Leaflet plugin for ArcGIS Services. Currently Esri Leaflet supports loading Esri basemaps and feature services, as well as tiled and dynamic map services.
The goal of Esri Leaflet is not to replace the ArcGIS API for JavaScript, but rather to provide small components to allow developers to build mapping applications with Leaflet. It pairs well with Terraformer for converting data and geoservices-js for making advanced request to ArcGIS REST services, for example place finding and reverse geocoding.
Currently Esri Leaflet is in development and should be thought of as a beta or preview.
There are loads of demos showing the features of Esri Leaflet, as well as how it might integrate with geoservices-js and Terraformer libraries. Check out the demos.
Here is a quick example to get you started. Just change the paths to point to the proper libraries and go.
<!DOCTYPE html>
<html>
<head>
<title>Esri Leaflet Demo</title>
<link rel="stylesheet" href="/the/path/to/leaflet.css">
<!--[if lte IE 8]><link rel="stylesheet" href="/the/path/to/leaflet.ie.css"><![endif]-->
<style>
html, body, #map {
width : 100%;
height : 100%;
}
</style>
<script src="/the/path/to/leaflet.js"></script>
<script src="/the/path/to/esri-leaflet.js"></script>
</head>
<body>
<div id="map"></div>
<script>
var template = "<h3>{NAME}</h3>{ACRES} Acres<br><small>Property ID: {PROPERTYID}<small>"
var map = L.map('map').setView([45.528, -122.680], 13);
L.esri.basemapLayer("Gray").addTo(map);
L.esri.featureLayer("http://services.arcgis.com/rOo16HdIMeOBI4Mb/arcgis/rest/services/Parks_pdx/FeatureServer/0", {
style: function (feature) {
return { color: "#70ca49", weight: 2 };
},
onEachFeature: function (feature, layer) {
layer.bindPopup(L.Util.template(template, feature.properties));
}
}).addTo(map);
</script>
</body>
</html>
Extends L.TileLayer
Constructor | Description |
---|---|
new L.esri.BasemapLayer(key, options) L.esri.BasemapLayer(key, options) |
key type of base map you want to add. The options parameter can accept the same options as L.TileLayer . |
Valid Keys
Streets
Topographic
Oceans
NationalGeographic
Gray
GrayLabels
- Labels to pair with theGray
base mapDarkGray
DarkGrayLabels
- Labels to pair with theDarkGray
base mapImagery
ImageryLabels
- Labels and political boundaries to pair with theImagery
basemapImageryTransportation
- A street map for pairing with theImagery
base mapShadedRelief
ShadedReliefLabels
- Labels for pairing with theShadedRelief
base map
L.esri.BasemapLayer
inherits all methods from L.TileLayer
.
L.esri.BasemapLayer
inherits all events from L.TileLayer
.
var map = L.map('map').setView([37.75,-122.45], 12);
L.esri.basemapLayer("Topographic").addTo(map);
Extends L.GeoJSON
Constructor | Description |
---|---|
new L.esri.FeatureLayer(url, options) L.esri.FeatureLayer(url, options) |
The url parameter is the url to the FeatureLayer you should like to display. See service URLs for more information on how to find these urls. |
L.esri.FeatureLayer
also accepts all the options you can pass to L.GeoJSON
.
Option | Type | Default | Description |
---|---|---|---|
token |
String |
null |
If you pass a token in your options it will included in all requests to the service. See working with authenticated services for more information. |
L.esri.FeatureLayer
also fires all the same events as L.GeoJSON
in addition to these events.
Event | Data | Description |
---|---|---|
loading |
Loading |
Fires when new features start loading. |
load |
Load |
Fires when all features in the current bounds of the map have loaded. |
metadata |
Metadata |
After creating a new L.esri.ClusteredFeatureLayer a request for data describing the service will be made and passed to the metadata event. |
authenticationrequired |
Authentication |
This will be fired when a request to a service fails and requires authentication. See working with authenticated services for more information. |
var map = L.map('map').setView([45.53,-122.64], 16);
L.esri.basemapLayer("Streets").addTo(map);
L.esri.featureLayer('http://services.arcgis.com/rOo16HdIMeOBI4Mb/arcgis/rest/services/stops/FeatureServer/0/').addTo(map);
The options parameter can accept anything that L.GeoJSON
can accept. This means you can apply popups, custom styles and filters. See Leaflet GeoJSON for more information.
Extends L.ImageOverlay
If you have a MapService you and use L.esri.DynamicMapLayer(url, options)
to render it on a map
Constructor | Description |
---|---|
new L.esri.DynamicMapLayer(url, options) L.esri.TiledMapLayer(url, options) |
url should be the URL of the feature layer to consume. See service URLs for more information on how to find these urls. |
L.esri.DynamicMapLayer
also accepts all the options you can pass to L.ImageOverlay
.
Option | Type | Default | Description |
---|---|---|---|
format |
String |
'png24' |
Output format of the image. |
transparent |
Boolean |
true |
Allow the server to produce transparent images. |
f |
String |
'image' |
Output type |
bboxSR |
Integer |
4326 |
Spatial reference of the bounding box to generate the image with. If you don't know what this is don't change it. |
imageSR |
3857 |
Spatial reference of the output image. If you don't know what this is don't change it. | |
layers |
String or Array |
'' |
An array of Layer IDs like [3,4,5] to show from the service or a string in the format like `[show |
layerDefs |
String Object |
'' |
A string representing a query to run against the service before the image is rendered. This can be a string like "STATE_NAME='Kansas' and POP2007>25000" or an object mapping different queries to specific layers {5:"STATE_NAME='Kansas'", 4:"STATE_NAME='Kansas'} . |
opacity |
Integer |
1 |
Opacity of the layer. Should be a value between 0 and 1. |
position |
String |
'"front"` | position of the layer relative to other overlays |
token |
String |
null |
If you pass a token in your options it will included in all requests to the service. See working with authenticated services for more information. |
Method | Returns | Description |
---|---|---|
identify(latlng, [options](#identify-options), callback) |
null |
Used to identify what features exist in a particular location on a L.esri.DynamicMapLayer . The first parameter is a L.LatLng object. the second if an object setting various options, and finally a callback that will be called with error and response . |
L.esri.DynamicMapLayer
also fires all the same events as L.TileLayer
in addition to these events.
Event | Data | Description |
---|---|---|
metadata |
Metadata |
After creating a new L.esri.DynamicMapLayer a request for data describing the service will be made and passed to the metadata event. |
authenticationrequired |
Authentication |
This will be fired when a request to a service fails and requires authentication. See working with authenticated services for more information. |
var map = L.map('map').setView([ 38.24788726821097,-85.71807861328125], 13 );
L.esri.dynamicMapLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/PublicSafety/PublicSafetyHazardsandRisks/MapServer", {
opacity : 0.25
}).addTo(map);
Extends L.TileLayer
Esri Leaflet can work with tiled map services as well. You can use L.esri.TiledMapLayer(url, options)
to use tiled map services. The url
parameter is the url to the MapServer and options are identical to the options you can pass to L.TileLayer
.
Your map service must be published using the Web Mercator Auxiliary Sphere tiling scheme (WKID 102100/3857) used by Google Maps, Bing Maps and ArcGIS Online. Esri Leaflet will not support any other spatial reference for tile layers.
Constructor | Description |
---|---|
new L.esri.TiledMapLayer(url, options) L.esri.TiledMapLayer(url, options) |
url should be the URL of the feature layer to consume. See service URLs for more information on how to find these urls. |
L.esri.TiledMapLayer
also accepts all the options you can pass to L.TileLayer
.
L.esri.TiledMapLayer
also fires all the same events as L.TileLayer
in addition to these events.
Event | Data | Description |
---|---|---|
metadata |
Metadata |
After creating a new L.esri.TiledMapLayer a request for data describing the service will be made and passed to the metadata event. |
var map = L.map('map').setView([37.761487048570935, -122.39112854003905], 12);
L.esri.tiledMapLayer("http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Household_Income/MapServer", {
opacity: 0.25,
zIndex:2
}).addTo(map);
Extends L.Class
L.esri.ClusteredFeatureLayer
provides integration for Feature Layers with the Leaflet.markercluster plugin. Because of the extra Dependency on Leaflet.markercluster we do not include L.esri.ClusteredFeatureLayer
in the default build of Esri Leaflet. It lives in /dist/extras/clustered-feature-layer.js. You will also need to include your own copy of the Leaflet.markercluster plugin.
Constructor | Description |
---|---|
new L.esri.ClusteredFeatureLayer(url, options) L.esri.clusteredFeatureLayer(url, options) |
url should be the URL of the feature layer to consume. See service URLs for more information on how to find these urls. |
Option | Type | Default | Description |
---|---|---|---|
cluster |
L.MarkerClusterGroup |
new L.MarkerClusterGroup() |
The instance of L.MarkerClusterGroup that points will be added to. |
createMarker |
Function |
null |
A function that will be called with a GeoJSON representation of the point its latitude and longitude. Should return a L.Marker object. |
onEachMarker |
Function | null |
This function will be called for every marker before it is added to the cluster. It is called with the GeoJSON representation of the point and the marker |
token |
String |
null |
If you pass a token in your options it will included in all requests to the service. See working with authenticated services for more information. |
Event | Data | Description |
---|---|---|
loading |
Loading |
Fires when new features start loading. |
load |
Load |
Fires when all features in the current bounds of the map have loaded. |
metadata |
Metadata |
After creating a new L.esri.ClusteredFeatureLayer a request for data describing the service will be made and passed to the metadata event. |
authenticationrequired |
Authentication |
This will be fired when a request to a service fails and requires authentication. See working with authenticated services for more information. |
L.esri.clusteredFeatureLayer("http://services.arcgis.com/rOo16HdIMeOBI4Mb/arcgis/rest/services/stops/FeatureServer/0", {
cluster: new L.MarkerClusterGroup({
disableClusteringAtZoom: 16,
polygonOptions: {
color: "#2d84c8"
},
iconCreateFunction: function(cluster) {
var count = cluster.getChildCount();
var digits = (count+"").length;
return new L.DivIcon({
html: count,
iconSize: null
});
}
}),
createMarker: function (geojson, latlng) {
return L.marker(latlng, {
icon: icons[geojson.properties.direction.toLowerCase()]
});
},
onEachMarker: function(geojson, marker) {
marker.bindPopup("<h3>"+geojson.properties.stop_name+"</h3><p>Stop ID: "+geojson.properties.stop_id+"</p><p>"+geojson.properties.stop_desc+"</p>")
}
}).addTo(map);
The data included in the metadata
event will vary depending on type of layer you are adding to the map.
DynamicMapLayer
andTiledMapLayer
will return the JSON Definition of a Map ServiceFeatureLayer
andClusteredFeatureLayer
will return the JSON Definition of a Feature Layer
Data | Value | Description |
---|---|---|
bounds |
LatLngBounds |
The bounds that features are currently being loaded. |
Data | Value | Description |
---|---|---|
bounds |
LatLngBounds |
The bounds that features where loaded. |
NOTE: The load
event will not fire if you add the layer to the map before adding the event listener. You must add the listener first and then add the layer to the map as follows.
var layer = new L.esri.FeatureLayer(url, options);
layer.on('load', function(e){
// do something on load
});
layer.addTo(map);
Data | Value | Description |
---|---|---|
retry |
Function |
Pass an access token to this method to retry the failed request and update the token parameter for the layer. See working with authenticated services for more information. |
Option | Type | Default | Description |
---|---|---|---|
layers |
String or Array |
'' |
An array of Layer IDs like [3,4,5] to show from the service or a string in the format like `[show |
layerDefs |
String Object |
'' |
A string representing a query to run against the service before the identify query is run. This can be a string like "STATE_NAME='Kansas' and POP2007>25000" or an object mapping different queries to specific layers {5:"STATE_NAME='Kansas'", 4:"STATE_NAME='Kansas'} . |
tolerance |
Integer |
5 | The pixel tolerance with which to buffer features for identifying. |
imageDisplay |
String |
{{mapWidth}},{{mapHeight}},96 |
Coming Soon!
Esri Leaflet supports access private services on ArcGIS Online and ArcGIS Server services that require authentication.
Handing authentication in Esri Leaflet is flexible and lightweight but makes serveral assumptions.
- You (the developer) will handler obtaining and persisting access tokens.
- Esri Leaflet will use your tokens so access services.
- Esri Leaflet will notify you when it recives an error while using your token and prompt you for a new one.
An example of authenticating with a username/password to an ArcGIS Service instance can be found here.
An example of using Oauth 2 to access a private feature service on ArcGIS Online can be found here.
- Fork and clone Esri Leaflet
cd
into theesri-leaflet
folder- Run
git submodule init
andgit submodule update
- Instal the dependancies with
npm install
- The examples in the
/examples
folder should work - Make your changes and create a pull request
- Leaflet - the core Leaflet library
- Leaflet.markercluster - If you want to use
L.esri.ClusteredFeatureLayer
you will need the Leaflet markercluster plugin - Terraformer - base library for other dependencies
- Terraformer ArcGIS - for converting geometries
- Terraformer RTree - client side RTree index for optimizations
These are currently included in /vendor
as submodules and are built into the dist/esri-leaflet.js
file.
Find a bug or want to request a new feature? Please let us know by submitting an issue.
Esri welcomes contributions from anyone and everyone. Please see our guidelines for contributing.
Dymanic Map Layer code is based on code from https://github.com/sanborn/leaflet-ags/blob/master/src/AGS.Layer.Dynamic.js
Copyright 2013 Esri
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
A copy of the license is available in the repository's license.txt file.
[](Esri Tags: ArcGIS Web Mapping Leaflet) [](Esri Language: JavaScript)