Query demographic data

Learn how to query demographic information for locations around the world with the GeoEnrichment service.

The GeoEnrichment service provides information such as population and household size about geographic areas that you define. The enrich method provides the ability to get facts about a location or area. Using Enrich, you can get information about the people, places, and businesses in a specific area or within a certain distance of a point.

In this tutorial, you use ArcGIS REST JS to access the GeoEnrichment service to search for demographic data within one mile of a clicked point and display the data in a overlay panel.

Prerequisites

You need an ArcGIS Developer or ArcGIS Online account to access the developer dashboard and create an API key.

Steps

Create a new pen

  1. To get started, either complete the Display a map tutorial or .

Set the API key

To access location services, you need an API key or OAuth 2.0 access token. To learn how to create and scope your key, visit the Create an API key tutorial.

  1. Go to your dashboard to get an API key. The API key must be scoped to access the services used in this tutorial.

  2. In CodePen, update apiKey to use your key.

    Use dark colors for code blocks
        
    Change line
    1
    2
    3
    4
    const apiKey = "YOUR_API_KEY";
    const basemapId = "ArcGIS:Streets";
    const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
    olms(map, basemapURL);

Add references to ArcGIS REST JS

This tutorial uses ArcGIS REST JS to access the geoenrichment service. It also uses the ol-popup library to display pop-ups.

  1. Add links to the ArcGIS REST JS and ol-popup libraries in the <script> section.

    Expand
    Use dark colors for code blocks
                                                                                                                 
    Add line.Add line.Add line.Add line.Add line.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.15.1/css/ol.css" type="text/css" />
        <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.15.1/build/ol.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/ol-mapbox-style@6.1.4/dist/olms.js" type="text/javascript"></script>
    
        <script src="https://unpkg.com/@esri/arcgis-rest-request@4.0.0/dist/bundled/request.umd.js"></script>
        <script src="https://unpkg.com/ol-popup@4.0.0"></script>
    
        <link rel="stylesheet" href="https://unpkg.com/ol-popup@4.0.0/src/ol-popup.css" />
        <script src="https://unpkg.com/@esri/arcgis-rest-demographics@4.0.0/dist/bundled/demographics.umd.js"></script>
    
    Expand

Update the map

The GeoEnrichment service has data sources for many countries around the world, including most of Europe. Update the position of the map to center on eastern Europe and the basemapId.

  1. Update the center parameter to [18.88, 47.33] and set zoom to 5.

    Expand
    Use dark colors for code blocks
                                                                                                                 
    Change lineChange line
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
          map.setView(
            new ol.View({
    
              center: ol.proj.fromLonLat([18.88, 47.33]),
              zoom: 5
    
            })
          );
    
    Expand
  2. Update the basemapId to ArcGIS:Navigation.

    Expand
    Use dark colors for code blocks
                                                                                                                 
    Change line
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
          const basemapId = "ArcGIS:Navigation";
    
          const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
    
          olms(map, basemapURL).then(function (map) {
    
    
    Expand

Add a click event handler

You need a location before calling the GeoEnrichment service. To get a location, you can add a handler to the Map's click event. The click handler will be called with an object containing a Coordinate.

You can change the mouse cursor to a crosshair to make it easier to click precisely. Modify the CSS style of its canvas element to do this.

  1. In the <style> , set the mouse cursor style to crosshair.

    Expand
    Use dark colors for code blocks
                                                                                                                 
    Add line.Add line.Add line.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
          }
    
          #map canvas {
            cursor: crosshair;
          }
    
        </style>
    
    Expand
  2. Add a handler for the click event. Inside, convert the click coordinate to a longitude and latitude and save it in a variable.

    Expand
    Use dark colors for code blocks
                                                                                                                 
    Add line.Add line.Add line.Add line.Add line.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
          olms(map, basemapURL).then(function (map) {
    
            map.on("click", (event) => {
    
              const lonLat = ol.proj.toLonLat(event.coordinate);
    
            });
    
          });
    
    Expand

Execute the query

You pass one or more study areas to arcgisRest.queryDemographicData to specify the location of your query. To query a circular buffer around a point, pass a geometry object with x and y parameters. The default search radius is one mile.

  1. Inside the click handler, create a new arcgisRest.ApiKeyManager to access the GeoEnrichment service. Call the service with an array containing a single geometry object containing the longitude and latitude, as the studyAreas parameter.

    Expand
    Use dark colors for code blocks
                                                                                                                 
    Add line.Add line.Add line.Add line.Add line.Add line.Add line.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
            map.on("click", (event) => {
    
              const lonLat = ol.proj.toLonLat(event.coordinate);
    
              const authentication = arcgisRest.ApiKeyManager.fromKey(apiKey);
    
              arcgisRest
                .queryDemographicData({
                  studyAreas: [{ geometry: { x: lonLat[0], y: lonLat[1] } }],
                  authentication: authentication
                })
    
            });
    
    Expand

Display the results

If the query is successful, the response will contain a results array with a value containing a FeatureSet. The FeatureSet contains attributes such as population within the study area, the number of males and females, and the average household size. To learn more, visit the GeoEnrichment service page.

You will display the results of the query in a pop-up.

  1. Before the click handler, create a Popup and save it to a popup variable. Add it to the map with map.addOverlay.

    Expand
    Use dark colors for code blocks
                                                                                                                 
    Add line.Add line.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
          const basemapId = "ArcGIS:Navigation";
    
          const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
    
          olms(map, basemapURL).then(function (map) {
    
            const popup = new Popup();
            map.addOverlay(popup);
    
    Expand
  2. Add a then handler to the queryDemographicData call. Inside, store the FeatureSet from the first result in a variable.

    Expand
    Use dark colors for code blocks
                                                                                                                 
    Add line.Add line.Add line.Add line.Add line.Add line.Add line.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
              arcgisRest
                .queryDemographicData({
                  studyAreas: [{ geometry: { x: lonLat[0], y: lonLat[1] } }],
                  authentication: authentication
                })
    
                .then((response) => {
    
                  const data = document.getElementById("data");
    
                  const featureSet = response.results[0].value.FeatureSet;
    
                });
    
    Expand
  3. If the FeatureSet contains data, use its attributes to build a message to show. Use popup.show to display the message at the location of the mouse click. Otherwise, display a "Data not available" message.

    Expand
    Use dark colors for code blocks
                                                                                                                 
    Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
                  const data = document.getElementById("data");
    
                  const featureSet = response.results[0].value.FeatureSet;
    
                  let message;
                  if (featureSet.length > 0 && featureSet[0].features.length > 0) {
                    const attributes = featureSet[0].features[0].attributes;
                    message =
                      `<b>Data for a 1 mile search radius</b>` +
                      [
                        `<br>Population: ${attributes.TOTPOP}`,
                        `Males: ${attributes.TOTMALES} `,
                        `Females: ${attributes.TOTFEMALES}`,
                        `Average Household Size: ${attributes.AVGHHSZ}`
                      ].join("<br>");
                  } else {
                    message = "Data not available for this location.";
                  }
                  popup.show(event.coordinate, message);
    
    Expand

Run the app

In CodePen, run your code to display the map.

You should now see a map centered over eastern Europe. Click on the map to query for demographic data and view the results in a pop-up.

What's next?

Learn how to use additional ArcGIS location services in these tutorials:

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.