Skip to content

Learn how to execute a spatial query.

Make a spatial query using API key authentication

A feature layer can contain a large number of features stored in ArcGIS. To access a subset of these features, you can execute an SQL or spatial query.

In this tutorial, you use GL Draw to sketch a feature on the map, and then use ArcGIS REST JS to perform a spatial query against the LA County Parcels hosted feature layer. A pop-up is also used to display feature attributes.

Prerequisites

You need an ArcGIS Location Platform or ArcGIS Online account.

Steps

Get the starter app

Select a type of authentication and follow the steps to create a new app.

You can choose one of the following to create a new CodePen:

  • Option 1: Complete the Display a map tutorial; or,
  • Option 2: Start from the Display a map tutorial .

Set up authentication

Create a new API key credential with the correct privileges to get an access token.

  1. Go to the Create an API key tutorial to follow the steps to get an access token with these 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.

Set developer credentials

Use the API key or OAuth developer credentials so your application can access ArcGIS services.

  1. Update the accessToken variable to use your API key.

    Expand
    Use dark colors for code blocks
    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  /* Use for API key authentication */  const accessToken = "YOUR_ACCESS_TOKEN"; 
    Expand

Add script references

This tutorial uses three additional libraries. ArcGIS REST JS is used for querying the feature layer. Mapbox GL Draw provides drawing tools, allowing the user to define a point, line, or polygon of interest. Terraformer is used to convert GeoJSON features generated by Mapbox GL Draw into ArcGIS JSON geometries, which is required to query the feature layer.

  1. Add <script> tags to reference the libraries.

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  <head>  <title>MapLibre ArcGIS tutorial: Query a feature layer (spatial)</title>  <meta charset="utf-8">  <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">  <!-- Load MapLibre GL JS from CDN -->  <script src="https://unpkg.com/maplibre-gl@5.14.0/dist/maplibre-gl.js"></script>  <link href="https://unpkg.com/maplibre-gl@5.14.0/dist/maplibre-gl.css" rel="stylesheet">  <!-- Load MapLibre ArcGIS from CDN -->  <script src="https://unpkg.com/@esri/maplibre-arcgis@1.0.0/dist/umd/maplibre-arcgis.min.js"></script>   <link rel="stylesheet" href="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.4.2/mapbox-gl-draw.css"  >  <script src="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.4.2/mapbox-gl-draw.js"></script>  <script src="https://unpkg.com/@esri/arcgis-rest-request@4/dist/bundled/request.umd.js"></script>  <script  src="https://unpkg.com/@esri/arcgis-rest-feature-service@4/dist/bundled/feature-service.umd.js"></script>  <script src="https://unpkg.com/@terraformer/arcgis@2.1.2/dist/t-arcgis.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> 
    Expand

Add Mapbox GL Draw

To display the Mapbox GL Draw controls, create a MapboxDraw and call map.addControl. By default, other tools are included, so you need to specify the three required tools: point, line, and polygon.

  1. Create a MapboxDraw and add it to the Map.

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  const map = new maplibregl.Map({  container: "map", // the id of the div element  zoom: 12, // starting zoom   center: [-118.80543, 34.03] // starting location [longitude, latitude]   });  const basemapStyle = maplibreArcGIS.BasemapStyle.applyStyle(map, {  style: "arcgis/outdoor",  token: accessToken  });   const draw = new MapboxDraw({  displayControlsDefault: false, // Don't add any tools other than those below  controls: {  point: true,  line_string: true,  polygon: true  }  });  map.addControl(draw, "top-left"); 
    Expand
  2. Edit the MapboxDraw global constants to allow compatibility with MapLibre GL JS.

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  const map = new maplibregl.Map({  container: "map", // the id of the div element  zoom: 12, // starting zoom   center: [-118.80543, 34.03] // starting location [longitude, latitude]   });  const basemapStyle = maplibreArcGIS.BasemapStyle.applyStyle(map, {  style: "arcgis/outdoor",  token: accessToken  });   MapboxDraw.constants.classes.CONTROL_BASE = "maplibregl-ctrl";  MapboxDraw.constants.classes.CONTROL_PREFIX = "maplibregl-ctrl-";  MapboxDraw.constants.classes.CONTROL_GROUP = "maplibregl-ctrl-group";   const draw = new MapboxDraw({  displayControlsDefault: false, // Don't add any tools other than those below  controls: {  point: true,  line_string: true,  polygon: true  }  });  map.addControl(draw, "top-left"); 
    Expand

Add query layers

Three layers are required to display the three types of query you can perform: circle, line, and fill. They share a single GeoJSON source, which at any time will contain one feature of either Point, LineString or Polygon geometry. Create the source with an empty GeoJSON feature collection.

  1. Create an addQueryLayers function. Inside, add a GeoJSON source and circle, line, and fill layers.

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  function addQueryLayers() {  map.addSource("query", {  type: "geojson",  data: {  type: "FeatureCollection",  features: []  }  });  map.addLayer({  id: "query-line",  type: "line",  source: "query",  paint: {  "line-color": "hsl(140, 0%, 30%)",  "line-width": 2,  "line-dasharray": [2, 2]  }  });  map.addLayer({  id: "query-fill",  type: "fill",  source: "query",  paint: {  "fill-color": "hsl(140, 0%, 50%)",  "fill-opacity": 0.2  },  filter: ["==", ["geometry-type"], "Polygon"]  });   map.addLayer({  id: "query-circle",  type: "circle",  source: "query",  paint: {  "circle-color": "hsl(140, 0%, 30%)"  },  filter: ["==", ["geometry-type"], "Point"]  });  } 
    Expand

Add parcel layers

Parcels returned by the query are simple polygons. You can display them with a GeoJSON source and a fill layer.

  1. Create an addParcelLayers function. Inside, add a GeoJSON source and a fill layer.

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  map.addLayer({  id: "query-circle",  type: "circle",  source: "query",  paint: {  "circle-color": "hsl(140, 0%, 30%)"  },  filter: ["==", ["geometry-type"], "Point"]  });  }   function addParcelLayers() {  map.addSource("parcels", {  type: "geojson",  data: {  type: "FeatureCollection",  features: []  },   });  map.addLayer({  id: "parcels-fill",  source: "parcels",  type: "fill",   paint: {  "fill-color": "hsl(200, 80%, 50%)",  "fill-opacity": 0.5,  "fill-outline-color": "white"  }  });  } 
    Expand
  2. Add the data attribution for the feature layer source.

    • Go to the LA County Parcels item.
    • Scroll down to the Acknowledgments section and copy its value.
    • Paste the copied value to the attribution property.
      Expand
      Use dark colors for code blocks
      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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  function addParcelLayers() {  map.addSource("parcels", {  type: "geojson",  data: {  type: "FeatureCollection",  features: []  },   // Attribution text retrieved from https://arcgis.com/home/item.html?id=a6fdf2ee0e454393a53ba32b9838b303  attribution: "LA County Parcels"   });  map.addLayer({  id: "parcels-fill",  source: "parcels",  type: "fill",   paint: {  "fill-color": "hsl(200, 80%, 50%)",  "fill-opacity": 0.5,  "fill-outline-color": "white"  }  });  } 
      Expand

Add a load handler

To add layers to the map, use the load event to ensure the map is fully loaded.

  1. Add an event handler for the load event. Inside, call addQueryLayers and addParcelLayers;

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  paint: {  "fill-color": "hsl(200, 80%, 50%)",  "fill-opacity": 0.5,  "fill-outline-color": "white"  }  });  }   map.on("load", () => {   addParcelLayers();   addQueryLayers();  }); 
    Expand

Get the draw feature

Mapbox GL Draw emits a draw.create event when you have finished drawing a feature. You can listen to this event to respond to the newly created feature.

By default, Mapbox GL Draw keeps all previously drawn features visible in its own layer. To prevent this, use deleteAll after copying the feature.

  1. Add an event handler for draw.create. Inside, store the feature in the query layer, then delete all features from Mapbox GL Draw.

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  map.on("load", () => {   addParcelLayers();   addQueryLayers();  });   map.on("draw.create", (e) => {  const feature = e.features[0];  map.getSource("query").setData(feature);  draw.deleteAll();   }); 
    Expand
  2. Click Run at the top right to test your code. You should be able to sketch a point, line or polygon feature, and see it turn into a green feature when complete.

Execute the query

Use the ArcGIS REST JS queryFeatures method to find features in the LA County Parcels feature layer that match the selected where clause. Use Terraformer.geojsonToArcGIS to convert the GeoJSON from Mapbox GL Draw into the ArcGIS geometry format.

When the matching parcels are returned, call setData on the parcels source to display them.

  1. Create a function that calls arcgisRest.queryFeatures. Specify GeoJSON as the return type, requesting returnGeometry and specific outFields. All of the features within the geometry will be returned with attribute information set by the outFields property.

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  map.on("draw.create", (e) => {  const feature = e.features[0];  map.getSource("query").setData(feature);  draw.deleteAll();   });   function executeQuery(geometry, geometryType) {   arcgisRest  .queryFeatures({  url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/LA_County_Parcels/FeatureServer/0",  geometry: geometry,  geometryType: geometryType,  spatialRel: "esriSpatialRelIntersects",  f: "geojson",  returnGeometry: true,  outFields: ["APN", "UseType", "TaxRateCity", " Roll_LandValue"]  })   } 
    Expand
  2. Add a response handler. Inside, set the returned parcels as the data for the parcels source.

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  arcgisRest  .queryFeatures({  url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/LA_County_Parcels/FeatureServer/0",  geometry: geometry,  geometryType: geometryType,  spatialRel: "esriSpatialRelIntersects",  f: "geojson",  returnGeometry: true,  outFields: ["APN", "UseType", "TaxRateCity", " Roll_LandValue"]  })   .then((response) => {  map.getSource("parcels").setData(response);  });   } 
    Expand
  3. In your MapboxDraw event handler, call executeQuery. Use Terraformer.geojsonToArcGIS to convert geometry into an ArcGIS JSON format.

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  map.on("draw.create", (e) => {  const feature = e.features[0];  map.getSource("query").setData(feature);  draw.deleteAll();   const geometry = Terraformer.geojsonToArcGIS(feature.geometry);  let geometryType = "esriGeometry" + feature.geometry.type;  if (feature.geometry.type === "LineString") {  geometryType = "esriGeometryPolyline";  }  executeQuery(geometry, geometryType);   }); 
    Expand
  4. At the top right, click Run. When you create a feature using the toolbox, a spatial query will run against the feature layer and display all land parcels within the boundary of the feature.

Add a pop-up

You can add a pop-up to view attributes of a parcel when you click on it.

  1. Add a click event handler to the parcels-fill layer. Inside, construct the pop-up content from the attributes of the clicked parcel.

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  .then((response) => {  map.getSource("parcels").setData(response);  });   }   map.on("click", "parcels-fill", (e) => {  const p = e.features[0].properties;  const message =  `<b>Parcel ${p.APN}</b>` +  `Type: ${p.UseType} <br>` +  `Land value: $${p.Roll_LandValue.toLocaleString()} <br>` +  `Tax Rate City: ${p.TaxRateCity}`;   }); 
    Expand
  2. Create a Popup and add it to the map using Popup.addTo.

    Expand
    Use dark colors for code blocks
    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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209  map.on("click", "parcels-fill", (e) => {  const p = e.features[0].properties;  const message =  `<b>Parcel ${p.APN}</b>` +  `Type: ${p.UseType} <br>` +  `Land value: $${p.Roll_LandValue.toLocaleString()} <br>` +  `Tax Rate City: ${p.TaxRateCity}`;   new maplibregl.Popup().setHTML(message).setLngLat(e.lngLat).addTo(map);   }); 
    Expand

Run the app

Run the app.

When you click on the map to draw a polygon, a spatial query will run against the feature layer and display all land parcels that intersect the boundary of the feature. You can click on a parcel to see a pop-up with information about the parcel.

What's next?

Learn how to use additional location services in these tutorials:

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.