Display global data

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

The GeoEnrichment service provides global demographic data for 170 countries and regions. To get globally available information, you use the KeyGlobalFacts data collection, which returns information for the total population, total households, average household size, and total population for males and females for a study area.

In this tutorial, you use ArcGIS REST JS to access the GeoEnrichment service and display global data for Eastern Europe.

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
    5
    6
    7
    8
    9
    10
    const apiKey = "YOUR_API_KEY";
    const basemapEnum = "ArcGIS:Streets";
    const map = new maplibregl.Map({
      container: "map", // the id of the div element
      style: `https://basemaps-api.arcgis.com/arcgis/rest/services/styles/${basemapEnum}?type=style&token=${apiKey}`,
      zoom: 12, // starting zoom
      center: [-118.805, 34.027] // starting location [longitude, latitude]
    });

Add references to ArcGIS REST JS

  1. Reference the request and demographics moduels from ArcGIS REST JS.

    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
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
        <script src="https://unpkg.com/maplibre-gl@2.1.9/dist/maplibre-gl.js"></script>
        <link href="https://unpkg.com/maplibre-gl@2.1.9/dist/maplibre-gl.css" rel="stylesheet" />
    
        <script src="https://unpkg.com/@esri/arcgis-rest-request@4.0.0/dist/bundled/request.umd.js"></script>
        <script src="https://unpkg.com/@esri/arcgis-rest-demographics@4.0.0/dist/bundled/demographics.umd.js"></script>
    
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
          }
        </style>
      </head>
    
    Expand

Update the map position

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

  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
          const apiKey = "YOUR_API_KEY";
          const basemapEnum = "ArcGIS:Streets";
    
          const map = new maplibregl.Map({
            container: "map", // the id of the div element
            style: `https://basemaps-api.arcgis.com/arcgis/rest/services/styles/${basemapEnum}?type=style&token=${apiKey}`,
    
            zoom: 5, // starting zoom
            center: [18.88, 47.33] // starting location [longitude, latitude]
    
          });
    
    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 LngLat.

You can change the mouse cursor to a crosshair to make it easier to click precisely. Use map.getCanvas to get the canvas, then modify its style property.

  1. After the map initialization code, set the mouse cursor style to crosshair.

    Expand
    Use dark colors for code blocks
                                                                                            
    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
          const map = new maplibregl.Map({
            container: "map", // the id of the div element
            style: `https://basemaps-api.arcgis.com/arcgis/rest/services/styles/${basemapEnum}?type=style&token=${apiKey}`,
    
            zoom: 5, // starting zoom
            center: [18.88, 47.33] // starting location [longitude, latitude]
    
          });
    
          map.getCanvas().style.cursor = "crosshair";
    
    Expand
  2. Add an async handler for the click event.

    Expand
    Use dark colors for code blocks
                                                                                            
    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
          map.getCanvas().style.cursor = "crosshair";
    
          map.on("click", async (e) => {
            // e.lngLat contains the clicked location
    
          });
    
    Expand

Execute the query

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

  1. Create a new arcgisRest.ApiKey to access the feature service.

    Expand
    Use dark colors for code blocks
                                                                                            
    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
          const map = new maplibregl.Map({
            container: "map", // the id of the div element
            style: `https://basemaps-api.arcgis.com/arcgis/rest/services/styles/${basemapEnum}?type=style&token=${apiKey}`,
    
            zoom: 5, // starting zoom
            center: [18.88, 47.33] // starting location [longitude, latitude]
    
          });
    
          const authentication = arcgisRest.ApiKeyManager.fromKey(apiKey);
    
    Expand
  2. Inside the click handler, call arcgisRest.queryDemographicData. Set the studyAreas parameter to a point geometry made from the event's lngLat property. Set the dataCollections parameter to to ["KeyGlobalFacts"] to obtain global data for your location.

    queryDemographicData is an asynchronous function. Using await, and declaring the click handler async, means the rest of the click handler will wait for a response from the GeoEnrichment service before continuing.

    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.
    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
          map.on("click", async (e) => {
            // e.lngLat contains the clicked location
    
            const response = await arcgisRest.queryDemographicData({
              studyAreas: [
                {
                  geometry: {
                    x: e.lngLat.lng,
                    y: e.lngLat.lat
                  }
                }
              ],
              dataCollections: ["KeyGlobalFacts"],
              authentication: authentication
            });
    
          });
    
    Expand

Show a pop-up

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. A message will display if there is no data available for a location selected. To learn more, visit the GeoEnrichment service page.

You can use a pop-up to show the results of the query at the location where you clicked on the map.

To add a pop-up to the map, you use the Popup class in MapLibre GL JS. See the Display a pop-up tutorial for more information.

  1. Set a variable containing the contents of the pop-up, using values from the query response.

    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.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
            const response = await arcgisRest.queryDemographicData({
              studyAreas: [
                {
                  geometry: {
                    x: e.lngLat.lng,
                    y: e.lngLat.lat
                  }
                }
              ],
              dataCollections: ["KeyGlobalFacts"],
              authentication: authentication
            });
    
            let message;
            const featureSet = response.results[0].value.FeatureSet;
            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.toLocaleString()}`,
                  `Males: ${attributes.TOTMALES.toLocaleString()}`,
                  `Females: ${attributes.TOTFEMALES.toLocaleString()}`,
                  `Average household size: ${attributes.AVGHHSZ}`
                ].join("<br>");
    
            } else {
              message = "Data not available for this location.";
            }
    
    Expand
  2. Create a Popup to display a message containing demographic attributes, and add it to the map at the clicked location.

    Expand
    Use dark colors for code blocks
                                                                                            
    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
            } else {
              message = "Data not available for this location.";
            }
    
            const popup = new maplibregl.Popup().setHTML(message).setLngLat(e.lngLat).addTo(map);
    
    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 popup.

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.