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
to filter the LA County Parcels feature layer .
Prerequisites
Steps
Create a new pen
- To get started, either complete the Display a map tutorial or .
Get an access token
You need an access token with the correct privileges to access the location services 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
- Item access
- Note: If you are using your own custom data layer for this tutorial, you need to grant the API key credentials access to the layer item. Learn more in Item access privileges.
- Privileges
- In CodePen, set
esri
to your API key..Config.api Key Use dark colors for code blocks esriConfig.apiKey = "YOUR_ACCESS_TOKEN"; const map = new Map({ basemap: "arcgis/topographic" // basemap styles service });
To learn about other ways to get an access token, go to Types of authentication.
Add modules
- In the
require
statement, add theFeature
module.Layer 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/
for loading the Map module. After the modules are loaded, they are passed as parameters (e.g.Map" 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. To learn more about the API's different modules visit the Overview Guide page.Use dark colors for code blocks <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
array of SQL queries.Expressions Use dark colors for code blocks 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
element and addFilter option
elements for each SQL query. Add some css styles to the elements.Use dark colors for code blocks // 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; font-size: 1em;"); sqlExpressions.forEach(function (sql) { let option = document.createElement("option"); option.value = sql; option.innerHTML = sql; selectFilter.appendChild(option); });
-
Add
select
to theFilter top-right
corner of the view.Use dark colors for code blocks 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
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
and set theLayer url
property to access the feature layer in the feature service. Set theout
property to return all attributes on the client and theFields popup
to display the parcel description and land value. Set theTemplate definition
toExpression 1=0
so no features are displayed when the layer is loaded. Addfeature
to theLayer map
.Use dark colors for code blocks 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
is the SQL where clause. Use the expression to apply a filter and limit features displayed in the map.
-
Create a
set
function with anFeature Layer Filter expression
parameter. Set thedefinition
to filter the feature layer with theExpression expression
.Use dark colors for code blocks 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
function when a SQL where clause is chosen from the selector.Feature Layer Filter Use dark colors for code blocks // 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: