Learn how to access local data, such as spending trends, for the United States with the GeoEnrichment service.
The GeoEnrichment service provides detailed local data for specific countries. Each individual data field is represented by an analysis variable that are organized into data categories such as spending and market behaviors such as 2022 Educational Attainment
or 2022 Seen Video Ad at Gas Station Last 30 Days
. The data available vary by country and by data provider.
In this tutorial, you use ArcGIS REST JS to access the GeoEnrichment service and display spending trend information for a study area within the United States.
Prerequisites
You need an ArcGIS Location Platform or ArcGIS Online account.
Steps
Create a new pen
- To get started, either complete the Display a scene tutorial or .
Get an access token
You need an access token with the correct privileges to access the resources used in this tutorial.
-
Go to the Create an API key tutorial and create an API key with the following privilege(s):
- Privileges
- Location services > Basemaps
- Location services > Data enrichment
- Privileges
-
Copy the API key access token to your clipboard when prompted.
-
In CodePen, update the
access
variable to use your access token.Token Use dark colors for code blocks const accessToken = "YOUR_ACCESS_TOKEN"; Cesium.ArcGisMapService.defaultAccessToken = accessToken; const cesiumAccessToken = "YOUR_CESIUM_ACCESS_TOKEN"; Cesium.Ion.defaultAccessToken = cesiumAccessToken; const arcGisImagery = Cesium.ArcGisMapServerImageryProvider.fromBasemapType(Cesium.ArcGisBaseMapType.SATELLITE); const viewer = new Cesium.Viewer("cesiumContainer", { baseLayer: Cesium.ImageryLayer.fromProviderAsync(arcGisImagery), });
To learn about the other types of authentication available, go to Types of authentication.
Add references to ArcGIS REST JS
-
In the
<head
element, reference the> demographics
andrequest
packages from ArcGIS REST JS.Use dark colors for code blocks <script src="https://cesium.com/downloads/cesiumjs/releases/1.121/Build/Cesium/Cesium.js"></script> <link href="https://cesium.com/downloads/cesiumjs/releases/1.121/Build/Cesium/Widgets/widgets.css" rel="stylesheet"> <script src="https://unpkg.com/@esri/arcgis-rest-request@4/dist/bundled/request.umd.js"></script> <script src="https://unpkg.com/@esri/arcgis-rest-demographics@4/dist/bundled/demographics.umd.js"></script>
Update the map position
Local data is only available in select countries and regions. Update the camera position to center on Nashville, Tennessee.
-
Update the camera
destination
to[-86.7679, 36.1345, 15000]
, Nashville TN.Use dark colors for code blocks viewer.camera.setView({ destination : Cesium.Cartesian3.fromDegrees(-86.7679, 36.1345, 15000), orientation : { heading : Cesium.Math.toRadians(0.0), pitch : Cesium.Math.toRadians(-80.0) }});
Add a click event handler
The study area for your application will be a one-mile buffer around a clicked location. Add an event handler that listens for left clicks on the map and retrieves their coordinates.
-
Add an event listener to the viewer's
Screen
that listens for left clicks.Space Event Handler Use dark colors for code blocks destination : Cesium.Cartesian3.fromDegrees(-86.7679, 36.1345, 15000), orientation : { heading : Cesium.Math.toRadians(0.0), pitch : Cesium.Math.toRadians(-80.0) }}); viewer.screenSpaceEventHandler.setInputAction(function (movement) { }, Cesium.ScreenSpaceEventType.LEFT_CLICK)
-
Retrieve the coordinates of the left click and convert them to
Cartographic
latitude and longitude. Pass the coordinates to a new function calledget
that accepts coordinates as degrees.Local Data Use dark colors for code blocks destination : Cesium.Cartesian3.fromDegrees(-86.7679, 36.1345, 15000), orientation : { heading : Cesium.Math.toRadians(0.0), pitch : Cesium.Math.toRadians(-80.0) }}); function getLocalData(longitude,latitude) { } viewer.screenSpaceEventHandler.setInputAction(function (movement) { const pickedPosition = viewer.scene.pickPosition(movement.position); const cartographic = Cesium.Cartographic.fromCartesian(pickedPosition); getLocalData(Cesium.Math.toDegrees(cartographic.longitude),Cesium.Math.toDegrees(cartographic.latitude)) }, Cesium.ScreenSpaceEventType.LEFT_CLICK)
Execute the query
Execute the query
operation to retrieve local data. To query a circular buffer around a point, pass a geometry
object with x
and y
coordinates. The default search radius is one mile.
-
Create a new
Api
using your access token to authenticate requests to the GeoEnrichment service.Key Manager Use dark colors for code blocks const accessToken = "YOUR_ACCESS_TOKEN"; Cesium.ArcGisMapService.defaultAccessToken = accessToken; const authentication = arcgisRest.ApiKeyManager.fromKey(accessToken);
-
Access the GeoEnrichment service with
query
. Set theDemographic Data study
parameter to a point geometry made from the passed longitude and latitude. Also pass theAreas authentication
object.Use dark colors for code blocks function getLocalData(longitude,latitude) { arcgisRest.queryDemographicData({ studyAreas: [{geometry: {x:longitude, y:latitude}}], authentication:authentication, }) }
-
Set the
analysis
parameter with the following analysis variables:Variables - Buys Natural Products (
Psychographics
)Shopping. M P28067 A _B - Auto/Truck Rental on Trips (
transportation.
)X7027 _I - Membership fees for Social Clubs (
entertainment.
)X9005 _I - Tapestry group name (
lifemodegroups
)NE W. TLIFENAME
Use dark colors for code blocks function getLocalData(longitude,latitude) { arcgisRest.queryDemographicData({ studyAreas: [{geometry: {x:longitude, y:latitude}}], authentication:authentication, analysisVariables: [ "PsychographicsShopping.MP28067A_B", "transportation.X7027_I", "entertainment.X9005_I", "lifemodegroupsNEW.TLIFENAME" ] }) }
- Buys Natural Products (
Display results
If the query is successful, the response will contain a results
array with a value containing a Feature
. The Feature
contains values representing the prevalence of each specified analysis variable in the provided study area. A message will display if there is no data available for a location selected.
-
Access the
Feature
returned by the service response. If data was returned, access the feature attributes to create a message.Set Use dark colors for code blocks analysisVariables: [ "PsychographicsShopping.MP28067A_B", "transportation.X7027_I", "entertainment.X9005_I", "lifemodegroupsNEW.TLIFENAME" ] }) .then((response) => { 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>" + [ `Buys Natural Products: ${attributes.MP28067a_B}`, `Membership fees for Social Clubs: ${attributes.X9005_I}`, `Auto/Truck Rental on Trips: ${attributes.X7027_I}`, `Tapestry group name: ${attributes.TLIFENAME}` ].join("<br>"); } else { message = "Data not available for this location."; } })
-
Create a new
Entity
to display the results. Set theposition
to the clicked location, and set thedescription
to themessage
you created.Use dark colors for code blocks else { message = "Data not available for this location."; } let resultEntity = new Cesium.Entity({ name:"Demographic results", description: message, position:Cesium.Cartesian3.fromDegrees(longitude,latitude) }); viewer.selectedEntity = resultEntity;
Run the app
In CodePen, run your code to display the map.
You should now see a map centered over Nashville. Click on the map to access the GeoEnrichment service to return local information and view the results in a popup.
What's next?
Learn how to use additional ArcGIS location services in these tutorials: