Learn how to use a SQL query to limit features displayed in a feature layer .
A hosted feature layer can contain a large number of features . To display a subset of the features, you can filter features on the server-side with a definition expression. Definition expressions are different than feature layer queries: they only support a SQL where clause without a geometry (spatial) parameter, and are only used to filter features at the time they are displayed in a map or scene . They cannot be used to get features like a feature layer query.
In this tutorial, you will apply a server-side SQL query with a definition Expression
to filter the LA County Parcels feature layer .
Prerequisites You need an ArcGIS Developer or ArcGIS Online account to access the 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 ArcGIS services , you need an API key .
Go to your dashboard to get an API key .
In CodePen , set the api Key
to your key, so it can be used to access basemap layer and location services.
Use dark colors for code blocks
Change line
1
2
3
4
esriConfig.apiKey = "YOUR_API_KEY" ;
const map = new Map ({
basemap : "arcgis-topographic" // Basemap layer service
});
Add modules In the require
statement, add the Feature Layer
module.
More info The ArcGIS Maps SDK for JavaScript is available as AMD modules and ES modules , but this tutorial is based on AMD. The AMD require
function uses references to determine which modules will be loaded – for example, you can specify "esri/Map"
for loading the Map module. After the modules are loaded, they are passed as parameters (e.g. Map
) to the callback function where they can be used in your application. It is important to keep the module references and callback parameters in the same order. For more information on the different types of modules, visit the Introduction to Tooling guide topic.
Expand
Use dark colors for code blocks
Add 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
88
89
< script >
require ([
"esri/config" ,
"esri/Map" ,
"esri/views/MapView" ,
"esri/layers/FeatureLayer"
], function ( esriConfig, Map , MapView, FeatureLayer ) {
Create a selector Use an HTML select
element to provide a list of SQL queries for the LA County Parcels feature layer .
Create a sql Expressions
array of SQL queries.
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
const view = new MapView({
container : "viewDiv" ,
map : map,
center : [- 118.80543 , 34.02700 ], // Longitude, latitude
zoom : 12
});
// Create a UI with the filter expressions
const sqlExpressions = [ "Choose a SQL where clause..." , "Roll_LandValue < 200000" , "TaxRateArea = 10853" , "Bedrooms5 > 0" , "UseType = 'Residential'" , "Roll_RealEstateExemp > 0" ];
Create a parent select Filter
element and add option
elements for each SQL query. Add some css styles to the elements.
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
89
// Create a UI with the filter expressions
const sqlExpressions = [ "Choose a SQL where clause..." , "Roll_LandValue < 200000" , "TaxRateArea = 10853" , "Bedrooms5 > 0" , "UseType = 'Residential'" , "Roll_RealEstateExemp > 0" ];
// UI
const selectFilter = document .createElement( "select" );
selectFilter.setAttribute( "class" , "esri-widget esri-select" );
selectFilter.setAttribute( "style" , "width: 275px; font-family: Avenir Next W00; font-size: 1em;" );
sqlExpressions.forEach( function ( sql ) {
let option = document .createElement( "option" );
option.value = sql;
option.innerHTML = sql;
selectFilter.appendChild(option);
});
Add select Filter
to the top-right
corner of the view.
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
89
sqlExpressions.forEach( function ( sql ) {
let option = document .createElement( "option" );
option.value = sql;
option.innerHTML = sql;
selectFilter.appendChild(option);
});
view.ui.add(selectFilter, "top-right" );
Verify that the select
element is created.
Create a feature layer to filter Use the Feature Layer
class to access the LA County Parcels feature layer . Since you are performing a server-side query, the feature layer does not need to be added to the map. However, to view the results of the query, the feature layer will be added to the map.
Create a feature Layer
and set the url
property to access the feature layer in the feature service . Set the out Fields
property to return all attributes on the client and the popup Template
to display the parcel description and land value. Set the definition Expression
to 1=0
so no features are displayed when the layer is loaded. Add feature Layer
to the map
.
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.
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
view.ui.add(selectFilter, "top-right" );
// Add a feature layer to map with all features visible on client (no filter)
const featureLayer = new FeatureLayer({
url : "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/LA_County_Parcels/FeatureServer/0" ,
outFields : [ "*" ],
popupTemplate : {
title : "{UseType}" ,
content : "Description: {UseDescription}. Land value: {Roll_LandValue}"
},
definitionExpression : "1=0"
});
map.add(featureLayer);
Apply the SQL expression The definition Expression
is the SQL where clause. Use the expression to apply a filter and limit features displayed in the map.
Create a set Feature Layer Filter
function with an expression
parameter. Set the definition Expression
to filter the feature layer with the expression
.
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
view.ui.add(selectFilter, "top-right" );
// Add a feature layer to map with all features visible on client (no filter)
const featureLayer = new FeatureLayer({
url : "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/LA_County_Parcels/FeatureServer/0" ,
outFields : [ "*" ],
popupTemplate : {
title : "{UseType}" ,
content : "Description: {UseDescription}. Land value: {Roll_LandValue}"
},
definitionExpression : "1=0"
});
map.add(featureLayer);
// Server-side filter
function setFeatureLayerFilter ( expression ) {
featureLayer.definitionExpression = expression;
}
Add an event listener to call the set Feature Layer Filter
function when a SQL where clause is chosen from the selector.
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
// Server-side filter
function setFeatureLayerFilter ( expression ) {
featureLayer.definitionExpression = expression;
}
// Event listener
selectFilter.addEventListener( 'change' , function ( event ) {
setFeatureLayerFilter(event.target.value);
});
Run the app In CodePen , run your code to display the map.
When the map displays, you should be able to choose a SQL query from the selector that applies a definition expression to the visible extent of the map. Only the features that match are added to the feature layer and displayed in the view .
What's next? Learn how to use additional API features and
ArcGIS services in these tutorials: