Learn how to add features from feature layers to a map .
A feature layer is a dataset in a hosted feature service . Each feature layer contains features with a single geometry type (point, line, or polygon), and a set of attributes . You can access and display features by making query requests to the feature service and displaying them in a map.
In this tutorial, you access and display three different hosted feature layers . The data is accessed and displayed as GeoJSON.
The feature layers are:
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 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 api Key
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.apply(map, basemapURL);
Add references to ArcGIS REST JS This tutorial uses ArcGIS REST JS for accessing the feature service. It also uses the ol-popup library to display pop-ups.
In the <head>
element, add references to the ArcGIS REST JS and ol-popup libraries.
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
< 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@10.5.0/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" />
Add a point feature layer The trailheads feature layer contains feature with a point geometry. Use a Vector
layer to access the feature layer by URL and display the points. By default, they will display as white circles with blue outlines.
Create a Vector Source
. Pass a new Geo JSON
as the format
parameter. For the url
parameter, pass a direct link to a FeatureServer endpoint.
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.
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
const basemapId = "ArcGIS:Streets" ;
const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
olms.apply(map, basemapURL).then( function ( map ) {
const pointLayerName = "Trailheads" ;
const pointLayerURL =
"https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
pointLayerName +
"/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=geojson" ;
const pointSource = new ol.source.Vector({
format : new ol.format.GeoJSON(),
url : pointLayerURL
});
Create a Vector
layer using the Vector
source you defined. Add it to the map using map.add Layer
.
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
const pointSource = new ol.source.Vector({
format : new ol.format.GeoJSON(),
url : pointLayerURL
});
const pointLayer = new ol.layer.Vector({
source : pointSource
});
map.addLayer(pointLayer);
Add a line feature layer The Trails feature layer contains features with a line geometry . Use a Vector
layer to access the feature layer by URL and display the lines. By default, the features are displayed as blue lines.
Create a Vector Source
with format
and url
parameters.
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.
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
const pointLayer = new ol.layer.Vector({
source : pointSource
});
map.addLayer(pointLayer);
const lineLayerName = "Trails" ;
const lineLayerURL =
"https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
lineLayerName +
"/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=geojson" ;
const lineSource = new ol.source.Vector({
format : new ol.format.GeoJSON(),
url : lineLayerURL
});
Create a Vector
layer using the Vector
source you defined. Add it to the map using map.add Layer
.
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
const lineSource = new ol.source.Vector({
format : new ol.format.GeoJSON(),
url : lineLayerURL
});
const lineLayer = new ol.layer.Vector({
source : lineSource
});
map.addLayer(lineLayer);
Add a polygon feature layer The Parks and Open Space feature layer contains features with a polygon geometry . Use a Vector
layer to access the feature layer by URL and display the polygons. By default, polygon features are displayed as translucent white fill with blue outlines.
If you added the layer with map.add Layer
, it would be added above other layers and obscure them. Instead, use map.get Layers
to access the layers collection, then use Collection.insert A t
to place it below the other two layers.
Create a Vector Source
with format
and url
parameters.
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.
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
const lineLayer = new ol.layer.Vector({
source : lineSource
});
map.addLayer(lineLayer);
const polygonLayerName = "Parks_and_Open_Space" ;
const polygonLayerURL =
"https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
polygonLayerName +
"/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=geojson" ;
const polygonSource = new ol.source.Vector({
format : new ol.format.GeoJSON(),
url : polygonLayerURL
});
Create a Vector
layer using the Vector
source you defined. Add it to the map using insert A t
at index 1.
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
const polygonSource = new ol.source.Vector({
format : new ol.format.GeoJSON(),
url : polygonLayerURL
});
const polygonLayer = new ol.layer.Vector({
source : polygonSource
});
map.getLayers().insertAt( 1 , polygonLayer);
In CodePen , click Run at the top right. Your map should display the locations of trailheads, trails, and open spaces on your map.
Add a pop-up You can use a Popup
to show data attributes for a feature when you click on them. A popup is a type of Overlay
so you add it to the map with map.add Overlay
. To get a feature, you use the click event and map.get Features At Pixel
to get the features at a click point. You also use the point to position the Popup
at the correct location.
More info For a full list of possible attributes to show, see the feature layer pages:
Create a Popup
and save it to a popup
variable. Add it to the map with map.add Overlay
.
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
const polygonLayer = new ol.layer.Vector({
source : polygonSource
});
map.getLayers().insertAt( 1 , polygonLayer);
const popup = new Popup();
map.addOverlay(popup);
Add a click
event handler. Inside, check if a feature from the trailheads layer was clicked. If so, move the pop-up, and show the trailhead name and park name (TRL_ NAME
and PARK_ NAME
). Otherwise, check the trails layer; show the trail name, length and elevation gain (TRL_ NAME
, LENGTH_ M I
, ELEV_ GAIN
) if it was clicked. Otherwise, check the parks layer; show the park name and managing agency (PARK_ NAME
and MNG_ AGENCY
) if it was clicked. Otherwise, hide the pop-up with popup.hide
;
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. 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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
const popup = new Popup();
map.addOverlay(popup);
map.on( "click" , ( event ) => {
let feature = map.getFeaturesAtPixel(event.pixel, {
layerFilter : ( l ) => l === pointLayer
})[ 0 ];
if (feature) {
popup.show(event.coordinate, `<h4> ${feature.get( "TRL_NAME" )} </h4> ${feature.get( "PARK_NAME" )} ` );
return ;
}
feature = map.getFeaturesAtPixel(event.pixel, {
layerFilter : ( l ) => l === lineLayer
})[ 0 ];
if (feature) {
popup.show(
event.coordinate,
`<h4> ${feature.get( "TRL_NAME" )} </h4> ${feature.get( "LENGTH_MI" )} miles, ${feature.get( "ELEV_GAIN" )} feet elevation gain.`
);
return ;
}
feature = map.getFeaturesAtPixel(event.pixel, {
layerFilter : ( l ) => l === polygonLayer
})[ 0 ];
if (feature) {
popup.show(event.coordinate, `<h4> ${feature.get( "PARK_NAME" )} </h4> ${feature.get( "MNG_AGENCY" )} ` );
return ;
}
popup.hide();
});
Run the app In CodePen , run your code to display the map.
You should now be able to click on features to see information in a pop-up.
What's next? Learn how to use additional ArcGIS location services in these tutorials: