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 account to access the developer dashboard and create an API key .
Steps Create a new pen To get started, either complete the Display a map tutorial or use this pen . 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.
Go to your dashboard to get an API key. The API key must be scoped to access the services used in this tutorial.
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 mapboxgl.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 Add links to the ArcGIS REST JS libraries in the <script>
section.
Use dark colors for code blocks
Show more lines
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
<!DOCTYPE html >
< html >
< head >
< meta charset = "utf-8" />
< meta name = "viewport" content = "initial-scale=1,maximum-scale=1,user-scalable=no" />
< script src = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.js" > </ script >
< link href = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-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 >
< body >
< div id = "map" > </ div >
< script >
const apiKey = "YOUR_API_KEY" ;
const basemapEnum = "ArcGIS:Streets" ;
const map = new mapboxgl.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);
map.getCanvas().style.cursor = "crosshair" ;
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
}
}
],
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>` +
[
`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." ;
}
const popup = new mapboxgl.Popup().setHTML(message).setLngLat(e.lngLat).addTo(map);
});
</ script >
</ body >
</ html >
Show more lines
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.
Update the center
parameter to [18.88, 47.33]
and set zoom
to 5.
Use dark colors for code blocks
Show more lines
Change line 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
< ! DOCTYPE html>
<html>
<head>
<meta charset = "utf-8" />
<meta name = "viewport" content = "initial-scale=1,maximum-scale=1,user-scalable=no" />
<script src = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.js" ></script>
<link href = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-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 : 14 px;
color : #323232;
}
</style>
</head>
<body>
<div id = "map" ></div>
<script>
const apiKey = "YOUR_API_KEY" ;
const basemapEnum = "ArcGIS:Streets" ;
const map = new mapboxgl.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 ) ;
map.getCanvas ( ) .style.cursor = "crosshair" ;
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
}
}
] ,
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>` +
[
` 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." ;
}
const popup = new mapboxgl.Popup ( ) .setHTML ( message ) .setLngLat ( e.lngLat ) .addTo ( map ) ;
} ) ;
</script>
</body>
</html>
Show more lines
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.
After the map initialization code, set the mouse cursor style to crosshair
.
Use dark colors for code blocks
Show more lines
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
<!DOCTYPE html >
< html >
< head >
< meta charset = "utf-8" />
< meta name = "viewport" content = "initial-scale=1,maximum-scale=1,user-scalable=no" />
< script src = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.js" > </ script >
< link href = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-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 >
< body >
< div id = "map" > </ div >
< script >
const apiKey = "YOUR_API_KEY" ;
const basemapEnum = "ArcGIS:Streets" ;
const map = new mapboxgl.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);
map.getCanvas().style.cursor = "crosshair" ;
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
}
}
],
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>` +
[
`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." ;
}
const popup = new mapboxgl.Popup().setHTML(message).setLngLat(e.lngLat).addTo(map);
});
</ script >
</ body >
</ html >
Show more lines
Add an async
handler for the click
event.
Use dark colors for code blocks
Show more lines
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
<!DOCTYPE html >
< html >
< head >
< meta charset = "utf-8" />
< meta name = "viewport" content = "initial-scale=1,maximum-scale=1,user-scalable=no" />
< script src = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.js" > </ script >
< link href = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-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 >
< body >
< div id = "map" > </ div >
< script >
const apiKey = "YOUR_API_KEY" ;
const basemapEnum = "ArcGIS:Streets" ;
const map = new mapboxgl.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);
map.getCanvas().style.cursor = "crosshair" ;
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
}
}
],
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>` +
[
`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." ;
}
const popup = new mapboxgl.Popup().setHTML(message).setLngLat(e.lngLat).addTo(map);
});
</ script >
</ body >
</ html >
Show more lines
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.
Create a new arcgisRest.ApiKey
to access the feature service.
Use dark colors for code blocks
Show more lines
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
<!DOCTYPE html >
< html >
< head >
< meta charset = "utf-8" />
< meta name = "viewport" content = "initial-scale=1,maximum-scale=1,user-scalable=no" />
< script src = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.js" > </ script >
< link href = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-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 >
< body >
< div id = "map" > </ div >
< script >
const apiKey = "YOUR_API_KEY" ;
const basemapEnum = "ArcGIS:Streets" ;
const map = new mapboxgl.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);
map.getCanvas().style.cursor = "crosshair" ;
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
}
}
],
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>` +
[
`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." ;
}
const popup = new mapboxgl.Popup().setHTML(message).setLngLat(e.lngLat).addTo(map);
});
</ script >
</ body >
</ html >
Show more lines
Inside the click handler, call arcgisRest.queryDemographicData
. Pass an array containing a single geometry object made from the event's lngLat
property. Also pass the authentication
object.
More info queryDemographicData
is an asynchronous function. Using await
, and declaring the click handler async
, means the rest of the click handler will wait for the response before continuing.
Use dark colors for code blocks
Show more lines
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
<!DOCTYPE html >
< html >
< head >
< meta charset = "utf-8" />
< meta name = "viewport" content = "initial-scale=1,maximum-scale=1,user-scalable=no" />
< script src = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.js" > </ script >
< link href = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-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 >
< body >
< div id = "map" > </ div >
< script >
const apiKey = "YOUR_API_KEY" ;
const basemapEnum = "ArcGIS:Streets" ;
const map = new mapboxgl.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);
map.getCanvas().style.cursor = "crosshair" ;
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
}
}
],
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>` +
[
`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." ;
}
const popup = new mapboxgl.Popup().setHTML(message).setLngLat(e.lngLat).addTo(map);
});
</ script >
</ body >
</ html >
Show more lines
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.
More info To add a pop-up to the map, you use the Popup
class in Mapbox GL JS. See the Display a pop-up tutorial for more information.
Set a variable containing the contents of the pop-up, using values from the query response.
Use dark colors for code blocks
Show more lines
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
<!DOCTYPE html >
< html >
< head >
< meta charset = "utf-8" />
< meta name = "viewport" content = "initial-scale=1,maximum-scale=1,user-scalable=no" />
< script src = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.js" > </ script >
< link href = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-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 >
< body >
< div id = "map" > </ div >
< script >
const apiKey = "YOUR_API_KEY" ;
const basemapEnum = "ArcGIS:Streets" ;
const map = new mapboxgl.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);
map.getCanvas().style.cursor = "crosshair" ;
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
}
}
],
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>` +
[
`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." ;
}
const popup = new mapboxgl.Popup().setHTML(message).setLngLat(e.lngLat).addTo(map);
});
</ script >
</ body >
</ html >
Show more lines
Create a Popup
to display a message
containing demographic attributes, and add it to the map at the clicked location.
Use dark colors for code blocks
Show more lines
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
<!DOCTYPE html >
< html >
< head >
< meta charset = "utf-8" />
< meta name = "viewport" content = "initial-scale=1,maximum-scale=1,user-scalable=no" />
< script src = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.js" > </ script >
< link href = "https://api.tiles.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-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 >
< body >
< div id = "map" > </ div >
< script >
const apiKey = "YOUR_API_KEY" ;
const basemapEnum = "ArcGIS:Streets" ;
const map = new mapboxgl.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);
map.getCanvas().style.cursor = "crosshair" ;
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
}
}
],
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>` +
[
`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." ;
}
const popup = new mapboxgl.Popup().setHTML(message).setLngLat(e.lngLat).addTo(map);
});
</ script >
</ body >
</ html >
Show more lines
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: