From 733b24d871ae7ead10c5682218c546f791a5112c Mon Sep 17 00:00:00 2001 From: ghybs Date: Sun, 6 Oct 2019 22:54:20 +0400 Subject: [PATCH 001/306] test(CircleMarker): add oldLatLng test case for new oldLatLng property of "move" event (added for Circle Marker by PR #6719) --- spec/suites/layer/vector/CircleMarkerSpec.js | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/spec/suites/layer/vector/CircleMarkerSpec.js b/spec/suites/layer/vector/CircleMarkerSpec.js index 11094392da1..4a6a9768b28 100644 --- a/spec/suites/layer/vector/CircleMarkerSpec.js +++ b/spec/suites/layer/vector/CircleMarkerSpec.js @@ -50,4 +50,34 @@ }); }); }); + + describe("#setLatLng", function () { + var map; + + beforeEach(function () { + map = L.map(document.createElement('div')); + map.setView([0, 0], 1); + }); + + it("fires a move event", function () { + + var marker = new L.CircleMarker([0, 0]); + map.addLayer(marker); + + var beforeLatLng = marker._latlng; + var afterLatLng = new L.LatLng(1, 2); + + var eventArgs = null; + marker.on('move', function (e) { + eventArgs = e; + }); + + marker.setLatLng(afterLatLng); + + expect(eventArgs).to.not.be(null); + expect(eventArgs.oldLatLng).to.be(beforeLatLng); + expect(eventArgs.latlng).to.be(afterLatLng); + expect(marker.getLatLng()).to.be(afterLatLng); + }); + }); }); From 292a99d88a5ce339a4c7931894c981a122619c66 Mon Sep 17 00:00:00 2001 From: ghybs Date: Mon, 7 Oct 2019 00:15:35 +0400 Subject: [PATCH 002/306] test(GeoJSON): resetStyle w/o argument should reset style of all child layers (as added by PR #6663) --- spec/suites/layer/GeoJSONSpec.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/spec/suites/layer/GeoJSONSpec.js b/spec/suites/layer/GeoJSONSpec.js index 944e9edc522..c7f0d47069a 100644 --- a/spec/suites/layer/GeoJSONSpec.js +++ b/spec/suites/layer/GeoJSONSpec.js @@ -53,6 +53,36 @@ describe("L.GeoJSON", function () { expect(layer.options.color).to.be('chocolate'); }); + it('should reset init options of all child layers', function () { + var feature = { + type: 'Feature', + geometry: { + type: 'LineString', + coordinates:[[-2.35, 51.38], [-2.38, 51.38]] + } + }; + var feature2 = { + type: 'Feature', + geometry: { + type: 'LineString', + coordinates:[[-3.35, 50.38], [-3.38, 50.38]] + } + }; + var geojson = L.geoJSON([feature, feature2], {weight: 7, color: 'chocolate'}); + geojson.setStyle({weight: 22, color: 'coral'}); + var layer = geojson.getLayers()[0]; + expect(layer.options.weight).to.be(22); + expect(layer.options.color).to.be('coral'); + var layer2 = geojson.getLayers()[1]; + expect(layer2.options.weight).to.be(22); + expect(layer2.options.color).to.be('coral'); + geojson.resetStyle(); // Should apply to all layers + expect(layer.options.weight).to.be(7); + expect(layer.options.color).to.be('chocolate'); + expect(layer2.options.weight).to.be(7); + expect(layer2.options.color).to.be('chocolate'); + }); + }); }); From 85abc8eae54efd3410ba7a33eb0d243fad84e5ed Mon Sep 17 00:00:00 2001 From: ghybs Date: Sat, 19 Oct 2019 00:42:06 +0400 Subject: [PATCH 003/306] test(GeoJSON): TDD case markersInheritOptions see next commit for resolution. --- spec/suites/layer/GeoJSONSpec.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/spec/suites/layer/GeoJSONSpec.js b/spec/suites/layer/GeoJSONSpec.js index 944e9edc522..cae83d2f961 100644 --- a/spec/suites/layer/GeoJSONSpec.js +++ b/spec/suites/layer/GeoJSONSpec.js @@ -31,6 +31,21 @@ describe("L.GeoJSON", function () { layer.addData(geojsonEmpty); expect(layer.getLayers().length).to.eql(0); }); + + it("makes default marker inherit group options if explicitly requested", function () { + // Check first that it does not inherit group options by default + var options = { + customOption: "My Custom Option" + }; + var layer = new L.GeoJSON(null, options); + layer.addData(geojson); + expect(layer.getLayers()[0].options.customOption).to.equal(undefined); + + // Now make it inherit group options + layer.options.markersInheritOptions = true; + layer.addData(geojson); + expect(layer.getLayers()[1].options.customOption).to.eql(options.customOption); + }); }); describe('resetStyle', function () { From 9f1731fa11c8efa3baf8f05f15bebcc2f04000a3 Mon Sep 17 00:00:00 2001 From: ghybs Date: Sat, 19 Oct 2019 00:51:58 +0400 Subject: [PATCH 004/306] feat(GeoJSON): add option markersInheritOptions to make default Marker (built for "Point" type Geometries) now inherit from the options of the GeoJSON Layer Group, as is already the case for Path-based (vector) Layers. Opt-in feature to avoid changing the default behaviour. See #6858 for more details. --- src/layer/GeoJSON.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index f88307e9e1c..110601ac6b7 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -78,6 +78,9 @@ export var GeoJSON = FeatureGroup.extend({ * @option coordsToLatLng: Function = * * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s. * The default is the `coordsToLatLng` static method. + * + * @option markersInheritOptions: Boolean = false + * Whether default Markers for "Point" type Features inherit from group options. */ initialize: function (geojson, options) { @@ -181,12 +184,12 @@ export function geometryToLayer(geojson, options) { switch (geometry.type) { case 'Point': latlng = _coordsToLatLng(coords); - return pointToLayer ? pointToLayer(geojson, latlng) : new Marker(latlng); + return _pointToLayer(pointToLayer, geojson, latlng, options); case 'MultiPoint': for (i = 0, len = coords.length; i < len; i++) { latlng = _coordsToLatLng(coords[i]); - layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new Marker(latlng)); + layers.push(_pointToLayer(pointToLayer, geojson, latlng, options)); } return new FeatureGroup(layers); @@ -219,6 +222,12 @@ export function geometryToLayer(geojson, options) { } } +function _pointToLayer(pointToLayerFn, geojson, latlng, options) { + return pointToLayerFn ? + pointToLayerFn(geojson, latlng) : + new Marker(latlng, options && options.markersInheritOptions && options); +} + // @function coordsToLatLng(coords: Array): LatLng // Creates a `LatLng` object from an array of 2 numbers (longitude, latitude) // or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points. From 665200ca1d07ed7c78abf3fc7398fe7a4777fd2c Mon Sep 17 00:00:00 2001 From: Sagarpreet Chadha Date: Mon, 28 Oct 2019 01:47:16 +0530 Subject: [PATCH 005/306] docs(PLUGINS): Adds Leaflet.Craft (#6842) --- docs/plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 2f84ca0cd69..898c5dd70c6 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2438,6 +2438,15 @@ Allows users to create, draw, edit and/or delete points, lines and polygons. Thibault Coupin + + + Leaflet-Craft + + Extends Leaflet.FreeDraw and gives extended features like Undo-Redo, deleting markers,dynamic area calculation of polygons ,various hooks/events and in-build control bars, etc. + + Sagarpreet Chadha + + From 330a869dbf2ea54551bb26079186fd651d61077f Mon Sep 17 00:00:00 2001 From: Sean Sullivan Date: Tue, 5 Nov 2019 12:00:45 -0500 Subject: [PATCH 006/306] Add test case to ensure scientific notation is correct (#6877) --- spec/suites/core/UtilSpec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/suites/core/UtilSpec.js b/spec/suites/core/UtilSpec.js index 979dcdca605..065dc5b002e 100644 --- a/spec/suites/core/UtilSpec.js +++ b/spec/suites/core/UtilSpec.js @@ -86,6 +86,7 @@ describe('Util', function () { expect(L.Util.formatNum(13.12325555, 3)).to.eql(13.123); expect(L.Util.formatNum(13.12325555)).to.eql(13.123256); expect(L.Util.formatNum(13.12325555, 0)).to.eql(13); + expect(isNaN(L.Util.formatNum(-7.993322e-10))).to.eql(false); }); }); From a55bec8835387b6168d0ef34ebccb3cf601acee4 Mon Sep 17 00:00:00 2001 From: Ben Talagan Babut Date: Tue, 5 Nov 2019 23:14:14 +0100 Subject: [PATCH 007/306] Fix race condition in Marker._setPos when _icon is not present (#6794) * Fix race condition in Marker._setPos when _icon is not present * Add safety check on this._icon * Fixed esdr if * Fixed esdr if * Fix esdr tabs --- src/layer/marker/Marker.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index eebea706cc3..da38058d004 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -287,7 +287,10 @@ export var Marker = Layer.extend({ }, _setPos: function (pos) { - DomUtil.setPosition(this._icon, pos); + + if (this._icon) { + DomUtil.setPosition(this._icon, pos); + } if (this._shadow) { DomUtil.setPosition(this._shadow, pos); @@ -299,7 +302,9 @@ export var Marker = Layer.extend({ }, _updateZIndex: function (offset) { - this._icon.style.zIndex = this._zIndex + offset; + if (this._icon) { + this._icon.style.zIndex = this._zIndex + offset; + } }, _animateZoom: function (opt) { From f8e09f993292579a1af88261c9b461730f22e4e6 Mon Sep 17 00:00:00 2001 From: Chloe McKnight Date: Fri, 8 Nov 2019 04:17:37 -0600 Subject: [PATCH 008/306] Fixes #6605 regarding API docs (#6871) * fixes api docs (Map & Marker) * fixes linting fail --- src/layer/GeoJSON.js | 1 + src/map/Map.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index 110601ac6b7..c5f130ab064 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -311,6 +311,7 @@ var PointToGeoJSON = { }; // @namespace Marker +// @section Other methods // @method toGeoJSON(precision?: Number): Object // `precision` is the number of decimal places for coordinates. // The default value is 6 places. diff --git a/src/map/Map.js b/src/map/Map.js index 796431ec5ee..20836c90235 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -1682,6 +1682,7 @@ export var Map = Evented.extend({ DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim'); } + // @section Other Events // @event zoomanim: ZoomAnimEvent // Fired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom. this.fire('zoomanim', { From 441c5fb0a877ada5d055f0d5f1fa1db8ce7c2957 Mon Sep 17 00:00:00 2001 From: Simon Legner Date: Mon, 11 Nov 2019 08:55:57 +0100 Subject: [PATCH 009/306] doc: run hljs on all documentation pages (#6885) --- docs/docs/js/docs.js | 3 +++ docs/docs/js/reference.js | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/docs/js/docs.js b/docs/docs/js/docs.js index 2a5a82f580f..72fd3973cae 100644 --- a/docs/docs/js/docs.js +++ b/docs/docs/js/docs.js @@ -1,3 +1,6 @@ +/* global hljs */ +hljs.configure({tabReplace: ' '}); +hljs.initHighlighting(); var tocCopy = document.createElement('div'); tocCopy.id = 'toc-copy'; diff --git a/docs/docs/js/reference.js b/docs/docs/js/reference.js index 2b95aee96d7..a1b052499d6 100644 --- a/docs/docs/js/reference.js +++ b/docs/docs/js/reference.js @@ -1,7 +1,3 @@ -/* global hljs */ -hljs.configure({tabReplace: ' '}); -hljs.initHighlighting(); - if (document.body.className.indexOf('api-page') !== -1) { var elems = document.querySelectorAll('h2, h3, h4, tr'); From 241972aca9dd99bebbd300dcdec4bb9f50619d47 Mon Sep 17 00:00:00 2001 From: Andrew Cherniavskii Date: Sun, 17 Nov 2019 22:01:38 +0100 Subject: [PATCH 010/306] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c1a3f95dd72..feeb462859b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leaflet", - "version": "1.5.1", + "version": "1.6.0", "homepage": "https://leafletjs.com/", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { From 33f6f88b7d504241db9681d973c6dbd228b82526 Mon Sep 17 00:00:00 2001 From: Andrew Cherniavskii Date: Sun, 17 Nov 2019 22:11:36 +0100 Subject: [PATCH 011/306] Release 1.6.0 (#6892) * update changelog * add blog post * build docs * update reference and download pages * add new version * update config and announcement * update integrity hashes --- CHANGELOG.md | 30 + docs/_config.yml | 8 +- docs/_posts/2019-11-17-leaflet-1.6.0.md | 26 + docs/download.md | 6 +- docs/index.html | 2 +- docs/reference-1.6.0.html | 24886 ++++++++++++++++++++++ docs/reference-versions.html | 1 + docs/reference.html | 2 +- 8 files changed, 24952 insertions(+), 9 deletions(-) create mode 100644 docs/_posts/2019-11-17-leaflet-1.6.0.md create mode 100644 docs/reference-1.6.0.html diff --git a/CHANGELOG.md b/CHANGELOG.md index ff3871b91e3..bb22a2a6512 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,36 @@ Leaflet Changelog (all changes without author notice are by [@mourner](https://github.com/mourner)) +## 1.6.0 + +### API changes + +* `GeoJSON.resetStyle` - allow invocation without an argument ([#6663](https://github.com/Leaflet/Leaflet/pull/6663) by [joukewitteveen](https://github.com/joukewitteveen)) +* Add new `markersInheritOptions` option to `L.GeoJSON` ([#6866](https://github.com/Leaflet/Leaflet/pull/6866) by [ghybs](https://github.com/ghybs)) + +### Improvements + +* Use passive event listeners ([#6694](https://github.com/Leaflet/Leaflet/pull/6694) by [danielkorte](https://github.com/danielkorte)) +* Add `oldLatLng` coordinates to `L.CircleMarker` `move` event ([#6719](https://github.com/Leaflet/Leaflet/pull/6719) by [errnesto](https://github.com/errnesto)) +* Add tests ([#6839](https://github.com/Leaflet/Leaflet/pull/6839), [#6841](https://github.com/Leaflet/Leaflet/pull/6841) by [ghybs](https://github.com/ghybs)) +* Add test case to ensure scientific notation is formatted correctly ([#6877](https://github.com/Leaflet/Leaflet/pull/6877) by [desean1625](https://github.com/desean1625)) + +### Bug fixes +* Fix performance issue with `L.Util.formatNum` ([#6668](https://github.com/Leaflet/Leaflet/pull/6668) by [cherniavskii](https://github.com/cherniavskii)) +* Respect `className` option in `SVGOverlay` and `VideoOverlay` ([#6679](https://github.com/Leaflet/Leaflet/pull/6679) by [IvanSanchez](https://github.com/IvanSanchez)) +* Cancel the canvas `mousehover` throttle on `mouseout` ([#6749](https://github.com/Leaflet/Leaflet/pull/6749) by [IvanSanchez](https://github.com/IvanSanchez)) +* Check for style being passed in `L.Path.setStyle` ([#6728](https://github.com/Leaflet/Leaflet/pull/6728) by [TheRealTorreySmith](https://github.com/TheRealTorreySmith)) +* Fix `dblclick` event when both Pointer Events and Touch Events are available ([#6855](https://github.com/Leaflet/Leaflet/pull/6855) by [filcab](https://github.com/filcab)) +* Properly unbind animation proxy events when removing map ([#6867](https://github.com/Leaflet/Leaflet/pull/6867) by [ghybs](https://github.com/ghybs)) +* Fix race condition in `Marker` when icon is not present ([#6794](https://github.com/Leaflet/Leaflet/pull/6794) by [BenTalagan](https://github.com/BenTalagan)) + +### Docs & Web Site + +* Update SvgOverlay code example ([#6658](https://github.com/Leaflet/Leaflet/pull/6658) by [cherniavskii](https://github.com/cherniavskii)) +* Fix mobile locate accuracy snippet ([#6693](https://github.com/Leaflet/Leaflet/pull/6693) by [ghybs](https://github.com/ghybs)) +* Fix broken accordions ([#6770](https://github.com/Leaflet/Leaflet/pull/6770) by [mbachner](https://github.com/mbachner)) +* Fix misleading `L.Marker` docs sections ([#6871](https://github.com/Leaflet/Leaflet/pull/6871) by [chloe-mc](https://github.com/chloe-mc)) + ## 1.5.1 (2019-05-08) * Fix module export regression ([#6647](https://github.com/Leaflet/Leaflet/pull/6647) by [cherniavskii](https://github.com/cherniavskii)) diff --git a/docs/_config.yml b/docs/_config.yml index 98b55f58b0f..e2bda19c19d 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -5,12 +5,12 @@ markdown: kramdown kramdown: entity_output: as_input -latest_leaflet_version: 1.5.1 -latest_leaflet_reference: 1.5.0 +latest_leaflet_version: 1.6.0 +latest_leaflet_reference: 1.6.0 # Integrity hashes for both leaflet.js and leaflet-src.js # These will be shown in the downloads page # See https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity integrity_hash_css: "sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" -integrity_hash_source: "sha512-eldJj3obVsCO9Tlrj/J8AFrrTFD4+sN8d9HdwKAqZuSgHloWOm6IzetLy1uQnwh9qLssrY3TAgIJQfjPfQJxHQ==" -integrity_hash_uglified: "sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og==" +integrity_hash_source: "sha512-6axRrTaCntT2gUQQnqcwJCDOQck4lTwHtKTriihNct1L7Ri2J1q0XFYgKJYldo0BTkijrR5X6r41l4OKCCLu/A==" +integrity_hash_uglified: "sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew==" diff --git a/docs/_posts/2019-11-17-leaflet-1.6.0.md b/docs/_posts/2019-11-17-leaflet-1.6.0.md new file mode 100644 index 00000000000..cc1938d6ef2 --- /dev/null +++ b/docs/_posts/2019-11-17-leaflet-1.6.0.md @@ -0,0 +1,26 @@ +--- +layout: post +title: Announcing Leaflet 1.6.0 +description: New release is out! +author: Andrew Cherniavskii +authorsite: https://github.com/cherniavskii +--- + +Leaflet 1.6.0 is out! + +This release brings some new features, as well as bugfixes and improvements! + +Here are some highlights: +- add `oldLatLng` coordinates to `L.CircleMarker` `move` event +- add new `markersInheritOptions` option to `L.GeoJSON` +- fix `dblclick` on iOS 13 +- use passive event listeners + +Big thanks to all contributors who made this release possible! + +Changelog is available [here](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md). + +To get the new release, update your dependencies in your favorite package manager, or check the [downloads page](https://leafletjs.com/download.html). + +Cheers,
+The Leaflet team. diff --git a/docs/download.md b/docs/download.md index 55ff23b9088..bef0b7e20e0 100644 --- a/docs/download.md +++ b/docs/download.md @@ -12,11 +12,11 @@ bodyclass: download-page Description - Leaflet 1.5.1 - Stable version, released on May 8, 2019. + Leaflet 1.6.0 + Stable version, released on November 17, 2019. - Leaflet 1.6-dev + Leaflet 1.7-dev In-progress version, developed on the master branch. diff --git a/docs/index.html b/docs/index.html index d5c168d4d44..cfb0091cdb6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,7 +2,7 @@ layout: v2 --- -
May 8, 2019 — Leaflet 1.5.1 has been released!
+
Nov 17, 2019 — Leaflet 1.6.0 has been released!

Leaflet is the leading open-source JavaScript library for mobile-friendly interactive maps. Weighing just about 38 KB of JS, diff --git a/docs/reference-1.6.0.html b/docs/reference-1.6.0.html new file mode 100644 index 00000000000..86cc9d4a3ee --- /dev/null +++ b/docs/reference-1.6.0.html @@ -0,0 +1,24886 @@ +--- +layout: v2 +title: Documentation +bodyclass: api-page +--- + +

Leaflet API reference

+ +

This reference reflects Leaflet 1.6.0. Check this list if you are using a different version of Leaflet.

+ +
+ +
+

UI Layers

+ +

Raster Layers

+ +

Vector Layers

+ +
+
+

Other Layers

+ +

Basic Types

+ +

Controls

+ +
+
+ + + + + + +

Utility

+ +

DOM Utility

+ +
+
+

Base Classes

+ + +

Misc

+ +
+
+ +

Map

The central class of the API — it is used to create a map on a page and manipulate it.

+ +
+

Usage example

+ +
+ + + + + +
// initialize the map on the "map" div with a given center and zoom
+var map = L.map('map', {
+    center: [51.505, -0.09],
+    zoom: 13
+});
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + + + + + +
FactoryDescription
L.map(<String> id, <Map options> options?)Instantiates a map object given the DOM ID of a <div> element +and optionally an object literal with Map options.
L.map(<HTMLElement> el, <Map options> options?)Instantiates a map object given an instance of a <div> HTML element +and optionally an object literal with Map options.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
preferCanvasBooleanfalseWhether Paths should be rendered on a Canvas renderer. +By default, all Paths are rendered in a SVG renderer.
+ +
+ +

Control options

+ + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
attributionControlBooleantrueWhether a attribution control is added to the map by default.
zoomControlBooleantrueWhether a zoom control is added to the map by default.
+ +
+ +

Interaction Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
closePopupOnClickBooleantrueSet it to false if you don't want popups to close when user clicks the map.
zoomSnapNumber1Forces the map's zoom level to always be a multiple of this, particularly +right after a fitBounds() or a pinch-zoom. +By default, the zoom level snaps to the nearest integer; lower values +(e.g. 0.5 or 0.1) allow for greater granularity. A value of 0 +means the zoom level will not be snapped after fitBounds or a pinch-zoom.
zoomDeltaNumber1Controls how much the map's zoom level will change after a +zoomIn(), zoomOut(), pressing + +or - on the keyboard, or using the zoom controls. +Values smaller than 1 (e.g. 0.5) allow for greater granularity.
trackResizeBooleantrueWhether the map automatically handles browser window resize to update itself.
boxZoomBooleantrueWhether the map can be zoomed to a rectangular area specified by +dragging the mouse while pressing the shift key.
doubleClickZoomBoolean|StringtrueWhether the map can be zoomed in by double clicking on it and +zoomed out by double clicking while holding shift. If passed +'center', double-click zoom will zoom to the center of the + view regardless of where the mouse was.
draggingBooleantrueWhether the map be draggable with mouse/touch or not.
+ +
+ +

Map State Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
crsCRSL.CRS.EPSG3857The Coordinate Reference System to use. Don't change this if you're not +sure what it means.
centerLatLngundefinedInitial geographic center of the map
zoomNumberundefinedInitial map zoom level
minZoomNumber*Minimum zoom level of the map. +If not specified and at least one GridLayer or TileLayer is in the map, +the lowest of their minZoom options will be used instead.
maxZoomNumber*Maximum zoom level of the map. +If not specified and at least one GridLayer or TileLayer is in the map, +the highest of their maxZoom options will be used instead.
layersLayer[][]Array of layers that will be added to the map initially
maxBoundsLatLngBoundsnullWhen this option is set, the map restricts the view to the given +geographical bounds, bouncing the user back if the user tries to pan +outside the view. To set the restriction dynamically, use +setMaxBounds method.
rendererRenderer*The default method for drawing vector layers on the map. L.SVG +or L.Canvas by default depending on browser support.
+ +
+ +

Animation Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
zoomAnimationBooleantrueWhether the map zoom animation is enabled. By default it's enabled +in all browsers that support CSS3 Transitions except Android.
zoomAnimationThresholdNumber4Won't animate zoom if the zoom difference exceeds this value.
fadeAnimationBooleantrueWhether the tile fade animation is enabled. By default it's enabled +in all browsers that support CSS3 Transitions except Android.
markerZoomAnimationBooleantrueWhether markers animate their zoom with the zoom animation, if disabled +they will disappear for the length of the animation. By default it's +enabled in all browsers that support CSS3 Transitions except Android.
transform3DLimitNumber2^23Defines the maximum size of a CSS translation transform. The default +value should not be changed unless a web browser positions layers in +the wrong place after doing a large panBy.
+ +
+ +

Panning Inertia Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
inertiaBoolean*If enabled, panning of the map will have an inertia effect where +the map builds momentum while dragging and continues moving in +the same direction for some time. Feels especially nice on touch +devices. Enabled by default unless running on old Android devices.
inertiaDecelerationNumber3000The rate with which the inertial movement slows down, in pixels/second².
inertiaMaxSpeedNumberInfinityMax speed of the inertial movement, in pixels/second.
easeLinearityNumber0.2
worldCopyJumpBooleanfalseWith this option enabled, the map tracks when you pan to another "copy" +of the world and seamlessly jumps to the original one so that all overlays +like markers and vector layers are still visible.
maxBoundsViscosityNumber0.0If maxBounds is set, this option will control how solid the bounds +are when dragging the map around. The default value of 0.0 allows the +user to drag outside the bounds at normal speed, higher values will +slow down map dragging outside bounds, and 1.0 makes the bounds fully +solid, preventing the user from dragging outside the bounds.
+ +
+ +

Keyboard Navigation Options

+ + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
keyboardBooleantrueMakes the map focusable and allows users to navigate the map with keyboard +arrows and +/- keys.
keyboardPanDeltaNumber80Amount of pixels to pan when pressing an arrow key.
+ +
+ +

Mousewheel options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
scrollWheelZoomBoolean|StringtrueWhether the map can be zoomed by using the mouse wheel. If passed 'center', +it will zoom to the center of the view regardless of where the mouse was.
wheelDebounceTimeNumber40Limits the rate at which a wheel can fire (in milliseconds). By default +user can't zoom via wheel more often than once per 40 ms.
wheelPxPerZoomLevelNumber60How many scroll pixels (as reported by L.DomEvent.getWheelDelta) +mean a change of one full zoom level. Smaller values will make wheel-zooming +faster (and vice versa).
+ +
+ +

Touch interaction options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
tapBooleantrueEnables mobile hacks for supporting instant taps (fixing 200ms click +delay on iOS/Android) and touch holds (fired as contextmenu events).
tapToleranceNumber15The max number of pixels a user can shift his finger during touch +for it to be considered a valid tap.
touchZoomBoolean|String*Whether the map can be zoomed by touch-dragging with two fingers. If +passed 'center', it will zoom to the center of the view regardless of +where the touch events (fingers) were. Enabled for touch-capable web +browsers except for old Androids.
bounceAtZoomLimitsBooleantrueSet it to false if you don't want the map to zoom beyond min/max zoom +and then bounce back when pinch-zooming.
+ +
+ + +
+

Events

+ +
+ +

Layer events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
baselayerchangeLayersControlEventFired when the base layer is changed through the layer control.
overlayaddLayersControlEventFired when an overlay is selected through the layer control.
overlayremoveLayersControlEventFired when an overlay is deselected through the layer control.
layeraddLayerEventFired when a new layer is added to the map.
layerremoveLayerEventFired when some layer is removed from the map
+ +
+ +

Map state change events

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
zoomlevelschangeEventFired when the number of zoomlevels on the map is changed due +to adding or removing a layer.
resizeResizeEventFired when the map is resized.
unloadEventFired when the map is destroyed with remove method.
viewresetEventFired when the map needs to redraw its content (this usually happens +on map zoom or load). Very useful for creating custom overlays.
loadEventFired when the map is initialized (when its center and zoom are set +for the first time).
zoomstartEventFired when the map zoom is about to change (e.g. before zoom animation).
movestartEventFired when the view of the map starts changing (e.g. user starts dragging the map).
zoomEventFired repeatedly during any change in zoom level, including zoom +and fly animations.
moveEventFired repeatedly during any movement of the map, including pan and +fly animations.
zoomendEventFired when the map has changed, after any animations.
moveendEventFired when the center of the map stops changing (e.g. user stopped +dragging the map).
+ +
+ +

Popup events

+ + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup is opened in the map
popupclosePopupEventFired when a popup in the map is closed
autopanstartEventFired when the map starts autopanning when opening a popup.
+ +
+ +

Tooltip events

+ + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip is opened in the map.
tooltipcloseTooltipEventFired when a tooltip in the map is closed.
+ +
+ +

Location events

+ + + + + + + + + + + + + + + + + + + +
EventDataDescription
locationerrorErrorEventFired when geolocation (using the locate method) failed.
locationfoundLocationEventFired when geolocation (using the locate method) +went successfully.
+ +
+ +

Interaction events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the map.
dblclickMouseEventFired when the user double-clicks (or double-taps) the map.
mousedownMouseEventFired when the user pushes the mouse button on the map.
mouseupMouseEventFired when the user releases the mouse button on the map.
mouseoverMouseEventFired when the mouse enters the map.
mouseoutMouseEventFired when the mouse leaves the map.
mousemoveMouseEventFired while the mouse moves over the map.
contextmenuMouseEventFired when the user pushes the right mouse button on the map, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
keypressKeyboardEventFired when the user presses a key from the keyboard that produces a character value while the map is focused.
keydownKeyboardEventFired when the user presses a key from the keyboard while the map is focused. Unlike the keypress event, +the keydown event is fired for keys that produce a character value and for keys +that do not produce a character value.
keyupKeyboardEventFired when the user releases a key from the keyboard while the map is focused.
preclickMouseEventFired before mouse click on the map (sometimes useful when you +want something to happen on click before any existing click +handlers start running).
+ +
+ +

Other Events

+ + + + + + + + + + + + + + +
EventDataDescription
zoomanimZoomAnimEventFired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom.
+ +
+ + +
+

Methods

+ +
+ + + + + + + + + + + + + + + + +
MethodReturnsDescription
getRenderer(<Path> layer)Renderer

Returns the instance of Renderer that should be used to render the given +Path. It will ensure that the renderer options of the map and paths +are respected, and that the renderers do exist on the map.

+
+ +
+ +

Methods for Layers and Controls

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addControl(<Control> control)this

Adds the given control to the map

+
removeControl(<Control> control)this

Removes the given control from the map

+
addLayer(<Layer> layer)this

Adds the given layer to the map

+
removeLayer(<Layer> layer)this

Removes the given layer from the map.

+
hasLayer(<Layer> layer)Boolean

Returns true if the given layer is currently added to the map

+
eachLayer(<Function> fn, <Object> context?)this

Iterates over the layers of the map, optionally specifying context of the iterator function.

+
map.eachLayer(function(layer){
+    layer.bindPopup('Hello');
+});
+
openPopup(<Popup> popup)this

Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).

+
openPopup(<String|HTMLElement> content, <LatLng> latlng, <Popup options> options?)this

Creates a popup with the specified content and options and opens it in the given point on a map.

+
closePopup(<Popup> popup?)this

Closes the popup previously opened with openPopup (or the given one).

+
openTooltip(<Tooltip> tooltip)this

Opens the specified tooltip.

+
openTooltip(<String|HTMLElement> content, <LatLng> latlng, <Tooltip options> options?)this

Creates a tooltip with the specified content and options and open it.

+
closeTooltip(<Tooltip> tooltip?)this

Closes the tooltip given as parameter.

+
+ +
+ +

Methods for modifying map state

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
setView(<LatLng> center, <Number> zoom, <Zoom/pan options> options?)this

Sets the view of the map (geographical center and zoom) with the given +animation options.

+
setZoom(<Number> zoom, <Zoom/pan options> options?)this

Sets the zoom of the map.

+
zoomIn(<Number> delta?, <Zoom options> options?)this

Increases the zoom of the map by delta (zoomDelta by default).

+
zoomOut(<Number> delta?, <Zoom options> options?)this

Decreases the zoom of the map by delta (zoomDelta by default).

+
setZoomAround(<LatLng> latlng, <Number> zoom, <Zoom options> options)this

Zooms the map while keeping a specified geographical point on the map +stationary (e.g. used internally for scroll zoom and double-click zoom).

+
setZoomAround(<Point> offset, <Number> zoom, <Zoom options> options)this

Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.

+
fitBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

Sets a map view that contains the given geographical bounds with the +maximum zoom level possible.

+
fitWorld(<fitBounds options> options?)this

Sets a map view that mostly contains the whole world with the maximum +zoom level possible.

+
panTo(<LatLng> latlng, <Pan options> options?)this

Pans the map to a given center.

+
panBy(<Point> offset, <Pan options> options?)this

Pans the map by a given number of pixels (animated).

+
flyTo(<LatLng> latlng, <Number> zoom?, <Zoom/pan options> options?)this

Sets the view of the map (geographical center and zoom) performing a smooth +pan-zoom animation.

+
flyToBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

Sets the view of the map with a smooth animation like flyTo, +but takes a bounds parameter like fitBounds.

+
setMaxBounds(<Bounds> bounds)this

Restricts the map view to the given bounds (see the maxBounds option).

+
setMinZoom(<Number> zoom)this

Sets the lower limit for the available zoom levels (see the minZoom option).

+
setMaxZoom(<Number> zoom)this

Sets the upper limit for the available zoom levels (see the maxZoom option).

+
panInsideBounds(<LatLngBounds> bounds, <Pan options> options?)this

Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.

+
panInside(<LatLng> latlng, <options> options?)this

Pans the map the minimum amount to make the latlng visible. Use +padding, paddingTopLeft and paddingTopRight options to fit +the display to more restricted bounds, like fitBounds. +If latlng is already within the (optionally padded) display bounds, +the map will not be panned.

+
invalidateSize(<Zoom/pan options> options)this

Checks if the map container size changed and updates the map if so — +call it after you've changed the map size dynamically, also animating +pan by default. If options.pan is false, panning will not occur. +If options.debounceMoveend is true, it will delay moveend event so +that it doesn't happen often even if the method is called many +times in a row.

+
invalidateSize(<Boolean> animate)this

Checks if the map container size changed and updates the map if so — +call it after you've changed the map size dynamically, also animating +pan by default.

+
stop()this

Stops the currently running panTo or flyTo animation, if any.

+
+ +
+ +

Geolocation methods

+ + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
locate(<Locate options> options?)this

Tries to locate the user using the Geolocation API, firing a locationfound +event with location data on success or a locationerror event on failure, +and optionally sets the map view to the user's location with respect to +detection accuracy (or to the world view if geolocation failed). +Note that, if your page doesn't use HTTPS, this method will fail in +modern browsers (Chrome 50 and newer) +See Locate options for more details.

+
stopLocate()this

Stops watching location previously initiated by map.locate({watch: true}) +and aborts resetting the map view if map.locate was called with +{setView: true}.

+
+ +
+ +

Other Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addHandler(<String> name, <Function> HandlerClass)this

Adds a new Handler to the map, given its name and constructor function.

+
remove()this

Destroys the map and clears all related event listeners.

+
createPane(<String> name, <HTMLElement> container?)HTMLElement

Creates a new map pane with the given name if it doesn't exist already, +then returns it. The pane is created as a child of container, or +as a child of the main map pane if not set.

+
getPane(<String|HTMLElement> pane)HTMLElement

Returns a map pane, given its name or its HTML element (its identity).

+
getPanes()Object

Returns a plain object containing the names of all panes as keys and +the panes as values.

+
getContainer()HTMLElement

Returns the HTML element that contains the map.

+
whenReady(<Function> fn, <Object> context?)this

Runs the given function fn when the map gets initialized with +a view (center and zoom) and at least one layer, or immediately +if it's already initialized, optionally passing a function context.

+
+ +
+ +

Methods for Getting Map State

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
getCenter()LatLng

Returns the geographical center of the map view

+
getZoom()Number

Returns the current zoom level of the map view

+
getBounds()LatLngBounds

Returns the geographical bounds visible in the current map view

+
getMinZoom()Number

Returns the minimum zoom level of the map (if set in the minZoom option of the map or of any layers), or 0 by default.

+
getMaxZoom()Number

Returns the maximum zoom level of the map (if set in the maxZoom option of the map or of any layers).

+
getBoundsZoom(<LatLngBounds> bounds, <Boolean> inside?, <Point> padding?)Number

Returns the maximum zoom level on which the given bounds fit to the map +view in its entirety. If inside (optional) is set to true, the method +instead returns the minimum zoom level on which the map view fits into +the given bounds in its entirety.

+
getSize()Point

Returns the current size of the map container (in pixels).

+
getPixelBounds()Bounds

Returns the bounds of the current map view in projected pixel +coordinates (sometimes useful in layer and overlay implementations).

+
getPixelOrigin()Point

Returns the projected pixel coordinates of the top left point of +the map layer (useful in custom layer and overlay implementations).

+
getPixelWorldBounds(<Number> zoom?)Bounds

Returns the world's bounds in pixel coordinates for zoom level zoom. +If zoom is omitted, the map's current zoom level is used.

+
+ +
+ +

Conversion Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
getZoomScale(<Number> toZoom, <Number> fromZoom)Number

Returns the scale factor to be applied to a map transition from zoom level +fromZoom to toZoom. Used internally to help with zoom animations.

+
getScaleZoom(<Number> scale, <Number> fromZoom)Number

Returns the zoom level that the map would end up at, if it is at fromZoom +level and everything is scaled by a factor of scale. Inverse of +getZoomScale.

+
project(<LatLng> latlng, <Number> zoom)Point

Projects a geographical coordinate LatLng according to the projection +of the map's CRS, then scales it according to zoom and the CRS's +Transformation. The result is pixel coordinate relative to +the CRS origin.

+
unproject(<Point> point, <Number> zoom)LatLng

Inverse of project.

+
layerPointToLatLng(<Point> point)LatLng

Given a pixel coordinate relative to the origin pixel, +returns the corresponding geographical coordinate (for the current zoom level).

+
latLngToLayerPoint(<LatLng> latlng)Point

Given a geographical coordinate, returns the corresponding pixel coordinate +relative to the origin pixel.

+
wrapLatLng(<LatLng> latlng)LatLng

Returns a LatLng where lat and lng has been wrapped according to the +map's CRS's wrapLat and wrapLng properties, if they are outside the +CRS's bounds. +By default this means longitude is wrapped around the dateline so its +value is between -180 and +180 degrees.

+
wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

Returns a LatLngBounds with the same size as the given one, ensuring that +its center is within the CRS's bounds. +By default this means the center longitude is wrapped around the dateline so its +value is between -180 and +180 degrees, and the majority of the bounds +overlaps the CRS's bounds.

+
distance(<LatLng> latlng1, <LatLng> latlng2)Number

Returns the distance between two geographical coordinates according to +the map's CRS. By default this measures distance in meters.

+
containerPointToLayerPoint(<Point> point)Point

Given a pixel coordinate relative to the map container, returns the corresponding +pixel coordinate relative to the origin pixel.

+
layerPointToContainerPoint(<Point> point)Point

Given a pixel coordinate relative to the origin pixel, +returns the corresponding pixel coordinate relative to the map container.

+
containerPointToLatLng(<Point> point)LatLng

Given a pixel coordinate relative to the map container, returns +the corresponding geographical coordinate (for the current zoom level).

+
latLngToContainerPoint(<LatLng> latlng)Point

Given a geographical coordinate, returns the corresponding pixel coordinate +relative to the map container.

+
mouseEventToContainerPoint(<MouseEvent> ev)Point

Given a MouseEvent object, returns the pixel coordinate relative to the +map container where the event took place.

+
mouseEventToLayerPoint(<MouseEvent> ev)Point

Given a MouseEvent object, returns the pixel coordinate relative to +the origin pixel where the event took place.

+
mouseEventToLatLng(<MouseEvent> ev)LatLng

Given a MouseEvent object, returns geographical coordinate where the +event took place.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +
+

Properties

+ +
+ +

Controls

+ + + + + + + + + + + + + + +
PropertyTypeDescription
zoomControlControl.ZoomThe default zoom control (only available if the +zoomControl option was true when creating the map).
+ +
+ +

Handlers

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
boxZoomHandlerBox (shift-drag with mouse) zoom handler.
doubleClickZoomHandlerDouble click zoom handler.
draggingHandlerMap dragging handler (by both mouse and touch).
keyboardHandlerKeyboard navigation handler.
scrollWheelZoomHandlerScroll wheel zoom handler.
tapHandlerMobile touch hacks (quick tap and touch hold) handler.
touchZoomHandlerTouch zoom handler.
+ +
+ + +
+

Map panes

+ +
+ + + +
Panes are DOM elements used to control the ordering of layers on the map. You +can access panes with map.getPane or +map.getPanes methods. New panes can be created with the +map.createPane method. +Every map has the following default panes that differ only in zIndex.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PaneTypeZ-indexDescription
mapPaneHTMLElement'auto'Pane that contains all other map panes
tilePaneHTMLElement200Pane for GridLayers and TileLayers
overlayPaneHTMLElement400Pane for vectors (Paths, like Polylines and Polygons), ImageOverlays and VideoOverlays
shadowPaneHTMLElement500Pane for overlay shadows (e.g. Marker shadows)
markerPaneHTMLElement600Pane for Icons of Markers
tooltipPaneHTMLElement650Pane for Tooltips.
popupPaneHTMLElement700Pane for Popups.
+ +
+ + +
+ +
+

Locate options

+ +
+ + + +
Some of the geolocation methods for Map take in an options parameter. This +is a plain javascript object with the following optional components:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
watchBooleanfalseIf true, starts continuous watching of location changes (instead of detecting it +once) using W3C watchPosition method. You can later stop watching using +map.stopLocate() method.
setViewBooleanfalseIf true, automatically sets the map view to the user location with respect to +detection accuracy, or to world view if geolocation failed.
maxZoomNumberInfinityThe maximum zoom for automatic view setting when using setView option.
timeoutNumber10000Number of milliseconds to wait for a response from geolocation before firing a +locationerror event.
maximumAgeNumber0Maximum age of detected location. If less than this amount of milliseconds +passed since last geolocation response, locate will return a cached location.
enableHighAccuracyBooleanfalseEnables high accuracy, see description in the W3C spec.
+ +
+ + +
+ +
+

Zoom options

+ +
+ + + +
Some of the Map methods which modify the zoom level take in an options +parameter. This is a plain javascript object with the following optional +components:
+ + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
+ +
+ + +
+ +
+

Pan options

+ +
+ + + +
Some of the Map methods which modify the center of the map take in an options +parameter. This is a plain javascript object with the following optional +components:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
animateBooleanIf true, panning will always be animated if possible. If false, it will +not animate panning, either resetting the map view if panning more than a +screen away, or just setting a new offset for the map pane (except for panBy +which always does the latter).
durationNumber0.25Duration of animated panning, in seconds.
easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
+ +
+ + +
+ +
+

Zoom/pan options

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
durationNumber0.25Duration of animated panning, in seconds.
easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
+ +
+
+
+ +
+ +
+

FitBounds options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paddingTopLeftPoint[0, 0]Sets the amount of padding in the top left corner of a map container that +shouldn't be accounted for when setting the view to fit bounds. Useful if you +have some control overlays on the map like a sidebar and you don't want them +to obscure objects you're zooming to.
paddingBottomRightPoint[0, 0]The same for the bottom right corner of the map.
paddingPoint[0, 0]Equivalent of setting both top left and bottom right padding to the same value.
maxZoomNumbernullThe maximum possible zoom to use.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
durationNumber0.25Duration of animated panning, in seconds.
easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
+ +
+
+
+ +

Marker

L.Marker is used to display clickable/draggable icons on the map. Extends Layer.

+ +
+

Usage example

+ +
+ + + + + +
L.marker([50.5, 30.5]).addTo(map);
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.marker(<LatLng> latlng, <Marker options> options?)Instantiates a Marker object given a geographical point and optionally an options object.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
iconIcon*Icon instance to use for rendering the marker. +See Icon documentation for details on how to customize the marker icon. +If not specified, a common instance of L.Icon.Default is used.
keyboardBooleantrueWhether the marker can be tabbed to with a keyboard and clicked by pressing enter.
titleString''Text for the browser tooltip that appear on marker hover (no tooltip by default).
altString''Text for the alt attribute of the icon image (useful for accessibility).
zIndexOffsetNumber0By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
opacityNumber1.0The opacity of the marker.
riseOnHoverBooleanfalseIf true, the marker will get on top of others when you hover the mouse over it.
riseOffsetNumber250The z-index offset used for the riseOnHover feature.
paneString'markerPane'Map pane where the markers icon will be added. +Map pane where the markers shadow will be added.
bubblingMouseEventsBooleanfalseWhen true, a mouse event on this marker will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
+ +
+ +

Draggable marker options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
draggableBooleanfalseWhether the marker is draggable with mouse/touch or not.
autoPanBooleanfalseWhether to pan the map when dragging this marker near its edge or not.
autoPanPaddingPointPoint(50, 50)Distance (in pixels to the left/right and to the top/bottom) of the +map edge to start panning the map.
autoPanSpeedNumber10Number of pixels the map should pan by.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ +
+ + + + + + + + + + + + + + + + +
EventDataDescription
moveEventFired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng.
+ +
+ +

Dragging events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
dragstartEventFired when the user starts dragging the marker.
movestartEventFired when the marker starts moving (because of dragging).
dragEventFired repeatedly while the user drags the marker.
dragendDragEndEventFired when the user stops dragging the marker.
moveendEventFired when the marker stops moving (because of dragging).
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the layer.
dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
mousedownMouseEventFired when the user pushes the mouse button on the layer.
mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
mouseoverMouseEventFired when the mouse enters the layer.
mouseoutMouseEventFired when the mouse leaves the layer.
contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + +
In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
getLatLng()LatLng

Returns the current geographical position of the marker.

+
setLatLng(<LatLng> latlng)this

Changes the marker position to the given point.

+
setZIndexOffset(<Number> offset)this

Changes the zIndex offset of the marker.

+
getIcon()Icon

Returns the current icon used by the marker

+
setIcon(<Icon> icon)this

Changes the marker icon.

+
setOpacity(<Number> opacity)this

Changes the opacity of the marker.

+
+ +
+ +

Other methods

+ + + + + + + + + + + + + + +
MethodReturnsDescription
toGeoJSON(<Number> precision?)Object

precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the marker (as a GeoJSON Point Feature).

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +
+

Properties

+ +
+ +

Interaction handlers

+ +
Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see Handler methods). Example: +
marker.dragging.disable();
+
+ + + + + + + + + + + + + +
PropertyTypeDescription
draggingHandlerMarker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set marker.options.draggable).
+ +
+ + +

Used to open popups in certain places of the map. Use Map.openPopup to +open popups while making sure that only one popup is open at one time +(recommended for usability), or use Map.addLayer to open as many as you want.

+ +
+ + +
+ + + + + +

If you want to just bind a popup to marker click and then open it, it's really easy:

+
marker.bindPopup(popupContent).openPopup();
+
+

Path overlays like polylines also have a bindPopup method. +Here's a more complicated way to open a popup on a map:

+
var popup = L.popup()
+    .setLatLng(latlng)
+    .setContent('<p>Hello world!<br />This is a nice popup.</p>')
+    .openOn(map);
+
+ + + +
+ + +
+ + +
+ + + + + + + + + + + + + + +
FactoryDescription
+ +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
+ +
+
+
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
+ +
+
+
+ +

Tooltip

Used to display small texts on top of map layers.

+ +
+

Usage example

+ +
+ + + + + +
marker.bindTooltip("my tooltip text").openTooltip();
+
+

Note about tooltip offset. Leaflet takes two options in consideration +for computing tooltip offsetting:

+
    +
  • the offset Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. +Add a positive x offset to move the tooltip to the right, and a positive y offset to +move it to the bottom. Negatives will move to the left and top.
  • +
  • the tooltipAnchor Icon option: this will only be considered for Marker. You +should adapt this value if you use a custom icon.
  • +
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.tooltip(<Tooltip options> options?, <Layer> source?)Instantiates a Tooltip object given an optional options object that describes its appearance and location and an optional source object that is used to tag the tooltip with a reference to the Layer to which it refers.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'tooltipPane'Map pane where the tooltip will be added.
offsetPointPoint(0, 0)Optional offset of the tooltip position.
directionString'auto'Direction where to open the tooltip. Possible values are: right, left, +top, bottom, center, auto. +auto will dynamically switch between right and left according to the tooltip +position on the map.
permanentBooleanfalseWhether to open the tooltip permanently or only on mouseover.
stickyBooleanfalseIf true, the tooltip will follow the mouse instead of being fixed at the feature center.
interactiveBooleanfalseIf true, the tooltip will listen to the feature events.
opacityNumber0.9Tooltip container opacity.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
classNameString''A custom CSS class name to assign to the popup.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

TileLayer

Used to load and display tile layers on the map. Note that most tile servers require attribution, which you can set under Layer. Extends GridLayer.

+ +
+

Usage example

+ +
+ + + + + +
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar', attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'}).addTo(map);
+
+ + + +
+ +

URL template

+ + + +

A string of the following form:

+
'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
+

{s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates. {r} can be used to add "@2x" to the URL to load retina tiles. +You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

+
L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
+
+ + +
+ + +
+

Creation

+ +
+ +

Extension methods

+ + + + + + + + + + + + +
FactoryDescription
L.tilelayer(<String> urlTemplate, <TileLayer options> options?)Instantiates a tile layer object given a URL template and optionally an options object.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
maxZoomNumber18The maximum zoom level up to which this layer will be displayed (inclusive).
subdomainsString|String[]'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
errorTileUrlString''URL to the tile image to show in place of the tile that failed to load.
zoomOffsetNumber0The zoom number used in tile URLs will be offset with this value.
tmsBooleanfalseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
zoomReverseBooleanfalseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
detectRetinaBooleanfalseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the tiles. +If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. +Refer to CORS Settings for valid String values.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
updateWhenIdleBoolean(depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
zIndexNumber1The explicit zIndex of the tile layer.
boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with bounds to prevent requesting +tiles outside the CRS limits.
paneString'tilePane'Map pane where the grid layer will be added.
classNameString''A custom class name to assign to the tile layer. Empty by default.
keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
loadingEventFired when the grid layer starts loading tiles.
tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
tileloadstartTileEventFired when a tile is requested and starts loading.
tileerrorTileErrorEventFired when there is an error loading a tile.
tileloadTileEventFired when a tile loads.
loadEventFired when the grid layer loaded all visible tiles.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
setUrl(<String> url, <Boolean> noRedraw?)this

Updates the layer's URL template and redraws it (unless noRedraw is set to true). +If the URL does not change, the layer will not be redrawn unless +the noRedraw parameter is set to false.

+
createTile(<Object> coords, <Function> done?)HTMLElement

Called only internally, overrides GridLayer's createTile() +to return an <img> HTML element with the appropriate image URL given coords. The done +callback is called when the tile has been loaded.

+
+ +
+ +

Extension methods

+ +
Layers extending TileLayer might reimplement the following method.
+ + + + + + + + + + + + + +
MethodReturnsDescription
getTileUrl(<Object> coords)String

Called only internally, returns the URL for a tile given its coordinates. +Classes extending TileLayer can override this function to provide custom tile URL naming schemes.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bringToFront()this

Brings the tile layer to the top of all tile layers.

+
bringToBack()this

Brings the tile layer to the bottom of all tile layers.

+
getContainer()HTMLElement

Returns the HTML element that contains the tiles for this layer.

+
setOpacity(<Number> opacity)this

Changes the opacity of the grid layer.

+
setZIndex(<Number> zIndex)this

Changes the zIndex of the grid layer.

+
isLoading()Boolean

Returns true if any tile in the grid layer has not finished loading.

+
redraw()this

Causes the layer to clear all the tiles and request them again.

+
getTileSize()Point

Normalizes the tileSize option into a point. Used by the createTile() method.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

TileLayer.WMS

Used to display WMS services as tile layers on the map. Extends TileLayer.

+ +
+

Usage example

+ +
+ + + + + +
var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
+    layers: 'nexrad-n0r-900913',
+    format: 'image/png',
+    transparent: true,
+    attribution: "Weather data © 2012 IEM Nexrad"
+});
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.tileLayer.wms(<String> baseUrl, <TileLayer.WMS options> options)Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
+ +
+ + +
+

Options

+ +
+ + + +
If any custom options not documented here are used, they will be sent to the +WMS server as extra parameters in each request URL. This can be useful for +non-standard vendor WMS parameters.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
layersString''(required) Comma-separated list of WMS layers to show.
stylesString''Comma-separated list of WMS styles.
formatString'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
transparentBooleanfalseIf true, the WMS service will return images with transparency.
versionString'1.1.1'Version of the WMS service to use
crsCRSnullCoordinate Reference System to use for the WMS requests, defaults to +map CRS. Don't change this if you're not sure what it means.
uppercaseBooleanfalseIf true, WMS request parameter keys will be uppercase.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
maxZoomNumber18The maximum zoom level up to which this layer will be displayed (inclusive).
subdomainsString|String[]'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
errorTileUrlString''URL to the tile image to show in place of the tile that failed to load.
zoomOffsetNumber0The zoom number used in tile URLs will be offset with this value.
tmsBooleanfalseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
zoomReverseBooleanfalseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
detectRetinaBooleanfalseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the tiles. +If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. +Refer to CORS Settings for valid String values.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
updateWhenIdleBoolean(depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
zIndexNumber1The explicit zIndex of the tile layer.
boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with bounds to prevent requesting +tiles outside the CRS limits.
paneString'tilePane'Map pane where the grid layer will be added.
classNameString''A custom class name to assign to the tile layer. Empty by default.
keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
loadingEventFired when the grid layer starts loading tiles.
tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
tileloadstartTileEventFired when a tile is requested and starts loading.
tileerrorTileErrorEventFired when there is an error loading a tile.
tileloadTileEventFired when a tile loads.
loadEventFired when the grid layer loaded all visible tiles.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + +
MethodReturnsDescription
setParams(<Object> params, <Boolean> noRedraw?)this

Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true).

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
setUrl(<String> url, <Boolean> noRedraw?)this

Updates the layer's URL template and redraws it (unless noRedraw is set to true). +If the URL does not change, the layer will not be redrawn unless +the noRedraw parameter is set to false.

+
createTile(<Object> coords, <Function> done?)HTMLElement

Called only internally, overrides GridLayer's createTile() +to return an <img> HTML element with the appropriate image URL given coords. The done +callback is called when the tile has been loaded.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bringToFront()this

Brings the tile layer to the top of all tile layers.

+
bringToBack()this

Brings the tile layer to the bottom of all tile layers.

+
getContainer()HTMLElement

Returns the HTML element that contains the tiles for this layer.

+
setOpacity(<Number> opacity)this

Changes the opacity of the grid layer.

+
setZIndex(<Number> zIndex)this

Changes the zIndex of the grid layer.

+
isLoading()Boolean

Returns true if any tile in the grid layer has not finished loading.

+
redraw()this

Causes the layer to clear all the tiles and request them again.

+
getTileSize()Point

Normalizes the tileSize option into a point. Used by the createTile() method.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

ImageOverlay

Used to load and display a single image over specific bounds of the map. Extends Layer.

+ +
+

Usage example

+ +
+ + + + + +
var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
+    imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
+L.imageOverlay(imageUrl, imageBounds).addTo(map);
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.imageOverlay(<String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options?)Instantiates an image overlay object given the URL of the image and the +geographical bounds it is tied to.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
opacityNumber1.0The opacity of the image overlay.
altString''Text for the alt attribute of the image (useful for accessibility).
interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
zIndexNumber1The explicit zIndex of the overlay layer.
classNameString''A custom class name to assign to the image. Empty by default.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ +
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
loadEventFired when the ImageOverlay layer has loaded its image
errorEventFired when the ImageOverlay layer fails to load its image
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the layer.
dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
mousedownMouseEventFired when the user pushes the mouse button on the layer.
mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
mouseoverMouseEventFired when the mouse enters the layer.
mouseoutMouseEventFired when the mouse leaves the layer.
contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
setOpacity(<Number> opacity)this

Sets the opacity of the overlay.

+
bringToFront()this

Brings the layer to the top of all overlays.

+
bringToBack()this

Brings the layer to the bottom of all overlays.

+
setUrl(<String> url)this

Changes the URL of the image.

+
setBounds(<LatLngBounds> bounds)this

Update the bounds that this ImageOverlay covers

+
setZIndex(<Number> value)this

Changes the zIndex of the image overlay.

+
getBounds()LatLngBounds

Get the bounds that this ImageOverlay covers

+
getElement()HTMLElement

Returns the instance of HTMLImageElement +used by this overlay.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

VideoOverlay

Used to load and display a video player over specific bounds of the map. Extends ImageOverlay. +A video overlay uses the <video> +HTML5 element.

+ +
+

Usage example

+ +
+ + + + + +
var videoUrl = 'https://www.mapbox.com/bites/00188/patricia_nasa.webm',
+    videoBounds = [[ 32, -130], [ 13, -100]];
+L.videoOverlay(videoUrl, videoBounds ).addTo(map);
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.videoOverlay(<String|Array|HTMLVideoElement> video, <LatLngBounds> bounds, <VideoOverlay options> options?)Instantiates an image overlay object given the URL of the video (or array of URLs, or even a video element) and the +geographical bounds it is tied to.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
autoplayBooleantrueWhether the video starts playing automatically when loaded.
loopBooleantrueWhether the video will loop back to the beginning when played.
keepAspectRatioBooleantrueWhether the video will save aspect ratio after the projection. +Relevant for supported browsers. Browser compatibility- https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
opacityNumber1.0The opacity of the image overlay.
altString''Text for the alt attribute of the image (useful for accessibility).
interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
zIndexNumber1The explicit zIndex of the overlay layer.
classNameString''A custom class name to assign to the image. Empty by default.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ +
+ + + + + + + + + + + + + + + + +
EventDataDescription
loadEventFired when the video has finished loading the first frame
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + +
EventDataDescription
errorEventFired when the ImageOverlay layer fails to load its image
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the layer.
dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
mousedownMouseEventFired when the user pushes the mouse button on the layer.
mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
mouseoverMouseEventFired when the mouse enters the layer.
mouseoutMouseEventFired when the mouse leaves the layer.
contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + +
MethodReturnsDescription
getElement()HTMLVideoElement

Returns the instance of HTMLVideoElement +used by this overlay.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
setOpacity(<Number> opacity)this

Sets the opacity of the overlay.

+
bringToFront()this

Brings the layer to the top of all overlays.

+
bringToBack()this

Brings the layer to the bottom of all overlays.

+
setUrl(<String> url)this

Changes the URL of the image.

+
setBounds(<LatLngBounds> bounds)this

Update the bounds that this ImageOverlay covers

+
setZIndex(<Number> value)this

Changes the zIndex of the image overlay.

+
getBounds()LatLngBounds

Get the bounds that this ImageOverlay covers

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

SVGOverlay

Used to load, display and provide DOM access to an SVG file over specific bounds of the map. Extends ImageOverlay. +An SVG overlay uses the <svg> element.

+ +
+

Usage example

+ +
+ + + + + +
var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
+svgElement.setAttribute('xmlns', "http://www.w3.org/2000/svg");
+svgElement.setAttribute('viewBox', "0 0 200 200");
+svgElement.innerHTML = '<rect width="200" height="200"/><rect x="75" y="23" width="50" height="50" style="fill:red"/><rect x="75" y="123" width="50" height="50" style="fill:#0013ff"/>';
+var svgElementBounds = [ [ 32, -130 ], [ 13, -100 ] ];
+L.svgOverlay(svgElement, svgElementBounds).addTo(map);
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.svgOverlay(<String|SVGElement> svg, <LatLngBounds> bounds, <SVGOverlay options> options?)Instantiates an image overlay object given an SVG element and the geographical bounds it is tied to. +A viewBox attribute is required on the SVG element to zoom in and out properly.
+ +
+ + +
+

Options

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
opacityNumber1.0The opacity of the image overlay.
altString''Text for the alt attribute of the image (useful for accessibility).
interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
zIndexNumber1The explicit zIndex of the overlay layer.
classNameString''A custom class name to assign to the image. Empty by default.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
loadEventFired when the ImageOverlay layer has loaded its image
errorEventFired when the ImageOverlay layer fails to load its image
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the layer.
dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
mousedownMouseEventFired when the user pushes the mouse button on the layer.
mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
mouseoverMouseEventFired when the mouse enters the layer.
mouseoutMouseEventFired when the mouse leaves the layer.
contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + +
MethodReturnsDescription
getElement()SVGElement

Returns the instance of SVGElement +used by this overlay.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
setOpacity(<Number> opacity)this

Sets the opacity of the overlay.

+
bringToFront()this

Brings the layer to the top of all overlays.

+
bringToBack()this

Brings the layer to the bottom of all overlays.

+
setUrl(<String> url)this

Changes the URL of the image.

+
setBounds(<LatLngBounds> bounds)this

Update the bounds that this ImageOverlay covers

+
setZIndex(<Number> value)this

Changes the zIndex of the image overlay.

+
getBounds()LatLngBounds

Get the bounds that this ImageOverlay covers

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

Path

An abstract class that contains options and constants shared between vector +overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

+ +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
colorString'#3388ff'Stroke color
weightNumber3Stroke width in pixels
opacityNumber1.0Stroke opacity
lineCapString'round'A string that defines shape to be used at the end of the stroke.
lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
fillColorString*Fill color. Defaults to the value of the color option
fillOpacityNumber0.2Fill opacity.
fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
classNameStringnullCustom class name set on an element. Only for SVG renderer.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the layer.
dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
mousedownMouseEventFired when the user pushes the mouse button on the layer.
mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
mouseoverMouseEventFired when the mouse enters the layer.
mouseoutMouseEventFired when the mouse leaves the layer.
contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
redraw()this

Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

+
setStyle(<Path options> style)this

Changes the appearance of a Path based on the options in the Path options object.

+
bringToFront()this

Brings the layer to the top of all path layers.

+
bringToBack()this

Brings the layer to the bottom of all path layers.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

Polyline

A class for drawing polyline overlays on a map. Extends Path.

+ +
+

Usage example

+ +
+ + + + + +
// create a red polyline from an array of LatLng points
+var latlngs = [
+    [45.51, -122.68],
+    [37.77, -122.43],
+    [34.04, -118.2]
+];
+var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
+// zoom the map to the polyline
+map.fitBounds(polyline.getBounds());
+
+

You can also pass a multi-dimensional array to represent a MultiPolyline shape:

+
// create a red polyline from an array of arrays of LatLng points
+var latlngs = [
+    [[45.51, -122.68],
+     [37.77, -122.43],
+     [34.04, -118.2]],
+    [[40.78, -73.91],
+     [41.83, -87.62],
+     [32.76, -96.72]]
+];
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.polyline(<LatLng[]> latlngs, <Polyline options> options?)Instantiates a polyline object given an array of geographical points and +optionally an options object. You can create a Polyline object with +multiple separate lines (MultiPolyline) by passing an array of arrays +of geographic points.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
noClipBooleanfalseDisable polyline clipping.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
colorString'#3388ff'Stroke color
weightNumber3Stroke width in pixels
opacityNumber1.0Stroke opacity
lineCapString'round'A string that defines shape to be used at the end of the stroke.
lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
fillColorString*Fill color. Defaults to the value of the color option
fillOpacityNumber0.2Fill opacity.
fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
classNameStringnullCustom class name set on an element. Only for SVG renderer.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the layer.
dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
mousedownMouseEventFired when the user pushes the mouse button on the layer.
mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
mouseoverMouseEventFired when the mouse enters the layer.
mouseoutMouseEventFired when the mouse leaves the layer.
contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
toGeoJSON(<Number> precision?)Object

precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

+
getLatLngs()LatLng[]

Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

+
setLatLngs(<LatLng[]> latlngs)this

Replaces all the points in the polyline with the given array of geographical points.

+
isEmpty()Boolean

Returns true if the Polyline has no LatLngs.

+
closestLayerPoint(<Point> p)Point

Returns the point closest to p on the Polyline.

+
getCenter()LatLng

Returns the center (centroid) of the polyline.

+
getBounds()LatLngBounds

Returns the LatLngBounds of the path.

+
addLatLng(<LatLng> latlng)this

Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
redraw()this

Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

+
setStyle(<Path options> style)this

Changes the appearance of a Path based on the options in the Path options object.

+
bringToFront()this

Brings the layer to the top of all path layers.

+
bringToBack()this

Brings the layer to the bottom of all path layers.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

Polygon

A class for drawing polygon overlays on a map. Extends Polyline. +Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

+ +
+

Usage example

+ +
+ + + + + +
// create a red polygon from an array of LatLng points
+var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
+var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
+// zoom the map to the polygon
+map.fitBounds(polygon.getBounds());
+
+

You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

+
var latlngs = [
+  [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
+  [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
+];
+
+

Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

+
var latlngs = [
+  [ // first polygon
+    [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
+    [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
+  ],
+  [ // second polygon
+    [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
+  ]
+];
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.polygon(<LatLng[]> latlngs, <Polyline options> options?)
+ +
+ + +
+

Options

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
noClipBooleanfalseDisable polyline clipping.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
colorString'#3388ff'Stroke color
weightNumber3Stroke width in pixels
opacityNumber1.0Stroke opacity
lineCapString'round'A string that defines shape to be used at the end of the stroke.
lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
fillColorString*Fill color. Defaults to the value of the color option
fillOpacityNumber0.2Fill opacity.
fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
classNameStringnullCustom class name set on an element. Only for SVG renderer.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the layer.
dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
mousedownMouseEventFired when the user pushes the mouse button on the layer.
mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
mouseoverMouseEventFired when the mouse enters the layer.
mouseoutMouseEventFired when the mouse leaves the layer.
contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + +
MethodReturnsDescription
toGeoJSON(<Number> precision?)Object

precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
getLatLngs()LatLng[]

Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

+
setLatLngs(<LatLng[]> latlngs)this

Replaces all the points in the polyline with the given array of geographical points.

+
isEmpty()Boolean

Returns true if the Polyline has no LatLngs.

+
closestLayerPoint(<Point> p)Point

Returns the point closest to p on the Polyline.

+
getCenter()LatLng

Returns the center (centroid) of the polyline.

+
getBounds()LatLngBounds

Returns the LatLngBounds of the path.

+
addLatLng(<LatLng> latlng)this

Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
redraw()this

Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

+
setStyle(<Path options> style)this

Changes the appearance of a Path based on the options in the Path options object.

+
bringToFront()this

Brings the layer to the top of all path layers.

+
bringToBack()this

Brings the layer to the bottom of all path layers.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

Rectangle

A class for drawing rectangle overlays on a map. Extends Polygon.

+ +
+

Usage example

+ +
+ + + + + +
// define rectangle geographical bounds
+var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
+// create an orange rectangle
+L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
+// zoom the map to the rectangle bounds
+map.fitBounds(bounds);
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.rectangle(<LatLngBounds> latLngBounds, <Polyline options> options?)
+ +
+ + +
+

Options

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
noClipBooleanfalseDisable polyline clipping.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
colorString'#3388ff'Stroke color
weightNumber3Stroke width in pixels
opacityNumber1.0Stroke opacity
lineCapString'round'A string that defines shape to be used at the end of the stroke.
lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
fillColorString*Fill color. Defaults to the value of the color option
fillOpacityNumber0.2Fill opacity.
fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
classNameStringnullCustom class name set on an element. Only for SVG renderer.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the layer.
dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
mousedownMouseEventFired when the user pushes the mouse button on the layer.
mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
mouseoverMouseEventFired when the mouse enters the layer.
mouseoutMouseEventFired when the mouse leaves the layer.
contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + +
MethodReturnsDescription
setBounds(<LatLngBounds> latLngBounds)this

Redraws the rectangle with the passed bounds.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + +
MethodReturnsDescription
toGeoJSON(<Number> precision?)Object

precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
getLatLngs()LatLng[]

Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

+
setLatLngs(<LatLng[]> latlngs)this

Replaces all the points in the polyline with the given array of geographical points.

+
isEmpty()Boolean

Returns true if the Polyline has no LatLngs.

+
closestLayerPoint(<Point> p)Point

Returns the point closest to p on the Polyline.

+
getCenter()LatLng

Returns the center (centroid) of the polyline.

+
getBounds()LatLngBounds

Returns the LatLngBounds of the path.

+
addLatLng(<LatLng> latlng)this

Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
redraw()this

Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

+
setStyle(<Path options> style)this

Changes the appearance of a Path based on the options in the Path options object.

+
bringToFront()this

Brings the layer to the top of all path layers.

+
bringToBack()this

Brings the layer to the bottom of all path layers.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

Circle

A class for drawing circle overlays on a map. Extends CircleMarker. +It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).

+ +
+

Usage example

+ +
+ + + + + +
L.circle([50.5, 30.5], {radius: 200}).addTo(map);
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + + + + + +
FactoryDescription
L.circle(<LatLng> latlng, <Circle options> options?)Instantiates a circle object given a geographical point, and an options object +which contains the circle radius.
L.circle(<LatLng> latlng, <Number> radius, <Circle options> options?)Obsolete way of instantiating a circle, for compatibility with 0.7.x code. +Do not use in new applications or plugins.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
radiusNumberRadius of the circle, in meters.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
colorString'#3388ff'Stroke color
weightNumber3Stroke width in pixels
opacityNumber1.0Stroke opacity
lineCapString'round'A string that defines shape to be used at the end of the stroke.
lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
fillColorString*Fill color. Defaults to the value of the color option
fillOpacityNumber0.2Fill opacity.
fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
classNameStringnullCustom class name set on an element. Only for SVG renderer.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
EventDataDescription
moveEventFired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the layer.
dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
mousedownMouseEventFired when the user pushes the mouse button on the layer.
mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
mouseoverMouseEventFired when the mouse enters the layer.
mouseoutMouseEventFired when the mouse leaves the layer.
contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
setRadius(<Number> radius)this

Sets the radius of a circle. Units are in meters.

+
getRadius()Number

Returns the current radius of a circle. Units are in meters.

+
getBounds()LatLngBounds

Returns the LatLngBounds of the path.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
toGeoJSON(<Number> precision?)Object

precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

+
setLatLng(<LatLng> latLng)this

Sets the position of a circle marker to a new location.

+
getLatLng()LatLng

Returns the current geographical position of the circle marker

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
redraw()this

Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

+
setStyle(<Path options> style)this

Changes the appearance of a Path based on the options in the Path options object.

+
bringToFront()this

Brings the layer to the top of all path layers.

+
bringToBack()this

Brings the layer to the bottom of all path layers.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

CircleMarker

A circle of a fixed size with radius specified in pixels. Extends Path.

+ +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.circleMarker(<LatLng> latlng, <CircleMarker options> options?)Instantiates a circle marker object given a geographical point, and an optional options object.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
radiusNumber10Radius of the circle marker, in pixels
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
colorString'#3388ff'Stroke color
weightNumber3Stroke width in pixels
opacityNumber1.0Stroke opacity
lineCapString'round'A string that defines shape to be used at the end of the stroke.
lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
fillColorString*Fill color. Defaults to the value of the color option
fillOpacityNumber0.2Fill opacity.
fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
classNameStringnullCustom class name set on an element. Only for SVG renderer.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ +
+ + + + + + + + + + + + + + + + +
EventDataDescription
moveEventFired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the layer.
dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
mousedownMouseEventFired when the user pushes the mouse button on the layer.
mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
mouseoverMouseEventFired when the mouse enters the layer.
mouseoutMouseEventFired when the mouse leaves the layer.
contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
toGeoJSON(<Number> precision?)Object

precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

+
setLatLng(<LatLng> latLng)this

Sets the position of a circle marker to a new location.

+
getLatLng()LatLng

Returns the current geographical position of the circle marker

+
setRadius(<Number> radius)this

Sets the radius of a circle marker. Units are in pixels.

+
getRadius()Number

Returns the current radius of the circle

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
redraw()this

Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

+
setStyle(<Path options> style)this

Changes the appearance of a Path based on the options in the Path options object.

+
bringToFront()this

Brings the layer to the top of all path layers.

+
bringToBack()this

Brings the layer to the bottom of all path layers.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

SVG

VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility +with old versions of Internet Explorer.

+

Allows vector layers to be displayed with SVG. +Inherits Renderer. +Due to technical limitations, SVG is not +available in all web browsers, notably Android 2.x and 3.x. +Although SVG is not available on IE7 and IE8, these browsers support +VML +(a now deprecated technology), and the SVG renderer will fall back to VML in +this case.

+ +
+

Usage example

+ +
+ + + + + +

Use SVG by default for all paths in the map:

+
var map = L.map('map', {
+    renderer: L.svg()
+});
+
+

Use a SVG renderer with extra padding for specific vector geometries:

+
var map = L.map('map');
+var myRenderer = L.svg({ padding: 0.5 });
+var line = L.polyline( coordinates, { renderer: myRenderer } );
+var circle = L.circle( center, { renderer: myRenderer } );
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.svg(<Renderer options> options?)Creates a SVG renderer with the given options.
+ +
+ + +
+

Options

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paddingNumber0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
toleranceNumber0How much to extend click tolerance round a path/object on the map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
EventDataDescription
updateEventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +
+

Functions

+ +
+ + + +
There are several static functions which can be called without instantiating L.SVG:
+ + + + + + + + + + + + + + + + + + +
FunctionReturnsDescription
create(<String> name)SVGElementReturns a instance of SVGElement, +corresponding to the class name passed. For example, using 'line' will return +an instance of SVGLineElement.
pointsToPath(<Point[]> rings, <Boolean> closed)StringGenerates a SVG path string for multiple rings, with each ring turning +into "M..L..L.." instructions
+ +
+ + +

Canvas

Allows vector layers to be displayed with <canvas>. +Inherits Renderer. +Due to technical limitations, Canvas is not +available in all web browsers, notably IE8, and overlapping geometries might +not display properly in some edge cases.

+ +
+

Usage example

+ +
+ + + + + +

Use Canvas by default for all paths in the map:

+
var map = L.map('map', {
+    renderer: L.canvas()
+});
+
+

Use a Canvas renderer with extra padding for specific vector geometries:

+
var map = L.map('map');
+var myRenderer = L.canvas({ padding: 0.5 });
+var line = L.polyline( coordinates, { renderer: myRenderer } );
+var circle = L.circle( center, { renderer: myRenderer } );
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.canvas(<Renderer options> options?)Creates a Canvas renderer with the given options.
+ +
+ + +
+

Options

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paddingNumber0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
toleranceNumber0How much to extend click tolerance round a path/object on the map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
EventDataDescription
updateEventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

LayerGroup

Used to group several layers and handle them as one. If you add it to the map, +any layers added or removed from the group will be added/removed on the map as +well. Extends Layer.

+ +
+

Usage example

+ +
+ + + + + +
L.layerGroup([marker1, marker2])
+    .addLayer(polyline)
+    .addTo(map);
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.layerGroup(<Layer[]> layers?, <Object> options?)Create a layer group, optionally given an initial set of layers and an options object.
+ +
+ + +
+

Options

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
toGeoJSON(<Number> precision?)Object

precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

+
addLayer(<Layer> layer)this

Adds the given layer to the group.

+
removeLayer(<Layer> layer)this

Removes the given layer from the group.

+
removeLayer(<Number> id)this

Removes the layer with the given internal ID from the group.

+
hasLayer(<Layer> layer)Boolean

Returns true if the given layer is currently added to the group.

+
hasLayer(<Number> id)Boolean

Returns true if the given internal ID is currently added to the group.

+
clearLayers()this

Removes all the layers from the group.

+
invoke(<String> methodName, )this

Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

+
eachLayer(<Function> fn, <Object> context?)this

Iterates over the layers of the group, optionally specifying context of the iterator function.

+
group.eachLayer(function (layer) {
+    layer.bindPopup('Hello');
+});
+
+
getLayer(<Number> id)Layer

Returns the layer with the given internal ID.

+
getLayers()Layer[]

Returns an array of all the layers added to the group.

+
setZIndex(<Number> zIndex)this

Calls setZIndex on every layer contained in this group, passing the z-index.

+
getLayerId(<Layer> layer)Number

Returns the internal ID for a layer

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

FeatureGroup

Extended LayerGroup that makes it easier to do the same thing to all its member layers:

+
    +
  • bindPopup binds a popup to all of the layers at once (likewise with bindTooltip)
  • +
  • Events are propagated to the FeatureGroup, so if the group has an event +handler, it will handle events from any of the layers. This includes mouse events +and custom events.
  • +
  • Has layeradd and layerremove events
  • +
+ +
+

Usage example

+ +
+ + + + + +
L.featureGroup([marker1, marker2, polyline])
+    .bindPopup('Hello world!')
+    .on('click', function() { alert('Clicked on a member of the group!'); })
+    .addTo(map);
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.featureGroup(<Layer[]> layers)Create a feature group, optionally given an initial set of layers.
+ +
+ + +
+

Options

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ +
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
layeraddLayerEventFired when a layer is added to this FeatureGroup
layerremoveLayerEventFired when a layer is removed from this FeatureGroup
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
setStyle(<Path options> style)this

Sets the given path options to each layer of the group that has a setStyle method.

+
bringToFront()this

Brings the layer group to the top of all other layers

+
bringToBack()this

Brings the layer group to the back of all other layers

+
getBounds()LatLngBounds

Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
toGeoJSON(<Number> precision?)Object

precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

+
addLayer(<Layer> layer)this

Adds the given layer to the group.

+
removeLayer(<Layer> layer)this

Removes the given layer from the group.

+
removeLayer(<Number> id)this

Removes the layer with the given internal ID from the group.

+
hasLayer(<Layer> layer)Boolean

Returns true if the given layer is currently added to the group.

+
hasLayer(<Number> id)Boolean

Returns true if the given internal ID is currently added to the group.

+
clearLayers()this

Removes all the layers from the group.

+
invoke(<String> methodName, )this

Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

+
eachLayer(<Function> fn, <Object> context?)this

Iterates over the layers of the group, optionally specifying context of the iterator function.

+
group.eachLayer(function (layer) {
+    layer.bindPopup('Hello');
+});
+
+
getLayer(<Number> id)Layer

Returns the layer with the given internal ID.

+
getLayers()Layer[]

Returns an array of all the layers added to the group.

+
setZIndex(<Number> zIndex)this

Calls setZIndex on every layer contained in this group, passing the z-index.

+
getLayerId(<Layer> layer)Number

Returns the internal ID for a layer

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

GeoJSON

Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse +GeoJSON data and display it on the map. Extends FeatureGroup.

+ +
+

Usage example

+ +
+ + + + + +
L.geoJSON(data, {
+    style: function (feature) {
+        return {color: feature.properties.color};
+    }
+}).bindPopup(function (layer) {
+    return layer.feature.properties.description;
+}).addTo(map);
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.geoJSON(<Object> geojson?, <GeoJSON options> options?)Creates a GeoJSON layer. Optionally accepts an object in +GeoJSON format to display on the map +(you can alternatively add it later with addData method) and an options object.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
pointToLayerFunction*A Function defining how GeoJSON points spawn Leaflet layers. It is internally +called when data is added, passing the GeoJSON point feature and its LatLng. +The default is to spawn a default Marker: +
function(geoJsonPoint, latlng) {
+    return L.marker(latlng);
+}
+
styleFunction*A Function defining the Path options for styling GeoJSON lines and polygons, +called internally when data is added. +The default value is to not override any defaults: +
function (geoJsonFeature) {
+    return {}
+}
+
onEachFeatureFunction*A Function that will be called once for each created Feature, after it has +been created and styled. Useful for attaching events and popups to features. +The default is to do nothing with the newly created layers: +
function (feature, layer) {}
+
filterFunction*A Function that will be used to decide whether to include a feature or not. +The default is to include all features: +
function (geoJsonFeature) {
+    return true;
+}
+
+

Note: dynamically changing the filter option will have effect only on newly +added data. It will not re-evaluate already included features.

coordsToLatLngFunction*A Function that will be used for converting GeoJSON coordinates to LatLngs. +The default is the coordsToLatLng static method.
markersInheritOptionsBooleanfalseWhether default Markers for "Point" type Features inherit from group options.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
layeraddLayerEventFired when a layer is added to this FeatureGroup
layerremoveLayerEventFired when a layer is removed from this FeatureGroup
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addData(data)this

Adds a GeoJSON object to the layer.

+
resetStyle(layer?)this

Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. +If layer is omitted, the style of all features in the current layer is reset.

+
setStyle(style)this

Changes styles of GeoJSON vector layers with the given style function.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bringToFront()this

Brings the layer group to the top of all other layers

+
bringToBack()this

Brings the layer group to the back of all other layers

+
getBounds()LatLngBounds

Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
toGeoJSON(<Number> precision?)Object

precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

+
addLayer(<Layer> layer)this

Adds the given layer to the group.

+
removeLayer(<Layer> layer)this

Removes the given layer from the group.

+
removeLayer(<Number> id)this

Removes the layer with the given internal ID from the group.

+
hasLayer(<Layer> layer)Boolean

Returns true if the given layer is currently added to the group.

+
hasLayer(<Number> id)Boolean

Returns true if the given internal ID is currently added to the group.

+
clearLayers()this

Removes all the layers from the group.

+
invoke(<String> methodName, )this

Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

+
eachLayer(<Function> fn, <Object> context?)this

Iterates over the layers of the group, optionally specifying context of the iterator function.

+
group.eachLayer(function (layer) {
+    layer.bindPopup('Hello');
+});
+
+
getLayer(<Number> id)Layer

Returns the layer with the given internal ID.

+
getLayers()Layer[]

Returns an array of all the layers added to the group.

+
setZIndex(<Number> zIndex)this

Calls setZIndex on every layer contained in this group, passing the z-index.

+
getLayerId(<Layer> layer)Number

Returns the internal ID for a layer

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +
+

Functions

+ +
+ + + +
There are several static functions which can be called without instantiating L.GeoJSON:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunctionReturnsDescription
geometryToLayer(<Object> featureData, <GeoJSON options> options?)LayerCreates a Layer from a given GeoJSON feature. Can use a custom +pointToLayer and/or coordsToLatLng +functions if provided as options.
coordsToLatLng(<Array> coords)LatLngCreates a LatLng object from an array of 2 numbers (longitude, latitude) +or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
coordsToLatLngs(<Array> coords, <Number> levelsDeep?, <Function> coordsToLatLng?)ArrayCreates a multidimensional array of LatLngs from a GeoJSON coordinates array. +levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). +Can use a custom coordsToLatLng function.
latLngToCoords(<LatLng> latlng, <Number> precision?)ArrayReverse of coordsToLatLng
latLngsToCoords(<Array> latlngs, <Number> levelsDeep?, <Boolean> closed?)ArrayReverse of coordsToLatLngs +closed determines whether the first point should be appended to the end of the array to close the feature, only used when levelsDeep is 0. False by default.
asFeature(<Object> geojson)ObjectNormalize GeoJSON geometries/features into GeoJSON features.
+ +
+ + +

GridLayer

Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas. +GridLayer can be extended to create a tiled grid of HTML elements like <canvas>, <img> or <div>. GridLayer will handle creating and animating these DOM elements for you.

+ +
+

Usage example

+ +
+ +

Synchronous usage

+ + + +

To create a custom layer, extend GridLayer and implement the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

+
var CanvasLayer = L.GridLayer.extend({
+    createTile: function(coords){
+        // create a <canvas> element for drawing
+        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
+        // setup tile width and height according to the options
+        var size = this.getTileSize();
+        tile.width = size.x;
+        tile.height = size.y;
+        // get a canvas context and draw something on it using coords.x, coords.y and coords.z
+        var ctx = tile.getContext('2d');
+        // return the tile so it can be rendered on screen
+        return tile;
+    }
+});
+
+ + + +
+ +

Asynchronous usage

+ + + +

Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the done() callback.

+
var CanvasLayer = L.GridLayer.extend({
+    createTile: function(coords, done){
+        var error;
+        // create a <canvas> element for drawing
+        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
+        // setup tile width and height according to the options
+        var size = this.getTileSize();
+        tile.width = size.x;
+        tile.height = size.y;
+        // draw something asynchronously and pass the tile to the done() callback
+        setTimeout(function() {
+            done(error, tile);
+        }, 1000);
+        return tile;
+    }
+});
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
+ +
+ + +
+

Options

+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
updateWhenIdleBoolean(depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
zIndexNumber1The explicit zIndex of the tile layer.
boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
maxZoomNumberundefinedThe maximum zoom level up to which this layer will be displayed (inclusive).
maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with bounds to prevent requesting +tiles outside the CRS limits.
paneString'tilePane'Map pane where the grid layer will be added.
classNameString''A custom class name to assign to the tile layer. Empty by default.
keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
loadingEventFired when the grid layer starts loading tiles.
tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
tileloadstartTileEventFired when a tile is requested and starts loading.
tileerrorTileErrorEventFired when there is an error loading a tile.
tileloadTileEventFired when a tile loads.
loadEventFired when the grid layer loaded all visible tiles.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bringToFront()this

Brings the tile layer to the top of all tile layers.

+
bringToBack()this

Brings the tile layer to the bottom of all tile layers.

+
getContainer()HTMLElement

Returns the HTML element that contains the tiles for this layer.

+
setOpacity(<Number> opacity)this

Changes the opacity of the grid layer.

+
setZIndex(<Number> zIndex)this

Changes the zIndex of the grid layer.

+
isLoading()Boolean

Returns true if any tile in the grid layer has not finished loading.

+
redraw()this

Causes the layer to clear all the tiles and request them again.

+
getTileSize()Point

Normalizes the tileSize option into a point. Used by the createTile() method.

+
+ +
+ +

Extension methods

+ +
Layers extending GridLayer shall reimplement the following method.
+ + + + + + + + + + + + + +
MethodReturnsDescription
createTile(<Object> coords, <Function> done?)HTMLElement

Called only internally, must be overridden by classes extending GridLayer. +Returns the HTMLElement corresponding to the given coords. If the done callback +is specified, it must be called when the tile has finished loading and drawing.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

LatLng

Represents a geographical point with a certain latitude and longitude.

+ +
+

Usage example

+ +
+ + + + + +
var latlng = L.latLng(50.5, 30.5);
+

All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

+
map.panTo([50, 30]);
+map.panTo({lon: 30, lat: 50});
+map.panTo({lat: 50, lng: 30});
+map.panTo(L.latLng(50, 30));
+

Note that LatLng does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + + + + + + + + + +
FactoryDescription
L.latLng(<Number> latitude, <Number> longitude, <Number> altitude?)Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
L.latLng(<Array> coords)Expects an array of the form [Number, Number] or [Number, Number, Number] instead.
L.latLng(<Object> coords)Expects an plain object of the form {lat: Number, lng: Number} or {lat: Number, lng: Number, alt: Number} instead.
+ +
+ + +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
equals(<LatLng> otherLatLng, <Number> maxMargin?)Boolean

Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

+
toString()String

Returns a string representation of the point (for debugging purposes).

+
distanceTo(<LatLng> otherLatLng)Number

Returns the distance (in meters) to the given LatLng calculated using the Spherical Law of Cosines.

+
wrap()LatLng

Returns a new LatLng object with the longitude wrapped so it's always between -180 and +180 degrees.

+
toBounds(<Number> sizeInMeters)LatLngBounds

Returns a new LatLngBounds object in which each boundary is sizeInMeters/2 meters apart from the LatLng.

+
+ +
+ + +
+

Properties

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
latNumberLatitude in degrees
lngNumberLongitude in degrees
altNumberAltitude in meters (optional)
+ +
+ + +

LatLngBounds

Represents a rectangular geographical area on a map.

+ +
+

Usage example

+ +
+ + + + + +
var corner1 = L.latLng(40.712, -74.227),
+corner2 = L.latLng(40.774, -74.125),
+bounds = L.latLngBounds(corner1, corner2);
+
+

All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

+
map.fitBounds([
+    [40.712, -74.227],
+    [40.774, -74.125]
+]);
+
+

Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range. +Note that LatLngBounds does not inherit from Leafet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + + + + + +
FactoryDescription
L.latLngBounds(<LatLng> corner1, <LatLng> corner2)Creates a LatLngBounds object by defining two diagonally opposite corners of the rectangle.
L.latLngBounds(<LatLng[]> latlngs)Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
+ +
+ + +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
extend(<LatLng> latlng)this

Extend the bounds to contain the given point

+
extend(<LatLngBounds> otherBounds)this

Extend the bounds to contain the given bounds

+
pad(<Number> bufferRatio)LatLngBounds

Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. +For example, a ratio of 0.5 extends the bounds by 50% in each direction. +Negative values will retract the bounds.

+
getCenter()LatLng

Returns the center point of the bounds.

+
getSouthWest()LatLng

Returns the south-west point of the bounds.

+
getNorthEast()LatLng

Returns the north-east point of the bounds.

+
getNorthWest()LatLng

Returns the north-west point of the bounds.

+
getSouthEast()LatLng

Returns the south-east point of the bounds.

+
getWest()Number

Returns the west longitude of the bounds

+
getSouth()Number

Returns the south latitude of the bounds

+
getEast()Number

Returns the east longitude of the bounds

+
getNorth()Number

Returns the north latitude of the bounds

+
contains(<LatLngBounds> otherBounds)Boolean

Returns true if the rectangle contains the given one.

+
contains(<LatLng> latlng)Boolean

Returns true if the rectangle contains the given point.

+
intersects(<LatLngBounds> otherBounds)Boolean

Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.

+
overlaps(<Bounds> otherBounds)Boolean

Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.

+
toBBoxString()String

Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.

+
equals(<LatLngBounds> otherBounds, <Number> maxMargin?)Boolean

Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting maxMargin to a small number.

+
isValid()Boolean

Returns true if the bounds are properly initialized.

+
+ +
+ + +

Point

Represents a point with x and y coordinates in pixels.

+ +
+

Usage example

+ +
+ + + + + +
var point = L.point(200, 300);
+
+

All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

+
map.panBy([200, 300]);
+map.panBy(L.point(200, 300));
+
+

Note that Point does not inherit from Leafet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + + + + + + + + + +
FactoryDescription
L.point(<Number> x, <Number> y, <Boolean> round?)Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
L.point(<Number[]> coords)Expects an array of the form [x, y] instead.
L.point(<Object> coords)Expects a plain object of the form {x: Number, y: Number} instead.
+ +
+ + +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
clone()Point

Returns a copy of the current point.

+
add(<Point> otherPoint)Point

Returns the result of addition of the current and the given points.

+
subtract(<Point> otherPoint)Point

Returns the result of subtraction of the given point from the current.

+
divideBy(<Number> num)Point

Returns the result of division of the current point by the given number.

+
multiplyBy(<Number> num)Point

Returns the result of multiplication of the current point by the given number.

+
scaleBy(<Point> scale)Point

Multiply each coordinate of the current point by each coordinate of +scale. In linear algebra terms, multiply the point by the +scaling matrix +defined by scale.

+
unscaleBy(<Point> scale)Point

Inverse of scaleBy. Divide each coordinate of the current point by +each coordinate of scale.

+
round()Point

Returns a copy of the current point with rounded coordinates.

+
floor()Point

Returns a copy of the current point with floored coordinates (rounded down).

+
ceil()Point

Returns a copy of the current point with ceiled coordinates (rounded up).

+
trunc()Point

Returns a copy of the current point with truncated coordinates (rounded towards zero).

+
distanceTo(<Point> otherPoint)Number

Returns the cartesian distance between the current and the given points.

+
equals(<Point> otherPoint)Boolean

Returns true if the given point has the same coordinates.

+
contains(<Point> otherPoint)Boolean

Returns true if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).

+
toString()String

Returns a string representation of the point for debugging purposes.

+
+ +
+ + +
+

Properties

+ +
+ + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
xNumberThe x coordinate of the point
yNumberThe y coordinate of the point
+ +
+ + +

Bounds

Represents a rectangular area in pixel coordinates.

+ +
+

Usage example

+ +
+ + + + + +
var p1 = L.point(10, 10),
+p2 = L.point(40, 60),
+bounds = L.bounds(p1, p2);
+
+

All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

+
otherBounds.intersects([[10, 10], [40, 60]]);
+
+

Note that Bounds does not inherit from Leafet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + + + + + +
FactoryDescription
L.bounds(<Point> corner1, <Point> corner2)Creates a Bounds object from two corners coordinate pairs.
L.bounds(<Point[]> points)Creates a Bounds object from the given array of points.
+ +
+ + +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
extend(<Point> point)this

Extends the bounds to contain the given point.

+
getCenter(<Boolean> round?)Point

Returns the center point of the bounds.

+
getBottomLeft()Point

Returns the bottom-left point of the bounds.

+
getTopRight()Point

Returns the top-right point of the bounds.

+
getTopLeft()Point

Returns the top-left point of the bounds (i.e. this.min).

+
getBottomRight()Point

Returns the bottom-right point of the bounds (i.e. this.max).

+
getSize()Point

Returns the size of the given bounds

+
contains(<Bounds> otherBounds)Boolean

Returns true if the rectangle contains the given one.

+
contains(<Point> point)Boolean

Returns true if the rectangle contains the given point.

+
intersects(<Bounds> otherBounds)Boolean

Returns true if the rectangle intersects the given bounds. Two bounds +intersect if they have at least one point in common.

+
overlaps(<Bounds> otherBounds)Boolean

Returns true if the rectangle overlaps the given bounds. Two bounds +overlap if their intersection is an area.

+
+ +
+ + +
+

Properties

+ +
+ + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
minPointThe top left corner of the rectangle.
maxPointThe bottom right corner of the rectangle.
+ +
+ + +

Icon

Represents an icon to provide when creating a marker.

+ +
+

Usage example

+ +
+ + + + + +
var myIcon = L.icon({
+    iconUrl: 'my-icon.png',
+    iconSize: [38, 95],
+    iconAnchor: [22, 94],
+    popupAnchor: [-3, -76],
+    shadowUrl: 'my-icon-shadow.png',
+    shadowSize: [68, 95],
+    shadowAnchor: [22, 94]
+});
+L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
+
+

L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.icon(<Icon options> options)Creates an icon instance with the given options.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
iconUrlStringnull(required) The URL to the icon image (absolute or relative to your script path).
iconRetinaUrlStringnullThe URL to a retina sized version of the icon image (absolute or relative to your +script path). Used for Retina screen devices.
iconSizePointnullSize of the icon image in pixels.
iconAnchorPointnullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon +will be aligned so that this point is at the marker's geographical location. Centered +by default if size is specified, also can be set in CSS with negative margins.
popupAnchorPoint[0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
tooltipAnchorPoint[0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
shadowUrlStringnullThe URL to the icon shadow image. If not specified, no shadow image will be created.
shadowRetinaUrlStringnull
shadowSizePointnullSize of the shadow image in pixels.
shadowAnchorPointnullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same +as iconAnchor if not specified).
classNameString''A custom class name to assign to both icon and shadow images. Empty by default.
+ +
+ + +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
createIcon(<HTMLElement> oldIcon?)HTMLElement

Called internally when the icon has to be shown, returns a <img> HTML element +styled according to the options.

+
createShadow(<HTMLElement> oldIcon?)HTMLElement

As createIcon, but for the shadow beneath it.

+
+ +
+ + +
+ +
+

Icon.Default

+ +
+ + + +
A trivial subclass of Icon, represents the icon to use in Markers when +no icon is specified. Points to the blue marker image distributed with Leaflet +releases. +In order to customize the default icon, just change the properties of L.Icon.Default.prototype.options +(which is a set of Icon options). +If you want to completely replace the default icon, override the +L.Marker.prototype.options.icon with your own icon instead.
+ + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
imagePathStringIcon.Default will try to auto-detect the location of the +blue icon images. If you are placing these images in a non-standard +way, set this option to point to the right path.
+ +
+ + +

DivIcon

Represents a lightweight icon for markers that uses a simple <div> +element instead of an image. Inherits from Icon but ignores the iconUrl and shadow options.

+ +
+

Usage example

+ +
+ + + + + +
var myIcon = L.divIcon({className: 'my-div-icon'});
+// you can set .my-div-icon styles in CSS
+L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
+
+

By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.

+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.divIcon(<DivIcon options> options)Creates a DivIcon instance with the given options.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
htmlString|HTMLElement''Custom HTML code to put inside the div element, empty by default. Alternatively, +an instance of HTMLElement.
bgPosPoint[0, 0]Optional relative position of the background, in pixels
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
iconUrlStringnull(required) The URL to the icon image (absolute or relative to your script path).
iconRetinaUrlStringnullThe URL to a retina sized version of the icon image (absolute or relative to your +script path). Used for Retina screen devices.
iconSizePointnullSize of the icon image in pixels.
iconAnchorPointnullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon +will be aligned so that this point is at the marker's geographical location. Centered +by default if size is specified, also can be set in CSS with negative margins.
popupAnchorPoint[0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
tooltipAnchorPoint[0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
shadowUrlStringnullThe URL to the icon shadow image. If not specified, no shadow image will be created.
shadowRetinaUrlStringnull
shadowSizePointnullSize of the shadow image in pixels.
shadowAnchorPointnullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same +as iconAnchor if not specified).
classNameString''A custom class name to assign to both icon and shadow images. Empty by default.
+ +
+
+
+ +
+

Methods

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
createIcon(<HTMLElement> oldIcon?)HTMLElement

Called internally when the icon has to be shown, returns a <img> HTML element +styled according to the options.

+
createShadow(<HTMLElement> oldIcon?)HTMLElement

As createIcon, but for the shadow beneath it.

+
+ +
+
+
+ +

Control.Zoom

A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

+ +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.control.zoom(<Control.Zoom options> options)Creates a zoom control
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
zoomInTextString'+'The text set on the 'zoom in' button.
zoomInTitleString'Zoom in'The title set on the 'zoom in' button.
zoomOutTextString'&#x2212' +The text set on the 'zoom out' button.
zoomOutTitleString'Zoom out'The title set on the 'zoom out' button.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
+ +
+
+
+ +
+

Methods

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
getPosition()string

Returns the position of the control.

+
setPosition(<string> position)this

Sets the position of the control.

+
getContainer()HTMLElement

Returns the HTMLElement that contains the control.

+
addTo(<Map> map)this

Adds the control to the given map.

+
remove()this

Removes the control from the map it is currently active on.

+
+ +
+
+
+ +

Control.Attribution

The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with the getAttribution method automatically. Extends Control.

+ +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.control.attribution(<Control.Attribution options> options)Creates an attribution control.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
prefixString'Leaflet'The HTML text shown before the attributions. Pass false to disable.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
setPrefix(<String> prefix)this

Sets the text before the attributions.

+
addAttribution(<String> text)this

Adds an attribution text (e.g. 'Vector data &copy; Mapbox').

+
removeAttribution(<String> text)this

Removes an attribution text.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
getPosition()string

Returns the position of the control.

+
setPosition(<string> position)this

Sets the position of the control.

+
getContainer()HTMLElement

Returns the HTMLElement that contains the control.

+
addTo(<Map> map)this

Adds the control to the given map.

+
remove()this

Removes the control from the map it is currently active on.

+
+ +
+
+
+ +

Control.Layers

The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

+ +
+

Usage example

+ +
+ + + + + +
var baseLayers = {
+    "Mapbox": mapbox,
+    "OpenStreetMap": osm
+};
+var overlays = {
+    "Marker": marker,
+    "Roads": roadsLayer
+};
+L.control.layers(baseLayers, overlays).addTo(map);
+
+

The baseLayers and overlays parameters are object literals with layer names as keys and Layer objects as values:

+
{
+    "<someName1>": layer1,
+    "<someName2>": layer2
+}
+
+

The layer names can contain HTML, which allows you to add additional styling to the items:

+
{"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.control.layers(<Object> baselayers?, <Object> overlays?, <Control.Layers options> options?)Creates a layers control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
collapsedBooleantrueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
autoZIndexBooleantrueIf true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
hideSingleBaseBooleanfalseIf true, the base layers in the control will be hidden when there is only one.
sortLayersBooleanfalseWhether to sort the layers. When false, layers will keep the order +in which they were added to the control.
sortFunctionFunction*A compare function +that will be used for sorting the layers, when sortLayers is true. +The function receives both the L.Layer instances and their names, as in +sortFunction(layerA, layerB, nameA, nameB). +By default, it sorts layers alphabetically by their name.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
+ +
+
+
+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addBaseLayer(<Layer> layer, <String> name)this

Adds a base layer (radio button entry) with the given name to the control.

+
addOverlay(<Layer> layer, <String> name)this

Adds an overlay (checkbox entry) with the given name to the control.

+
removeLayer(<Layer> layer)this

Remove the given layer from the control.

+
expand()this

Expand the control container if collapsed.

+
collapse()this

Collapse the control container if expanded.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
getPosition()string

Returns the position of the control.

+
setPosition(<string> position)this

Sets the position of the control.

+
getContainer()HTMLElement

Returns the HTMLElement that contains the control.

+
addTo(<Map> map)this

Adds the control to the given map.

+
remove()this

Removes the control from the map it is currently active on.

+
+ +
+
+
+ +

Control.Scale

A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends Control.

+ +
+

Usage example

+ +
+ + + + + +
L.control.scale().addTo(map);
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + +
FactoryDescription
L.control.scale(<Control.Scale options> options?)Creates an scale control with the given options.
+ +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
maxWidthNumber100Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
metricBooleanTrueWhether to show the metric scale line (m/km).
imperialBooleanTrueWhether to show the imperial scale line (mi/ft).
updateWhenIdleBooleanfalseIf true, the control is updated on moveend, otherwise it's always up-to-date (updated on move).
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
+ +
+
+
+ +
+

Methods

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
getPosition()string

Returns the position of the control.

+
setPosition(<string> position)this

Sets the position of the control.

+
getContainer()HTMLElement

Returns the HTMLElement that contains the control.

+
addTo(<Map> map)this

Adds the control to the given map.

+
remove()this

Removes the control from the map it is currently active on.

+
+ +
+
+
+ +

Browser

A namespace with static properties for browser/feature detection used by Leaflet internally.

+ +
+

Usage example

+ +
+ + + + + +
if (L.Browser.ielt9) {
+  alert('Upgrade your browser, dude!');
+}
+
+ + + +
+ + +
+

Properties

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
ieBooleantrue for all Internet Explorer versions (not Edge).
ielt9Booleantrue for Internet Explorer versions less than 9.
edgeBooleantrue for the Edge web browser.
webkitBooleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
androidBooleantrue for any browser running on an Android platform.
android23Booleantrue for browsers running on Android 2 or Android 3.
androidStockBooleantrue for the Android stock browser (i.e. not Chrome)
operaBooleantrue for the Opera browser
chromeBooleantrue for the Chrome browser.
geckoBooleantrue for gecko-based browsers like Firefox.
safariBooleantrue for the Safari browser.
opera12Booleantrue for the Opera browser supporting CSS transforms (version 12 or later).
winBooleantrue when the browser is running in a Windows platform
ie3dBooleantrue for all Internet Explorer versions supporting CSS transforms.
webkit3dBooleantrue for webkit-based browsers supporting CSS transforms.
gecko3dBooleantrue for gecko-based browsers supporting CSS transforms.
any3dBooleantrue for all browsers supporting CSS transforms.
mobileBooleantrue for all browsers running in a mobile device.
mobileWebkitBooleantrue for all webkit-based browsers in a mobile device.
mobileWebkit3dBooleantrue for all webkit-based browsers in a mobile device supporting CSS transforms.
msPointerBooleantrue for browsers implementing the Microsoft touch events model (notably IE10).
pointerBooleantrue for all browsers supporting pointer events.
touchBooleantrue for all browsers supporting touch events. +This does not necessarily mean that the browser is running in a computer with +a touchscreen, it only means that the browser is capable of understanding +touch events.
mobileOperaBooleantrue for the Opera browser in a mobile device.
mobileGeckoBooleantrue for gecko-based browsers running in a mobile device.
retinaBooleantrue for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%.
passiveEventsBooleantrue for browsers that support passive events.
canvasBooleantrue when the browser supports <canvas>.
svgBooleantrue when the browser supports SVG.
vmlBooleantrue if the browser supports VML.
+ +
+ + +

Util

Various utility functions, used by Leaflet internally.

+ +
+

Functions

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunctionReturnsDescription
extend(<Object> dest, <Object> src?)ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
create(<Object> proto, <Object> properties?)ObjectCompatibility polyfill for Object.create
bind(<Function> fn, )FunctionReturns a new function bound to the arguments passed, like Function.prototype.bind. +Has a L.bind() shortcut.
stamp(<Object> obj)NumberReturns the unique ID of an object, assigning it one if it doesn't have it.
throttle(<Function> fn, <Number> time, <Object> context)FunctionReturns a function which executes function fn with the given scope context +(so that the this keyword refers to context inside fn's code). The function +fn will be called no more than one time per given amount of time. The arguments +received by the bound function will be any arguments passed when binding the +function, followed by any arguments passed when invoking the bound function. +Has an L.throttle shortcut.
wrapNum(<Number> num, <Number[]> range, <Boolean> includeMax?)NumberReturns the number num modulo range in such a way so it lies within +range[0] and range[1]. The returned value will be always smaller than +range[1] unless includeMax is set to true.
falseFn()FunctionReturns a function which always returns false.
formatNum(<Number> num, <Number> digits?)NumberReturns the number num rounded to digits decimals, or to 6 decimals by default.
trim(<String> str)StringCompatibility polyfill for String.prototype.trim
splitWords(<String> str)String[]Trims and splits the string on whitespace and returns the array of parts.
setOptions(<Object> obj, <Object> options)ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.
getParamString(<Object> obj, <String> existingUrl?, <Boolean> uppercase?)StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} +translates to '?a=foo&b=bar'. If existingUrl is set, the parameters will +be appended at the end. If uppercase is true, the parameter names will +be uppercased (e.g. '?A=foo&B=bar')
template(<String> str, <Object> data)StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' +and a data object like {a: 'foo', b: 'bar'}, returns evaluated string +('Hello foo, bar'). You can also specify functions instead of strings for +data values — they will be evaluated passing data as an argument.
isArray(obj)BooleanCompatibility polyfill for Array.isArray
indexOf(<Array> array, <Object> el)NumberCompatibility polyfill for Array.prototype.indexOf
requestAnimFrame(<Function> fn, <Object> context?, <Boolean> immediate?)NumberSchedules fn to be executed when the browser repaints. fn is bound to +context if given. When immediate is set, fn is called immediately if +the browser doesn't have native support for +window.requestAnimationFrame, +otherwise it's delayed. Returns a request ID that can be used to cancel the request.
cancelAnimFrame(<Number> id)undefinedCancels a previous requestAnimFrame. See also window.cancelAnimationFrame.
+ +
+ + +
+

Properties

+ +
+ + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
lastIdNumberLast unique ID used by stamp()
emptyImageUrlStringData URI string containing a base64-encoded empty GIF image. +Used as a hack to free memory from unused images on WebKit-powered +mobile devices (by setting image src to this string).
+ +
+ + +

Transformation

Represents an affine transformation: a set of coefficients a, b, c, d +for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing +the reverse. Used by Leaflet in its projections code.

+ +
+

Usage example

+ +
+ + + + + +
var transformation = L.transformation(2, 5, -1, 10),
+    p = L.point(1, 2),
+    p2 = transformation.transform(p), //  L.point(7, 8)
+    p3 = transformation.untransform(p2); //  L.point(1, 2)
+
+ + + +
+ + +
+

Creation

+ +
+ + + + + + + + + + + + + + + + + + +
FactoryDescription
L.transformation(<Number> a, <Number> b, <Number> c, <Number> d)Instantiates a Transformation object with the given coefficients.
L.transformation(<Array> coefficients)Expects an coefficients array of the form +[a: Number, b: Number, c: Number, d: Number].
+ +
+ + +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
transform(<Point> point, <Number> scale?)Point

Returns a transformed point, optionally multiplied by the given scale. +Only accepts actual L.Point instances, not arrays.

+
untransform(<Point> point, <Number> scale?)Point

Returns the reverse transformation of the given point, optionally divided +by the given scale. Only accepts actual L.Point instances, not arrays.

+
+ +
+ + +

LineUtil

Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

+ +
+

Functions

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunctionReturnsDescription
simplify(<Point[]> points, <Number> tolerance)Point[]Dramatically reduces the number of points in a polyline while retaining +its shape and returns a new array of simplified points, using the +Douglas-Peucker algorithm. +Used for a huge performance boost when processing/displaying Leaflet polylines for +each zoom level and also reducing visual noise. tolerance affects the amount of +simplification (lesser value means higher quality but slower and with more points). +Also released as a separated micro-library Simplify.js.
pointToSegmentDistance(<Point> p, <Point> p1, <Point> p2)NumberReturns the distance between point p and segment p1 to p2.
closestPointOnSegment(<Point> p, <Point> p1, <Point> p2)NumberReturns the closest point from a point p on a segment p1 to p2.
clipSegment(<Point> a, <Point> b, <Bounds> bounds, <Boolean> useLastCode?, <Boolean> round?)Point[]|BooleanClips the segment a to b by rectangular bounds with the +Cohen-Sutherland algorithm +(modifying the segment points directly!). Used by Leaflet to only show polyline +points that are on the screen or near, increasing performance.
isFlat(<LatLng[]> latlngs)BooleanReturns true if latlngs is a flat array, false is nested.
+ +
+ + +

PolyUtil

Various utility functions for polygon geometries.

+ +
+

Functions

+ +
+ + + + + + + + + + + + + + + + +
FunctionReturnsDescription
clipPolygon(<Point[]> points, <Bounds> bounds, <Boolean> round?)Point[]Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgman algorithm). +Used by Leaflet to only show polygon points that are on the screen or near, increasing +performance. Note that polygon points needs different algorithm for clipping +than polyline, so there's a separate method for it.
+ +
+ + +

DomEvent

Utility functions to work with the DOM events, used by Leaflet internally.

+ +
+

Functions

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunctionReturnsDescription
on(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisAdds a listener function (fn) to a particular DOM event type of the +element el. You can optionally specify the context of the listener +(object the this keyword will point to). You can also pass several +space-separated types (e.g. 'click dblclick').
on(<HTMLElement> el, <Object> eventMap, <Object> context?)thisAdds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
off(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisRemoves a previously added listener function. +Note that if you passed a custom context to on, you must pass the same +context to off in order to remove the listener.
off(<HTMLElement> el, <Object> eventMap, <Object> context?)thisRemoves a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
stopPropagation(<DOMEvent> ev)thisStop the given event from propagation to parent elements. Used inside the listener functions: +
L.DomEvent.on(div, 'click', function (ev) {
+    L.DomEvent.stopPropagation(ev);
+});
+
disableScrollPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'mousewheel' events (plus browser variants).
disableClickPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'click', 'doubleclick', +'mousedown' and 'touchstart' events (plus browser variants).
preventDefault(<DOMEvent> ev)thisPrevents the default action of the DOM Event ev from happening (such as +following a link in the href of the a element, or doing a POST request +with page reload when a <form> is submitted). +Use it inside listener functions.
stop(<DOMEvent> ev)thisDoes stopPropagation and preventDefault at the same time.
getMousePosition(<DOMEvent> ev, <HTMLElement> container?)PointGets normalized mouse position from a DOM event relative to the +container (border excluded) or to the whole page if not specified.
getWheelDelta(<DOMEvent> ev)NumberGets normalized wheel delta from a mousewheel DOM event, in vertical +pixels scrolled (negative if scrolling down). +Events from pointing devices without precise scrolling are mapped to +a best guess of 60 pixels.
addListener()thisAlias to L.DomEvent.on
removeListener()thisAlias to L.DomEvent.off
+ +
+ + +

DomUtil

Utility functions to work with the DOM +tree, used by Leaflet internally. +Most functions expecting or returning a HTMLElement also work for +SVG elements. The only difference is that classes refer to CSS classes +in HTML and SVG classes in SVG.

+ +
+

Functions

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunctionReturnsDescription
get(<String|HTMLElement> id)HTMLElementReturns an element given its DOM id, or returns the element itself +if it was passed directly.
getStyle(<HTMLElement> el, <String> styleAttrib)StringReturns the value for a certain style attribute on an element, +including computed values or values set through CSS.
create(<String> tagName, <String> className?, <HTMLElement> container?)HTMLElementCreates an HTML element with tagName, sets its class to className, and optionally appends it to container element.
remove(<HTMLElement> el)Removes el from its parent element
empty(<HTMLElement> el)Removes all of el's children elements from el
toFront(<HTMLElement> el)Makes el the last child of its parent, so it renders in front of the other children.
toBack(<HTMLElement> el)Makes el the first child of its parent, so it renders behind the other children.
hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element's class attribute contains name.
addClass(<HTMLElement> el, <String> name)Adds name to the element's class attribute.
removeClass(<HTMLElement> el, <String> name)Removes name from the element's class attribute.
setClass(<HTMLElement> el, <String> name)Sets the element's class.
getClass(<HTMLElement> el)StringReturns the element's class.
setOpacity(<HTMLElement> el, <Number> opacity)Set the opacity of an element (including old IE support). +opacity must be a number from 0 to 1.
testProp(<String[]> props)String|falseGoes through the array of style names and returns the first name +that is a valid style name for an element. If no such name is found, +it returns false. Useful for vendor-prefixed styles like transform.
setTransform(<HTMLElement> el, <Point> offset, <Number> scale?)Resets the 3D CSS transform of el so it is translated by offset pixels +and optionally scaled by scale. Does not have an effect if the +browser doesn't support 3D CSS transforms.
setPosition(<HTMLElement> el, <Point> position)Sets the position of el to coordinates specified by position, +using CSS translate or top/left positioning depending on the browser +(used by Leaflet internally to position its layers).
getPosition(<HTMLElement> el)PointReturns the coordinates of an element previously positioned with setPosition.
disableTextSelection()Prevents the user from generating selectstart DOM events, usually generated +when the user drags the mouse through a page with text. Used internally +by Leaflet to override the behaviour of any click-and-drag interaction on +the map. Affects drag interactions on the whole document.
enableTextSelection()Cancels the effects of a previous L.DomUtil.disableTextSelection.
disableImageDrag()As L.DomUtil.disableTextSelection, but +for dragstart DOM events, usually generated when the user drags an image.
enableImageDrag()Cancels the effects of a previous L.DomUtil.disableImageDrag.
preventOutline(<HTMLElement> el)Makes the outline +of the element el invisible. Used internally by Leaflet to prevent +focusable elements from displaying an outline when the user performs a +drag interaction on them.
restoreOutline()Cancels the effects of a previous L.DomUtil.preventOutline.
getSizedParentNode(<HTMLElement> el)HTMLElementFinds the closest parent node which size (width and height) is not null.
getScale(<HTMLElement> el)ObjectComputes the CSS scale currently applied on the element. +Returns an object with x and y members as horizontal and vertical scales respectively, +and boundingClientRect as the result of getBoundingClientRect().
+ +
+ + +
+

Properties

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
TRANSFORMStringVendor-prefixed transform style name (e.g. 'webkitTransform' for WebKit).
TRANSITIONStringVendor-prefixed transition style name.
TRANSITION_ENDStringVendor-prefixed transitionend event name.
+ +
+ + +

PosAnimation

Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

+ +
+

Usage example

+ +
+ + + + + +
var fx = new L.PosAnimation();
+fx.run(el, [300, 500], 0.5);
+
+ + + +
+ + +
+

Constructor

+ +
+ + + + + + + + + + + + + + +
ConstructorDescription
L.PosAnimation()Creates a PosAnimation object.
+ + +
+ + +
+

Events

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
startEventFired when the animation starts
stepEventFired continuously during the animation.
endEventFired when the animation ends.
+ +
+ + +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
run(<HTMLElement> el, <Point> newPos, <Number> duration?, <Number> easeLinearity?)

Run an animation of a given element to a new position, optionally setting +duration in seconds (0.25 by default) and easing linearity factor (3rd +argument of the cubic bezier curve, +0.5 by default).

+
stop()

Stops the animation (if currently running).

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

Draggable

A class for making DOM elements draggable (including touch support). +Used internally for map and marker dragging. Only works for elements +that were positioned with L.DomUtil.setPosition.

+ +
+

Usage example

+ +
+ + + + + +
var draggable = new L.Draggable(elementToDrag);
+draggable.enable();
+
+ + + +
+ + +
+

Constructor

+ +
+ + + + + + + + + + + + + + +
ConstructorDescription
L.Draggable(<HTMLElement> el, <HTMLElement> dragHandle?, <Boolean> preventOutline?, <Draggable options> options?)Creates a Draggable object for moving el when you start dragging the dragHandle element (equals el itself by default).
+ + +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
clickToleranceNumber3The max number of pixels a user can shift the mouse pointer during a click +for it to be considered a valid click (as opposed to a mouse drag).
+ +
+ + +
+

Events

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
downEventFired when a drag is about to start.
dragstartEventFired when a drag starts
predragEventFired continuously during dragging before each corresponding +update of the element's position.
dragEventFired continuously during dragging.
dragendDragEndEventFired when the drag ends.
+ +
+ + +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
enable()

Enables the dragging ability

+
disable()

Disables the dragging ability

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

Class

L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here. +In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

+ +
+

Usage example

+ +
+ + + + + +
var MyClass = L.Class.extend({
+initialize: function (greeter) {
+    this.greeter = greeter;
+    // class constructor
+},
+greet: function (name) {
+    alert(this.greeter + ', ' + name)
+    }
+});
+// create instance of MyClass, passing "Hello" to the constructor
+var a = new MyClass("Hello");
+// call greet method, alerting "Hello, World"
+a.greet("World");
+
+ + + +
+ +

Class Factories

+ + + +

You may have noticed that Leaflet objects are created without using +the new keyword. This is achieved by complementing each class with a +lowercase factory method:

+
new L.Map('map'); // becomes:
+L.map('map');
+
+

The factories are implemented very easily, and you can do this for your own classes:

+
L.map = function (id, options) {
+    return new L.Map(id, options);
+};
+
+ + + +
+ +

Inheritance

+ + + +

You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

+
var MyChildClass = MyClass.extend({
+    // ... new properties and methods
+});
+
+

This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

+
var a = new MyChildClass();
+a instanceof MyChildClass; // true
+a instanceof MyClass; // true
+
+

You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

+
var MyChildClass = MyClass.extend({
+    initialize: function () {
+        MyClass.prototype.initialize.call(this, "Yo");
+    },
+    greet: function (name) {
+        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
+    }
+});
+var a = new MyChildClass();
+a.greet('Jason'); // alerts "Yo, bro Jason!"
+
+ + +
+ +

Options

+ + + +

options is a special property that unlike other objects that you pass +to extend will be merged with the parent one instead of overriding it +completely, which makes managing configuration of objects and default +values convenient:

+
var MyClass = L.Class.extend({
+    options: {
+        myOption1: 'foo',
+        myOption2: 'bar'
+    }
+});
+var MyChildClass = MyClass.extend({
+    options: {
+        myOption1: 'baz',
+        myOption3: 5
+    }
+});
+var a = new MyChildClass();
+a.options.myOption1; // 'baz'
+a.options.myOption2; // 'bar'
+a.options.myOption3; // 5
+
+

There's also L.Util.setOptions, a method for +conveniently merging options passed to constructor with the defaults +defines in the class:

+
var MyClass = L.Class.extend({
+    options: {
+        foo: 'bar',
+        bla: 5
+    },
+    initialize: function (options) {
+        L.Util.setOptions(this, options);
+        ...
+    }
+});
+var a = new MyClass({bla: 10});
+a.options; // {foo: 'bar', bla: 10}
+
+

Note that the options object allows any keys, not just +the options defined by the class and its base classes. +This means you can use the options object to store +application specific information, as long as you avoid +keys that are already used by the class in question.

+ + + +
+ +

Includes

+ + + +

includes is a special class property that merges all specified objects into the class (such objects are called mixins).

+
 var MyMixin = {
+    foo: function () { ... },
+    bar: 5
+};
+var MyClass = L.Class.extend({
+    includes: MyMixin
+});
+var a = new MyClass();
+a.foo();
+
+

You can also do such includes in runtime with the include method:

+
MyClass.include(MyMixin);
+
+

statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

+
var MyClass = L.Class.extend({
+    statics: {
+        FOO: 'bar',
+        BLA: 5
+    }
+});
+MyClass.FOO; // 'bar'
+
+ + + +
+ +

Constructor hooks

+ + + +

If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

+
MyClass.addInitHook(function () {
+    // ... do something in constructor additionally
+    // e.g. add event listeners, set custom properties etc.
+});
+
+

You can also use the following shortcut when you just need to make one additional method call:

+
MyClass.addInitHook('methodName', arg1, arg2, …);
+
+ + + +
+ + +
+

Functions

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunctionReturnsDescription
extend(<Object> props)FunctionExtends the current class given the properties to be included. +Returns a Javascript function that is a class constructor (to be called with new).
include(<Object> properties)thisIncludes a mixin into the current class.
mergeOptions(<Object> options)thisMerges options into the defaults of the class.
addInitHook(<Function> fn)thisAdds a constructor hook to the class.
+ +
+ + +

Evented

A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

+ +
+

Usage example

+ +
+ + + + + +
map.on('click', function(e) {
+    alert(e.latlng);
+} );
+
+

Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

+
function onClick(e) { ... }
+map.on('click', onClick);
+map.off('click', onClick);
+
+ + + +
+ + +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+ + +

Layer

A set of methods from the Layer base class that all Leaflet layers use. +Inherits all methods, options and events from L.Evented.

+ +
+

Usage example

+ +
+ + + + + +
var layer = L.marker(latlng).addTo(map);
+layer.addTo(map);
+layer.remove();
+
+ + + +
+ + +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+ + +
+

Events

+ +
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+ +

Popup events

+ + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+ +

Tooltip events

+ + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+ + +
+

Methods

+ +
+ + + +
Classes extending L.Layer will inherit the following methods:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+ +

Extension methods

+ +
Every layer should extend from L.Layer and (re-)implement the following methods.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
onAdd(<Map> map)this

Should contain code that creates DOM elements for the layer, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).

+
onRemove(<Map> map)this

Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).

+
getEvents()Object

This optional method should return an object like { viewreset: this._reset } for addEventListener. The event handlers in this object will be automatically added and removed from the map with your layer.

+
getAttribution()String

This optional method should return a string containing HTML to be shown on the Attribution control whenever the layer is visible.

+
beforeAdd(<Map> map)this

Optional method. Called on map.addLayer(layer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.

+
+ +
+ +

Popup methods

+ +
All layers share a set of methods convenient for binding popups to it. +
var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
+layer.openPopup();
+layer.closePopup();
+
+

Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+ +

Tooltip methods

+ +
All layers share a set of methods convenient for binding tooltips to it. +
var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
+layer.openTooltip();
+layer.closeTooltip();
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

Interactive layer

Some Layers can be made interactive - when the user interacts +with such a layer, mouse events like click and mouseover can be handled. +Use the event handling methods to handle these events.

+ +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ +
+ +

Mouse events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
clickMouseEventFired when the user clicks (or taps) the layer.
dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
mousedownMouseEventFired when the user pushes the mouse button on the layer.
mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
mouseoverMouseEventFired when the mouse enters the layer.
mouseoutMouseEventFired when the mouse leaves the layer.
contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

Control

L.Control is a base class for implementing map controls. Handles positioning. +All other controls extend from this class.

+ +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
+ +
+ + +
+

Methods

+ +
+ + + +
Classes extending L.Control will inherit the following methods:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
getPosition()string

Returns the position of the control.

+
setPosition(<string> position)this

Sets the position of the control.

+
getContainer()HTMLElement

Returns the HTMLElement that contains the control.

+
addTo(<Map> map)this

Adds the control to the given map.

+
remove()this

Removes the control from the map it is currently active on.

+
+ +
+ +

Extension methods

+ +
Every control should extend from L.Control and (re-)implement the following methods.
+ + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
onAdd(<Map> map)HTMLElement

Should return the container DOM element for the control and add listeners on relevant map events. Called on control.addTo(map).

+
onRemove(<Map> map)

Optional method. Should contain all clean up code that removes the listeners previously added in onAdd. Called on control.remove().

+
+ +
+ + +

Handler

Abstract class for map interaction handlers

+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
enable()this

Enables the handler

+
disable()this

Disables the handler

+
enabled()Boolean

Returns true if the handler is enabled

+
+ +
+ +

Extension methods

+ +
Classes inheriting from Handler must implement the two following methods:
+ + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addHooks()

Called when the handler is enabled, should add event hooks.

+
removeHooks()

Called when the handler is disabled, should remove the event hooks added previously.

+
+ +
+ + +
+

Functions

+ +
+ +

There is static function which can be called without instantiating L.Handler:

+ + + + + + + + + + + + + + +
FunctionReturnsDescription
addTo(<Map> map, <String> name)thisAdds a new Handler to the given map with the given name.
+ +
+ + +

Projection

An object with methods for projecting geographical coordinates of the world onto +a flat surface (and back). See Map projection.

+ +
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
project(<LatLng> latlng)Point

Projects geographical coordinates into a 2D point. +Only accepts actual L.LatLng instances, not arrays.

+
unproject(<Point> point)LatLng

The inverse of project. Projects a 2D point into a geographical location. +Only accepts actual L.Point instances, not arrays. +Note that the projection instances do not inherit from Leafet's Class object, +and can't be instantiated. Also, new classes can't inherit from them, +and methods can't be added to them with the include function.

+
+ +
+ + +
+

Properties

+ +
+ + + + + + + + + + + + + + + + +
PropertyTypeDescription
boundsBoundsThe bounds (specified in CRS units) where the projection is valid
+ +
+ + +
+

Defined projections

+ +
+ + + +
Leaflet comes with a set of already defined Projections out of the box:
+ + + + + + + + + + + + + + + + + + + +
ProjectionDescription
L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, +mostly used by GIS enthusiasts. Directly maps x as longitude, and y as +latitude. Also suitable for flat worlds, e.g. game maps. Used by the +EPSG:4326 and Simple CRS.
L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS.
L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, +used by almost all free and commercial tile providers. Assumes that Earth is +a sphere. Used by the EPSG:3857 CRS.
+ +
+ + +

CRS

+
+

Methods

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
latLngToPoint(<LatLng> latlng, <Number> zoom)Point

Projects geographical coordinates into pixel coordinates for a given zoom.

+
pointToLatLng(<Point> point, <Number> zoom)LatLng

The inverse of latLngToPoint. Projects pixel coordinates on a given +zoom into geographical coordinates.

+
project(<LatLng> latlng)Point

Projects geographical coordinates into coordinates in units accepted for +this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).

+
unproject(<Point> point)LatLng

Given a projected coordinate returns the corresponding LatLng. +The inverse of project.

+
scale(<Number> zoom)Number

Returns the scale used when transforming projected coordinates into +pixel coordinates for a particular zoom. For example, it returns +256 * 2^zoom for Mercator-based CRS.

+
zoom(<Number> scale)Number

Inverse of scale(), returns the zoom level corresponding to a scale +factor of scale.

+
getProjectedBounds(<Number> zoom)Bounds

Returns the projection's bounds scaled and transformed for the provided zoom.

+
distance(<LatLng> latlng1, <LatLng> latlng2)Number

Returns the distance between two geographical coordinates.

+
wrapLatLng(<LatLng> latlng)LatLng

Returns a LatLng where lat and lng has been wrapped according to the +CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds.

+
wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

Returns a LatLngBounds with the same size as the given one, ensuring +that its center is within the CRS's bounds. +Only accepts actual L.LatLngBounds instances, not arrays.

+
+ +
+ + +
+

Properties

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
codeStringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857')
wrapLngNumber[]An array of two numbers defining whether the longitude (horizontal) coordinate +axis wraps around a given range and how. Defaults to [-180, 180] in most +geographical CRSs. If undefined, the longitude axis does not wrap around.
wrapLatNumber[]Like wrapLng, but for the latitude (vertical) axis.
infiniteBooleanIf true, the coordinate space will be unbounded (infinite in both axes)
+ +
+ + +
+

Defined CRSs

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CRSDescription
L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial +tile providers. Uses Spherical Mercator projection. Set in by default in +Map's crs option.
L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. +Leaflet 1.0.x complies with the TMS coordinate scheme for EPSG:4326, +which is a breaking change from 0.7.x behaviour. If you are using a TileLayer +with this CRS, ensure that there are two 256x256 pixel tiles covering the +whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), +or (-180,-90) for TileLayers with the tms option set.
L.CRS.EarthServes as the base for CRS that are global such that they cover the earth. +Can only be used as the base for other CRS and cannot be used directly, +since it does not have a code, projection or transformation. distance() returns +meters.
L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. +May be used for maps of flat surfaces (e.g. game maps). Note that the y +axis should still be inverted (going from bottom to top). distance() returns +simple euclidean distance.
L.CRS.BaseObject that defines coordinate reference systems for projecting +geographical points into pixel (screen) coordinates and back (and to +coordinates in other units for WMS services). See +spatial reference system. +Leaflet defines the most usual CRSs by default. If you want to use a +CRS not defined by default, take a look at the +Proj4Leaflet plugin. +Note that the CRS instances do not inherit from Leafet's Class object, +and can't be instantiated. Also, new classes can't inherit from them, +and methods can't be added to them with the include function.
+ +
+ + +

Renderer

Base class for vector renderer implementations (SVG, Canvas). Handles the +DOM container of the renderer, its bounds, and its zoom animation. +A Renderer works as an implicit layer group for all Paths - the renderer +itself can be added or removed to the map. All paths use a renderer, which can +be implicit (the map will decide the type of renderer and use it automatically) +or explicit (using the renderer option of the path). +Do not use this class directly, use SVG and Canvas instead.

+ +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paddingNumber0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
toleranceNumber0How much to extend click tolerance round a path/object on the map
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ +
+ + + + + + + + + + + + + + + + +
EventDataDescription
updateEventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

Event objects

Whenever a class inheriting from Evented fires an event, a listener function +will be called with an event argument, which is a plain object containing +information about the event. For example:

+
map.on('click', function(ev) {
+    alert(ev.latlng); // ev is an event object (MouseEvent in this case)
+});
+
+

The information available depends on the event type:

+ + + +
+

Event

+ +
+ + + +
The base event object. All other event objects contain these properties too.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+ + +
+ +
+

KeyboardEvent

+ +
+ + + + + + + + + + + + + + + + +
PropertyTypeDescription
originalEventDOMEventThe original DOM KeyboardEvent that triggered this Leaflet event.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+
+
+ +
+ +
+

MouseEvent

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
latlngLatLngThe geographical point where the mouse event occured.
layerPointPointPixel coordinates of the point where the mouse event occured relative to the map layer.
containerPointPointPixel coordinates of the point where the mouse event occured relative to the map сontainer.
originalEventDOMEventThe original DOM MouseEvent or DOM TouchEvent that triggered this Leaflet event.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+
+
+ +
+ +
+

LocationEvent

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
latlngLatLngDetected geographical location of the user.
boundsLatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
accuracyNumberAccuracy of location in meters.
altitudeNumberHeight of the position above the WGS84 ellipsoid in meters.
altitudeAccuracyNumberAccuracy of altitude in meters.
headingNumberThe direction of travel in degrees counting clockwise from true North.
speedNumberCurrent velocity in meters per second.
timestampNumberThe time when the position was acquired.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+
+
+ +
+ +
+

ErrorEvent

+ +
+ + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
messageStringError message.
codeNumberError code (if applicable).
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+
+
+ +
+ +
+

LayerEvent

+ +
+ + + + + + + + + + + + + + + + +
PropertyTypeDescription
layerLayerThe layer that was added or removed.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
+ +
+
+
+ +
+ +
+

LayersControlEvent

+ +
+ + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
layerLayerThe layer that was added or removed.
nameStringThe name of the layer that was added or removed.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
+ +
+
+
+ +
+ +
+

TileEvent

+ +
+ + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
tileHTMLElementThe tile element (image).
coordsPointPoint object with the tile's x, y, and z (zoom level) coordinates.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+
+
+ +
+ +
+

TileErrorEvent

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
tileHTMLElementThe tile element (image).
coordsPointPoint object with the tile's x, y, and z (zoom level) coordinates.
error*Error passed to the tile's done() callback.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+
+
+ +
+ +
+

ResizeEvent

+ +
+ + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
oldSizePointThe old size before resize event.
newSizePointThe new size after the resize event.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+
+
+ +
+ +
+

GeoJSONEvent

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
layerLayerThe layer for the GeoJSON feature that is being added to the map.
propertiesObjectGeoJSON properties of the feature.
geometryTypeStringGeoJSON geometry type of the feature.
idStringGeoJSON ID of the feature (if present).
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
+ +
+
+
+ +
+ +
+

PopupEvent

+ +
+ + + + + + + + + + + + + + + + +
PropertyTypeDescription
popupPopupThe popup that was opened or closed.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+
+
+ +
+ +
+

TooltipEvent

+ +
+ + + + + + + + + + + + + + + + +
PropertyTypeDescription
tooltipTooltipThe tooltip that was opened or closed.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+
+
+ +
+ +
+

DragEndEvent

+ +
+ + + + + + + + + + + + + + + + +
PropertyTypeDescription
distanceNumberThe distance in pixels the draggable element was moved by.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+
+
+ +
+ +
+

ZoomAnimEvent

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
centerLatLngThe current center of the map
zoomNumberThe current zoom level of the map
noUpdateBooleanWhether layers should update their contents due to this event
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
typeStringThe event type (e.g. 'click').
targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
layerObjectDeprecated. The same as propagatedFrom.
+ +
+
+
+ +

DivOverlay

Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.

+ +
+

Options

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
offsetPointPoint(0, 7)The offset of the popup position. Useful to control the anchor +of the popup when opening it on some overlays.
classNameString''A custom CSS class name to assign to the popup.
paneString'popupPane'Map pane where the popup will be added.
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
OptionTypeDefaultDescription
attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
+ +
+
+
+ +
+

Events

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
addEventFired after the layer is added to a map
removeEventFired after the layer is removed from a map
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
popupopenPopupEventFired when a popup bound to this layer is opened
popupclosePopupEventFired when a popup bound to this layer is closed
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
EventDataDescription
tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
+ +
+
+
+ +
+

Methods

+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
addTo(<Map|LayerGroup> map)this

Adds the layer to the given map or layer group.

+
remove()this

Removes the layer from the map it is currently active on.

+
removeFrom(<Map> map)this

Removes the layer from the given map

+
getPane(<String> name?)HTMLElement

Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

+
getAttribution()String

Used by the attribution control, returns the attribution option.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindPopup()this

Removes the popup previously bound with bindPopup.

+
openPopup(<LatLng> latlng?)this

Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

+
closePopup()this

Closes the popup bound to this layer if it is open.

+
togglePopup()this

Opens or closes the popup bound to this layer depending on its current state.

+
isPopupOpen()boolean

Returns true if the popup bound to this layer is currently open.

+
setPopupContent(<String|HTMLElement|Popup> content)this

Sets the content of the popup bound to this layer.

+
getPopup()Popup

Returns the popup bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

+
unbindTooltip()this

Removes the tooltip previously bound with bindTooltip.

+
openTooltip(<LatLng> latlng?)this

Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

+
closeTooltip()this

Closes the tooltip bound to this layer if it is open.

+
toggleTooltip()this

Opens or closes the tooltip bound to this layer depending on its current state.

+
isTooltipOpen()boolean

Returns true if the tooltip bound to this layer is currently open.

+
setTooltipContent(<String|HTMLElement|Tooltip> content)this

Sets the content of the tooltip bound to this layer.

+
getTooltip()Tooltip

Returns the tooltip bound to this layer.

+
+ +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodReturnsDescription
on(<String> type, <Function> fn, <Object> context?)this

Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

+
on(<Object> eventMap)this

Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

+
off(<String> type, <Function> fn?, <Object> context?)this

Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

+
off(<Object> eventMap)this

Removes a set of type/listener pairs.

+
off()this

Removes all listeners to all events on the object. This includes implicitly attached events.

+
fire(<String> type, <Object> data?, <Boolean> propagate?)this

Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

+
listens(<String> type)Boolean

Returns true if a particular event type has any listeners attached to it.

+
once()this

Behaves as on(…), except the listener will only get fired once and then removed.

+
addEventParent(<Evented> obj)this

Adds an event parent - an Evented that will receive propagated events

+
removeEventParent(<Evented> obj)this

Removes an event parent, so it will stop receiving propagated events

+
addEventListener()this

Alias to on(…)

+
removeEventListener()this

Alias to off(…)

+
clearAllEventListeners()this

Alias to off()

+
addOneTimeEventListener()this

Alias to once(…)

+
fireEvent()this

Alias to fire(…)

+
hasEventListeners()Boolean

Alias to listens(…)

+
+ +
+
+
+ +

Global Switches

Global switches are created for rare cases and generally make +Leaflet to not detect a particular browser feature even if it's +there. You need to set the switch as a global variable to true +before including Leaflet on the page, like this:

+
<script>L_NO_TOUCH = true;</script>
+<script src="leaflet.js"></script>
+
+ + + + + + + + + + + + + + + + + +
SwitchDescription
L_NO_TOUCHForces Leaflet to not use touch events even if it detects them.
L_DISABLE_3DForces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.
+ +

noConflict

This method restores the L global variable to the original value +it had before Leaflet inclusion, and returns the real Leaflet +namespace so you can put it elsewhere, like this:

+
<script src='libs/l.js'>
+<!-- L points to some other library -->
+<script src='leaflet.js'>
+<!-- you include Leaflet, it replaces the L variable to Leaflet namespace -->
+<script>
+var Leaflet = L.noConflict();
+// now L points to that other library again, and you can use Leaflet.Map etc.
+</script>
+
+ +

version

A constant that represents the Leaflet version in use.

+
L.version; // contains "1.0.0" (or whatever version is currently in use)
+
+ + + + + + + + + + + diff --git a/docs/reference-versions.html b/docs/reference-versions.html index ccb298147b3..79b2031f373 100644 --- a/docs/reference-versions.html +++ b/docs/reference-versions.html @@ -20,4 +20,5 @@

Available API References

  • API reference for 1.3.4
  • API reference for 1.4.0
  • API reference for 1.5.0 and 1.5.1 +
  • API reference for 1.6.0

    diff --git a/docs/reference.html b/docs/reference.html index e04f2807c03..590cbadaf47 100644 --- a/docs/reference.html +++ b/docs/reference.html @@ -1,4 +1,4 @@ --- layout: redirected -redirect_to: reference-1.5.0.html +redirect_to: reference-1.6.0.html --- \ No newline at end of file From 587eb48163f2b7d840c4f2ecc9bc4dfc7f3932c8 Mon Sep 17 00:00:00 2001 From: henrythasler Date: Sun, 17 Nov 2019 22:31:49 +0100 Subject: [PATCH 012/306] Update plugin entry for Leaflet.Geodesic (#6891) --- docs/plugins.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/plugins.md b/docs/plugins.md index 898c5dd70c6..b549aa319da 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1780,6 +1780,15 @@ These plugins provide new markers or news ways of converting abstract data into Iván Sánchez + + + Leaflet.Geodesic + + Draw geodesic lines and circles. A geodesic line is the shortest path between two given points on the earth surface. It uses Vincenty's formulae for highest precision and distance calculation. Written in Typescript and available via CDN. Demo + + Henry Thasler + + Leaflet.greatCircle @@ -4096,15 +4105,6 @@ The following plugins perform several sorts of geoprocessing (mathematical and t Alexander Milevski - - - Leaflet.Geodesic - - Draw geodesic (poly)lines. A geodesic line is the shortest path between two given positions on the earth surface. and You can also calculate the exact distance between two given points on the map. - - Henry Thasler - - Leaflet.buffer From 4a8e55b0c444ffb6490d1b4b1926529da524664b Mon Sep 17 00:00:00 2001 From: Josh Erb Date: Thu, 28 Nov 2019 00:41:37 -0600 Subject: [PATCH 013/306] [docs] Update Doc Examples to Use Modern Endpoint (#6905) * update the first few examples * Update all legacy Static API urls with modern URLs * Add missing map?? * oops stray png * Remove example.html --- debug/map/svgoverlay.html | 4 ++-- debug/map/videooverlay.html | 4 ++-- debug/vector/moving-canvas.html | 2 +- docs/_layouts/v2.html | 2 +- docs/examples/choropleth/example-basic.md | 4 ++-- docs/examples/choropleth/example-color.md | 4 ++-- docs/examples/choropleth/example.md | 4 ++-- docs/examples/choropleth/index.md | 6 ++---- docs/examples/choropleth/thumbnail.png | Bin 172242 -> 172205 bytes docs/examples/geojson/example.md | 4 ++-- docs/examples/geojson/geojson-example.html | 4 ++-- docs/examples/geojson/geojson.html | 2 +- docs/examples/layers-control/example.md | 6 +++--- docs/examples/mobile/example.md | 5 ++--- docs/examples/mobile/index.md | 2 +- docs/examples/quick-start/example-basic.md | 4 ++-- docs/examples/quick-start/example-overlays.md | 4 ++-- docs/examples/quick-start/example-popups.md | 4 ++-- docs/examples/quick-start/example.md | 4 ++-- docs/examples/quick-start/index.md | 11 +++++------ docs/examples/quick-start/thumbnail.png | Bin 464673 -> 458216 bytes docs/examples/video-overlay/example-bounds.md | 5 ++--- .../video-overlay/example-nocontrols.md | 5 ++--- docs/examples/video-overlay/example.md | 7 +++---- docs/examples/video-overlay/index.md | 6 +++--- 25 files changed, 48 insertions(+), 55 deletions(-) diff --git a/debug/map/svgoverlay.html b/debug/map/svgoverlay.html index c904234696d..9fed5dc838c 100644 --- a/debug/map/svgoverlay.html +++ b/debug/map/svgoverlay.html @@ -23,12 +23,12 @@ var map = L.map('map'); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox.satellite' + id: 'mapbox/satellite-v9' }).addTo(map); var svgElement = document.querySelector('#image'), diff --git a/debug/map/videooverlay.html b/debug/map/videooverlay.html index 1490f68eb77..8007b889edb 100644 --- a/debug/map/videooverlay.html +++ b/debug/map/videooverlay.html @@ -21,12 +21,12 @@ var map = L.map('map'); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox.satellite' + id: 'mapbox/satellite-v9' }).addTo(map); var videoUrls = [ diff --git a/debug/vector/moving-canvas.html b/debug/vector/moving-canvas.html index 043bad5d4fc..8e7f6a03ea5 100644 --- a/debug/vector/moving-canvas.html +++ b/debug/vector/moving-canvas.html @@ -17,7 +17,7 @@ diff --git a/docs/examples/choropleth/example-basic.md b/docs/examples/choropleth/example-basic.md index 29cbe3a4c4d..2f08b43bdce 100644 --- a/docs/examples/choropleth/example-basic.md +++ b/docs/examples/choropleth/example-basic.md @@ -7,12 +7,12 @@ title: Choropleth Tutorial var map = L.map('map').setView([37.8, -96], 4); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox.light' + id: 'mapbox/light-v9' }).addTo(map); var geojson = L.geoJson(statesData).addTo(map); diff --git a/docs/examples/choropleth/example-color.md b/docs/examples/choropleth/example-color.md index 171f7fb0498..f01191cd2cb 100644 --- a/docs/examples/choropleth/example-color.md +++ b/docs/examples/choropleth/example-color.md @@ -8,12 +8,12 @@ title: Choropleth Tutorial var map = L.map('map').setView([37.8, -96], 4); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox.light' + id: 'mapbox/light-v9' }).addTo(map); // get color depending on population density value diff --git a/docs/examples/choropleth/example.md b/docs/examples/choropleth/example.md index c9df07cc7c0..d335d1d501e 100644 --- a/docs/examples/choropleth/example.md +++ b/docs/examples/choropleth/example.md @@ -38,12 +38,12 @@ css: "#map { var map = L.map('map').setView([37.8, -96], 4); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox.light' + id: 'mapbox/'light-v9' }).addTo(map); diff --git a/docs/examples/choropleth/index.md b/docs/examples/choropleth/index.md index 1f24dc1ee70..917616475e7 100644 --- a/docs/examples/choropleth/index.md +++ b/docs/examples/choropleth/index.md @@ -36,8 +36,8 @@ Let's display our states data on a map with a custom Mapbox style for nice grays var mapboxAccessToken = {your access token here}; var map = L.map('map').setView([37.8, -96], 4); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=' + mapboxAccessToken, { - id: 'mapbox.light', + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=' + mapboxAccessToken, { + id: 'mapbox/light-v9', attribution: ... }).addTo(map); @@ -228,5 +228,3 @@ CSS styles for the control (we also reuse the `info` class defined earlier): } Enjoy the result on the top of this page, or on a [separate page](example.html). - - diff --git a/docs/examples/choropleth/thumbnail.png b/docs/examples/choropleth/thumbnail.png index b65c90132b0dcefdcc3262dbbaf58fd7ad26c306..ee53dd2afebcb1b515cef50d2e0c87234360e5ca 100644 GIT binary patch literal 172205 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 literal 172242 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͍|Pj35! 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%0A>un^2h%d(QYkJrW<Hq9 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 a>K_1cQOh?X)$Gau0000 var map = L.map('map').setView([39.74739, -105], 13); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox.light' + id: 'mapbox/light-v9' }).addTo(map); var baseballIcon = L.icon({ diff --git a/docs/examples/geojson/geojson-example.html b/docs/examples/geojson/geojson-example.html index 9fc8fbda6c7..ff3e935a592 100644 --- a/docs/examples/geojson/geojson-example.html +++ b/docs/examples/geojson/geojson-example.html @@ -16,12 +16,12 @@ - diff --git a/docs/examples/mobile/index.md b/docs/examples/mobile/index.md index 2b8e497ed64..57dcc60d165 100644 --- a/docs/examples/mobile/index.md +++ b/docs/examples/mobile/index.md @@ -33,7 +33,7 @@ We'll now initialize the map in the JavaScript code like we did in the [quick st
    var map = L.map('map').fitWorld();
     
    -L.tileLayer('https://api.tiles.mapbox.com/v4/MapID/997/256/{z}/{x}/{y}.png?access_token={accessToken}', {
    +L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', {
     	attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
     	maxZoom: 18
     }).addTo(map);
    diff --git a/docs/examples/quick-start/example-basic.md b/docs/examples/quick-start/example-basic.md index 4f0e5c71ba3..a6fa584e843 100644 --- a/docs/examples/quick-start/example-basic.md +++ b/docs/examples/quick-start/example-basic.md @@ -8,12 +8,12 @@ customMapContainer: "true" var mymap = L.map('mapid').setView([51.505, -0.09], 13); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox.streets' + id: 'mapbox/streets-v11' }).addTo(mymap); diff --git a/docs/examples/quick-start/example-overlays.md b/docs/examples/quick-start/example-overlays.md index b6258b2fd58..2810d97b064 100644 --- a/docs/examples/quick-start/example-overlays.md +++ b/docs/examples/quick-start/example-overlays.md @@ -8,12 +8,12 @@ customMapContainer: "true" var mymap = L.map('mapid').setView([51.505, -0.09], 13); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox.streets' + id: 'mapbox/streets-v11' }).addTo(mymap); L.marker([51.5, -0.09]).addTo(mymap); diff --git a/docs/examples/quick-start/example-popups.md b/docs/examples/quick-start/example-popups.md index 87185f8c751..1a1fa1565af 100644 --- a/docs/examples/quick-start/example-popups.md +++ b/docs/examples/quick-start/example-popups.md @@ -8,12 +8,12 @@ customMapContainer: "true" var mymap = L.map('mapid').setView([51.505, -0.09], 13); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox.streets' + id: 'mapbox/streets-v11' }).addTo(mymap); L.marker([51.5, -0.09]).addTo(mymap) diff --git a/docs/examples/quick-start/example.md b/docs/examples/quick-start/example.md index 9836f261392..b05fd1cc805 100644 --- a/docs/examples/quick-start/example.md +++ b/docs/examples/quick-start/example.md @@ -8,12 +8,12 @@ customMapContainer: "true" var mymap = L.map('mapid').setView([51.505, -0.09], 13); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox.streets' + id: 'mapbox/streets-v11' }).addTo(mymap); L.marker([51.5, -0.09]).addTo(mymap) diff --git a/docs/examples/quick-start/index.md b/docs/examples/quick-start/index.md index e9de01b2a3d..b9a247a0b2b 100644 --- a/docs/examples/quick-start/index.md +++ b/docs/examples/quick-start/index.md @@ -50,20 +50,20 @@ By default (as we didn't pass any options when creating the map instance), all m Note that `setView` call also returns the map object --- most Leaflet methods act like this when they don't return an explicit value, which allows convenient jQuery-like method chaining. -Next we'll add a tile layer to add to our map, in this case it's a Mapbox Streets tile layer. Creating a tile layer usually involves setting the [URL template](/reference.html#url-template) for the tile images, the attribution text and the maximum zoom level of the layer. In this example we'll use the `mapbox.streets` tiles from [Mapbox's "Classic maps"](https://www.mapbox.com/api-documentation/#maps) (in order to use tiles from Mapbox, you must also [request an access token](https://www.mapbox.com/studio/account/tokens/)). +Next we'll add a tile layer to add to our map, in this case it's a Mapbox Streets tile layer. Creating a tile layer usually involves setting the [URL template](/reference.html#url-template) for the tile images, the attribution text and the maximum zoom level of the layer. In this example we'll use the `mapbox/streets-v11` tiles from [Mapbox's Static Tiles API](https://docs.mapbox.com/api/maps/#static-tiles) (in order to use tiles from Mapbox, you must also [request an access token](https://www.mapbox.com/studio/account/tokens/)). -
    L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', {
    +
    L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', {
     	attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
     	maxZoom: 18,
    -	id: 'mapbox.streets',
    +	id: 'mapbox/streets-v11',
     	accessToken: 'your.mapbox.access.token'
     }).addTo(mymap);
    Make sure all the code is called after the `div` and `leaflet.js` inclusion. That's it! You have a working Leaflet map now. -It's worth noting that Leaflet is provider-agnostic, meaning that it doesn't enforce a particular choice of providers for tiles. You can try replacing `mapbox.streets` with `mapbox.satellite`, and see what happens. Also, Leaflet doesn't even contain a single provider-specific line of code, so you're free to use other providers if you need to (we'd suggest Mapbox though, it looks beautiful). +It's worth noting that Leaflet is provider-agnostic, meaning that it doesn't enforce a particular choice of providers for tiles. You can try replacing `mapbox/streets-v11` with `mapbox/satellite-v9`, and see what happens. Also, Leaflet doesn't even contain a single provider-specific line of code, so you're free to use other providers if you need to (we'd suggest Mapbox though, it looks beautiful). -Whenever using anything based on OpenStreetMap, an *attribution* is obligatory as per the [copyright notice](https://www.openstreetmap.org/copyright). Most other tile providers (such as [MapBox](https://www.mapbox.com/help/how-attribution-works/), [Stamen](http://maps.stamen.com/) or [Thunderforest](https://www.thunderforest.com/terms/)) require an attribution as well. Make sure to give credit where credit is due. +Whenever using anything based on OpenStreetMap, an *attribution* is obligatory as per the [copyright notice](https://www.openstreetmap.org/copyright). Most other tile providers (such as [Mapbox](https://docs.mapbox.com/help/how-attribution-works/), [Stamen](http://maps.stamen.com/) or [Thunderforest](https://www.thunderforest.com/terms/)) require an attribution as well. Make sure to give credit where credit is due. ### Markers, circles and polygons @@ -143,4 +143,3 @@ Let's improve our example by using a popup instead of an alert: Try clicking on the map and you will see the coordinates in a popup. View the full example → Now you've learned Leaflet basics and can start building map apps straight away! Don't forget to take a look at the detailed documentation or other examples. - diff --git a/docs/examples/quick-start/thumbnail.png b/docs/examples/quick-start/thumbnail.png index fa75cdae4c55f7ef0a4789f6fcd202dec92db812..60ee04b1bdc1aa050fdaec511ccc64947893dc9c 100644 GIT binary patch literal 458216 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%0DGyv{79W#dLf3a(Pn(aNKM1#6G>Y{lKsgpd_6 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 z z3lHgw^Cs?>cZ&AmCbAw+CYV5nT%$?E>31C-^%x_SBJV4BhJuQasQXdc*#Q0z4)!N} zGn*BwSA#A_uIGOqezr}6Y7OpJaF-V7qHvrBId^u!yj}KQ2Q6E0uRq2o^O4q^VYaol zY&aPl<2Uxn1b{53!P_DwMjD9UXu^`0@Sx4o2k%l?qI?VdH5nP_19z;y#!D%wzFxqs{FJTQ;_aS*`g%b!R z<4SrcvvfVmbdBLEae(xMuf;pzJd{1;6k?&j{F8}$URr!4_N2vTU=i2s;W zI4AYYZ^uuslkTPakMw&p$V`r+IPL4)--QPg^Zz=|-fAC8zsh|m@x;T;PLjooMY*ee zT~x<*VXb10IyNd0VZos0k6K3?^=A}nrr7uodJ7=kqf6hYCh+>g#^M0+m?OZfl9BTT zSu~mJ{-|4tG+BC|78*@my0>)ixZt&fSg0>5q-Eoq?(E*2?yQ-SBWD&<0))Z3siJ9) zx?YATU^qrvyg{d9Qzv3y!y~b#vNhcWR^e4@PQipg&)k0v7nV$@>>N9KoFaRc)hBHp6Sj+5!ew?}#=}7D6bg*Zu^^pDBLSOcFFD8H{LB%g zse3`B=<0UAE@G>!AqBxvlQgi+`WIT(IuJ_LHYEb~wY~2C-zD<$uYpH3!-T+F-*t{m=mkeJ@ z;^IBPOUpBJ=5FooyQffAY6~F{)ChVBRxdMbi5JGK&7m2!&H8^d$b*I)|+-?SHRvbHVGiC~!R3TsWeuYq$Wgd1x{BZ3h zo#A?Z$bs?`@I)MB&E@_|YRjppAf!NyVfDb*i;~o5mQf>??uyxnrS)uT4*W;thiMH$ z?{LX5pC{OB(zuLtC1OqWH|NK9*SAWQOhLLkLm;Z!zUxa%nAR+71i8VqmT|)YDvQ#R zG6o;*n9hCAFZ@Z16;|)urpEx^WRk9T#^EhaFdxp`&%EolHnU30fN@u@cWWQX7gPwQ z+cpzRbV)3n`Z{}@eKES0UmRN-uF34mMHHP`;BiUMY<%TJM?5`8KsH%S-OO<^Qy&SS z{p`3EtjpN3M4`xvC&EP!gMBJ7tqLesht~=M{YD^fCE=nG%fCVvckn9$2>tD)-pw>_ zn|3TFuC*3i&nid>9oloaTFH!q690lq2D;TIx~epqzN_U!KjiT5V2| zB=i8Z^SZ09A?5xXgpXWM#+Kuf?x9FSOXT-Wct#o)-4ha;fHmd0N11P)o5CbA0W>e? z85&u3GjNSyv8%nDuY#`z^>ZH`&-g;=Di)bJ=DbSy$Q*`_wgxR#2(Zvvm5(z*6rHG# zMcDhi`ccO}zk5yn#Wy~etNg8g_%SV;2&=~6Eu7rVDW287HkwxbL^N5MSRrFzz-j!5CsJYW|Z`^KtOVC^c;Q$o#2b<|pv3OCfYIhS`s2+0w3zw;84MfQ)zT z${v_C7C7$fMDQ9jR)LK*`(XNyKLs8ZH<~0H6fd@l2v& zA31U&`nrpxF7k+QDLBF8D^&mP#0unGNKmz&)tR2KC>9Zj4MN{2E=Yq~llei6-I!4U zRc5U9O_zj7uIo&zm2On6V>6_eyHT%%uJMzfisn1-iO$d68kPOe*75j%>AeBQSGoQ6 zd^NxK4?_W|dhInachikA`?8nD0@-$sTOz5eSBrvUQ_xiVHt5lFE*wCXhYX_&>z;V3 z@Mqv`)QbLz9;_Vj!RytA(CiQni<==Sf~%KvHU|Fjtite&@$%ks6nvv!5GE~u-lI0< z_4ZEz-u0pqBa!jWZZb0`*%i_Kq*}mde{&Az#9fG(u_fN?tL*x15jmI+|I&>r{;-zj z@WX3RMNJ?B4p$rm#LCVJM8=WGY_$%x<02`rlU8U|L8(BXSCf`zs8Cq9%r)ls-0}eY z()4fZG(-I>i6ilBW*ebs&2wG$3Ap7UKx;?APv8m@)52RtvC{h5%@#zXBZwZX$6j2% z69@%ISXb6cvt~~VRdP=ZtJSlu1noc&$mIY4KmbWZK~y@&+6fj}-yVPfj)x-Dp_>m2 zHgOwsC^_Ta@uu#yxMN`e{60V73DGXZI&ce6iib5k5@@Q9lbly}vw6uxe3XREB6VJ-$ z@?FfcP4S3$Q)t(Ug^OZ&A}~VZ+TlwITq+T+QQLN&TBHNO*0xm|DgvJV*+=I= z`ABO}f5Y;Gkd`ga*#>906()?EUqQ%(3fH9YOBWJ-Nd-OEvdJ0L9%Cb4Ejq3p$E1Mg zBYkFlE#!lq^T)CIOli5blg`_`nabOb#?GBPQ>iruwF&(6@EXUb5ZT(M!9yz;w4F8- z8cYB4(tNf8MN}{fI3@&0uk{*V^*;HYvB>-;{b{VN4}TZ>ZOw$WRQjW*f`Ui*OFJ=! zi){Mq!7VA^*J*%v(7~j|(hr|kJX5~s9r;{w!B<)+arsKKjm0c|E40LWoj<)dO$1iY zPd>wS#4`=P289BiZ5jP(q*H?vttn%)zF9&O<4D$Mg<5uGfFg$yq}Cpbi(x=VqGy9a zGoyGwE<*aIc55bC4_RdCegHZ9*%#;8eS2Bl({cHWZ%NnIo+lrTXCB)f+b+8jLUkg( z{`pT4T#e6lU@4{Rzd+5Ct(3aIFl*Gb7~D)1XM-a9(R8fXd=PV`0a+sykQ$DI(Z9F? ztr(&L(hgB1(XA&u6e5fj%3x(IT7CTk2z4s?kSh4=({kO)Of9$0Y?pXw?qjBx!y1E+Tu}AmEhP4CHvJxhM3(oX?7q9i8jJ49m z(1u$~!NxuhQ&(xIpWt_d9Rmg(quR1sWd-5V?M%G(+(QB7@fy zH+5m#Z>;UdhN*YLXXo?ao^RQd&uIC~XY&W9`hje=^}G?j#p zDdQbs0w$*Bs8C&80^G%|bsS70$#rVtDj%~mNHG=Ccj=pP4hmXUfw$vct1#tB@l%(b z)#07bvU#EcF2Vt^Zm<~KV#K!5v1VMf!IL(<^ zf(*0 z%nPq3vdfyAaR(#h8JB3rq5Dp0wMv&957M$ZO)%_iaSu6^eT{HFVk=ggS6CUKs7&fpNw zFxc5=DyYskilA6hOd8ONg_nF15f%DH5&>-QT!tHAAHTf(=rn?L;vf6Bbt z{>T6RAK^jl)k&gD;tXw@0hm0{^_%$3SokN7>GG4-C{y{H&rCsrzWEMkfDd8$2S%<3 zAdr2ikJB&0+<2inZrb0RBieA^%oVL0V|nL#@ZXDp*CbY5<^+u)=b#g}{G@fS>m7qDg|y&{Ml#wzMxF+{Z5Krc+PNP{EUjTC7olNFhNY=7RV85-d8VxJihe zFzX^%WY110SsOp35Or$!IDwy6$9*j1+iv|7yE|XXuFVe;4y{}pPd;!DRYUs`43=d3T5Ym!3j}&y-})G5=jJ{0_Ykl)8^d#lqjO;`!U!=f z#E;~_nT&LgvB%CLCON%3z$jxd+!JbyG~Zd`2sCwDBgC=EF}3IhsE zPG}v${SNxl?^znP0;ZOfr2|VqG_xwGufxW$6hlBj&^KPHQFlU+uD|wz*tho(#Jh>= zu_FX9cf<|XU67Tu52MkpTe~!luoscBU8|NtkXVGm+L(zYxDB=X948a3pE!>@?|VAd zuK_Xb7@GX{Ez5FGp`90RK)}IGfQ3$N$P(pK4P%aC@;&BK< zci$T;e)^}Q@!9>^?sNYvVx5^-vpi-uZ;k5GWzn>3Q?wC)uhw<6VIPmE5m5)o^Gp|R zWGFXcu*_6aoMv<9FAkYc@B=^#WebpNu7i zinJ#9GtW;NPG7jJo%p$h4}CCV&z@*qvpzar^P1?`ur7(53X#lKOOV0x3p`U7ZYwS^ z@xOzb9?}o3t|?#l z-0Zj3A(mYB#Xj4QQe4m9V2mgU5@jujr9Zfxp&e;C;Jo)Rle`0O)qye#jC(_%=CO%hT7%LGk6=6kjg>aaEPQ6-5Er_} zU2opxZ}wB+T&tkZ>xP(H8!Z!0wA$rbrK8U|n57gJ6s#L~&CeVsec82(^^7)KJJvuS z`p6t47A>!3tO%6T#0)MhU=1hUPTb-K;3MB4n+O`#X^~w7j+XB0Sc4Ce;e$(j=0U9b zSD_dUGlylXA_Yg+gcX(KPg+MDm*bU&CB1V#z#GTOrFl3<_D_22{jkJ@T?(nd)@xG; zLIBxR*$G+4%{jLmL178=Z}sA$%bY3|(NZKp!qHQjv0ihnwv-gA39OX&KTNZNbAN ze3RfZYawH~IPbfSsF*6GwzA$;^t9%=J}sf6do`6w8+Xj8B;6gr{m55gn-~mww?L5l z!5ch1GL9xJAX-qSaK#u$b(#JVca{+0aW=vUU zuQJSWbt{pC!^t*1f7Qkw9lWNt4H+w>hF7FY1%))@ z;aY2e$yXJOa#GacP2--%deIIu0k}%c_&0Om(RLCG*O{I3I|QQ-lf2h^oT8qQ+Pv;F z_q5XFt3cC&l;4P7d4|c>1g<46g%G4{534JyeXm)&A|8HhKk#0R>#y1jLzKXwMZ;J| z@dXbp>qDumuz%aCwCde)?-Q|g(@N%r{dI8Ngr6^N#>oOY7gXz;nN3bV7M0rrPMmcH6?KKi@q&e9gO+qQOt^C8|?ql_i8z^M2- zjY6U|r-dS@)+|ZQ9(SCsRzkwmuBBaDFmsd$RrNw+$h;;tX%pEKJi?-%OSkU zC&lX8i8V-i;T#l;7)lr43vDPGtuaHoe5#C>MS&&za9*!Pt&<{jt6R6mik`IzE9YSx z7oCB}&BPY9H?ZAu=y5Hwq96KURXy zN#l28@GPz2oGWb1wOokR@hbK>`$8;^d^uW|ZHL=+rqbjbIUZr_T$VOuy3U0wz2Ggg z0(LtwoCCg|^BSM;pzQfh6Takn&h&d?eVaShaUJ*sC{+Fz5hN5$ie;D|>684tz=@fG28|N_;UVtY zNAWTF6W7_#RFF~#k}8((&Yvzhaox|eGvFWBXaBgzSf`>e!9O8#uE*rse7663b*$f{ zfuM{Bngm{YBy7N~W-@A9s&_Ky2jTzJz-r%)?V$beZHkKB7ltlzSg;KHJ5C{UO}uV!O9=rH^8EFD}D=dp2M zmFWEb0jl1D)K0AXVo6xsRk?vavl8;9JCM^5h7toHx;Ee|t-?$!UIRU0akHp1?uBcZ zydtrJ^axhQ9J!ba;S(uqTYwOoU|VCS2_D6C-+)$UNdm8Rp>%?TPSRon=OM5G2(X?JzEs4<W1tmMy-dr z>HMwVj;6o<>pXYn4@f=tyz656{2df+Tg4oqZ9#YxiCYm`VW&BZBxOSc!9#?hidqBT zJzPxr4$LKhGiW$C0TGy-|K}X`4Prg_yyr*tk}FC5CD!A>o@lw_^HDiLrXEKlf>G}; z{z}aM*#~0!=YBROzw73N2e;-SOeDhMx0-x2LDLOb)fy!Vz`6xx!b@TC6re*akr^>J zYL=#@yJi3k*->TxE#rTV95+s>n1C&X;WH#oOl!_pE_U2s9EnU6XFW{ffj{%LiUFc~E3`xI5)C*SveF2D`+-uFgj<%*a) zbU0?;{??fLlMh7Y-TxKgA1xCB&?2pl!x^w%3RIH%G?=6j`cIPGW$?Y`ewC{wSe+LZ zC>)BgV$l681X;Y`4$ebI?5KTbedZyP70%#~!n%hr@Oy3q3p}+_r7N7Vs8!C)P)7_6 zacq?S)CBV^a0y)6=|dBNyP3{E31)%oomjX#5sn7g^jK!C(2$lb`e)HWhvvFU0E5oX zt+dGaBj>)%k&J_Q1^S~kPCBXev&Z^{3l$5?Mr5^WFQ;N~BcThTu0moio3R{XQ65}eoy5#*Z9{%V$b2diR-dL9jF>iER&yxz0rs6F57IjN;V7)d`1ZkFp3{`F3u^IreG^n)>Q)ahh>eM;-aA(fh<+#rC~ z@Jb_u|I`TWTMjBaS?&?&(g6Mf4`>AQ&`nI_D_;IGf~oJqW8j`{rI@cg+V&VB0&+IS zeJIrk+SMv9aw@=k)+}>;h^(zcHMk(qlaQ0KVf0fvXn%?@?3jGfKP;|ph1AKMs3@nP z!kpSa;UEmW&OQUYd`}A$*H~TKYlMmTn-()K=kRiWKLao3sjT%fc7=E+M+hY>q{+19 z=e(aYt>W>?Z!mWVN8K00MaU{->k|2A!@>P~7S+0BvL{bXWF^aVfpE85U>svh0W8cc zsw#L7@=4AA5!ZXd<;)YHYz`Rd9r*vq&pElawNntE>a-F%`s8lUD_837RIr+hg9i^`Ezm*&sYcFo zFDMUpF1J#=)(XdzF*y)nvj}^8+&q+I0)#BBATlIhj!9gt6OMD=vr+!k=PA$m9k`sH zsK%Rr{xJgfVO$93n(~#1WDsX$r7%5@;UOYNCwA7{-Bwy%tpy{ixk6y)re z?PFa;*|L9&2>vQ#DxIAKwwfK5f);Jo`{lbwFG&HyS7Fc62r45gKE*nufab`ZQ?|+> z-qOuYG3Mm1F*gZA|yR0Xj$7 z6W6LPidx^ylG0M9z|SLDU!CxaUU2smGfzCu{IlTFK?vYeq}(4x*~DcH{m5Wql-lOC zZ=)p1FfRH&7%x_B=0q6USI6SZqX<2?vN@bfaor>cVjgY++%!B9VXey{Np|KZ+-t==zV;j`$La>uELMKeKo07Z% zvp93&;pqq1tA+fEOuEKl8~?$NWFvYRScDyy2#pz2SPs;uamP5Cr}G2umaGdJLjAkOE3O z5`z{Hz`*k{7POO`j1#jnP-C%8#x<9&fybalGDat|4-3r|m#&PX5Q=u<476l*k;yY> zT^AUN6FIcB8&}%OWa2K``FSb~BlMWg+y#MkdlRKLU3JTsQsMvxYn(^xLOTSwqQjf+}jG_X@s{xnQEW*?{jB3a#12ILopVeGi@z%_+r z-D34UfNU%0aPPht{P8zM%cGA9-ZMw_f=gre>X%@x=}W{^5NJuExA?b9-40@Z$lhu~ z0IFIsoqt6$L*SKx@J~(FMdrdOM1rv)aO9B$-;sEfzxk2R;)O5!SU={s?Tp2XuZ%^u zsA&HB=b{0j%%ka~4B}&Mxf%SxWy~|Hls_QKDB5p$8Ta6Rg7}+SEC+0xF^ZxoJ43W)-|3@8_589zI{zPLtt*!WMXY)$q}A? zVdpAbkrME^q#2V4mI_P*xY|h;&Ch;sQ}~03FfH^A%OVdrvyOZQuSVu*jLlJ{fmImZ zF+vE;s+*of5x^42z8Og~>h#lik*xVbz^cq9l}*~!N-5(P2lH8e^D{V7)<5`yYoT%8 z^~rxX;sg(86mXf-8R&MpH|dpyIGb>rw^6~rnN6@O^G`>^sb`{f;t94*IL6!|wCXyf zAvfD>WRuNkSp^ys6S(vy`VFIFJy;sS!n<=O?a&W{ol9T1m7}axO0fV_g>c7H4k1J9 z^ewF@EEf5KZnJc)(_iOG0Hz|xxtuVlvh#18*%VeK`{(b{5pH4bwO$fL&AWVwUpei) z(m+1*9C?Y>%?dcL5NRLF3tE-^peNj$^g^Vz8}uVHwUU@gzZ71ytnqTau=~LR`*A6R zk5Y=pHHAb8-N4FB43ELW3L?&(t7Sf)$#;04f-bG+fBDbgz|wg5k;lkDelj;u-g(Im z?rTQ*T?Ve#1-Jqi`zcSK#+xDB9fx?SYcOM-7^`s9Rpucq<$2%gaEw}Tl}YsEVdBiG+_f=jcttKf(r&z_FZvV*NfuN?33~2`0WS{17xY00(=@G0^>${HwMVh?k_el zxI721;9y4#5)@cxgdsj_a&Kc%TDf(0gzPUEqZNM5;t~iVr7=6B2y-GrA|l{YSQ1gS zFnN@TEiF+XPC(O2FI-LlJjlcJvnE&8kMCFo8oVQqf*E^%>2Y)D*yyKnG zp}WZ?!wDx_t+%6XPWF$as>#!qXIs zTCzAqRcp-4Ok@?p;YN?9>bnhwgz_|QIns1sY!FQP(MaH~#G!=@70v0!Woa!?c+9#q zFyIr%4kbfSsz1s8Rhs?ny99m>77ByVCGf(_ITeWvIJZ`lrf*$<=?-gK1yS7Z$b|@F z5dH{t6@C5))o3wF>-vk6SP1tAcgN7{UXKe3fvR@QuO^P?>KDiS>Wv8pe@=oRF@Qn2 z_&k!(&`~Ww7+ztKQ~X-D{D2!|II?^p1`skBLjp2;CrpKEIant79qi^4!f_IzTKkOI zxhRKYD%P>to!7(+!cohvuSd&$Up*rjEqUwPvk>IiFaAP~(fc$_8+>Xpz*E2YCkP-| zOaJ;WqhZymhyw>>`b|F(3m^FFX!@030)CpZ#WjsC#-oKg7&UWG)`1s2P`3fS*Ct zT3zO0Vjk{TZ7hpxqiB!{NYr(Kk+)F6TrIY0%n^d079BSP?gGDc%eGNKRl&zn5Yq^I zbLo~ssN%B>Q{tTQ2-#bNBVrxQ1WWfYih@d;o5NaQR+p8rM2=17Di#=TAfC!}5~%!f zE24JdCKV8^qV1;6DkWNKiiXQh>^xhhDNY)YEsaW{hcUVyGRRlR%gk}XTjxkYPmNZB zKLG=o9>uc6dURt{iziBKq!%hIW@xe^X;Bu8^sf#E zCBqmeaTbj4^yG1>c2`MK>5gA{b02F4W?CcgGUaB3;#S~lY^6e)u0kvQgKa1j2!*UI zqP>76ePWElS>|k9MLV@&EJv_7uf@u>0#n0Px`>k3-ht9d23zCoGtpSx9}8o983yr> z)W32gPqE7FJ{p^ery~Hnv11E6jc;U6uNACAifK;6nArrmo$+-MRDO(Dm%)DM5o^eO z`+Q!~k~3?Rb>MpA(5k1!LYh^CCs#W74YOwi(Mz0GOT#797h+d)`rF8y8rxJCT5_GC z$j%Uh+Cm(O%-zx{X*J7!mrwweTX9Exwl5S-O4{i*H1Zi;bjEL~;28Ip0#j}7Qefcj zREk;m25sAp!i9xMU6(+UdvZAw&!XV3WkfnGio&a)hh03wBAF@{71uCxUZB9GT&Qy7 zVab!ckLL>$Y5oHb?T$?wHpVd3!Ve!k0`Dw*R)I=5U#^FoJFfS$eG%?@mAp^>C{1wgyutM-T$DvrTmX0CVfL*yP@l_HC|O<$ zuY&qp_6OvJrm>Fa%|26pVYa}ztVc!ri1oz0ktq$`F&2q*jF>SAcm)#L_H|Wkz6W?Qub;5J9tQa9cVri-%`+Wg2Odj0(%d z0*IseYI;}`vjKsafhiGgpqfB+zAcswS%(P3 z1IROEryM__RfyDE_Pue#QQL7M1h_~jF-l})U?Q&4uadZvJ2_(}3dqTI5-#IB8hQTA zH|~$hhd&n0Z+Tm^{OFH5H&OlbKacAB-WRPeenm{~yo93iP zzko0j6a^GIL11^ORrAop`!a@N$3^QX+DOldYJd1?%%Z(Rv18y8{I%8i>NlPQ@e!aP z-WO~my9e$6>v!$W#nVOH!NuEFFsAvq_rYglisu;naoI%>8Ddx-f9h~N|H^Ig^xhL> zsvX5Gr_e{t0Pa40u@a$@-Gr7!-z3^1T0!Fm7y{LVH6>#)Y=fv{7odGCgt$2;Cs+(H zy)2~;~8iB zQGRw{{(?5^O{sU<(n#WX*{Q+yjl6b@a$%d(uKM+l; ziSYUP;|vCC4a~k_^>4=9(bLiUe?1j{^xs!8rdd*cHT@#gFm7RJ%!yVUaW(6%0C|O8 zPWwM&P%LOD!*Z{!+>?uIo7i%uh05%U2u+jY#~>oCY_4g;b=u#z96=hQ&ALG|6V_B*zoP`nRF#H$;iaiGVado25lRARV*J` zyVw>)OV0wagT%zC2sz;`WG2pFI+B39KEy}0U*~-si_n1s6LItFmy<}+5vR}-R`)K( z2S0w4ZCG%xHV#EcW{om_?o+^0$KEGreT@_-b4xXyHbT84Hb{F>kbk1+|x z^^?!ylhz7#>LNU7y{Y%Z7*7R6`>0Z2ITPnj`0^~e>fGx^Nm$wwgk}H94}69&)vF-$ zRxs-CZH~|FYKcGn%OiLVh)?aM4jz|JQt0;B@x!rvZCCu}+p#o~4L1(nq+UmVjA1MV za>Wr6D-ifS6gYTzJoLyTDFE-?OF5U-tK;5#?}_WKyABsx5pe7D&wCtqod(wnDyzU* zZ_RcMS@9Zqoysp{1$ti;*c`Ou;+YCHx|I_aIb?nZw=Ko62werDSZmEl)Ov%k1RjXn z^5@o!lk_HgRFs+WsrDD3^z;v<%;LPHzy*H$+#-m5)759bq#(>%s2;nGjK)J)Y!M9G zc7nSUGDhJ0(q})+wo0q4lXw;Z7^^VM#cQChTY9*#-MRcQ=4>}4)nBU>WOmjdP_!SA zVW4$+tnOYLcaQu-ENxpJJNmDV)@cGLo7m|VA>%YcjR@R>fHW|OsSeY1(eyxO0AyVe z0|TAJzW%{nxB_1R%nr@Wwd9^#y7ENmaWpwK!3uEa7FW#L1ZRor@Dm$-;lfQ5}e(d#o zbAVuYphy|#C8X7#@I6AjolELra_gzDA`tLp-6)NnuyzYA;uJl)e z`q7VK#X@Mm`Fjvx)MOmGRfY>8QS+DRxHGeb5_`cX>)?1O9I3I7&mG4KKrJn-w^|n0 z!*CRur>tB)^*Hk<<79(itbNN@)1UrzIltM+cm8}^ARukj`qehH6xvk^kRCpG0M{Uy zIamrjFMf5v6nlsr^m7F(cOwjSHknCTXLjCm^>-PE2_)SFw%>lwXgqmhE?#?0FTyX| zRiM;a?Rp$bfypNd0xBq7&{u1^R7jm(q*676oLWpH(b+P9_~TU|CF{$r8|1VsMGh>D zSnODcc?G?Rxg&p(xI1e=G^I+QAS_XY5G*Vewm?{DUC;Zbn5(QJnSkP_Xz=NpXFOIA zha%H%u5$VzT`blD_d3)9*F~1|Nfc<**0d%VLLn`X&S-I$DN6&=1qBgGJ_27d-P+%* z^PNYoZ7oLp^Kl8j;@(jpl)*Qn=xga%z{;)JwK{7tR^iV$5gcXK?)7%$#8LPc?pOLN zFHGYBu(GzDbpG(+Bdke<$ikErK7HIEmYC%$43E$fTWFnd^<3dS`3ab?-npg?WpeEJ zca7rGL z#Ukam9OARUo`J_+artF&0r8e5kmyETK+v8gX~(3EMM6P}Tb;s}%z?%g1zGXB;9adl z|H@lhsyOfX9jEiCdr&y0B^{Wg@G5-7aQY}7c6JkQH?aqpu`Z}gU2W{=9Ns6^OdEX5 zJ>Qy==ra(lB>LAq%my&PwE?M~u_qD?;EOyxj?0AwtC@ERE-nR@R?=pt$UxZ8yB$C^ zP-|m7u|!yZW)PULP8f(N;^YMJ4EKmCLB{&n4YH)dEPI}5t?{$czIBV#nq~IW)kgfF z)FYCS)6Wr7WJgEP_A!$sLw4ddnaOEbNHY3FY!-<1C0r=RwV1WlX6zAt(cIDlDsA589_{`u~V z4_Ps^1`FIco6(VM4#8W!f|vs${xeemSH&H7J)GN_Tyfd?acXofF5Ss)<+~n>UKWj& zw$=7r+!!mlj;f#(v8xkT2j+fb!^33E@XQ7*dd(sQ*(zeDb&yy!skzM)M=&?X=C+ys z4nlC$1u9`ZZ+roo*z94pSozO?98I74bYA11g@NTUcm7pTdFZiNJizYGER-fJU5z3u z_#zRT#6NB!vn=IKtU+({V6>n$AD({(8x?bvOGN_W45N{mb*3=JSp^;m-@ke=*F|tT zJLg_63e?enY0TrB@S=7y1-e)MNVI(EA9167Ew8g~(Q;yJj(+?j(e#3w;)lL>b;LM~ z?YDm;8m_@*arHG3cYHnK{y&VxxBN^@e{V1IJq$?E7F}x)FrTIHBkpRsbK96xSRXUU z5pue*?TFdIfEOUqDQ_GLNN1kKb9An~7cQ1>P=e+md% zl6pE@&JlKdQeZwsn+DpOwBx4chF*B+QZqKr`7+T$A=7y`;Xw=I^RItlT(sk|SPpGC zu-_de5G-qgO@UuF!~I3zlUE%-emuU!xPRaWUJo2f)pspMwy*a^cx!c5K+WIa-MWJn zq^5ZPo4@%`tXQ=HvMZX1p1@-5dAPj{E5Zt};?0K|IZ+GX%69IWmCOi8+@;qJ8M_G0gG0*bcxr z%Z7?6r2g!%bI30NpVnPI1wx8S6H~G67RH#zy992AT+J zJb(oPB_zGIK4?yL3y3A8D;vL*;xT>G7q2v|Sy+f!C`+Nu2|GQ7HpAgU)asON19|(F zi=1~&v(r?$K7ZY8T>0jW(QwDRgQ|xSSNx}(fVlH_c^2_JZ~BoKZ(+L(9^H+9R^)*^ z8SpL(3RA#j;s?Q43sv7`9vc(m&Q zs#*78>LgBp>bu9tE&~@B5AH@%=DWLysK>vq%j?Q3wqtQZi=*v{)2B$|?~Ju;m&b=c z`qg;x3opVyiX`8=S1dop7_Op(TVf<}AVRDG;Mx+bU5GAAHd z?J(hqS(q)=bp;5IbF?{D-xtU-X_{pFknjIb(e³Gxm{rQk3`nUfeRsWYoAXqj$ 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⋙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%0De70svYf(oT8hvmkh{GYRlHG5GxK7RI!~D@S8@h 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%0D#B6ABe@e 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

    R~Q+^jIm2B#I|bZZ-B8mLz%9WQ{x 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 literal 464673 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

    B;*M?0gtRvO_JN(cxsrWXJ!r^;kbs> z#KtCZ#dE`;>0RFLb9U85bQb9xp?m$h1}G`-PRo8Y#| zy0*Mn*`TVKHD8U_0O{8C1x54K) zi$E2$L9fs#l#rTB>@v_Gpx%fD05_HN{&Pcti`+w^@Z{k@cwkKi-1jnNG($3QX5P>P zUPL1B4(4~gMRbU%0y_;6Luk%zh%W{MN5A;E&ITa{GpEARSOgU8BCMhf+G1K2oq+*2 zVq-Sc#cCVwo7+~4)>71f7z2QtrbtX;u(h_9nsaTXk{X-jn20?)pHg%VMnvzWHOqMc z(c&>3H^c6YNu1vM#9XzV+a6E0Q)2}AkfwN z!}>^?fJq!~Q`=(2h|YTo&gP)e$%M^|q9Kq+_J{=E-i8;^o1u%!gb4`H9)yDu8rVP{ z(v>lNl}Q~v9qu1vL1>Jt!2-A#1~YGFY)FA!AgEAjNV5C8POvmKikgPWrYROyK zwpy!Muc&+A#VpOE59k8BrmCo|H8W)ebiMV>e91(mwJv_qOr@#SEXt@2O}TT0pdULE zNsJt)Ii<+VSGX}x)BO1O#`z#3>Gj?`I2WJ?Ax`uBq+hhIhT!y1e<`YhRAO)sDSq{2 zUws+A_=3X}lAv%|TM?HQ zAw)U`0IH+hwmT&{xIER%6K6QQ!&$|eh>fv_^M(`nJ^4V4bX|>A)D%Dvs)Bi>UGFR= zG{m0Zm`W2-?MNG?k;xLeO++^1;$mhz}`D9iyaIPe2bMP?juP zagoD5qVKnD=fMNQAb;NEoXCt#3B+p7dCj>vH&o!rJMTh7spd!rgro`PN`M%N;+~yD zqRXa{rgnJ9nm00-55dL6zV$&VhUDji3m(Rhg!*_rBo`+P9$H1jPh@l8P7Ov3n_(S; za~kh(3nCBXFRI3%YFllm^~~p2hou*T8YkXQb4&^8 z+2EPEgcymEnd|Q~Mo30vqd*+>>g8&<)87UJN3=@`-e3@iF4PxsYx8{{8{;(V47{sS z&UM0W_PqwCNZ5n8x41C$dLAhPIIZ3_H}zrwI%$*CoSFr;NR6aO4bnt!o$#B%7ZHWP zErAvXLLF@=KvZ{o!vIVYBB)YpV5Vvvn$TyBony_+U4!aZkyW~}6m?ZT?9Fa+R>9T{ z93H0lJAeN79)9~bHnkAr!^5vwL~nQV1X@ZaEdg{VVp%>Yp2Exzhuu8y@M3olh@T}h zh<9c$<2f4OXOJ2&8yGabri6rd;!T~i={(!qKa>8;KI^r0N{D3V#r^T0*1z-j>xU2E zJfsBJQ`k!&Iu<}&SF6>Y9^tS2CHGhUB6mP8*47tx`c`#SM7CFi*qYZWO~)~)`ck-7 ztTmV_8hQXnrZX%v7AHJq4Jsf&;L>9{%+uk?r5ymaa<2J9Dc`7_kcH4jQ)DEoU5XT$ z5k_^uJ^u{~)q(8oq^4-s`r&GYhWFmGNC?^s`8PiNcI2-dB^)+)K>a0lox3vNm1Opr zV%$yQ4TktWF>+rT5zYWxuWkj&f=^~1pq~asHN>mkNvl?JE_rJW`c1DLaf#b@0`a1u znZv%6Su1&6Pk!kx-JY20uvpI7)X=1?r(<1!Jo%XB0}`j`UBRT@d6P!$wX`$TS7=oQ$2CtfhHX5{+mqD%zS8bkwCkNH3j!M7oMe^mI$m zRw&JyH=V71g*5xf)5OUI2cD75(RD$)O0wFmp1QxohOvz|On{S8QdUwVv(HB3Bh++g z?uCd4G=k^3(ob)p!38u4t|vDA;x*$`D^ma%)8y*dH<%p0Wfwh z1RuP=rLNO7`4EOvjpLWIh^RqvPIEw$i?{OB1tph7w%mGsK0Gej1XNI)DKtUday_5c z)486voJG;tb4RJM8^#w*f}oDAXUWY*3!=yOa%5D;_=Cw11rUJDyom?sXUqk|y+R~0 z)J9i(Arl1?5Cc&&731C%F@ntG`Qid0BDGdSagM#~t&RXwz{3vT?ETK8T7B2fzu3;p zyRZxUAJ6lTW_a3>cT!u;MVm6A6j_g3E0!M8144XE-usy1xVxD7vc#IQiq{&oAqciw z^J}DOBJ6y9A3}(rUB$|p_LKpdm?E*>D-IhoM6XkaczpufdPdu5ly`}Bhof$ zdB9?ZC^`1H6%M8E$Rgg`!;q;-j{u~x}jEukRkUa>K^x6h7gEIMw6kdyRw->#E$>ifB-u5xNJdea_+}Zk6-QfygRs< zjJQcH>n7`BxuOzc6lvRrRf{OiQyQg}_83{$O{}BUcGI`St2EZg^bqh9Q}*lFTCcrl z2l$;HI5BwlE$-U}0t~i!CIDPFdjAps?mv(}{h9fQ54#Ik;1)!kOMS9h>^FXjUw*;z z=a89h)5yL8-t_&(5DHthR?SQ<6AJAaRiXh|4*-lJ49&ASG8O{y+7Kxvi92)&z*TD% z_McIr;a*l^>4#Dee8NwgQy#TgL<;T^mD+2)EB&yVTE`jn`VTilB{T zwyJHLsY9Ft&q(M@42@_tThwNN*+lEI<>zBr&(>StwQTuR1&CwJtpcj<_s;o&xepp-TNIoG_ANkOLkUfeu^!`R;p&LYc{RSquqY_yPb31kl1_f?ODgLNds=;YWuTzn`xNCoa>tQ`ybY92!oQRC*T=eUY`BcIA;Ui^33G+n+yJ({KKCp2hQzeDk0F)Sj8c^tdquRv6*uRyq18kdOi2l{Of9AF|S+&*< z%B{|f`c!`M4i5+V;_bGc3xF=mP@}qu%K&tG8Niv7Swn6U zqnEbd@83?-BeQEQm-XYaN-2wB^+8j@l-RjI=)ve-B#XdCQLB?PN@4bohv>K1i^E)s zkk@Srcc?wAr21z~^Dt&P*^m810P`4Demg zcJ-Rd+&S9aU?blRyeBH-%`JCSj`}Sj5&2da+{EE77epK2sPfaDk)143^g_w7YNikgDo zx%d$L8{gWRzd0?E&w$%B^X@?N!8vqg3TW_e5=Iw^T>&t%N$@8?+W*+Q4no8qQ2**x zKM6>64NI)KIj zm}oDTP5Ta#0=urjSP+!~c8=aa+UpaxLj~VV8Y~NXW}mESZe`5{49imUxzwZrveb23 zkM!{vK5p{9e0+h$PmTQ3mk$qb<`|N5&aso$OzqArTM(4UM&{XC>r$sBxQUs446#I# z<~!?rbgm^hfzDW{mA9>xYSY-ig{@%OblIelZP@}@KH2eTYXO>2QGK)&h6QT~q3!qW z@v*I&)&g4wRbYneWT5tA+&TN*T?GY4r~uEZ?+EN^`q6J6e*EK~n97HDaQv9bECz32 zP0F?`$J3(bDd+O;>-_R!h|c*a+q4{cIn^qw3+?czZ{9+R#Idt$XLLc4YNquV0TZ-G z@4raX7tFr3bKdOv{VTfApvJi!9uUB%#BOBn_i(pi{yt7}AQ#=kKI|mq9A0xcL7_~eWPw^!i9FLi)K^c34NcHV#9k& zi2E9PJiB;X_J^9G_9PyMu(}M4@ZE$JM=I0jZZ!Vm)>`i~mGOgGaoAoNkh6wXsjTh1 zY55=@&s-a*Y>wCSNsljcsf2*UCfKBbp{M8x82Jh_7^5N`sf;SrBBz&E4iq586hidQ zLkwzmK{JDah+YpD?p;9ceOd9Yf)asSj9cFZ5W9zWu$yteNAGbz!zW!CCcLy4D(q$$ z>&*|fDVRAWiqT)Y@Yhbh;pNG9Kdf;E@J@0Jkq}Rf3M1c-$Lan z5HNHIVQy<{Ytvq{es7oos&y$G#2rAiPHt~XXkyl`U6~OE|2TnnmmdM(9Y;?;+q7;k zWzXbNyuf=9Z+99hLSZeMYs*^HSqL$*=A3h?&l)(EaZ4!-UGk`-vynYBaF-+heK^K+xt$51sK{xHSwBc(IFalpb zIqYA602NJuCYOGcrr(IUw4<4<(kMWhIL+)M2eSDf0OA;o@|ewh_u?)oY&g& z_mEy&bKC0HRmg-%0nLmFrzsr{`xxWc$`N!liXf%S;ofVxjW3@^Pn|ybRT~2pGwx{+ z0@T`aF59-5X|J_HFhV4{%pgm%QoGerGeGbT)sYc_Q8UT{LlKk7Ve%&26Iu=TDwo>4s*dD#b>U5=nlt<=_S7JZ-) zoR8ixnYLCzkui7|9dXdC=FM7YjKKp=-tPipl{NRiZc~&2p&~*ctk`l}VNpdfr!E3` z)=G6n*#H5tnHG^ES`;o^Km@u}qB?Z*u4Rs?c8}Ywlrm3=h*C;gYhAZm)>^8FAToOr z3eB*pVy(N@E^gFdgsh6Cv?l9zdht+QJ=gQuw%SE2EE}#W93wO1a4|$2nXg`%*aISd zn|?a7iO_=twVvO$HIN23J(%N?`|)k87R7Cjqs)rrF#LUPWNYV+QR){-@^T(-EL z+;(oIW@1r60&DxC1juRU{gk{}T^oMAD3IVAc{?LbJ!_p>i=~8`JwQW)b=VYZO-Y<% zM6wHj7ftO_qh1*O6bJ#xMe>nr>-l77vs%yDzegVMn#$-J(k)GVy3 zjYNWXE^&eQeq*VWJW)ddtw}Vi&m&7Qz;Rv?4Uw)zL+2*9E(D%cLDiWNDLL(RGhI3d zP+Dth-Uw-+;l^qr(u%gqpxvjyn`)^d3WkPg&7cZOgVt@pom8x~sY=e!8W3Wi?ua(k zid{{kV-3;l3gN&TArhonEmSsF*3dI&FO`XHV_kd>u`)xSog(q272MYpwA;kk#)S@m z-=)occNPx@s-uOV%n$;mh{0h97d5F*Qkkg&6NH|kBjSB-I=Hpy9P>Ug(DVW-wb;$k2i=QP_H~h?aM;*TzaEHs+Z@pV=9P_8Oe1AP%&zs$u zsTmtt=kI&NhOA`Hf(P#^({X&{ z%)E(={#+Qujf*~&Lu7&k7W7h=C&Z1MG*IA1(5%+l%4P!0&Lu|A=xEgP;VHzQMEBO~ z*~R3dr?`QNQ0-Dkani$s%@Z(Ej09s4iQVsTGgeeVL^0U9ZVw72Og8lC%|`DH2c|*L zwuDU*o zNW;AgTXnSnBUnPDjf|O{_hUFdt{)LKy-L&G7?1E8_Zh+XR(juqi9_(tdFYXU72E6o zTPXn6!8w808Crg=sn6@OAmF^)yU~|3lk4(hNW?K<@UGJ?iHA#vdNlH69(#5HfTU(1 zre=CQ6g6$4ZP*j{ROUDTnSbV2)&0|N|MvXlmlOj0|2m|~>6_EnKmX;+`tjYzU&glg z&JB-C>&qx2?b5`D;3m%pF0S*ivQ06%hn=>mELGNRBAq9{KTJM4lP-SKKX*jpE{A+! zXjdo|K#>@_>ifXXZI2>wTJ2$#vaKl`neC*qWARR7z>}y83u@J9Sf`lh)#o z&!8QvQ5!X3*{n+0vaDyGb}_|ZMyHdm3zVyw_Gb+2p?X=sob5<)ei4W`Z^LjotQBDu+la$(|nIfE4>q@pRP3iFsh8RSq zt=13Em0kQwoM&tk_h%Js3{sSuqSeWc!!v)V9hz6QkbWtRm`#}C?cvK zE@qlocZi1vdV2Kp>_i>1_K`EB*lV;E!GHx~gGfM%fT(!i4Q)+pu~r@Ep*N-w8aBb! z`$~wFcy+G$pdoVXh9xmh#D2iiMejJXcW--_C)_t}zLQuEmUSagwLYIlxW?FqTYteA zkp9_WW>+Z4eb{HuzJsqAcf$22_n>Dmu*=1CuUZZF*^J_4_NhboeT0Y+0y2CWcHfx+ zU=N(kg)ylDyi5J)b1Y1M^uW7JBt^Rh5BAv7Ykj{d4({t(psSc(pf+ymROg9ni$?jl%%E@{Z%9i<>rC zPmMzhp}tOv_Z9;pU~9N7WC%bVH@+BGm0n0Rl~NiOWSHCxo-%HNqQk^nz&5j0vG#+V z2zQ8lciEeQ5q?j<7JjfFgLp0J)l@*ukU1Q1|KmXF7PIz2we(B%DvEulWZz?C%jlV? zFYHI8Uzk6!cYuDL!|t$SS!z4sQDBVB7|{$y&~+ktgU68?hzfjibKew@i|%U^%}_38N;q)ahP zacVvx`v$VrWjUYnwmJ50*hGDL#{_0@OmwSw22p{bLp2fYS~3pDA|1y#8tEdJhw9@` ze*Dk>r~cFNi!b2+pMpI<{`B!z4**!s$G`p8{@VJocpt!HH`vJl6n8$v**^q&B6XYO z0@4vXG1$Su8*MV-CO+}ui#hEBdJ+*S(kH%s+{*(wHPH8jI6wx{w3V{eQdD&iokEO? zu$Ed%c4#iRK&Douww479HE*gibn}TP3^Vx9T0L*8Sk-E)0c1FeiecP zfKod$sETZ*TKy+WLu$D9B5`UROwxksw&QOcBp~ln(N5zwW1?|c|XHN2pkR5eAoByWTi*h4QQxrs;fWD>n4r>~OmGdqs8#=L1>6ug)d zVk1W9i9AM!?%I_ZP4TOwrgU-HT3MPmai-8;F{Hs1siJN*?3!|XGKcFyh~&MSlk2LYNQwwXXn2)jwokLPA8<)Cu$xD{yOZs1 zpTGLrvifA)p;ubK5AU+f4DR-7fUV~%$U6ii1Re)+y(x!a&4qtitK_YSZoMcb5gh0C zCb$isgk5hV1Y@HEFtJAlLo&7oHZfU6Qz**Gxd)dXJU>L52;Eq~NUM-hN^zd2__E;I zbX{ayMMYB5hXW$OX{B5V$pCu~wJ8nxTOtE(K#H#8cPdK7D$vY2erN%E20JS#fCqC% z$_7};GHM0wq+c|=A76epT}x5C z_qR8_G^zvgkg)rRBCNY99sKk-y@FO|UH4{dYam_MkuPeccxlgE+IQE9OU-#XpU;km z4g_9u6vW1^`QR9Xj~t>A*)%!lw1=5>nBSJSt+v-t?e*}r=ov5Q02&}95!rGEu*2aH zW3c^Uw026XFXxvJ&+nWG$m~E+3o$90)lJH(wTY3Mx$l%1BZ!dbmR?@JdQP+Zvi+DSKan_sKIbt%d@iUc+HozS-M+Hd8iLFwi6uI!rWL3eRHpa>_oCpQbdWIWSAvj?3}m z`E**B+I{?UoXQk@^dY)FY;s`m|AV+@FrQ6N?7K6WTdU%8)XVoH!x8Y-zxX_ciZu;g zBqGAGcWK|r#em@lU0M}P3;_I0@ePMZBHvItJk*f^UFo?tn%*KqK)Qi7yG;S0hlzn8 z`0gb#5yf7g6o3_AGiWyQEW3)Ec{il!&CnD~M;EL2QZ5NO!!_)74sZLV-Jf#>grOse z1LSOm7gX_uW59I5sj31A5cR)hc)d#qfPc87Ic`wv3B_ezrVX1}r3AYvkb-3ASDG8_ zjCV-UA*tQEOP=T<;1|)>j&=YyrohTveL!M!gY7^9mzj=gRU`t693oF*2`Fb0yIOQZ zF*^%>Ap8KZ5d?z=MY?Ft6|^&H2353si`^fLo6;Y&p34)u3DN`k9daa|VSa-2=uO^+ zuYNPUu;8MLqNyqT8IIXK8!IXw%Tlrla}0ZPj80O`Z(62YUy7Uq7e*x{v#XA1Z_Dgwf?jJiT}iJ_B`g-B7XNT{S{UHlRx}JW-KiOIXFzy zTb{m{rYV*hOVc8?wDuqk`n`DB%m&X$atym%+u>b$>6rx*`V0g zoA9<{=Z0iB2%2)PK5u+Hhhvc-bUbb6Gw*lQ>FrYr``z9|^0wAm2QEa^ge)*b2b~** zLWoT09C;7k_wKyF_lKeBP%1LV(GhWU=o2s_j?v|`I|LW@4-bdKA%rj%pg^)O4V07H!ceOt-gk* zV8o2(Jv1PJS#_tn2Mq`X?1Oeq;eICRGASm&JHX>L>;K0=Ns3<90nhk$=W*v4Cj(lA zJ{GN-nFJ>La+c?;Nb=Ree*6SG#`h;$TE92$5T>SmF(HSJ{m$c)g}01zH$mmp6TTSr2x@W z+R+rz?*S*G;AlapS1#DSucQKM&%QzXg@}k8IL*6&j$;Vj`TeD*u!x6nO+!wWv2p>9rbFT(~e92iV z8nCTq6#?VN@(5mQR8Yi&C3I)+WG)PVxN z`YqsnmmjYq8zkq*J90cOs{VQ(QWrsenC5xt7Y&{AAake$72TYQ^dzd|M=M9FW1Ub)wFBNWN=6f((+Oj3}@1W_`q&L%&nGn zd#)mc#rf>}kd&Cgz((8;8t%}Ock&H*pRj+r%@E=gh-v7qpjDW(p?5^KX8^<)5RiZR z#_#9k47_*IXo!o9xEkb8Q!Z7dHWUd6(Z}fAzqRhdxGGXgdU$ZmrB)rzXf>}TH(LR5 z?#*H5MBGB@&D(WVbw$K{pxpz^DLy=f$0yo7p$lf&q%VHdKc5?a=gOU8=h75G_aVjB zIv_WtY4_&w>C3}m8Y6*e4%-H*6eo7x*f(~Fj6ilB9oZ+^5BK|&s@<(O>>Mx)k=($l zc*SM_;+=B^jK}?1x{oW&@ZJFfln@B9pSMe4F}U3#IPf@E#jq<+^0tfP1wNxjqiX>s zm*U!PyOXGi*!YGFQAk#+?`l0(P$Nb_{6usgZER~}ibUoNAVVXlvs$P*G^wiDr1f?W z58P-IE4kIu8+1k&jMz=eMA?9yOY?m2{)zbk5G1>;tjpUss74CThSd&| zut)X*F`{`uKx)==qmeHW1K~JFaDk^?VcvLQ4%roLc?XLA3>k!XU~IF`?NZ<#lH6ZP zK-X+v(3C(U&;-MZP?adT@P$u1z*B3hN;WJ*UhGD}GBEPp=(r@e5A;IdqDv`&#*ZKT z$7glHTu@LY0%lWh0DaMd%LVNWSxME2438UOGrWkoLqo`j9yKFZ8yW|V3=Jw+0~5Pw zts~lX|35FkoDj6NZ9%fi{`DOiOu3Ix1ev0=@ zX$0$E3GFgOR+L7qXx(aAibn#j5|w6fD=3?(HATFF(^a%tB|rx2xpCZwFgxdo5bj)G zh}p$N)1=lan(GvF_ZmF-E;-knSDwz^LyD8iWYt$u5Vc-6G8#K0ZjRA2Xe0Bi0G@CN zz>VG=6HUQy!I=#g6-92&HAcrq(Rt^bbX14?bh`BUw}_uSw>wVtASj7h?WX%h!A{yw=T};eOulA09}h9_P&r&I`y1S_6OO&wuja-n_w~ zx0?|LSc3Wpi~(beDMatw*t6I3^78S+^70IIn*ve_mO|K1K259)m}`B_!4T2Z(mbVU z64mqRTxyXv3Maajy{ICiCqe9LZ7*_0t=b9@d5%Qj1N#sWC@=HN$7w4sOk3L7ejmM` zo%5zJw29U3uimRHyIm%1SJ|;^0)N+==y99#E2zB&BOJUA5<>9^riQ2eV95n1a>yu*3^((^z1>&D$(X*jR%gib8aSh?03h}?ASz1fzXI(oHNzCj8YBk{&R#M zYC3!l5c-5fIO1N}Z~Pc9q*}8+NdVlT?T8M@5h5rQQ}$u@As8gE2Z0Ug4A=k_=r*51 zMsn<@#B;JKV0DvE$%BNC-^9~WorlLavVRanBd27lpgnUyglcMV?g_`{&Abw6-?Tm8 z#5j`$zzno9otWm%D33y@h-3;CVFQ>?$e@(9Kqy(FxU2?D{W5AcYgWoLQ`6e+to0E zE{OAypriACj_F~)e>xoA9u9AIyU97arwYapV+gGZNY%#X0~o+}YB6*{Txd*Yg&?EW z%gWD)9RX<=Y~1w-%mxn3A=+s7Dlh>9dc`1Es~Cy6em)cd$pl2;;=_aF>~nDBZAke! zh1Kj<3!oY3cS1yd_n-ggJI?plFJhX0_eVeegFpQHU?i#4wYJ=DDX(xpvkIPrslqOlFZ#8#RV0Van;>@EZ8+J=Qe==$^_yf!^r-df)J5(*6% z0=6)>6blG!=Wsr?-5yh7qS)17J7*V&Z1VIt&%48+skICntcsM<)CKNf^Hg7s$ZXov zVP{topWXK;M!hxgx6p>vX~V9QmdsE!#^5~zz;InZpO4G&xvnQR^^wV=1n-0M&OzxH zhO}BTfYnZ0b0PTFh}nvnh_(J8*6aT5oSS!hF)Qn)tqQ31mWz)*M(VsI1a%^*#Kr~+ZK*$IRaT8i4 zC~ENRyQ@5+>X8y4zCWJIvSvEg-5YxIraruG9l(PbNOU*sAmUqh;R2$fE<20} zSD<~V?d5caS^%0k*L9E3xekE={o8yWIi9%*sLR;rK-eZxEeX$Mu6C0by^iw@vk3oK7LN5V*U-rweV-?zr)G`R9CwQPoj)UoEjr zbz4_i*R~Zc)eN!qsk-QmP;qIati@`zQcT3I!s=JnsSVDj!1&Rfo;7YZU?7dj05MmT z4FSOocZ|!Hj9}JTxvvj&fH1^wYc5opGvz+l%%FmU--%jO4tY)ON1ARnOw6j4SnS#Ql7s9}iD7iKVEQa1QL9=bsmyhDS#wclOM5@ET z#l(in8VHMV2CT>u2qxgHB!C(SXS5w!GB^Qbq!YryKn#cWTSMzTqKp=>C+A>jV|;V# zo}d8(F|r5m(eG*clJ-CO)z^yqE*J7 zPKK<&4Wt2(f?hNPfxt)%s;L47G+yrA|j{Bh2T_u2+U5@a?a=TX*nHRUO+1` zFou3K>;;`Ds5%tK5Ig~3==lv1;Z=&`b4o5Eh7b=Ak8zr6&cjL7Ooq2ZN>c~im;xeu z7j~|`5pngkU4^9(qZnob?W4L&O4YLu0c*tSodG~CQmd#4qOvCn0ewVZ1h|xAqTh;- z=$P2wOo?z1oyIc90Z_~l8%A&!ITJI3J6KusoOiCiEd2iC^zKhUE5+0Zy5#7aufJk%&Tg9?zR;xrGVpOE)TzAjB zNMq2jP`Q(%rR#ubST7BBshA1?5+ww#C9mh_Z+@}7`v#9kzvZCDn`cI)N{p6 zyqOQ)A0GJd1U`yM*`C*znqNd~8=XSM4!=eM^G1YylF-nJFt01TKhuX7I4j5=C>Rpp z=TKC7^LdKmT!YDD7@DB=Q5mQy zsIu7vyrcQR`vZhPexh)|^ayu0p(U5|x%&Z`%B0S@G^f4a|0MlniOYxbp+VE06B7`8 zUmzn9Dp={lX+hvXp-r&_hfGz2Yg;Uf)U~MqyBH4hd`RgK(?g7hH0@KG=Xsh^_&hW2%L_%oDFM%Yz!J_7iR}VwO}o+WYr?X=v)KEDkG^P-|0@*PY?&k z)>M&z2^@iQ0InebawYTB0!VY8;e~#X`)+2RkOOYgchcc9RpssP{T}?<#+N_+4R|@q zyl*9!TAE%A^|9xe(8m}(E5KHKJzG9)vJ_;1pg0+2o^*Z)4}^40Wv~X{V)Td}X=*B4 zvD!ASjk(NoYYh_y@8@}5mtc;z;H!UZJ~)TN20=;%tI}Q{W`;eOnV5jk6r}qn=XGmp zDn{&x`BnsJDcahdb?klIP%>~G_#msWDwT?*YLmX>`!EnTh^3a(>2!SlnAbC^FdJYm zqbrhL?ix^GkmymTfaIo>nAt8S7>f6Cts$uY74Q8(VqV$(7uDopW;BGzLU6l>J$Wkm zL8VBkYpw>1ksyf=-rR&R6GvhMC;*#jmQEC^6-$9y4Xm+;pyUYG1VySSx_`Py<_N_lVjeQ8Y~ z1x#t2kfGOU{WJkMjR{<$=IQhfzgek>Pm@gEm_RC+eKudaTUT3yb!*Ml{Ug{Lqep^> zPzi`RF>;)zI8E%F6TwDGWZaBku!PZ|p%oKF2$3Eh(&OVi&AxvwRcdZ|aoF~W9fsVX z!+L| zTtFWP2uw%UP4C$FpIg&>e^`%ELF8P|FYDOLMa!hk1|XQ>vcL}WBX71t_a*LrjBmbR?}2C>D%}Ych*~c7 zd|sL~YZhbh!OuMZM*595H3Is&eZA?{-v>#DPxib$I`NY)q)=6ur@9uTlf;rDp|E96Cl-TXT3b6}k4O@cZC0 zSAfOU*ZMYHGLtJ@Mw(20y7X%r;m1E|jtu~{do0%~BL1SAPo+T>WfI3^+L~blP-F%g z$Y;#zTN}+c{MK+Dm7xKMiPlEz=5k>oVTQv2RL8{;LU7It;A%ij8l(4Ytu(0u4b`NU zQgSK9`!FojU5Dn1UWmI0UGKz{m~K0tstlh59e)VFYi4G4|Lp()xNfv*Ay{i|UEDOe za2RhWs@uApj?d@gN3EM9Q=s-588|rS8fmryAg09=ns-2c*nki9=h1j1qLHrLP|}wh z=Cf?eZgSk$dnitk9HlgsBDK_3indK`HQb2Jbr~1uCT7nBNCoUvG90tChF}h0Dy?n# z43hV_9b6?sC9P~02}3`3HgY<=v_lN-1|Pn)lxRq4AR1m<5#uZ3EhTb9?CBx-uV%kC z!;l`OOiM$+w${>W##&7p#kiaI4|bjPHqm8SPsgL0&hzZOyO1MFsb$r=NvngT-I@TH z^{at>h~2hB%SuwlfUj;@u@Hw4TAGg2?uA&*5~3UTy6PxfhmXavGbFu%b(_r9;0Ss) zTmUMf^%c_rvR&0+Zj5*AF|6qZZq$qcycx@dVMFW!kq7XirVWr_K0N*AZ$%38@uan^ zpl8)}q@*!L?;|0I$g-M8-xPHicCqV_Vh~T+~55@m7(~I|bh8Wz3 zMjP=o8$F;MN~`DXjG4iw9X*hLM4G_B)@&~sKdkg|WdpUzT+$Gf6lG;uxD^xtN=QyQ z7=|iLg|I3_CPpJfMZ26?f*#*~OG6R5=dgfH9AIh~1(182!IL8-pdc78(m&uBg$coW zLy-p4NGlp3u%nd1JO}QVYbkX(FWYj|nh_y-$Dp-oRS+b0$Ub%{)xkU^vq&1q7?BK2 z#MK%~4yA-v6%Ez62~-D7lT^>9cBTpl!5ASTc;9N!e&2XC5-BE?2-uPHj+p79WBL7f zZ3IwI6{)Rkg<7?IGRpHTq&QQ>vK2E@Q|JZHAhN5pRdv&vN5Sj}3M(9W*_*e_690i*CX2e7e2#7#& z{DqM;4URi1YQ=sc#QAOkX3nc8bmY*Zc(OgmxBU1cni2psfG*In;)VC=5TR!hq#|Y8 z2yk7O`BfJtzDaNLE`OAdKd(PuWepgD3wNL;glo=$Hl~4K(M&U#x2EUgYPzN9B1dGx zgO76v&KYXKX3@Hm8{KIiDVmtJjCL{rt)Ugj8v$_eR5lcW9^B0(0a+Bq%r!v-yJ#c= z7^-O387a<(@%rE>c&>s3D5_Pf5gP&_JMSDb^lcz-x#XfEW6Sy;amm}!sxpF06Cd_6 z&jmq_FWrOM`Tc&ZlG}1#&o5;=Gg^oKKglo9o&JNyEG8G**TWYO0OY~w>MjiKFhX#z`n8 zpN=0-FCVvc)BZUlxlS|igq=zioTk{y)bg6QTyeEhTdh{Iwo2|Cwe&2^KI;=(Z_YQv zXH~STazt-yH9*75%jgaS^Ep}N0>T+}4FCfskyJKo4Sblre`4~r=DIE-KE$tn{FC(N z%lP{XzI;4=eD{mD~0F+aSSp5CN+9}%(DT&e*;jP$ri?=GfJbjK48zWalvwA;y1 z7c=S{`o8jmsVFo- zvti<2i!4@&2~4%w#rDeZN>v_zhYc9OjTz6iK_$oYa(p>k%YiH*1tq85+ffxT`V?b` zNTO0&RRbB4hzO=Y0xag$qQS(}k_m9``92B)LzTw70P z8e(vaNFI$qKhsWxTMPU@5TSkX5i0Syi&g#BW= ziJdg(rsRnk(Gv#1(qy;=3PQU&38EF0V%pTJ9)KqeJDHP930-3FfR5aRJ&!SfZ7t{1 zF>foF&GWq9??MPE#c7(>^C_?AmbYzNYpW^7=;PD$l(uAxHEoXg2LAn2Son$yq^ZLh zGv;C&*p8f!GaxEe_VLlVG^G$?4BdAvc({u#=hN}Dt*e1eDINCvG)+W2WJi?8HLA6> z(k*p@chncA7{hKiPstF#F^0e#xC${aG0%IN_ee;6Q@EiZkl8tA9|B$*_R+tdidsru zOW7<7rj^N&2&~z1LFZvIbyo*UxC~+K%Fg|vNz?H2?N7eVV??BXgLDJa3LHhhPX?!nQnEf*4TeHl>s9a(AE$(s}98ofck2r6?(R$ zs#ln&_dW%mz|Q$>M1hmOq&DWsWPFaxP- zjSaCEEI9ghBw}hr$UU&f?P4{vylv%tQfWR;VSn&G*p2*ehMySHAUKEU8PNgY=jnGx zzZ;+zfNeW{_&}#~s|R9E4RKvkehFd0ouC0q;>v+`fh4I$vtYm`1Orou0Hh;nN2HtO z!JW6h!7bDI)@adK%>i17_S4A-8S$XH*H#;>iG5IV7FUNDc2nBz;;^>wXryIZPwR4K zA`wI6p<33OoKNTH4~>FYqgO32dwCbq@g;%Hy9f99#y>tm+9?xt+RhM7MNtsBQlJsx8o`IoTt-mf zS^(ENE5BvJM5pGpax>dc@a9YS@lR;~#;I{pQlZG(sxzMJgIa?+QNt(@V&!B1~?VK3ZTTePfOV=>#$v+Zp# z-bNds)=H$qX!+vKW=1q5=?x4o{gP`aKvktCjG}<8NZDGg%}8C~IH8{{1mh^|Raw+} zn_DAU0*jm4395=EjzkC%AQ@~32AIKCv(2vSJ}NoI$>0It4TcBU?`b#lwC@h{paTXk zVk+CVozLgf>9plMm|IhK=nEmHlwu4Ep-Rc?X+58JX+okD(?0BXZoih5k*}Nf_lf@+ zV9)f(Gcqev>%CYMbk1S)xTkrV_Pc{~d_%$3s@9+7ocp1j*KO@A$QJuyU5iq#{e!ry z5m&}GcD}-XzmG8z;n2%KBvVth@e}_Vu78@N{zM}FoPk7$<6+Qcc&n6bD_!hwi&#^M zSgSTyD}Vtp5Zy-S-={Bj?bF@JFFLlFJHtpZgf44rlx_J_j&uJ~c$RLfBM zCw4JT&V>v5^alGT=ORY$k)V$o6p$aw4Ko!}D zZh!dIYo&X8Lfy~s^c3GbrFnMDwY6HS){3gGcie!iUfh5c(XL|}8`X>; z_V#3$L-6cI@3Oy1u4R+Dfixvw9T}pN>Xw(+FCYmRMM za$covoY!QVLuI2-j21OD$YNcAT~RYYyNwe^VkAAB<2&aF9QibU*Q?!m^ucP;t+u>m za%KRfw6dugh8?7b7G_|N(cU8@+PI$nzdGQq>@bK0=*x7D27(bc78d1 zh_mYHE|wIijz8O^}AWy59Bd7NYCv*u<^KaxrATy&{EhV zu#LEu5y(t2xH&Ls&m#xxm(WEQ_7M>_**Y&w?oYz)M3EX9B6FLk7F=n~$N|_^OUijn zlzs3I4-ei40ONtHZ?)BS=?r-vQ*zE-El!33q4y!AIU>lmmDZF1xo_~J*A1;fDOi8N zPO=AGH;QMopZ8IDtJSHc6oDw8m*x0D)aH4bJ1W)r*zLYeyDno+TJ+m0{C5AWYgt%^K7y~P9e3PZ}atuN0lZ%Amw zLM$+(;n??gAMXi0a8LyOg|*%PGPC((NIJ{+s1!6%Sc{7g6h`rqUR*bJavCIpU?#5AHBI;ub>1~{ow)Y>N|KXO;^Ugg!atuxlMbv&!#CbsY zbZncG_weK$vWeyso<7=^(S>9)8y48k`Mlb)`l9p16Nf;2*MQs3tv{Bn2`38(?b5cl)^t4Hu|phVYo%j;^A85)7INrhIBgO+_>(&?kN z^|((r^?DUg97laGF$!^0fB=g5dEizmqoR8R{*M7#j! z5ZkMW_x=#P8y^ZHezrMXRnNPG`ti7JN79m@C8yBm!t^ZLX>9<#JtahF-L&Km(tAy1 z`jU%3WZG%h!Ke2cljST+X?4wp6+47O8@Pn&!R9ZUn-mRH5CQL;Ev@%uhZYKgB8+gR zbJM-ziBQI3Yh7u=`e>DvCykFdec{rVuG@t|4>c&IEX!!b9P@g%)`nd@n4meZW|xjB zUciM+sx2?&jC_pIg&5uLi}?0;=idc^pOv5efcS3@9Mwjz0~jEhNL`krmO`Mr$9)`f z57#KIEz5Fzc{v?F=JSiT;)akkxN%r&b}7($lGWju1%U1&Kt zTYmjh83Ya?#c6&`FoPR6472m2VrL+bj!|nUqM+!|Mb}%ssG_FVlLPJ#atpVo- zR*hBEq*T!Ayu@m0_TGB}5UEWzvqGfqqO$;acY^~EBICUxm>Gz|w_>T6Uj}=NNF59CknVxK*@pb&$PxDTE6h9WK8AV=gL6NWD#>>srstx-M&P`1^HP zOU{RbyiWWhF~bOx+P1ZAo7SeSW-BVVp;z!(sVPMB^J@NtHN(e`l5+)wd8foGVyzh= z5M8u=&Fp)Sx0caQZaVl7hfaWWh0knKK-k1; zaqEibqi&@#H=hidHX{XfQ`v>OmUhZoS7J}m6FKX{An1YL9jVYz02CZoH~TofdCOmZ z>C>#&0lg77b^_w4YZLmw=&ZZr>lHhV*kN-b$mHj=e|(&FJ9bV*)-69jKc7!8T5~`n zHbxUuF>GK!*2@hw?Oe!yH8(*aWz`E?6OnuP{y=uz4;w+z8e8*h-Z`3+=)tV6t(3fp zRd&rq^$F&^-|xdTN6*~7!^Ey}HTNS!FqQQ+%5tpRnQBhZCbBqq>ZO%M)Q0ZL$TB_Q zSOgL6HVP0$6ulg|AsM0|8jjHt-q1yeXwI1r%7I~ls$i;24Z*+xC3U;z=jxJ)B2-ji z95z}efX!IUi8?j93Md%>nR&C>;L#u&G1v|{7d;Y91*KptJ}Kqc{xpa_0zNu`yb6eI;)RjjXv*D9zG4=pVN=;N2~UMc_} zJ#P9^xAa9X=#$H)2zKQ;*$C}lE^u)D_6iwooWA^*vYwZ&PX@iL^Gt|v$?*(KTU9O2 zhy8x%h6@wYzo`ZJH4txU&HbimJ>b_ocK_&4UVGfT-LAGN1Wv5PShbBeJKR#{c4r-Ve*Svj7r7@c)pj?XX4a#pYyoeS>XU?#V=l&sR&2S)@g zYgt7F2BsKM0nO~@-Wk%|Yl6fM2fD~anJ{=#Q%Bah2b@Zoj?bY@^UJ<LbOIsFh>XD5cG9gDYN6lKRvYg+&v$A-V)3#M|u1^txodUr1 z$nDRnMDFaVMZ^$1(mq9q=$%I^>**!e(^8uGeVl$mk6&O+;~vcYPEoCBjcTEFq4UC9 z&g_;qU#xE)Nn!tdjCsv(p4P`VtKZu3YdW2S59Ibp9{#L@GrUdjn0=h%!xQZu6fCc2 zsTG(nm$YyN7Vtzd#H1Jy*PIt=#Yl%5ohmr*uUr({=QD+THN?Tj?|B1AB7X--fkG+m^abt?qqD#57GQpW~(|wKO;q z*D&M$!Oy!8qXVp!#+KX9_IlDhVt0-qUz#~3N4U^bZ$aRI8z)y+a)zV(Yj1XeV~ONDOg#L%>u zvRb>TGaxeI3^-hR9Y7*V0DjD9+M?T{YlYs+P*_fw#2Y2SCO-z9S5pNTv`yeC)Y}QVC-t6S4 zPV7i6ob~`dhDo7q%V~LeF3XCbec@-Cb^yQxeazD}NSnwVRmCw6CiU>O-nOlm)()XF zPI4YeTWePW%T*uJOyFug*Y_^aD}Oe`7-DpNUf$Mqs|6HdN{Hwk^~x-`jw=|*4YeWV z8b*5_Z-zC9fPbcUf%OzxK{;5p*dw;N-=Uqy>KlsDcdkog=e*gHmb0pea zbnx_uKaCio>$EVfiU6qS!1co63i}<|V@IwSB9OP9FcL6<8TKwq=NjQ_TuV2^I|e`A z`LdbzAKvO4$E@D-=zC&M6M{k?N{kVhnaS%z2QT(>yu;-uh~u3j(u5#pC^FbvgBj6} z(7l>sfANK5hVO=`4viD*Px5Q5A`Q`q;HuuKrhRBS&py0{3jv92z>T+UJ)dgH#28X^ zAq?pBaC&K~d1!xA#|u}}T3Xu_36PpW>sYOe+BpYNn0lpqZ8)ge#l!_bhl4&MvS>V> z!tq(wvv$p>iqMv`wT5(E3WxZ1bA9xkROaqAer(lAsSHR)-eU*PjF0dlP4J1Cq4h8K z>B47ezx2LZ?q>|iA(8=!$x2*QHsuPKiMN=xc~_b$`m+(a0Mm>i3DZWTDP?%nTErlC zd!x+ki6V77F+kF59z%rRs}}`!y)ftka)LXRpW5oSmsX)9YB=pO#Dm{t%F$I;Q_l`a%-|Kua&5ZFk)XQ zS=eh#ZQj+dek^Yv>3DMAd_&s;yQ#UiC89Xz1}s;^mRkdIBNHI=ncX%~qo%ciB$oi%+;7T44iF*Uh)CPkP za+-$URdZei5e*gkc&19NDq=m5$hp3%Tox7@?KDwoy{V99L!?d_^UfK$>~M`coeyER z4=JWGM!f&$-4Ew%!xH;|*=`d~c)>cCs746Lj^(Fy4e$q^;tfUfH zJw@dXY0Q-&2-IacKY#pC&Zp#gw?FV4$w#IBxk&E)kLyCvjm5DLAPU9V* z?3{Dy;7Sp>EASLd;M$ex4LH>6t-{V}U%q=fEJQS?NHNi97J45-;PJVCm+;|kk}>}n zVRjor8IGPWUIu8t=5Z53pzoU3;qx<}j`O-C)6n4`wmaBYKlZ=#JNEm34u12uJh?ee zT_)1QHHckIyEu1M6K1$*s0d>NVjrduVt4AIPaStv@5^JnYx@%s_Hf>*3bRA<%$$rk zG%$1_vAfXoh{!u9S2T&ipA|!IUsR>G+Vg1dj1Z~EfSbc-(RGlP?Q|;ZBE1J9mp-I$ zWyuSj$xM+by|y+UrfH%vy6QWBsdb8hEiQhKMP;W=g4kD217~~e!BSImP zX=lVcQ9*V9I;Y;8=IrAK_GYo9n4~@0XxlmRp(k5pSN&Q1vv1SEQKF8`Mnbi#z*1?s z$hy|kIWKF=Ta_w!?K_nU(#FIS^4NVF-pW+SOycu$-pU`|~~&M8Ru$5BRyAivw+&Ooam$R_Onso;A-d=k zW0$LN&M_F&($@2`t&28Am)zcINNYN@oLh?S@DRfkVM%>@YNsRZ4jwumb)NbjhZnW2 z&tvQ;(lc(8&hB#JCFcdtXNt+k$N;u&c0R|vfeLt^5yi-R$7o>c*okwcR#W8=ce|&< z)7!)0fgIbl>|~;j5)Gi#ppT(yQxn79%^+U`8{%qQOC85mMH`sw9@^JkADnkU+-U@@ zgWM3b0Xe;(d9Wk#Fa%0FQEKFH+Q)epE&@oGfIE>ggZ^Ba=JQ(4WnER4J(^RC(vw)e zO|y&PQRNXJ zA}KmiELoSc9=CFml3i5>1a#n?1w?O1GsB+LJ0lP5&s*}qK&Oh{yRkg;2Sb|C;U2l7)&J|t7nKmJqvKZQT{d;Tx|d6*+OH^zJO?!f?ug*DN5EA!HjUPm@DO@4Ts+!~@i^e%4r zFYG}?S9#okh}_E!X7XVgQ%UUTTIk`OPicabbj?-;OaT}^3%i4S8oL`4kK6`U)T98qvcpd(j67)eNoDR{?B;i^2;XU1(^&NXjl z6+z%KST(o{>LoI&;mGj}6`fK*0HUk0c;7{coR3p_J*8oER*1>JMqu_xgw{`(^Nu{F zSwavWTuAe@_wxa@TCD=q;cRYTb)s76Yw)%mH`&m;M8UboR<^q2mO&%}z475o#-#YM zGb^7(HXs)~gy09g;`21}UNPsUP&kUHVOh-#-=1tM29*fX#4$bG7)EB}Sq3cQIyF0h z?eBQ&m+s!(Li=wL24Gjkd67=ASaaF(y0p`|9Zz*DssiI|-nvYV!SLev=nR>Mmffpd znnJ0HJX@#^V8um?9?@hU?sTBv{QlY)yMIpl!b}?{*7lQkWx$M zpxQpf2Z7kh6038z6@LFA`bb2)+kwHK(UZOy<%qW06czU#4zUH;wlk8OiBg(Cr5uZ# zo~LDTU?s(~*$UuZLX~BZtGmIbUnhR;^@H>URtn zk_-|)4BEBcC{>Ka_rQ6;fjOvZxwQZo;Ihd8qNvnXoC{#!LYoealQ|z^np|+y^#bm% z?CW)pX4abJRkn}Y_S~8Tpa<_}MQpW;H(;;2xww=_><~`nHrt|8iE?oZR0`=-p3FgVR}M*L`r}_2rBKAm$rnZKwFS=VslX`>ZYK^*jYB6id4-af?;tmM2dwJ8o2{=i6} z>|O4|z*6$Mt{2F!_pjK^yc1|3TdA$K<>XHL`7q6Ca`SKOe_FK?(AVd0HrXz|;@=ko zklP0hQ=miOLyU7s(K`pthnV8LM>E%#>?V@6Ze-#WP!Wd#`gij6oAQWV<2Jn>JJd*G z=o;T`mBC$n-eE;B`*!cUQ<1VeFUb3FxA8L~;`jZfo6hMC#&}bdkIfLzqQe(uO5H6>%y}b{ zX=;5TLLyYXw2SUKaCUu+prJ=`6RNrQ`nxd6!0OxxMfM+9!7IsdYhuMuFLzuN8JM(3Cy zOD)@~IYXv{2+50LDO=uN7z48)ox)T(P*;}oNHj{R z>&B!2HU`50V}93`m%1IbZB8{JdkQ`TAJW96o;kSSQy-Yj`+158pTq@Qf6ZRL6MgdL znf3;SaO>k*1*Gf6KJfUyyXYSP9_}csflR1*Zo#xU@PR3kBlHHLnrEFHM$?8jH}A^> z4HWT)dhB1X4a26*OtWmwikXd)lbw$V=Us5#Osp`52ri-n?446%Q)k$WO3CN*nb}WM zWafFEUz6&(mYQoVjZ9j}b*r@`H$D0{Kb^|UdVG%`MCIE{&h%S4b`P?V%%A}l)HCFl zcEapto4}wS-(=F9HbhX73YeM9Q=q_P0A&C@uXA3b(eS*lzVGr6?>+T^e~J*bTx+Xi zx{8i3(tP7etEJ-^S|fJu2Z6nxLql&rB)XHBQ5!dMpS!`Yd6cSH1xuw?6OqMuX;~~$b-G|{A_>iuft#a>n=wA>2Jbc{PX(f{=B_?`w87_;Q2o% zDVMQaUFI@d|6#+gJ?&0^8(NT0?7UfnAt(ArUfPAYk4(V!CQ&GrJ4ZdvtVS2yl2{ z=D8fSHgYaKJVhcppUN+PR?J%M;90N=rdp*nMB~xq^ifJ(t7Or}#y}n|062qcreI18 z9M}hTLtELEygQ#C)^j1+Ks6=1nCmHg9-n73_9-~cJ|jY39HyZ^@Jc!aBfC0AS#N-U z*OlVi)bz%$zWd3QqJ(CEVp`U9eSca%uFEE8!vZ8~-DS;8fvI2qba!BecFVUQI5(yA zI89F}CTCWcGkko87`!8PIP#bq-WtEPgg296DFuiMtx9d}PZd6f`1tg+e|&sPJ+X8p zgL9d-@CRg#d+>B`9rIpUGOnF@8KGwH3(P8%Mb61$mEcdS}^2sTj1yS8X`b|yV&Y0 zTgP&V3c)!aaPl}K1~OsUfK7qX#t{s^9s|3U_;{=I$JdcaTL({7)m644MF)`PVt`|6 z+A6fh02C8AkAz^2OwbXq!J1{=it5?>7^8QNce|qB=NV;C+hm5aZrCk7dQS zv9!rKANB>4tP8a&fX#E=r83RLG$f5f>lkiCLL+G73Q)i*nv0YI#AAIVyqAszRMqRf zLtTDia?T@OGUHEL&LUw1Q^@pf`rfuVUPF*+Zj<3`xb zYO8A%F>~I>^vX#fBD(~%VfS&3A)|`_n6O1vy;Bbustp7{13^t}z(B4cfq{yEh!6>Y z5b~h=jlX!e7O@!13)yBc^_w&Qk)3n<&eLJUUtqrn3t)1}*lrLMB7>CLA1 zGt>|$X+vpRmwJBLj%PS&X*B&P`pNS+psZB@)U!u|2;{|}nKV&ow=<8gL4aia$p|Eb z>+LXfM(!<;5pjIJ+qSh<#~R=IC=LOpdEU)4Up)J|2y%~{x4h+U+T%NyPu$mWed2Bjgc%uE&U66w!i-Ui=-*kZpW`~5KtPrT~`66hE1f3HG`87w&D+=CoPPGFFQ<=3LYt=jG(Utyjw=(!*V{CNfY%{Qn0830 zO`vP|3?M7@K^qej{?N94P0@OUKmguiP&FDKk8|PSQNR4EwUVuE=a*&|9!G7>YV)Gb zF3xqTO30CYav_o{ouJW%uWD}ujV`OIb@>wzu^UR@hb5pGAXxA6^q-V2xm@~l`Zve3 z;9WZV-M@4FcmG+A#6)8cfS!IeDRt;dY*~)yyd1afB(*>_YKp3c0NP7N;5&bYySUl| zX$Pc-7$;_yTC^+$3e8~`A7~E1u&qnY*@dKsr!`Fl30h;KUX!s??WJo`%?K32oMQB@ zspj0*GUjQ_(eK;GDf!l*7L?|V9uOaUDzmB{Rmbd!zI(v8e7>p}QjHU^3tc@*;T9N5 zdFh1E0xF6sO)NL4%^7$=8YM#yHG}^Ad(5!O*mrDa@{qiG??Q~k{jT10ZEih=({soh zq_iD&a(H9Ay+7)#5wZ+h9fE>7TNm*%lLlSsHHdH`@pM>P;TF$70p znszQaH>GLbP4j%ajm2PD*1E0Qiq@J-sT~1M&h_1kLI`FcB7+yxCuM;_S1Ap!8(M>VF4GU5I%paIFP-RCY};xrZPb>zuR}=TUXMGa^zif) zx)#Q;4hS*%5TQqO@y+!1H}y9S>=)}V7FpDkfe}za5%9i4Grm>OVtLignjBzyOAkAm z*ad)C+uEujz@7w1y)|mBITPG0mST_I~?|h!vT7f zl3$)buFGjK(WKAsnLPqbDe*P8J|0gWK77b|4FmzzsF{dLQI-3JP{mqrK05d}54)HH zBi=L?Ek^(JKtKKw9UgsY`f@x^{fhkmSp4Vz^Z)t3{@4FHT;sp;U-_^6OaIcp1pn_2 z13@wZLPHa+Yk{qL00w33zHP+hgG~wMggzpBrqJ(vlO|H-YM29HCarZfxprIcU_IOW zclOu+ReOArzx-F^U-_5q_kM2xczbqI&gW%a7EwtlJw80#Qkhc9>3puGx}IT3Yp*qq z>8q}*?m`HFSbLa=k1@qWgaS|oiSx#d?2qq-{raBDh#B@09WDc29(9j13~H%1Tr%Wt z=o1}zM?7W|0-!hE!dS(nHY+83e6bJD^@}6#4@F^JPN$czpFjTWysWZ&i2H{_n%~T` zPbtSBA*FftFQuAzrli;Es;m$)@f$c)UA z*}kVTf_MhVSM2roj{(i@XF8v#7k!H1zK4?BzPaat8z}UeKIdH4UimETytLz~ZCSJ$ z`T!1TbOCWFFMz3io*4D3^uG;7UG;dp3j~UeVF}iu45;1LgzvgT}=wdCp$|lmh zbMt^7+F-P|CfR^P*mZhmZdJE+b1r%x9f92m5E|Gt#aa;*O=pB35q{aR4)0Z~NX82_ z?30ccU9@UI5G|!>5z*LmY1>DRj{s2ec0N6yPai?HfPhWxwCL&V&Ra0+ersd{NO!OH z1@{~(kS0g~j%ac`CG`kWNhJ7)&TXh=11veLt5+-gr|r#Gb$&oZtQEA7i6^k&I8Kib zk8hry4u``iX0~;GepO{X)>#2mdyR{0{k6}<9So&t ztAp%WeQEsjpb7O6@C(GJUKUL*s0-{2g7drmZhn09^KRrl zcSe|}*f6nEzf(uiy<>-xoCc=+W0$NIw1K_oe%DAl7yEB+>igv1Wc?` z-HQ;kRx6R4Qh0h3zx)z7Hdy?W!sBCHj`07n_-lXdul=w8*Z*s{#>bBz;r|0+eVf6H zdGHYL1qB>ClcI_O)Pn7`5#<1!0vKwD_AqIAX!Jnwz`z5v&~4Ik*OfOWMkc)6?FPU6 zg?s-F{`G%N|KeY?fB%2L{`{Xa)mrj$emNaqM8w)*p3-e)thFqsmvvcO7p7B@ZClk$ z>ds7y^PpO~RwE!zhkd8vc+fkG?@u65*9y`Q^>S;FGXd@HZbJ#6M_=xQR4105T>!#_ zzyM@@kGpp-L%=JBmHJP3+3GL9Ifuw!ej$!q`B>mo{c2P5JHOk{`~6`zzj~DTn8bM( z0wZ5FLox?`%$H z4Xp2ih@BXQ9@t%Y@@&R2c+g1f1aNCArn%&EDWyt`!_u6tY;A)2OsvNojA!?rukLLmBFqy+CNokky2KLb$Q9lpO*X)!H5FnCND=gu2iM#38N9| z6(Vr$Pu#()5v{3YRX{sLn`hbwQlRrGp$~D=n2I(fZs^1(Mr!k6OLJj@yiwWE3?2J8 z1?SW5@c8(+-|t6xBhnqx&c|OpT5EtHg)}cEP9Y@EE&_NmbPO>lJAjKflrfu$YLi-8 zZ6erZ$21>ohI+I2s zU^j=bkFf-_xSL;*)F6#hOiYt=37J7uT3xmRFJ;M1SsN07IaE)EWS7;* zn1Sgk%7X@w$)3T!L0o&0wMSyI34q5Szkf9}vT^XO$kHTdae>IO3QNV-7%BL`;=nbQJBLym%#*p<}k_)bwRL z{^I;KbNF%|HZ!3aN>kqqSqX70s^BP2qt3+JsxnQp0fE`noo&W&^Y(&Tw(Wd0skOct z4m{&mt$T=)0|FLo4XOfFX!n(XO4GV=TU_%oG$R!77ae?&u{L(K5$`x4l7m|ye)}-R z%ZCRBC{#{TaS2cuM$#Q z_1!}6-_t+x^!5RM^d-F6Tl6ATT4}W)0C^)D#e#uK@7WlhPyDz3mi@sW;&1*2{5$@Y z_LCpy^}L>+RWvwOX>g6MP<1-Jd|-gs4bWSwfK;%rPJmWw-nQHth5*j(cLxMuQ7#p0 z0ntyn^oaM+Q$>V6!Ids{v~F817f-3&rH)W7u}etRaT)&*=dOw67LVE0bmp?xC?NIBu-4^O*Ce-E zFA6wSOBGe2VJ2LKUI#}{-gAs$sMDT)700ug?f3JWw+|N~eS!kAS}UgPVhmBx0U~+N zKE#lwdE(a~6(M$JRsqhfvf0*JHZvUZWrJ>Q0BD`3V%^^u3<1di?^6ra8wYTRdeLRH zL@VfK*g$doCqtqC{}W*b(je#dTGp;-m1aG&IWKZNNhxZEgTn%9mn;V1&yH)ei%cCt z3Vx1h0>dt+p&-g0MP${2eNqYQ*?)MB&&LQXk8jJDyW(P&x|M8zq6p{_Co`*6S6s=2 zAb_D9f?33?*Wc|z9`F}-h}1$5_GSv}LdWOshY%%A>b=nrAGG^4{;Jolm%SM2Xpn3D zP>Ym&G=0akD*6V=I@5`BAwzTyh8v#U>1@HLtErf^Rf>>BPvOB$-W`wO^b&;p!(*ih zh!nZT{pzAHOPo5!ZmDInT9I9#DNVb1zu)in^Sm2*jP(qloBX2-R!{XAu zN5mNWxl_YZbU7_~&1x89-hq&Z;DHHZ@NJ$0k>BkoM1xDT*3Rei^Ye%GbZT`Y8~5@s zVIQ`IKK2N`OVL_g*L7LW+qQY{dsj&Tkk}E8iS0T*($DZ@1}I3CSs7yV6n%7l2ZSoC zXkBx8S+zGT&;_2on?3u0=KIOJ2t}CPoIV6GgFOSjCp;2+LPUH-F$ILXOVogdaynO& zEw8E#*pmw#YvOlZ0z%V5iXFU+}#uFLsXkJ8OB+4=qMAyV}0CzoEIpcjzq zklo<37(aJ?L@&}lo{uFr3jSbEkA9ARLW&Kf3OgnAp4_V@Vy58 zE!`zw5fOJK@fwI+J7V3kB`v3`>DO1oGskP-X(p7~If)v)7P|GJ)Ok*M9zU{_p;G z!~WoZ=Qr%lL1NHB7rFONtGRAV)dnp%Vl^R-U{$3^leVne`MfouX-Q zP*tzC`lxy#Huhk84K-vK*+R{trDU~HNsyS8T%-dUVoDr6Mt2>l=v@+gEpruN1Tzq* zs2xxBeD>uz!QOr0raka}XXt}Z$)k%+LsdqkMvBAZ6|whykW8f~eXWy?Ub!{r)0%TZ zYXH_nOEnScD8XE7Wj}eZt?tZrh-3<7J3l}FqL!T31A;z&@ufqOs!P>lX4#{$Qh zWAY({7-P6#C%tdXA*51E(@S$wErM5MfO&olVMZiX0Mk}#EvvM(SK_9ML(l{+B`i9= z=-t>wNVoLcuppiR^I#t#&?t0OhX<(LK&z^EZrh*Fnf^?6n%Vu!Pz3r`Eil-d#6-yM zfvZ}qFxn&DN)j{xrnOgBB1vG1^RDfpe^NJP@K*IwGMJ!;U3_U@ompR?r^)&nJ}<`?)G~Qy-^&d|(SEMIo2J)_KZJ1W%52-~A^?cmV<5~#YAP)~#*!Zf3aOCfqc5d}dp=vP|RTuFf)!5lFpRz)36%w8v%DO^X~ zI<9%Uc3_b%0A#cq8vVlW9gao5chg&_+Dc(n4;q<+46aC;}q=%zxbT0esdZdQ5v0=RI($)w+Hy~ zTR6;BRmZA8bQQ?I+36yE^UK2@{sA(c{?ebLf92o#c`B_YsCwaws1gekc#jGocmWL$ zZ@CK@rZwwSL+Ak2@1@)mfNr6`-Cb+IaU}y|RU}&l~Cet7a6>vpfku#W5$MgCL zTGN(WvD_>puK-Eq3zIj<3}%QM+Pktnf6O~=nhQ?T4nfvp=SoW!&>Vy8_UZ8SMF+2W zrpt85dkA4Sbs5V(ToO=~E{2SVF{PO1o}EG~tt?wBYm-IvbakZl<9<>#A`9_OLIwn2 z0oeMJ0?@uYHnLiwkHze>bOhmh0`K|NKQMT@wuH!>qiO08S}pR(56HnNdZ8$r%WU zBwzwMwzWuA7k$_}plv(mdHMN}n{G?C*psbz(-Y1^7aqm59|VElc(+Nt3u zh7_h(Sgbc^jku*+eIXNW7?6mxT3xYi1Pz$P1q}%uCnBP8?K80VKBZT5>>PuK9Vl4#bjGD$3S=AIPNZ-)9x?1(Mre#e_RTEel-6HE`zx!pVy(eumk zbULf*MJn^^AmoYEYzZs*0VK?$CA31tSG%nju?*Vyvx@Qh=Cgtym2%%x-)HGq8gx zD;^NicN8(jWGL`D&+|MxMoGKY6wncS=Y0%*q%jEJiJ|&0BF?$tINe$&_4IaB&YMVO zqK*JgF~qT`Joty-+5ZkA{-e`B`g;3%lMSKg)ZcaT$Ln%|!viN^GM*-i!KD;EJ9MN}4kL#8YnaRb7F&4A+bk271k|ex3_1pj+ zpLGd3ZqES$5?K|<;w|{-DD*w7oe>t$-YNk64vbZ98;lM6D&*#4PL|m<1fza{BVnsq zb8N9yVodV_aFljJoC$M^+dMC|Jm+OSK6?Y-9^W_zMO$X94$O+v&3oJJQg6n9jsyfR zgC6Ic-Rb(<#YyxcLum>o((+l`8F6#IAh!_ExkhBS%R?1vHODx1-JZM1eKvfbr}UQ0 z4<#=4Xa3OsO=m$}c%FI^HWA_|ZFi--f)&nrTZ%LxGyvL)^>*!Gy5RQ_!q+JLjCG&a5k9MuaO1_x{fME);E0VqFCG=6p%@jGGmpGEEW# zXr+8+)!>hHnBR#qSXRwQ;`joul4jrL*mi%VAsDE1 zBAaUf8ZR4zM(=7740+JX4?JPFPsJ=#t?iH2Y`0P@qD63-_b709xhyM>kEfw9b_oi zCp^d=l|c}sG$~C5S_M*rU_4>mEN-^-V>3u(Zvl6G>Vv}rlmG#BaGb1Jt38!L#%Y>U zN~5oU-v-_1UaC6CsyT1#x~l2`po}}N_7tv`Y6jk?*YV#xr)i2l4qZ$}_a?n5mS4)t zyZlb9F}fe_)Lz;UlXnLfA9mA}VoVVtq}|k{GVzV;e(C9dMziQ0jdk7DTB~<{>Y}gE zqYWbiGt}X|)ePX<>Q=1@l!j6W3o#&lD&$QDjO-1Zk(!}(B;9>4!4TBHJ`BK(ECiUi z3($b`HJ92a0wRJ_v^rG#bmt%mjNPA}97V2{g<_u0E4f$7k8!qVXDmA(djNbRdfeSEl-Hg}ZTTZ7HN ze;@uw|0Dc6e-HkH|G{6W(clOgJro{)@ro)%Kt>FLk^ z&hI=P4o#$V{R6zMaGyKsIfAjFWw1r5nnNZ>s-n`4Lf~Mp#8gQnP% zFVICqZpTkUKLN*`;sCyd--=2T0V!%Hb}#dxf^%Rg1WaiV5Ok=gp3eGmv}FagF?j<6 zxoI5$(x3-PPYZSlA0Kd@aeQK~gCSF){)x0WlgK1zF22 zlf#~{+(yvfz4*1at5GDNa1_KM<=jY1VDV5m%Lc)O(zM?{82L_8iD`a~;2qq>*u!#b zQcB%keL`M7yj#}A6H`nvc+UpJfL>717f20UhHT(HHX>voB}4RCqqSKbnBU9(0pjfV z^-JCDg!!xrrdhQ@Coclqos;egBdUl>G=4tzrq|F;g8;MWOY#+!%c{8v0(5VakphW~bV*bVMWtEoJ#8j} z$kfwEv;i)3NNg}&d+TWS`T$fy6GQ81S5?!&mdEcdZqlT-ysc7O9m^8o^oylvDXoY~k+Ml{*5I@F%;I$Xs3Y8nF*%MG^+oDku0cs0 z0w1EU(Vvew8}uh8(s~DUEw%U%hBond`zzyY{8L{;Rd1qYgxD`1sYOk&tC}*}okp6X z8dfF_&U@49NF5uX+D#6g5J%08iVm@_tSS1(H~Sy`$j$RPuiMwZY#%>>G?yYz5uJl3 zLq==pt_k*$?Y0>prgT@+{QAe$3s`XI8oA&jGbrV%RVugiXyOGrLX^xc3mo6u$M<$V zeO@qMuW{+qb0lC;q34A^E;@gZFWi8*dcib5sQALj1_VxLAG}FT&?)EXI&^tSM z+upzb@bSa@x~==e;Wz&BU;g5YFaPwf{k8x7AN|ok{F{ICU;6#u`>mh+WH(J)DO;^q z*No3*O!qZWL)}nU)n+CNqob(Te&_e}^zJ!3mnTdP19#Uv*DV0+@i{knCGTK2FN5Koz#BTH1zwklw4cQYBo|C2jF`i zgCPRD%l@gR7pOo1UgK`#q`SioAQB-nA+ec_RrUE<|Hj{H|L9MxWa#5H>v0DXC1}mo z)k47E{tf!){;J>a$NFnmU&*V}w&`c7%;@ppun@nsg1$eSG3)8e0OZ&WKFjRWMBYcU zesvk7+Cs|fl5=ilt>>kdnp-ub(b?gvc{T$^;vM@vxmcT(oJ-zN8ed)gmF&X1#S4l6 zrGKjchE??lwW+LzYDpSxTW(aes^@v09(L1yo_Yd{u9R3Si5QczGb0%C{1+^y=GH`N zbFJ;bCGwFR^F_~W-Sp#!b=|UOKOcCWoDY>)`dLN0gkEb4%W`_zwq+P8i8M40j6|pnHUlBkfe~vN3PC||!3YE`JJlU-sdpY8BpyzOLkivn z<`5XMiHzfS_jxdWd-vVQK?80@Wv%c*{4clkaRu<(9CWucPOM-m&BR(=wk@8|h!j&~ zqQk?358-$`o=&H2+a4buyM3hF%{xL=(eA8oCgM6@W`214@bo6cBwa^meT_w0>)mPe zsLlkzU<9!l*V+~Q*g_b!+l|5jDpqonQs*5%?h+Wi2$wqCQ^&5{TD>g7BTes3YcP;# z8kxN_hgYuK|@PUB1{{q|vow&92SdU9Ro!a?amY4eSF@F>jhyJF;`@Lm5K^N@6cBFPjsi1I; zDy@}TN^P%EMRZJ&UZbgvnGIsUn6Q+xmE1&jyWI^-dJEO7*`x?LH(H*3t}T61CPW-! zaN#>DccvW*>A?0B5<&L3G6Cwa2sGn<&qSbLWMZx@mG{9P9_F9^Wd6xddB3mcqk$+1 zsd5O8&{U;}ftnFQPpqI%ELEA=V!V;8;MYG!Iw&v<(+P&-mq&HArv(baP!W(!$dF~9 zbbi|2{{dj4CF>-EdOrc7Iuy8F?OPJjRJ|7+iT z^RNG%zq5~_w3b2;y~t`X(Y=S)w^~d$LK6^@L-s(dGyv9Qe3ehf&o^ECte)t`)rr}a9-^n{fYjKzb)Hp`vb;+_g2co zV16rhK3ba4jDPQUhg&Fufe3Qv=Um_%coW(4{b3z#bJY*JT2uh&=f3y-d-#D-6f=`^ zIKs@lG#4mED!HzKn2kttQ8n&Y*2R%cjnNX=Y&0qQCR^=Bzz&oKjNWiSnB@i~>EB;H zT(Cep_vW4e`7onet*x0dQhFtmJ@&@+MdP4*bZ;t~_ZG>q8(PCem+P&mRYseF!)X_O z_3(_?8`=u%x;=la>#9= zO-R(aE{+`&+2~32FN`HYYy7O#c%+n=Qb?xDt zdmWLa)>mDVA>d8xSqxj6409-sDyLkK~nl~T^fm%JeMJClOMN9yD^&~xh_$s+%DSvur^@#{ zLMS{UQS6Ky7LhHBo57WHfpiXoLg=>ddfJAd^DH}YoZCl9A*eD}5e?2qhS?JRnQrfPC=MN_@a6>w|#M?ZtF-_zRzd~r~PiwL`Z zH@WQVxD53`w4xM8DNSjAc%0{n5Judrv~Pf48}~5+g6tT- zNPGr79zXnzzyG)15kLI?@BHR(|Hhlg$A9<_|M2<4$$NPF=1^+}!nM}YkES^ODDB<0 zo@-UpOZj#+w)qaK%+ApT?%lMnHn5>uxeUNF3P<~ja@^# zc8zRMz_eF+jCSwy(YtP_!@h#>3KP1*K*vLxy~BPv{sdlu#!fo9w8ylV9|^Re!`>x!wrjbopv@;Gr;kQ z^40yPmAY=ZDu%dADb*%h-kOMuuX^p%Zts2Q8v~S_&!=C-M}(K%-Vaub*|^z|}8=yrnP%Ww_Yu~i` zb&*AFT(|g%Dxul!DS`=fce0{jvP;|aNc%nbIv14^-*v}Xs zIrSm9DfvLbL1GG?93%BQ=K|tJy2{YrTa24wANv`QdY~QiTL6|QWjE!6v-VPu8Ycik z?P~&&2W&RPCyl$Y>#hAfrF7WumvwEeJwHF!S`V*SOy2Ky(2I@ZGZJEm^EAyNhH)G% zuiN=Wa}JJunyicUZl#t|Iy{zdHbZ8guIZ*Wl%?i*Dky6HbvjBv0f(K~S^l0tlK+9EA&<}`ZIvT zfB4-u|8M*^{u?*NywBr5@*nw+{73(z|55lS3j$yTHjtiFODT=45>NvNcHLN6(S)Un z)U2&422PPCMnyn^!yDZ{wJ&~>fB7^0`cM7GcUU$P1JK)@hD3M`$OZo78~=-U@sR31 zYM+sOKCJQ2&rkoS|EqlSZu^)2#rF6xq~Qn~lQ~A_F*cx2tcd#Y-l{9?-CwH$0$hz> zw(=+MUOqamiu?V;Jnd_d<7q8beVAgJ0VtoB=dZsx9Ui#UpFBQ({LSC|;_X{zuB~Zn z-x`S_e!l@mPaMD#>;pXn2neE=yKFT3%;pYWSV544P+9gE?9Z)H?|SuMkx|NHPcr9w8DZv=dF^V0wbbcX{k-GkRRlWn)9%ftD4s=ik_332@pyFBl6*OU>Z~E zCgqZgo{ldcKYZBEM<2EjNGCJ90>Ca?i4h`rMv4Rz`v~5NXwLO?IxlOHM$SE?-J3MO zD#0UK%|4eZ?L<_Z2j>wL!~{J8gQ}GeW&6{uyf0FkqFto$MBxtMrPn^jMVXC(A~i?r zek%KY*zY}u*s2v3^&#x$!<*gXQ<$QNYA5o)?sLbNEoVg9?dFj}gb)Yibtw7n^wG?2 zY51^uU7vATk5G#P1$5Rto}xcvS_}JJs9I7#`(5yJbTLKtj_Fd7wgyOocPSa-x26!c zZYY?kU?~;QVw_U?k~#G8O*&gxVrsQo#}@StCXQ4F#d6#7(iZRLETMl zjHlD-+(DVnx!rCTgZEF5ghoJ3B*ghf?NO1sEp1z%i3>Yqw{dN?12pe5d z`geU~vujrY`(D~p8EJqQE&rF76-bU+cT3Xr4_OiXa z&+or3Uq83!Q#*@|W4G~|OWkzWZs^DJZzeOw|O`F=#gF9wry01 z2A;`9)~L-FK~UA6`d74K%CN!3feG(=yhJzt(y)d3?)al2LkM)(zars2qm5ACBORLu zwbf*UEkGcdWWb5RulZ4nCoF`F)9)op!ES5``}`eq9UL=?wsqjftTACjS+ZR z>EHOf_ILljEerh9#eey~{9lHD%kf|Tum9KKhvUEaU;Hor6Q?rPYkHstXgyVj#)ja? zWaRCl4Gc}3Zw?Dvbt-Cn(HXe^IM@gO#gEFvo7SqGPX7JR>Ek!pn%%&p;=6a}fBv6c|NQT>kDfi6mTggy6ZW=qnp}z?Qd^Up zwYz$B5F;qS+VEp`zbx)+qf+@JKKh5>njKe}fA)*~{Ly~#P5I`dhF=s4=k>TiX?|Om zpZ)23pm<*X<=^`4pSJeT{`AK&#--FO(yuwt%Qk6vZDAUsAsF>ty5p5AH;~0XRD55& zDlwUJlAI<6@2KbD{oU}YucG&preTnjx4JA@L_*+c3TcWl1`)B^q}dP*zex@wUc3yh zZ27yU`9-kqI(h4Hm!=Tlcg-H}1O`8={806p*W6y)uNKvBrBR)Oc%@4#-T!romE4keu$@+f+k*-+Z06E#p>LtFIz9Io|{y#IPwbX@8DAR z5a)}Qwu*r%foiQ{paP=SA7a`E;k}05?f1Sr*0gSu`~30a@#WOA5k^(7iU!wlEZ#bg z*oor;RM9ISn?lL;^lHR@R^S-tIPHB%V_BMu96fk=Ckmk43ya19wZNDG-e#_EZ zO~;pYSw)&-CN)xQRYOu{H>w`zJ;8T^ov%W?Dsn5^CbEJIW1Fl|?TIM5^v3xEyV>o! zP{+kK97#-j_OECJa2u7X4*9IBs~DnV+$rqxt48M$Ky?QpMDLxC;PpXs-ddGX1CdA4 zy0%=vw0Aa?!9;3VPsfiR3EgY)9m6np1AyA2l(O_;Qw1{4~$|)v7nqIS)X-tp?ba#Y6 z@3M4RjW!S_&_r8lb!*#cJ$)=6-*WA5rEe|YXcR{+Ds*?a}b!Exmlf4FA_z$8Y}b|wG_^C9O?3#FW|R-7q^AK{uB7c zpW?P6;+%oB*Ro@05|yxbJr~EMzZk@`O;TET?=ruC3|* zVK=1^Qy8LQ1Nez_EhX*NGQs}nM>7u4t|fGj>u+EzMk5ffP7eU~$;b=rGeY$JMCn$X zUz$xKC^E#hRho)e6>HLW61DqW1dN(!6=5N*!Ss#UTeEWjUTtFWV|)`#~o&;6As~Z4%U1X^(m+aHb-SELV_94U= z9KwA#cGI+LCAa(`m!nAz$P%G`CHSK`B-%YD+9z_o*UzL^*80r@a_lZ+@_j*<4-4$B z$7YZ`zcqNfE!**9AGvFrcEx)~0G=J818_*-V~9i*TFadVWPpU89h*t1FCX65PSSaL z^Tsicsy(G719`FKQ}0Eklzi|H4~Hf)#uKHq)4Ht3)0WF9q)RQ(nrZV)o^Z&oi2~DY ziL}oP)B%%WM(1%D5Cq5GQSjOcHnlf6l@Zwl4BI8C)+$H@UdXgx%-%T_Wq^39Ls5wZEb7OdTYIO zvScfgH_ZaV=m^J54KH!mWF3u}e~UtDMr0!+ELm`qQoUW~6Cs3suO+tAQkGM#xw@12 zRjFLzoTay&13>D@!F?7*ox#K9Gj^3DT-|C>RY3C?{Hb5$w&$um>O*2zG?m+EPfN1 znRoH4uYUWdU|4JYyZ_)DGYiauK0j|{=P%~``)_C$T{u3|`nrC%MI_@CckQvOAC|4ADx3@tHS_u^kb2Tq)BNfd(?KWA3||jnIWDWL zIkXaM%_1cv5HmP7jR+^JOHng$czNSXmQMF|?ofR0%_sD4{q&O*-cFQQS`DYX+OkSE zV`2_bV^pG|%4Sf?mh*?4-%CAmH&4Wi8ubZl;w7PTJ(VHvLP{}&$nG_+CSTnmWzw2E z6T=o4!0#L+r(w1bLr9Kz0Al)ZS@Dv!Bi+=>sDCvAaG-?5fYNGP7E`qt9MP`Ukn>W? z;`}zBU#1lMwFX0;*Q`wdP3OLR)Y;e!2;N1FaZQZkA@~B1#5$9 zV2+$i4iZSuBOA1fz^p=*y0+y*{_t*n_c4Dwz80X%($->mtPxB+?zPc$ap*kx&(pO} zOY+YNp|_#>wSR74tl%0@GZa%)?HYm@xX+$k>f4w$$=j*ZRTq>6L`{(lfh%;7i71QS zpn-N(^^GA;qJV%RO-E~r(DxvA4MneZb=(7b5L29E+)Wtb?%~UFNSr^2{z55}r4-{X zMhroTY?|t}G_02rp;&=~wVHo0>`g^L*Q+$bIvk|9Ag;`^$gn{5!uvY#baqY|D#%{mXJ%!@7l9 z$uR=nnh9pm6tm(c;LsAf;35F#Dy4{;QXoTYrJ2?;vrId;3`R>V9-J5F0YVVpa_sz@Y!QL2NcN z5xZhskS<_X=s(vhaP4yjBYpH^R_kf>IC^~OQ`uwqVrJ!DEMnIrG(i*jz_Ej*1z~qBZVfM_`G)q;3m%F8Vr1}cb z`dsM<@NPZR`SiY&g@~t=cDw!9V#}77)5mprDN@Zvf=3XNS_`9`T{&x5U+`4qS*3vS zMKI>J5!_!AqczSEXvg7;=-+ti5PTvCfo+Q9C^Z7}>`O|=jt2@NZQB;pkIub>n8DDH z#h@pc0Gn&82N?Z+V4~Igkft#2Lz>vftKVl1;dFSYA&_eD9({7ujq9EBL^rvPv02|7 z7Y(Ra$2`nH5!7p&5F=4Esjay6B)PgNVN9st$?Z_Aw~>~VPP=I$VwX~g3D)H$2zpQ#&oX zY;|kehNE?nvb6K5oR+q1lE+x8Ssh0&&?iTP432?s4uJPb%M~m3d2#;fnZP>`BN&8? z^9J(@u7YvXZL#CCl7aJz7qClHS*)G4h^(%yglftIkAXGJ?u*@9 z+$8{r&iNP=?7S{+3RB5t&F8JuZMUetVdn;>It+5bcURo_Cx1Hq-~T#({dH5l=-{;4 zfG${of8yu>7x>}$ul?8lYk%}de+1X~&;Dosv%mLyzXv}M9Vqip6F2!z>^Tbd#Sh=WKl;0Hd{&V=-p+Mf%oYCd zPu=AC5W(3^z~ENs+xZ;-um88lKmM`)OaDyy$ya2c$CviAU+Bk^BZl1$gGaU7RD}=% z+04d(lLM!vZnf8#x|@8zjIgRs&WK%nNcb3VT2g)4KUY}ualvQ90!Z4DHQ&jl3@V5P zfQSLvkgz8dUd6SIbM6?9H$J`fU;X|o`a!jP^Y!sh{^(_SiGF&j6P`}?3zeUpVXZos z^-K9!blIX3a#LzUB}$1cBw|NqR!f6#EjzCKXalXyDuJpIf+t`U#Ub%Ntf=l9nb5A8 z%g}=w1@|3f(5~t%cHeLLJO}x_uQvLZS6d&G-cPaq(+iBo>^?g}8yctA*MN0Fs`~L) z@!?&|ORbwoaW0hYN!6TBeZXw%x_x{_ki4i__fnXAciSzKplV+L zCes7)6G1dADsEkLS!yk9rwg+WQ$U)bQwW#ylAPzsyEKI<(FX}1-|@EcyrZW#lpD=bFzT!ag8hJZ23@ zq2DB>Qpv5=-fLvD*>q>Rj^*3nK5zhmh=jQ!p`bNn~cdUdQcB8n6P1hCsJhTm~_LIwLX#zqD|6gRRJzCKuB%J6iAr!xg1Lv72czI*4H z@Nj^hWb`6hD_W&KqGRXqD!#;{c}=6GY<6j}^n%?zJUzXFf?kg2^O=Zl8{u`r1enEK zYo$VjPh#EjRx+6$r?>^$%KLUa)~#lvGc3Uci0-tm&mTT~eD@k|P7{c&qRnb8SwurW zj@|$a#Gc4qD4Mm!zxlVPzy7bmvdSl(cB-PHr}|IHV1gfx|JDEMe|4YA{OA62|GA#8 z{J%Tw?#Xxn-h2s$#^mp?GHR0$No|H&UcJikBxi~oH4$xrd)3A)V! z2SU7>Ug%Zy7tNvheqBW}>bjQJ|6uS8hzMfMfWdis-5K{gKeKJ~7I|&*9^gfV1o!>M z1tuL*-2?V~gYjQME()j}VTiyX?9$K+Kb*(6}#A0?G)o3L9nzmv_DcjYD2ztns9&dNKE&|*fPGInhMcZu#qXw;M1q*6j`%a}9A~2c(nF-w1 zqT4y^F?m3e8N$a#P}-A z61(>pRV1_G}{bf3lI6=ZdpP2wPXAqE0R3Z~U`liqgXi^+x?9#0Ky6)BxlQ2`1& z@c~u2)&WA03l^g&IO`oxyvTMUqEn!e_pWNxnlKdR$_zwo_e}AA#fsi^KCaXO0-{UZ zTx)4t?X=kFdFR8-;Rz{#6@%JcYL7*-;W4GejuFF<7^$_2szdA+&K|*VJ;BQ}wd%vv z#R41=iCIUd8WA``N6l=L{Jfr04B&ipK0X{~Pj70i?iElqyK9YJYkqk-ee?A%-+%bH zo=*;}<6|5EXs;)Ui;)qat3{-mDUm0BB+f{NxS5F=0x({(Z5^ZF7^jEF!Hhe&u=AcB zBM}jL03H%_&W993@PU~JR&T^CdvtU5xa?4#XsZs&K~Hw5^R z=UVE!_5J(p{fGAPc!lncNf;9o5~I6E?;_w`*Y^fMv>zNH-SwY7A3E8-nX<^KLis(;Mm=(0;!cl}$4RYCqx7)vc`^CCtX)VU+yOOo@LszDqKA!WrG=cr$xs=l9jIGwXtn1Id{`wd1 z-&GZ#LiO-O>rf>_0h613%6zHPg{Yl8BpaQ!IAcr7H~8qhx(f#SI6e2N(#mvopWbS6{+BwNjdCaRku^bi*s!JevV?3t{o0IEPH51A~Zo*;4w1sMM05U+OQ9 z9`<|w2_AmCX?s5X!N;%9wQkPG6!*Q1bl$00S+{lFwx-}id^PPOa-#+|v;M{4>W8My zRKFEH;DL1}VCpFXNT<|FYh%BchNUP%b5v{A;|sU!5#7-B8OViu{0+jDFM)i~h8M|O z-qx+;>^mT_eVb$Bc)?}lVdfA5VPXTTTVBt(mL`a9-tXSLdGq-2FikU&4W^fh@*tiP zfDvHmSF#5%y9kn>RThC2;RH0Kg!M{vp<(Vlm@oDj$Ll&!Q|Q?gkvF~Q4l^x)wY6uk zq&73}z1yL2UeC+AZn=t}?^LJR2Ua^DkIQnNy?cx)0Jd7PDo3!(RcoeB4NvEV$L`aY z$g5yCz<|sq$m z;o3>y&c8b{ff6P=U@Ed=U;#Q_33odCeZ=(*bL~Q31BX+K;F6S3`XY}yse)^kmja{0SWdaoryThD3Is+R8k+Jzh4y6W24-b3zzL-*k zyT(f`CFgQHEnmNTUt9arufK85y}Z19`0)Pp8t3Pi=U@CPUO)PCQvm{Th|I}{hd4jP zX`bdd#qj#S)N`ibkdTQ-<<`8!wq(p0)e>u%Z68Es5{Tv9L zR8Vc~%|$eTi{jgrGK8qa#;!Wsu&BY#U`NPTJ09Csmd3SetGQ)!-C#04HBcE2ENadW zx_8WR__r>4evEq5PJcGbP*%y1EZT2h@nZBDw8eeR@=aJG=aRCS`ApY zqQ~d37Aoqh4gE{Fzg-YP0gG6!idbvCm`>E8(ya{%9FY(UGG1jgMP%UAhcGaqqE<7I zvXyl^t<{W0B!>8U=f@5#wZPUjFO02Yz)TXf!qDaAP&ro0s} zu!C5IZL!lcZy6k$3vls~(R%=#sg6{kSGj;p9DpJcb-G%+DBalDnOcKe+}c|s?f^}W z0o`XW#P1^SF7{9DIsir0OZs>lw%%S%G@NS8E)5z(z}BEPHiew^eAeZ~%2B*kd#Em! zcxcpn6wZfNDr=Xo@5p2Bu8v{kR57Koph@Y3YCuWR#i&*2bR=Yk2bto9DPaPDX7vAJ z??3omIgTuGFid8afw|^6k|IU5AG_Xr^L6&a{6EopzdL@Wt<;j5qIvE*0A(^WBDPQo zfOzENu)8(-{g>1|FNs?)7xof$D&oXB*)S%HDeBE_sJi8PTyJHyS~qja2Tas*`TLWc zANI3~**V{|YXl7rDo4yk+CzXq6L>y6nbmV8PT7YBaAmMTcrY7JaiIuUxDq<9+>)AS z?5=NS|9`qGzNWkpM z%}Vh&&aQ?Nae4Ln^_#o9X}bh7O%&$-{%$*Cx_0Uu^$(kF^DvGh0@NW?P0N+VXt({i z-R-I>v~v*YYW9P6CB2fE$@#20Oz4MD1wx#Iz83WBUxokozxJQ+dCa$|9&fww<*f|S zX21^~_$@|Lexl7=Ojt9R14l+4$eUwA#$5KlCr@N3r$)sf7>`v$Gc+h2}%worg@0*Z#0w?3u#>^dXq5KS^+CNnT3Q2)hmQsweL|EFoO z_(!+d%&ffL%6VV8&E9#v&X^aCzX-mO>_?AD4A2hyQpQ7|vlada%+oTYJlA+CRYagu z`)U56DeL{iC@HhUrn07mI>6zeG2s}Yi#S9W4H;;KFz%N6gr{?hpd{_Dp_ zfAS~)6#ldL5MT-%h2LlV(fB<8FKDa$DDWb_I-@6%n}lmLR8L4 zR8&k9R810#xST>BIgKu502bGee(0;ZcFtE-vk$ChPBG$PchFWnBf(eg;t)0n84y?mu*^UK zlxdAz@*NBHVRCHWknWzjMSO#h7@Wh(zcW{e8OI6C!$G$p&Tl!>1T4ifBc zl7UIgGDgR4y;@JXTE#R-XAn^czRV$(ASNQ5O}Z&h5Fw%x(Xd!d(KydUbnY?56!$C7 z#Q-$(%$^-E3l>&b?DM#qiEP_8uJ8Mtg}pBlsiE(7J`k_#`6jE+Kd=8^|F8VjS90() z#dmh7Z|?ZjoyG*F20soeW99U00Uk*@f-x4K7eiE}Y#?BYdaQPU!5IkA5gL&l=4(n; ziW(>!2#qn3ckF{V5zwqeW{%kD@={)WG1BZi>L9$g^t z48#Ul{oUVD9`(=uNnWi0PcO^<{*j-0G@o|fvj_8)aNr~hlM9rJQM@a|x+ocrMe?tK z2si@_REj@RxfII#K%}NRj=I@dKPaNr6)dBhlY!ZrNwi_K&0yPzgOCFRf~7MF<*3Kx zAYM8pB9%XWXO(X+ee=|u&(kIShLbf=&+}aihc#LllM}%TpMLPsPoMrbUo5V#i5>i4 z@rXw-*VBSCm`O@^!}vwteL1F^z8|tkPLPtt(L|VS;i*AkpgLphGx~n?+bz-_-uv}x zRaI44N=Y7e0H)ckFBog~>Kj@yt*Nq{tAv|nRMjJuBC9BQPnIZ)Jpf`8jVa0VXY2p&fAf={e)4R+TG(8qF*7{Ymrez!@)H0~8$`vP z*qc=ZgMlEGiXp0jDF_JU&h!ot5LaN%a!$D)Z0I2-H60a36O{<#sI!^ykmH0j^r_p$ zT@PJa2&@nTGPBVkGvgFdU$zSf$&q((piKz)UDDn63t+HZdOA0gq|+5xZjYxsp8#g% zys2pkWr>EW=nVvYw&guu-BQydsQ_YBhyrMuMfUHD%FQ@#Z@0ULyG`G}jrum*{kEH? z5BklfABULIT=wln@_9vznCoh9I7ZBfsCyU@dhe!7tEwtNCDZnLytrNQcUn+JAbpNDMKzAfK(b53`I&bfc}uiF3P z|6#bjk>ekb9R@`J#~fbX$lHyGLBWrsDx(IfrCxB*$m>x@C}xO^%8r1njBf4K_1RQR zaw3#jQi>D4Cg8LCib|eYG9B6hCm%OJVgNOZ$uwh36cd_)M+j;@z^8u<%ZvSd)9cr$ z0NFqk7>x}OaqPm~4%<2}Yi1_Hl2cdYe*W_>u^;8a})CdnG17J}`2~$}(hxj-zo#Ep-=DP(61oP&L4#+b$Fdb2&iZQ?|=~LsZAn z#?hHJv+gcC2ZmM3br#o;ren@o4J3F&Po%_FgpH=83IvJ>qDsg{psF_ikxSKpdy?ww zXf{6F_PY&aX?=?Z#FZhFuh!2eJZqZ<9`T4DDG)h?C(~N5{^dB{efj0TfBo|3am*?> zj;KO`&{dA8a=|GDV~$ydp)cdBOyp+%a`2iw^fk}^U!Nd3rhLh%2&7+_H| zMF1oW)r1uQ0Tj`?bSZVC#F(dlqsC;N!X04)=0POOFv2)MN}`qwB8WmFaE6n$-Fa`|(8I!$ z=6*g;gas#YumY%|5|%unoW{K8VEcbV)~&!cOU$owUv+79W2;-^ou#CaRT;rMcI3#J zcd2eh#+U}(ZBj}~djflLxz7vB<1kOMWJ!5~nZ9E*isX0?B+?nDU{vqjDW#zlVA^)E z+GE)??ZjuM)9JDah4h3l`%)hi<$L704wUDPvK^zgPod&DC)e+`&2qi0*Gwci?sgsb zl!gxe{Lk_K_J4K5z>W`}fk6Rvk-vBY51lBSa1z@6pg~y?1t}xoyk>Tw1SCZ*2Z(kQ zbm_j@C~=6E)ni&LIMjjPb+fmAuiY zuv)`k{W<*V7dQ^4$p{o@7?44ApB$(@U0Lbe)7SMOcXQMJkK-`oYgVam9MIRu8M-=CUx61G?~~Ndt@@BLjFp1^dv$%gbxuOGJNJHHX>y6eHG zJ0cdv)k&6gK3JDhy1AJ~s&9&~ED;?8XUbhdiPyFxLo&5;MnvWd#A%AC>W)uO=cx(& zSO41n<9~wPj<6_O>2w^=4_o)ejdX+HX$lq3%qM=}7zLET2xM9a48RPeh4{4ScMKd=1+}#SBg7YYsdD(+HvlGpa^^ z@+Y|m>;DR41eWrae@)SMouKCHrB)RPoTn7>-F^Mnea7AF@k>I_20;!!OBZqjux<&vBE=}ssU;XO!?aD2e>!zK$53AjFv)IQ{HuFp`${ra3 z+3{X6Q6ECJRCKp}==;wl-6)74?hx*C+6?m0k6ns8k^xQ8OcnJ+($4I<>1?u)0mCtk z)tJB`K#6cPP+)+Hurecn2#|;nVPSR!-~c@W0m_leoQveoO$@#%g|U+)K(oad?WDsj zyY%8syhm}TS4o*NwYXUEx}qxQ*!8S(&T{g%+wkgMhiHffMrd@L@&RIbas@whbON3sDmVd$$2mR%DisekVjzH$ ztCh^F3MdeGCIXX~;O-%HV`*aMez25irlWYO93q|%{TqOldo1~qMGjjOYwx;{>BXfy z|AgOs=EgfjI+>g7VZaXqWW}c|X=*?`H`;S|_w8T*Wk#V-J^%wT8x?!OQ4vaG_ngWg zIKwE@0w)B(&R5<$q(gkPcRqxQ*_GIgubqd_f%AX1M=?Y~&n`Ijd=layYK$;-rCw0@Fjt_tHx4-#||M-9V z^>2Q0mj_%d>Zey1&!03`YiztWmGe;1Tu_Rm#5}>o@TB-d0JM3F4(AU&`BM}vnwn(; z(ozB{qjI`K9K@990?F9bOw&q4LO@_>hdY~5=3kM@`L7eabJi3`OMn?{)L}PFV%t8B z#ne3R#?9M@&E2-&b>q;FLyCReuQ57sSIeu9p8n*?<7XyW;&UpdOaYGaV*{!t5%>H+R$E45VaG2qCCpA&0^~UR|el0lzc+xBgrI zEjYvF|nAKn`f_j#1jex3VLK;!~ z4772qBmp23VqJmL{V^zo;EP&Mse|Mg$LdHXh{Y+xZvSxQa2y6}s*bvnVkV9v5*zcZ;bHA00 zUv6=9Ml2UFfFby40S41#NZEi;5i(g6O^O*$ROVEbIl;gV=K*HDUyehx(Oe?zVSE^O zH@j}^fxryfiUi9Y>o?ydI;9K~0)Vw_<6{N zkPRyWhh}FZ|lt>V^ zWBTgtpa|Z_?L&V379IwU#u2mSe6vg8o(}1a{p%d$jAi&1N$UBN4@%<2ZN(l)P&?K~nZj zyKv5>aRjU`EZ)?p?p6G3_htUMm=mhFZmVXwSgw|fb=$5Q*Z9(fD5KtX zhVpv9A;?8IF&MLKFd>80rh|%?w3}PA?sn$rtLv-fVpUbav8(1> z#nt6%eRbKcSM73D*LxD<=WL?F5y5Ocw0!0tujb|W^x7%d2)_%FYiSp17y)L!H_hWMxuxI@^$relifZt zHNy`b=&%Gt5)nH38pV_s@bp%H9d$u)(sZH09z^d7>kUuQH7A&X*=ar+?S0V(XJ!NQ z_URHxmoJP1z4@GmzTE9M*^HVj8bdq<2pJ&UZL7cf>nDGN@cbt~(QHTkd!ZdVEihun z;O|myY3ymNLI)N_YD5=&AnynfM42Ht2dZOAQe=SVFObS9q5v2&IW&~*uK(enwmD)3xv~9>KZ8uv&K-1lrc1iBLp=qW^Yxg!HPhR}@{-^)j|K|Th zGty@0U%vY4SHJ${um9$6KY#how*ZJ}gvQ5^PBwdLlJlr4qipZDcc0zey}jGr?@G~&kaW~Mbhy$#r_T3XU4AE^+dNWrux(6dc9gt*SKd)KV?v3V(&v0syfu3ovMn; z>ASZSR{)@-OBtA{-rwEd-QKC#96}D>`KGBu2w*msHnPmfb5$m%H165TwDPIqVn;fG zNV6j)rIft)*VosdeDcY&XV0b!i^4Yq&+O*kurnpE%_W~4<5-$X`?wW)yW4FGlPd4_ ziSEoVMCKbyxeCr;2C8{(LP?=AqFL&{`isS%|D_WlAG8GDi8>!E0Q~$7zrH~ta869k zG$tJrj7GQ1CvTf)JB2=`L2M9(A3WHAkO&^#5yk~eqoE~roV@*baPzF63KL(7ov z?k|4%*L48>-~&W3Bt--;DpoCo;$U#fF>fT3D#5Pn?!Cu2Mkb=BA?CrkZXEl$>KNwy z*t1NA85!W%hqLOK^eDS=yR*%FO@RZvAV-Y@&?F+ACNX8_TdWw(kQ1gJc;p4N7olC( z0G6Uk76UuVi(w{VInRHzXn@EDc=7Qkk38lPkN94Ms`}$U{ikN~<(Hp3@0j^im5DP{ zG9QnZix|QTh%k89)O8k5-h*?%jKnh4gkpKP`@p01yGy;-JM<%R&gJ(p$3ErFZdcd!^ecPElBp*12Y>wJ`ns;G zsjBpgpZ}ct+`rm%)>)KJIwTxJ-17F8ZZ%1DQ**^?T1qU3foD2SP#1umwn1$V#KV`g z0%b%(B@-3t^LQWa7VwsN=TW)D7)qC{Gm91^=qS>OZIwE(WQem2F;$JV3tlXI+vG(J z?JBIFE}varT&>sZMcam|YWJsMCT;Ub*J?>fFeAn|`~FY=Z3;6WBs1H`pLG4u?-6Ir zTqVoF&DapXDMmR7y$hJ%QAL((i(HqP7mLNjwZx*bY(M339H!ILlY}GiT{u&#KKrblS`WJ|)eRwtfn)&#?IYga!pj?i zGRWf{0A&P>3F&R~ia?!mRvu0|0wAgLo?OAb`KQ<6r+e zw-sDoDvHch$uqTX0`DAmh=XQvNEy=5O(T(MjGMbVRjpU6uv%?m`s}m6`_1Q{2e3bU z_Tu9wPXcpH*+8+#qobLi)u@a8sX3iR_E}Y7=Irdf3(k4wz~tBrY%m>AL8R^Xm%Gui zT9pGz2wXKBYFA=JPSuzBKTw-fUM!C>X$H;?)m?u0lP5p@>EDOPJmL|LsOtKsKl>w5 z8^+|lLxiHcj7L!LW~Wjps2VYcx^306XsD`vdB9Hy$R303d{69Hw1za19_X7E4h@0MpY5uEP8~B~GK*8JBUGF^=PGK@wwH zwzZ^O`S9r{pRU^VzxXHrau|o*xZ9pvb3Lp@pt6Z~an?>WC zv#hDlF^zLbMzNWZG{zjWsWFmc@7Q_gIk4MLFVyRLeOX<95MF%plTV0fe_imPFm~g# z%#0l)qa~A3ED6|gB(+GIy_>+Uq;t<|mwNy1GO}jrcDp?_*_$lyXRYhoD$GgmGEe>N zw)>XQIQFIW6GE7aBED(RJKr`f5_<1NbP8(y;)~C3Zf-~Xyy&&O1xUp)2F+x`}r^8fB5|K)~pWIi_6Q}IXwAJmeLd> zv)$?X-H%2vh>6f)|VeW|Jffle{X%vBOdXH^~Kf4pZsjfZY=XDS|FmPfQ5PxAbw3{ z$c1`|Tp?hns-~%%SxHJr25{OV!WnkEZ5&5EbP8q?qop-{rWG|nCPKgilBtE$R_j1RMrB#&{{z~nBC z{Wx~fL>;)`f}ew+_5zf)zPh|@KWZ=jVD-rd`<~16i2I&bUC&zSA;n0<%jIIau<#5f z=HrV>GvXN2k(SMTGKtJ;T*3KT=gYLXJ??v*KJyTJTJ4RrT&p5>L|g;CLNCuK|?4YLjuENOUdkP z4ha$AABuOoQD{~!G0C|b4DTs;jY+!BBp)1w;2ju;^yEVT;M-Sd24}#mbhl%syll>E zHVVL>eTlBhfBeU=SRipf#;@+~wkgu{XNy04a=BOxIn-_0%?C0Eml;G;H5SjwN^cWHh=d)6 z%0flKIWv+hCi=A^M(s4zsG`Ge95-TPy=<>v{PCZypTB^A2p;i>M?87@42gzeG_z9P zXQEJ5h|tuP4;3PvM1Aai(=KZ@Vyb7q5%1mkci=3E80IcUc5DE0J53R9xBVzXCIQ4z z(KM@;uvR!`nh(iD3}k#s0~?I}Bo?`LzKtpM`?T1ks)S&4fK4d#xBwx9wp}2={S>o& zbF=F@cD!6Hub*7Mc=2L&vG#RXtQIR=?P&y}Wp(OSVSRUXw;gs-hdG*wLmld6+bnD6 z$Rgx+R=H}-BAUhW{Jdj{vqDBL6$0nHcYd{6K6(D+!)G5pxqdQ{hUIiG`$k)(ron|Q z**UjdESh~nOPGC5n1BF4K;yW_uz#H+4hRtp=f@BrB@!|KQDJ2!M#Qe~OZehAjsR97 zKdTvKUfQuMn0XBQJr1oOM4aEQRz&8yPgQo~W_qsbg#&CJu|9AP0Lnl$znoE8ki{Nm z+7J;i5S22UeNJVDVN5B38FR513&k#vnY{PSULe$jP&sC#J)C!SRTqK<$D`!pz$TJY z&N0O-xnyC3K}yNhfA?A0K>}bFK{Y0-H(l6vRPI7c9bZhd0gcxm?BGf}H7Fh>U{KbN z0UUr_vA@Or0z41QCIScuNMMA)02NHp!2Y4c#SGqua(VGSv6N-E)o}nMP&LVxa_M`0 zqim&$3Oik6UK+Tst%K7^~J@-uIs00)HL@t9pRI!tDk)Mq2Ao)oNsRLyy>EC9eM!5 zimMMo^KqaHR-XAWnW5r02>&5d9{|DB)Ise{)l>{jPFX5Ud^8cX(+s<+nQE!;fSDyt z8yW6}m99Sh*~Nz+!ap33c*G;7A>QqF;v2gX1X$J8%2q1veg|1M#gHCm1iwf5UwPhN z^4A$ji2J%oUohk}c+Lp<_IBuYyOhm<)JP6?t%``oOaONDJkO#Lr0>UvhZs2Jti(-B z`^Ln~w1n_r&RMEDGK(;ZZOD4P_TB?x-|u&^W-!M1aKBNp&BM0+&F5{?PVmkHz)ybi zlc!If{dfMmW~wpmi@RBc<~<}37?`S}A!9N2G$Lenm7iZdJ1~ne$w#N_ABu(V_)2_1^8H;@NFB zo2j_+^5x4ZN%}NQG<(_Yv0SdEHEoz_jN>pUB2Lrwh%cwJ_Y>WF*p%W~2>uk4BqCkc zA#Q#{n`$vfB7Rj2|_I4YtRGped~ zj-3mOMLUgRO|#`q(*WYJIb}KR3q1SKuWr|MyOdJ7WV_ut%K`w3T3lZV(B19)>kX*@ zpdR#1f~pYeeD%TLmbN{1Isj}2{8+#hGN1E}c^khT$77Gk1b{^(V_Hg90EN*YzMr5J z5S?piP7m;2x?`#~jAp}px8>oFNo4N=LD2x1<;im(;=9+V^7ZY^4r~S?FBEu=KB`>HW~PGz;JM4Oo&GBdW<8uo24FOQBw~d{i)K6F z>>VOBfVm{A!w4yQ&Hm|&pG_*6f1D5ABOdVxM69ZM9QQjdM4W3a0RY&!xq(uhq?hw< z=wwWxIhTUzVc#|mL$~KL-O%?r9;nRF3Gdt8z`#UU1w!%wbZCoM1_LBAaEM$vSu}20 zcSyPyifT+Tr4+LWLirMgGM;&!?B<-S>w2+R_!-kUcS?D}+}!D>y?9EAh^8A{U0tp( z*6Y>9(-%)KE-%`)B|3yQlsil@&bDuvnL<@LE+O15%wxQ@Vj9)-l=Wz4NToQS!*DES021N(fnIT$bIwgqaf*vuw2Qek&V_kY)uCZD zt6s!8zP`RHV%rj6RD>+v2j|@UiNurOw{(BzQp)~m7fEjs@DfqUHkzlS_g2BvMtN2z zi{7~alT@`lXF8(HbtB^G^wj9U83s^zaA8hNT&AvY0&&brL&}O197j>D+jg;t%$^8M zjfm!#!~hPg0u>e+5l1jolz>k9(L~V{aORs2LwIu!qI#y>1~YIDR@bp=bS9&}_J}pW%D6@Hh5G>!f|U(A$-qt{TBu-PXWlw!dmMA=i=z4nRVdz6#0&sQ zayO*iHuoEpysDe#>iJI}a|s^th~EY!^KVaO0A^Vw-Hlvd+~3# zzh+_^+itgSaQNbC4hX2KDW*No$byWL2j>`(Ck%`mBvDJ*)QpJAIEBbOzOHdUW_{D| zUUmJ$Fz7J4Q7D5R4TL9@;*&^>hf0PSoT$vq4~pU>7qx8RPeq=Rvk>Jnsbpq*ZkN+~ zJ;md`DB>FckUer?9#i3EHoi*}N;p7i2F<@H(?SG3;waITLdd$VPcfFRgU!z;&2&;k z)fADuW8TlH?RiznxSmiq(*;$SJ6xiB(41TYL`7IL9u!A$y8m6bfB&Z;@qQS~>z#K! z$vavtSL@YfQ#WDuM6LF^Nf)a9wlhQl%%WyWVw3}jgIy0vbgrsZNy1%EL(+F^Ey}^J zuCZBK7Et(c1LyTkoQf}C1Ok9(H=4K20P%489VplS{guB+1oZxEkL=0N#Ho^%(i%-G zUq1slbehh8k#-{^z*CaS!x`|+Tlo3k)E|F5Wo>*ybhTQgG2Y(ZZg;yPLz}(=oC}h3 z<-IsJ#t3s{?&Z~0?EBsQ?WXIynABz})0j1&q#6|nO^fB!F|p)ZutK;_Ry%6td^xo} z6u!n`YN5ooNXq@)u)T@7^G>TLAN=Iv$y0d5BOdYFp&Z$FIiLHsoyI87PepVb$2}w1 zZHK-~aTJMQ$_NZbU>*$|nmIt=%IXT9U82ZLWt!FM>WN=0`eA(g*4^KkNM5wdr_Y`~ zd-h_rS|ZrP{q5_wZ(hHi%x&*9GUhy{{4k{9L}dt1PG4p=j&XW2^K9_t1n+&>>rZrL zD#`4vS{ChQvyCwUz(iq&eti4pEg}`s#w_@8h^VHj2Ir}Ve27j=d(2Xjd>9cbBB7#z z&6+hTZHVt23hF}f8Zi(mVn#TEX5p#ZDzC=lnR1Q;V=<0^Hr*O~XN5*A@1ebKdQ?MSfd2UooaD@1KaA#JT0uJ-PRu z%H%NTi1NvV#jI!1a{j!r@WtbD+rcz z?6%rZs^Poa$vvp+_VhCLJIT=u7`

      }R;Dc2O;tez|Vuo>{YU&B9eKI9~XA!K;OH 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�dWe=o$db!D1U0M5#%q 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%0A60!=6zjEq|v%flwj^=Bju~tukUr;n|D6` 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 diff --git a/docs/examples/video-overlay/example-bounds.md b/docs/examples/video-overlay/example-bounds.md index 1413517274d..259de204780 100644 --- a/docs/examples/video-overlay/example-bounds.md +++ b/docs/examples/video-overlay/example-bounds.md @@ -5,12 +5,12 @@ title: Video Overlay Tutorial - diff --git a/docs/examples/video-overlay/example-nocontrols.md b/docs/examples/video-overlay/example-nocontrols.md index 58adce6bf44..0836788c224 100644 --- a/docs/examples/video-overlay/example-nocontrols.md +++ b/docs/examples/video-overlay/example-nocontrols.md @@ -5,12 +5,12 @@ title: Video Overlay Tutorial - diff --git a/docs/examples/video-overlay/example.md b/docs/examples/video-overlay/example.md index 4494a7b2705..c8d6e7592fb 100644 --- a/docs/examples/video-overlay/example.md +++ b/docs/examples/video-overlay/example.md @@ -5,12 +5,12 @@ title: Video Overlay Tutorial - diff --git a/docs/examples/video-overlay/index.md b/docs/examples/video-overlay/index.md index b9610a6a3a3..f52338213c6 100644 --- a/docs/examples/video-overlay/index.md +++ b/docs/examples/video-overlay/index.md @@ -29,8 +29,8 @@ First of all, create a Leaflet map and add a background `L.TileLayer` in the usu var map = L.map('map').setView([37.8, -96], 4); - L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=' + mapboxAccessToken, { - id: 'mapbox.satellite', + L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=' + mapboxAccessToken, { + id: 'mapbox/satellite-v9', attribution: ... }).addTo(map); @@ -106,7 +106,7 @@ This allows us to build custom interfaces. For example, we can build a small sub var MyPlayControl = L.Control.extend({ onAdd: function() { var button = L.DomUtil.create('button'); - button.innerHTML = '⏵'; + button.innerHTML = '▶️'; L.DomEvent.on(button, 'click', function () { videoOverlay.getElement().play(); }); From 7882015ee883b394f6c4de69b10fed39c1f5d4db Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 29 Nov 2019 10:04:40 +0200 Subject: [PATCH 014/306] fix typo in choropleth example --- docs/examples/choropleth/example.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/choropleth/example.md b/docs/examples/choropleth/example.md index d335d1d501e..88db7da6e0f 100644 --- a/docs/examples/choropleth/example.md +++ b/docs/examples/choropleth/example.md @@ -43,7 +43,7 @@ css: "#map { attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox/'light-v9' + id: 'mapbox/light-v9' }).addTo(map); From 1a09806d133ec7876c035e4a28ddbd33a2549162 Mon Sep 17 00:00:00 2001 From: Sucipta <4288123+chipta@users.noreply.github.com> Date: Fri, 29 Nov 2019 17:59:38 +0800 Subject: [PATCH 015/306] Fix canvas renderer not fully clearing the canvas due to transformation (#6915) --- src/layer/vector/Canvas.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 280f7fef579..ce6d3b4c6ff 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -236,7 +236,10 @@ export var Canvas = Renderer.extend({ var size = bounds.getSize(); this._ctx.clearRect(bounds.min.x, bounds.min.y, size.x, size.y); } else { + this._ctx.save(); + this._ctx.setTransform(1, 0, 0, 1, 0, 0); this._ctx.clearRect(0, 0, this._container.width, this._container.height); + this._ctx.restore(); } }, From 87331081380caa971753e629cd3589b86b760bcc Mon Sep 17 00:00:00 2001 From: Dan Swick Date: Mon, 2 Dec 2019 04:49:16 -0500 Subject: [PATCH 016/306] update mapbox attribution URL (#6922) --- docs/examples/quick-start/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/quick-start/index.md b/docs/examples/quick-start/index.md index b9a247a0b2b..5e8964be396 100644 --- a/docs/examples/quick-start/index.md +++ b/docs/examples/quick-start/index.md @@ -63,7 +63,7 @@ Make sure all the code is called after the `div` and `leaflet.js` inclusion. Tha It's worth noting that Leaflet is provider-agnostic, meaning that it doesn't enforce a particular choice of providers for tiles. You can try replacing `mapbox/streets-v11` with `mapbox/satellite-v9`, and see what happens. Also, Leaflet doesn't even contain a single provider-specific line of code, so you're free to use other providers if you need to (we'd suggest Mapbox though, it looks beautiful). -Whenever using anything based on OpenStreetMap, an *attribution* is obligatory as per the [copyright notice](https://www.openstreetmap.org/copyright). Most other tile providers (such as [Mapbox](https://docs.mapbox.com/help/how-attribution-works/), [Stamen](http://maps.stamen.com/) or [Thunderforest](https://www.thunderforest.com/terms/)) require an attribution as well. Make sure to give credit where credit is due. +Whenever using anything based on OpenStreetMap, an *attribution* is obligatory as per the [copyright notice](https://www.openstreetmap.org/copyright). Most other tile providers (such as [Mapbox](https://docs.mapbox.com/help/how-mapbox-works/attribution/), [Stamen](http://maps.stamen.com/) or [Thunderforest](https://www.thunderforest.com/terms/)) require an attribution as well. Make sure to give credit where credit is due. ### Markers, circles and polygons From 6c5eece356ed9c029202ae001e82666e1dd093c3 Mon Sep 17 00:00:00 2001 From: vladimir Date: Mon, 2 Dec 2019 12:50:54 +0300 Subject: [PATCH 017/306] Fix addLatLng method comment for documentation. (#6924) --- src/layer/vector/Polyline.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index bb03520c7b5..6f2d90c5bc6 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -160,7 +160,7 @@ export var Polyline = Path.extend({ return this._bounds; }, - // @method addLatLng(latlng: LatLng, latlngs? LatLng[]): this + // @method addLatLng(latlng: LatLng, latlngs?: LatLng[]): this // Adds a given point to the polyline. By default, adds to the first ring of // the polyline in case of a multi-polyline, but can be overridden by passing // a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)). From 472407cd2ec8a5f05f0ea0e060c0e41b61778c57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20P=C3=A9rez?= Date: Fri, 6 Dec 2019 23:18:43 +0100 Subject: [PATCH 018/306] Support for passive events is not actually checked (#6930) The `passiveEvents` variable was always a truthy value since it holds a reference to the function, instead of it being self-invokated and thus getting its result. --- src/core/Browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Browser.js b/src/core/Browser.js index 669a1ecdfe9..8b591e34a17 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -130,7 +130,7 @@ export var passiveEvents = (function () { // Errors can safely be ignored since this is only a browser support test. } return supportsPassiveOption; -}); +}()); // @property canvas: Boolean // `true` when the browser supports [``](https://developer.mozilla.org/docs/Web/API/Canvas_API). From 52d54846cc4be1de188dd662ba27d230b17d2645 Mon Sep 17 00:00:00 2001 From: Seth Lutske <52637023+slutske22@users.noreply.github.com> Date: Thu, 12 Dec 2019 02:07:16 -0800 Subject: [PATCH 019/306] Plugins: add leaflet-arrowhead (#6918) --- docs/plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index b549aa319da..4b5e4d7aa39 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1270,6 +1270,15 @@ These plugins provide new markers or news ways of converting abstract data into Benjamin Becquet + + + Leaflet-arrowheads + + Allows user to quickly draw arrowheads on polylines for vector visualization. + + Slutske22 + + Leaflet.Sprite From 214cd3e368e05274e9f2dba6516d30363d9168a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 12 Dec 2019 11:48:52 +0100 Subject: [PATCH 020/306] CRS.simple tutorial: Link to waybackmachine snapshot of UQM tool --- docs/examples/crs-simple/crs-simple.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/crs-simple/crs-simple.md b/docs/examples/crs-simple/crs-simple.md index b656da98f07..3f48b5cff5b 100644 --- a/docs/examples/crs-simple/crs-simple.md +++ b/docs/examples/crs-simple/crs-simple.md @@ -14,7 +14,7 @@ iframe { Sometimes, maps do not represent things on the surface of the earth and, as such, do not have a concept of geographical latitude and geographical longitude. Most times this refers to big scanned images, such as game maps. -For this tutorial we've picked a starmap from Star Control II, a game that is now available as the [open-source project The Ur-Quan Masters](https://en.wikipedia.org/wiki/Star_Control_II#The_Ur-Quan_Masters). These maps were made with a [tool to read the open-source data files](http://www.highprogrammer.com/alan/games/video/uqm/index.html) of the game, and look like this: +For this tutorial we've picked a starmap from Star Control II, a game that is now available as the [open-source project The Ur-Quan Masters](https://en.wikipedia.org/wiki/Star_Control_II#The_Ur-Quan_Masters). These maps were made with a [tool to read the open-source data files](http://www.highprogrammer.com/alan/games/video/uqm/index.html) of the game (webpage seems to have been taken down, see the [archived version](https://web.archive.org/web/20171112052528/https://www.highprogrammer.com/alan/games/video/uqm/index.html)), and look like this:

      From c8a6f4ca2f1d4cb664ce1dcdaa42a4f024bcbaf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Vin=C3=ADcius=20de=20Carvalho?= Date: Thu, 12 Dec 2019 07:53:04 -0300 Subject: [PATCH 021/306] Plugins: add Leaflet.SegmentEdit (#6884) --- docs/plugins.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/plugins.md b/docs/plugins.md index 4b5e4d7aa39..b33b15cf78e 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2307,7 +2307,6 @@ Allows users to create, draw, edit and/or delete points, lines and polygons. Nathan Mahdavi - Leaflet.Editable.Polyline @@ -2438,7 +2437,7 @@ Allows users to create, draw, edit and/or delete points, lines and polygons. Justin Manley - + Leaflet.Pin @@ -2447,7 +2446,7 @@ Allows users to create, draw, edit and/or delete points, lines and polygons. Konrad Klimczak - + L.Control.PaintPolygon @@ -2465,6 +2464,15 @@ Allows users to create, draw, edit and/or delete points, lines and polygons. Sagarpreet Chadha + + + Leaflet.SegmentEdit + + An extension to Leaflet.draw to allow editing large polylines one chunk at the time. + + Lemaf + + From 64a98645bbe48803558bcad610c4cd2de643bcc9 Mon Sep 17 00:00:00 2001 From: Marcin Date: Thu, 12 Dec 2019 11:54:15 +0100 Subject: [PATCH 022/306] Plugins: Added Leaflet.Rainviewer (#6854) --- docs/plugins.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index b33b15cf78e..da147d582a6 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1204,6 +1204,18 @@ Load overlay data from third-party-services. See also [basemap providers](#basem Public Lab + + + Leaflet.Rainviewer + + + + Plugin for RainViewer radar data API Demo. + + + Marcin Wasilewski + + From 84bc05bbb6e4acc41e6f89ff7421dd7c6520d256 Mon Sep 17 00:00:00 2001 From: Florian Pigorsch Date: Thu, 12 Dec 2019 11:56:08 +0100 Subject: [PATCH 023/306] Fix some spelling errors (mostly in the docs). (#6850) --- CHANGELOG.md | 4 +- .../_posts/2012-07-30-leaflet-0-4-released.md | 14 +- ...-0-4-5-bugfix-release-and-plans-for-0.5.md | 4 +- .../_posts/2013-01-17-leaflet-0-5-released.md | 2 +- docs/_posts/2013-02-20-guest-post-draw.md | 2 +- ...8-leaflet-0-7-released-plans-for-future.md | 4 +- .../2015-09-01-leaflet-0.7.4-released.md | 2 +- docs/plugins.md | 4 +- docs/reference-0.7.7.html | 2 +- docs/reference-1.0.0.html | 216 +++++++++--------- docs/reference-1.0.2.html | 216 +++++++++--------- docs/reference-1.0.3.html | 216 +++++++++--------- docs/reference-1.1.0.html | 212 ++++++++--------- docs/reference-1.2.0.html | 120 +++++----- docs/reference-1.3.0.html | 18 +- docs/reference-1.3.2.html | 16 +- docs/reference-1.3.4.html | 16 +- docs/reference-1.4.0.html | 16 +- docs/reference-1.5.0.html | 16 +- src/core/Events.leafdoc | 6 +- src/geo/LatLngBounds.js | 2 +- src/geo/crs/CRS.js | 2 +- src/geo/projection/index.js | 2 +- src/geometry/Bounds.js | 2 +- src/geometry/Point.js | 2 +- 25 files changed, 558 insertions(+), 558 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb22a2a6512..f9308f698f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -835,7 +835,7 @@ Animation code in Leaflet had undergone a major rewrite (main PR: [#2382](https: * Fixed `Map` `panInsideBounds` to accept array-form bounds (by [@RLRR](https://github.com/RLRR)). [#3489](https://github.com/Leaflet/Leaflet/pull/3489) * Fixed marker draggable state to persist when removing and adding back to the map (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3488](https://github.com/Leaflet/Leaflet/pull/3488) * Fixed inertia not working when parallel to axis (by [@rikvanmechelen](https://github.com/rikvanmechelen)). [#3432](https://github.com/Leaflet/Leaflet/issues/3432) -* Fixed images and SVG inside popups having max-width property overriden (by [@yohanboniface](https://github.com/yohanboniface)). [#3452](https://github.com/Leaflet/Leaflet/pull/3452) +* Fixed images and SVG inside popups having max-width property overridden (by [@yohanboniface](https://github.com/yohanboniface)). [#3452](https://github.com/Leaflet/Leaflet/pull/3452) * Fixed cursors when dragging is disabled (by [@juliensoret](https://github.com/juliensoret)). [#3219](https://github.com/Leaflet/Leaflet/issues/3219) [#3233](https://github.com/Leaflet/Leaflet/pull/3233) * Fixed `LatLng` `wrap` to not drop altitude (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3420](https://github.com/Leaflet/Leaflet/issues/3420) * Fixed Firefox for Android not being detected as mobile (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3419](https://github.com/Leaflet/Leaflet/pull/3419) @@ -1133,7 +1133,7 @@ Note tha we skipped 0.7.6 version for which we accidentally published a broken b ### Dev Workflow improvements -* Leaflet builds (*.js files in the `dist` folder) were removed from the repo and are now done automatically on each commit for `master` and `stable` branches by [Travis CI](travis-ci.org/Leaflet/Leaflet). The download links are on the [Leafet download page](http://leafletjs.com/download.html). +* Leaflet builds (*.js files in the `dist` folder) were removed from the repo and are now done automatically on each commit for `master` and `stable` branches by [Travis CI](travis-ci.org/Leaflet/Leaflet). The download links are on the [Leaflet download page](http://leafletjs.com/download.html). ## 0.6.2 (2013-06-28) diff --git a/docs/_posts/2012-07-30-leaflet-0-4-released.md b/docs/_posts/2012-07-30-leaflet-0-4-released.md index 18ab66e1d7d..a5f2e711bac 100644 --- a/docs/_posts/2012-07-30-leaflet-0-4-released.md +++ b/docs/_posts/2012-07-30-leaflet-0-4-released.md @@ -91,7 +91,7 @@ Rectangle is a convenient shortcut for creating rectangular area layers. You cou #### Icon API -[Icon][] API was improved to be simpler and more flexible, and the changes are not backwards-compatible too (the old code can be updated very quickly though). Check out the updated [Custom Icons tutorial](../../../examples/custom-icons.html), or head straigt to the [API docs](../../../reference.html#icon). +[Icon][] API was improved to be simpler and more flexible, and the changes are not backwards-compatible too (the old code can be updated very quickly though). Check out the updated [Custom Icons tutorial](../../../examples/custom-icons.html), or head straight to the [API docs](../../../reference.html#icon). #### Control API @@ -99,7 +99,7 @@ Custom Controls are much easier to create now --- checkout the [API docs](../../ #### Better Events API -[Aaron King][] brough some improvements to [event methods](../../../reference.html#events). `on` and `off` methods can now accept multiple event types at once as a string space-separated types: +[Aaron King][] brought some improvements to [event methods](../../../reference.html#events). `on` and `off` methods can now accept multiple event types at once as a string space-separated types: map.on('click dblclick moveend', doStuff); @@ -127,7 +127,7 @@ You may think that Leaflet is unbelievably fast already, but this version brings * Box shadows on controls were replaced with simple borders on mobile devices to improve performance. * Vector layers won't flicker after each panning on iOS now. -In addition, there are several usability improvents not already mentioned: +In addition, there are several usability improvements not already mentioned: * Panning now works even if there are markers under the cursor (helps on crowded maps). * Popup appearance is slightly improved. @@ -143,11 +143,11 @@ Here's [a full list of bugfixes](https://github.com/Leaflet/Leaflet/blob/master/ Besides the GeoJSON and Icon changes mentioned above, here's a [list of potentially breaking changes](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md#other-breaking-api-changes) --- read it carefully when updating your code (shouldn't take much time though). -Download options for Leaflet 0.4 (including the actual download, the CDN-hosted version, and intructions for building manually) are listed on the [download page](../../../download.html). +Download options for Leaflet 0.4 (including the actual download, the CDN-hosted version, and instructions for building manually) are listed on the [download page](../../../download.html). ### Code Stats -I'm still commited to keeping Leaflet as small and lightweight as possible. Here's a breakdown of the current size of the library: +I'm still committed to keeping Leaflet as small and lightweight as possible. Here's a breakdown of the current size of the library: * JavaScript: **27 KB** minified and gzipped (102 KB minified, 176 KB in source, 7578 lines of code) * CSS: **1.8 KB** gzipped (8 KB, 377 lines of code) @@ -155,7 +155,7 @@ I'm still commited to keeping Leaflet as small and lightweight as possible. Here ### Documentation Update -Until now, Leaflet API reference was incomplete. But for this release, enourmous effort was put into making it 100% complete, up-to-date and generally the best API reference page you've ever seen. All remaining classes, methods, options, events and properties were carefully documented and more code examples added, and the docs will always be kept up-to-date from now on. +Until now, Leaflet API reference was incomplete. But for this release, enormous effort was put into making it 100% complete, up-to-date and generally the best API reference page you've ever seen. All remaining classes, methods, options, events and properties were carefully documented and more code examples added, and the docs will always be kept up-to-date from now on. Besides, the design of the page was significantly improved --- with better colors, font, spacing, hyphenation, manually adjusted column widths, etc. --- lots of detail to make it beautiful and easy to read. @@ -181,7 +181,7 @@ Since the previous release, Leaflet got adopted by many great companies, includi ### Thank You -I'd like to thank all the awesome people that helped Leaflet becoming what it is now --- contributed code, reported bugs, used Leaflet on their websites, told collegues about it, talked about it on conferences, etc. Keep up the great work! +I'd like to thank all the awesome people that helped Leaflet becoming what it is now --- contributed code, reported bugs, used Leaflet on their websites, told colleagues about it, talked about it on conferences, etc. Keep up the great work! Special thanks go to [Dave Leaver][] for his inspiring contributions including improved zoom animation and the state-of-the-art clustering plugin, and [Jason Sanford][] for his friendly support (and setting up the Leaflet CDN among other things). diff --git a/docs/_posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md b/docs/_posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md index d5ea237ed50..13d21789482 100644 --- a/docs/_posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md +++ b/docs/_posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md @@ -8,7 +8,7 @@ authorsite: http://agafonkin.com/en ### 0.4.5 release -While we contrinue working on the next major release (0.5), today we decided to release **Leaflet 0.4.5**. It contains only one small but important bugfix for **wonky zoom animation** on upcoming **Chrome 23** (currently in beta and to be released in a couple of weeks) and **Internet Explorer 10** (that will eventually hit Windows 7 in addition to Windows 8). +While we continue working on the next major release (0.5), today we decided to release **Leaflet 0.4.5**. It contains only one small but important bugfix for **wonky zoom animation** on upcoming **Chrome 23** (currently in beta and to be released in a couple of weeks) and **Internet Explorer 10** (that will eventually hit Windows 7 in addition to Windows 8). Everyone is encouraged to upgrade (before Chrome 23 turns stable). As always, you can find CDN links and downloads for the new release on the [download page](../../../download.html). @@ -20,7 +20,7 @@ Highlights of things already implemented in the `master` branch include touch in We're also in the process of a major refactoring of vector rendering code to allow much simpler extension of base functionality with custom shapes, additional rendering systems (like WebGL in addition to existing SVG/VML and Canvas renderers), easy switching between renderers, also making the code simpler and easier to understand. -The same goes for projection-related code to make using Leaflet with non-standard projections easier, inluding plain projections for game and indoor maps. Thanks to these changes, in addition to making advanced GIS folks happier, we'll see much more awesome Leaflet projects like [interactive Skyrim map on IGN](http://www.ign.com/wikis/the-elder-scrolls-5-skyrim/interactive-maps/Skyrim) or [World of Warcraft map on Wowhead](http://www.wowhead.com/map). +The same goes for projection-related code to make using Leaflet with non-standard projections easier, including plain projections for game and indoor maps. Thanks to these changes, in addition to making advanced GIS folks happier, we'll see much more awesome Leaflet projects like [interactive Skyrim map on IGN](http://www.ign.com/wikis/the-elder-scrolls-5-skyrim/interactive-maps/Skyrim) or [World of Warcraft map on Wowhead](http://www.wowhead.com/map). Another important task for upcoming weeks is working more closely with plugin developers. In particular, one of the areas of focus will be the [Leaflet.draw](https://github.com/jacobtoye/Leaflet.draw) plugin that will soon become a state-of-the-art map vector drawing/editing solution, just as Dave's [Leaflet.markercluster](https://github.com/danzel/Leaflet.markercluster) became the best marker clustering solution among all mapping platforms out there. diff --git a/docs/_posts/2013-01-17-leaflet-0-5-released.md b/docs/_posts/2013-01-17-leaflet-0-5-released.md index c9630db2915..b98f80a9252 100644 --- a/docs/_posts/2013-01-17-leaflet-0-5-released.md +++ b/docs/_posts/2013-01-17-leaflet-0-5-released.md @@ -12,7 +12,7 @@ Rejoice, everyone — after 4.5 months of development with [26 contributors As always, you can find CDN links and downloads for the new release on the [download page](../../../download.html). -The huge detailed list of changes is documented in the [changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md). Be sure to read the "Breaking Changes" part of it before upgrading to avoid any issues! The [API reference](../../../reference.html) was updated to accomodate all the changes too. +The huge detailed list of changes is documented in the [changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md). Be sure to read the "Breaking Changes" part of it before upgrading to avoid any issues! The [API reference](../../../reference.html) was updated to accommodate all the changes too. In other news, [Leaflet repository](https://github.com/Leaflet/Leaflet) has moved to [its own GitHub organization](https://github.com/Leaflet), along with the two of the most important plugins — [Leaflet.markercluster](https://github.com/Leaflet/Leaflet.markercluster) and [Leaflet.draw](https://github.com/Leaflet/Leaflet.draw). As some of you have noticed, this is one of the clues to a really nice upcoming announcement about Leaflet future — stay tuned. :) diff --git a/docs/_posts/2013-02-20-guest-post-draw.md b/docs/_posts/2013-02-20-guest-post-draw.md index 75c50787ab4..56fd0554421 100644 --- a/docs/_posts/2013-02-20-guest-post-draw.md +++ b/docs/_posts/2013-02-20-guest-post-draw.md @@ -12,7 +12,7 @@ _This is a guest post from Jacob Toye, an active Leaflet contributor and also th Upon release the immediate response from the Leaflet community was very positive. It became clear that the next step would be progressing this tool to a state where users could edit and delete shapes in addition to creating them. This is ultimately what Leaflet.draw 0.2 set out to do. -After a few months of off and on development, with most of this spare time kindy sponsored by my employer Smartrak, we proudly present Leaflet.draw 0.2 -- your one stop plugin for drawing, editing and deleting vectors and markers on Leaflet maps. :) +After a few months of off and on development, with most of this spare time kindly sponsored by my employer Smartrak, we proudly present Leaflet.draw 0.2 -- your one stop plugin for drawing, editing and deleting vectors and markers on Leaflet maps. :) _Note from Vladimir: the polyline/polygon editing functionality from Leaflet core has been moved into this plugin where it fits much better. The plugin in turn has moved into [Leaflet organization on GitHub](https://github.com/Leaflet) and is now officially supported by the Leaflet development team. Note that version 0.2 currently depends on Leaflet master (in-progress development version) to work._ diff --git a/docs/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md b/docs/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md index 96b5d2a4d93..6ba784e4937 100644 --- a/docs/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md +++ b/docs/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md @@ -23,7 +23,7 @@ For Leaflet, this can only mean very good things — much more time on Leafl You can check out the [detailed changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md#07-dev-master) of what's already done over the recent months for 0.7 (about 90 improvements and bugfixes), but I'd like to mention some highlights: * Added the ability to **upscale tiles** to higher zoom levels (e.g. have zoom 19-20 when the source has 18 max). -* Added support for **IE11 touch devices**. MS unexpectedly broke their pointer API compatibility between Developer Preview and final IE11 release, and we eventually rewrote quite a bit of code to make everything work smoothly across all IE versions (both dekstop & mobile), fixing a bunch of IE10 bugs along the way as well. +* Added support for **IE11 touch devices**. MS unexpectedly broke their pointer API compatibility between Developer Preview and final IE11 release, and we eventually rewrote quite a bit of code to make everything work smoothly across all IE versions (both desktop & mobile), fixing a bunch of IE10 bugs along the way as well. * Officially **dropped IE6 support** (nobody cares anyway) and cleaned up/fixed IE7-8 styles. * Dropped the need for **IE conditional comment** when including Leaflet, making the snippet much simpler — all IE7/8-specific styles got simplified and moved to the main `leaflet.css` file. * Fixed an **obscure iOS7 memory leak** that crashed Safari when you tried to create several thousands of layers (e.g. markers for clustering). I still don't understand why it happens, but we managed to fix it with a bit of trickery. @@ -46,7 +46,7 @@ While it's an ambitious plan and it may take more than one stable release, finis Another direction I'd like to focus on after releasing 0.7 is **website and documentation improvements**. First, Leaflet is begging for **more step-by-step tutorials** (with more advanced features like custom layers, custom controls, etc.), and I'd love to do a docs/tutorials sprint some time in future. Second, the presentation could be significantly improved — adding a prominent visual **showcase** or app gallery, making Leaflet users more prominent with some logos and quotes/testimonials, and updating the layout/design for a more stylish, clean look, etc. -Hope that gives a good glimpse of the stuff to expect from Leafet in near future, and don't hesitate to ask any questions in comments — I'll be happy to answer! +Hope that gives a good glimpse of the stuff to expect from Leaflet in near future, and don't hesitate to ask any questions in comments — I'll be happy to answer! Grab the CDN links or downloads for the new release on the [download page](../../../download.html) as always. Be sure to try it out on your apps and report any regressions so that we can patch them up immediately. And lets make some nice Twitter buzz about the release as usual! diff --git a/docs/_posts/2015-09-01-leaflet-0.7.4-released.md b/docs/_posts/2015-09-01-leaflet-0.7.4-released.md index 87403701840..f043b49f04a 100644 --- a/docs/_posts/2015-09-01-leaflet-0.7.4-released.md +++ b/docs/_posts/2015-09-01-leaflet-0.7.4-released.md @@ -21,7 +21,7 @@ The 0.7.x releases will not implement new features. Stay tuned for more news on ### Get the update -Developers using Leaflet 0.7.3 are advised to upgrade to 0.7.5 to prevent problems arising from modern browers. +Developers using Leaflet 0.7.3 are advised to upgrade to 0.7.5 to prevent problems arising from modern browsers. The release is also available through NPM, Bower, [direct download](http://cdn.leafletjs.com/downloads/leaflet-0.7.5.zip), or through our CDN: diff --git a/docs/plugins.md b/docs/plugins.md index da147d582a6..e1c2e0f593e 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2217,7 +2217,7 @@ Powerful multi-purpose libraries for data visualization. leaflet.migrationLayer - leafet.migrationLayer is used to show migration data such as population, flight, vehicle, traffic and so on. Data visualization on map.demo + leaflet.migrationLayer is used to show migration data such as population, flight, vehicle, traffic and so on. Data visualization on map.demo Sylvenas @@ -2921,7 +2921,7 @@ The following plugins enhance or extend `L.Control.Layers`. - Leafet.LayerTreePlugin + Leaflet.LayerTreePlugin Leaflet control allows to switch layers on and off, display them in a tree-like way (demo). diff --git a/docs/reference-0.7.7.html b/docs/reference-0.7.7.html index 84f131a5af9..a84c6743d0e 100644 --- a/docs/reference-0.7.7.html +++ b/docs/reference-0.7.7.html @@ -6131,7 +6131,7 @@

      Methods

      HTMLElement - Should contain code that creates all the neccessary DOM elements for the control, adds listeners on relevant map events, and returns the element containing the control. Called on map.addControl(control) or control.addTo(map). + Should contain code that creates all the necessary DOM elements for the control, adds listeners on relevant map events, and returns the element containing the control. Called on map.addControl(control) or control.addTo(map). onRemove( diff --git a/docs/reference-1.0.0.html b/docs/reference-1.0.0.html index ff3b1a923e4..8e48f4c7718 100644 --- a/docs/reference-1.0.0.html +++ b/docs/reference-1.0.0.html @@ -1703,7 +1703,7 @@

      Locate options

      watch Boolean false - If true, starts continous watching of location changes (instead of detecting it + If true, starts continuous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. @@ -2474,7 +2474,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -2487,7 +2487,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -2545,7 +2545,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -2558,7 +2558,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -3174,7 +3174,7 @@ bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3187,7 +3187,7 @@ openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -3245,7 +3245,7 @@ bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3258,7 +3258,7 @@ openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -3546,7 +3546,7 @@

      Options

      'auto' Direction where to open the tooltip. Possible values are: right, left, top, bottom, center, auto. -auto will dynamicaly switch between right and left according to the tooltip +auto will dynamically switch between right and left according to the tooltip position on the map. @@ -3730,7 +3730,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3743,7 +3743,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -3801,7 +3801,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3814,7 +3814,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -4426,7 +4426,7 @@

      Methods

      createTile(<Object> coords, <Function> done?) HTMLElement

      Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropiate image URL given coords. The done +to return an <img> HTML element with the appropriate image URL given coords. The done callback is called when the tile has been loaded.

      @@ -4551,7 +4551,7 @@

      Extension methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -4564,7 +4564,7 @@

      Extension methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -4622,7 +4622,7 @@

      Extension methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -4635,7 +4635,7 @@

      Extension methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -5333,7 +5333,7 @@

      Methods

      createTile(<Object> coords, <Function> done?) HTMLElement

      Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropiate image URL given coords. The done +to return an <img> HTML element with the appropriate image URL given coords. The done callback is called when the tile has been loaded.

      @@ -5437,7 +5437,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -5450,7 +5450,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -5508,7 +5508,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -5521,7 +5521,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -6064,7 +6064,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -6077,7 +6077,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -6135,7 +6135,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -6148,7 +6148,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -6732,7 +6732,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -6745,7 +6745,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -6803,7 +6803,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -6816,7 +6816,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -7561,7 +7561,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7574,7 +7574,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -7632,7 +7632,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7645,7 +7645,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -8418,7 +8418,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -8431,7 +8431,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -8489,7 +8489,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -8502,7 +8502,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -9285,7 +9285,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -9298,7 +9298,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -9356,7 +9356,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -9369,7 +9369,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -10105,7 +10105,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -10118,7 +10118,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -10176,7 +10176,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -10189,7 +10189,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -10875,7 +10875,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -10888,7 +10888,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -10946,7 +10946,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -10959,7 +10959,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -11437,7 +11437,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11450,7 +11450,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -11508,7 +11508,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11521,7 +11521,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -12027,7 +12027,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12040,7 +12040,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -12098,7 +12098,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12111,7 +12111,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -12610,7 +12610,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12623,7 +12623,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -12681,7 +12681,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12694,7 +12694,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -13268,7 +13268,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13281,7 +13281,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -13339,7 +13339,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13352,7 +13352,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -14006,7 +14006,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -14019,7 +14019,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -14077,7 +14077,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -14090,7 +14090,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -14786,7 +14786,7 @@

      Extension methods

      createTile(<Object> coords, <Function> done?) HTMLElement -

      Called only internally, must be overriden by classes extending GridLayer. +

      Called only internally, must be overridden by classes extending GridLayer. Returns the HTMLElement corresponding to the given coords. If the done callback is specified, it must be called when the tile has finished loading and drawing.

      @@ -14815,7 +14815,7 @@

      Extension methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -14828,7 +14828,7 @@

      Extension methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -14886,7 +14886,7 @@

      Extension methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -14899,7 +14899,7 @@

      Extension methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -15174,7 +15174,7 @@

      Methods

      equals(<LatLng> otherLatLng, <Number> maxMargin?) Boolean -

      Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overriden by setting maxMargin to a small number.

      +

      Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

      @@ -16064,7 +16064,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -16077,7 +16077,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -16135,7 +16135,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -16148,7 +16148,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -16738,7 +16738,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -16751,7 +16751,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -16809,7 +16809,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -16822,7 +16822,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -17964,7 +17964,7 @@

      Functions

      stamp(<Object> obj) Number - Returns the unique ID of an object, assiging it one if it doesn't have it. + Returns the unique ID of an object, assigning it one if it doesn't have it. throttle(<Function> fn, <Number> time, <Object> context) @@ -18143,7 +18143,7 @@

      Methods

      -

      LineUtil

      Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.

      +

      LineUtil

      Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

      Functions

      @@ -18217,7 +18217,7 @@

      Functions

      Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgeman algorithm). Used by Leaflet to only show polygon points that are on the screen or near, increasing performance. Note that polygon points needs different algorithm for clipping -than polyline, so there's a seperate method for it. +than polyline, so there's a separate method for it. @@ -19574,7 +19574,7 @@

      Popup methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -19587,7 +19587,7 @@

      Popup methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -19643,7 +19643,7 @@

      Tooltip methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -19656,7 +19656,7 @@

      Tooltip methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -20133,7 +20133,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20146,7 +20146,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -20204,7 +20204,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20217,7 +20217,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -21079,7 +21079,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -21092,7 +21092,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -21150,7 +21150,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -21163,7 +21163,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -21441,17 +21441,17 @@

      MouseEvent

      latlng LatLng - The geographical point where the mouse event occured. + The geographical point where the mouse event occurred. layerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map layer. + Pixel coordinates of the point where the mouse event occurred relative to the map layer. containerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. originalEvent @@ -22423,7 +22423,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -22436,7 +22436,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -22494,7 +22494,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -22507,7 +22507,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      diff --git a/docs/reference-1.0.2.html b/docs/reference-1.0.2.html index 0269db23473..27b6eef6f1f 100644 --- a/docs/reference-1.0.2.html +++ b/docs/reference-1.0.2.html @@ -1705,7 +1705,7 @@

      Locate options

      watch Boolean false - If true, starts continous watching of location changes (instead of detecting it + If true, starts continuous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. @@ -2561,7 +2561,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -2574,7 +2574,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -2632,7 +2632,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -2645,7 +2645,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -3295,7 +3295,7 @@ bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3308,7 +3308,7 @@ openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -3366,7 +3366,7 @@ bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3379,7 +3379,7 @@ openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -3622,7 +3622,7 @@

      Options

      'auto' Direction where to open the tooltip. Possible values are: right, left, top, bottom, center, auto. -auto will dynamicaly switch between right and left according to the tooltip +auto will dynamically switch between right and left according to the tooltip position on the map. @@ -3885,7 +3885,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3898,7 +3898,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -3956,7 +3956,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3969,7 +3969,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -4566,7 +4566,7 @@

      Methods

      createTile(<Object> coords, <Function> done?) HTMLElement

      Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropiate image URL given coords. The done +to return an <img> HTML element with the appropriate image URL given coords. The done callback is called when the tile has been loaded.

      @@ -4736,7 +4736,7 @@

      Extension methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -4749,7 +4749,7 @@

      Extension methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -4807,7 +4807,7 @@

      Extension methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -4820,7 +4820,7 @@

      Extension methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -5503,7 +5503,7 @@

      Methods

      createTile(<Object> coords, <Function> done?) HTMLElement

      Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropiate image URL given coords. The done +to return an <img> HTML element with the appropriate image URL given coords. The done callback is called when the tile has been loaded.

      @@ -5652,7 +5652,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -5665,7 +5665,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -5723,7 +5723,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -5736,7 +5736,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -6285,7 +6285,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -6298,7 +6298,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -6356,7 +6356,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -6369,7 +6369,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -6965,7 +6965,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -6978,7 +6978,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -7036,7 +7036,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7049,7 +7049,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -7806,7 +7806,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7819,7 +7819,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -7877,7 +7877,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7890,7 +7890,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -8675,7 +8675,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -8688,7 +8688,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -8746,7 +8746,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -8759,7 +8759,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -9554,7 +9554,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -9567,7 +9567,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -9625,7 +9625,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -9638,7 +9638,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -10386,7 +10386,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -10399,7 +10399,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -10457,7 +10457,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -10470,7 +10470,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -11167,7 +11167,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11180,7 +11180,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -11238,7 +11238,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11251,7 +11251,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -11741,7 +11741,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11754,7 +11754,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -11812,7 +11812,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11825,7 +11825,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -12343,7 +12343,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12356,7 +12356,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -12414,7 +12414,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12427,7 +12427,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -12938,7 +12938,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12951,7 +12951,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -13009,7 +13009,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13022,7 +13022,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -13608,7 +13608,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13621,7 +13621,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -13679,7 +13679,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13692,7 +13692,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -14386,7 +14386,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -14399,7 +14399,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -14457,7 +14457,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -14470,7 +14470,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -15123,7 +15123,7 @@

      Extension methods

      createTile(<Object> coords, <Function> done?) HTMLElement -

      Called only internally, must be overriden by classes extending GridLayer. +

      Called only internally, must be overridden by classes extending GridLayer. Returns the HTMLElement corresponding to the given coords. If the done callback is specified, it must be called when the tile has finished loading and drawing.

      @@ -15203,7 +15203,7 @@

      Extension methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -15216,7 +15216,7 @@

      Extension methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -15274,7 +15274,7 @@

      Extension methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -15287,7 +15287,7 @@

      Extension methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -15517,7 +15517,7 @@

      Methods

      equals(<LatLng> otherLatLng, <Number> maxMargin?) Boolean -

      Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overriden by setting maxMargin to a small number.

      +

      Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

      @@ -16495,7 +16495,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -16508,7 +16508,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -16566,7 +16566,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -16579,7 +16579,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -17183,7 +17183,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -17196,7 +17196,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -17254,7 +17254,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -17267,7 +17267,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -18381,7 +18381,7 @@

      Functions

      stamp(<Object> obj) Number - Returns the unique ID of an object, assiging it one if it doesn't have it. + Returns the unique ID of an object, assigning it one if it doesn't have it. throttle(<Function> fn, <Number> time, <Object> context) @@ -18560,7 +18560,7 @@

      Methods

      -

      LineUtil

      Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.

      +

      LineUtil

      Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

      Functions

      @@ -18634,7 +18634,7 @@

      Functions

      Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgeman algorithm). Used by Leaflet to only show polygon points that are on the screen or near, increasing performance. Note that polygon points needs different algorithm for clipping -than polyline, so there's a seperate method for it. +than polyline, so there's a separate method for it. @@ -20048,7 +20048,7 @@

      Popup methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20061,7 +20061,7 @@

      Popup methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -20117,7 +20117,7 @@

      Tooltip methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20130,7 +20130,7 @@

      Tooltip methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -20574,7 +20574,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20587,7 +20587,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -20645,7 +20645,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20658,7 +20658,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -21537,7 +21537,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -21550,7 +21550,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -21608,7 +21608,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -21621,7 +21621,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -21899,17 +21899,17 @@

      MouseEvent

      latlng LatLng - The geographical point where the mouse event occured. + The geographical point where the mouse event occurred. layerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map layer. + Pixel coordinates of the point where the mouse event occurred relative to the map layer. containerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. originalEvent @@ -22915,7 +22915,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -22928,7 +22928,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -22986,7 +22986,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -22999,7 +22999,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      diff --git a/docs/reference-1.0.3.html b/docs/reference-1.0.3.html index 421b8b946e5..61fdbdc7952 100644 --- a/docs/reference-1.0.3.html +++ b/docs/reference-1.0.3.html @@ -1715,7 +1715,7 @@

      Locate options

      watch Boolean false - If true, starts continous watching of location changes (instead of detecting it + If true, starts continuous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. @@ -2571,7 +2571,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -2584,7 +2584,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -2642,7 +2642,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -2655,7 +2655,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -3305,7 +3305,7 @@ bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3318,7 +3318,7 @@ openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -3376,7 +3376,7 @@ bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3389,7 +3389,7 @@ openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -3632,7 +3632,7 @@

      Options

      'auto' Direction where to open the tooltip. Possible values are: right, left, top, bottom, center, auto. -auto will dynamicaly switch between right and left according to the tooltip +auto will dynamically switch between right and left according to the tooltip position on the map. @@ -3895,7 +3895,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3908,7 +3908,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -3966,7 +3966,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3979,7 +3979,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -4578,7 +4578,7 @@

      Methods

      createTile(<Object> coords, <Function> done?) HTMLElement

      Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropiate image URL given coords. The done +to return an <img> HTML element with the appropriate image URL given coords. The done callback is called when the tile has been loaded.

      @@ -4748,7 +4748,7 @@

      Extension methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -4761,7 +4761,7 @@

      Extension methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -4819,7 +4819,7 @@

      Extension methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -4832,7 +4832,7 @@

      Extension methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -5517,7 +5517,7 @@

      Methods

      createTile(<Object> coords, <Function> done?) HTMLElement

      Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropiate image URL given coords. The done +to return an <img> HTML element with the appropriate image URL given coords. The done callback is called when the tile has been loaded.

      @@ -5666,7 +5666,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -5679,7 +5679,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -5737,7 +5737,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -5750,7 +5750,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -6317,7 +6317,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -6330,7 +6330,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -6388,7 +6388,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -6401,7 +6401,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -6997,7 +6997,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7010,7 +7010,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -7068,7 +7068,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7081,7 +7081,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -7838,7 +7838,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7851,7 +7851,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -7909,7 +7909,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7922,7 +7922,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -8707,7 +8707,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -8720,7 +8720,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -8778,7 +8778,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -8791,7 +8791,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -9586,7 +9586,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -9599,7 +9599,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -9657,7 +9657,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -9670,7 +9670,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -10418,7 +10418,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -10431,7 +10431,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -10489,7 +10489,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -10502,7 +10502,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -11199,7 +11199,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11212,7 +11212,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -11270,7 +11270,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11283,7 +11283,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -11773,7 +11773,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11786,7 +11786,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -11844,7 +11844,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11857,7 +11857,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -12375,7 +12375,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12388,7 +12388,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -12446,7 +12446,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12459,7 +12459,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -12970,7 +12970,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12983,7 +12983,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -13041,7 +13041,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13054,7 +13054,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -13640,7 +13640,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13653,7 +13653,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -13711,7 +13711,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13724,7 +13724,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -14418,7 +14418,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -14431,7 +14431,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -14489,7 +14489,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -14502,7 +14502,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -15157,7 +15157,7 @@

      Extension methods

      createTile(<Object> coords, <Function> done?) HTMLElement -

      Called only internally, must be overriden by classes extending GridLayer. +

      Called only internally, must be overridden by classes extending GridLayer. Returns the HTMLElement corresponding to the given coords. If the done callback is specified, it must be called when the tile has finished loading and drawing.

      @@ -15237,7 +15237,7 @@

      Extension methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -15250,7 +15250,7 @@

      Extension methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -15308,7 +15308,7 @@

      Extension methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -15321,7 +15321,7 @@

      Extension methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -15551,7 +15551,7 @@

      Methods

      equals(<LatLng> otherLatLng, <Number> maxMargin?) Boolean -

      Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overriden by setting maxMargin to a small number.

      +

      Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

      @@ -16529,7 +16529,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -16542,7 +16542,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -16600,7 +16600,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -16613,7 +16613,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -17217,7 +17217,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -17230,7 +17230,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -17288,7 +17288,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -17301,7 +17301,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -18418,7 +18418,7 @@

      Functions

      stamp(<Object> obj) Number - Returns the unique ID of an object, assiging it one if it doesn't have it. + Returns the unique ID of an object, assigning it one if it doesn't have it. throttle(<Function> fn, <Number> time, <Object> context) @@ -18597,7 +18597,7 @@

      Methods

      -

      LineUtil

      Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.

      +

      LineUtil

      Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

      Functions

      @@ -18671,7 +18671,7 @@

      Functions

      Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgeman algorithm). Used by Leaflet to only show polygon points that are on the screen or near, increasing performance. Note that polygon points needs different algorithm for clipping -than polyline, so there's a seperate method for it. +than polyline, so there's a separate method for it. @@ -20085,7 +20085,7 @@

      Popup methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20098,7 +20098,7 @@

      Popup methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -20154,7 +20154,7 @@

      Tooltip methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20167,7 +20167,7 @@

      Tooltip methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -20611,7 +20611,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20624,7 +20624,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -20682,7 +20682,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20695,7 +20695,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -21583,7 +21583,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -21596,7 +21596,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -21654,7 +21654,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -21667,7 +21667,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -21945,17 +21945,17 @@

      MouseEvent

      latlng LatLng - The geographical point where the mouse event occured. + The geographical point where the mouse event occurred. layerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map layer. + Pixel coordinates of the point where the mouse event occurred relative to the map layer. containerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. originalEvent @@ -23029,7 +23029,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -23042,7 +23042,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -23100,7 +23100,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -23113,7 +23113,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      diff --git a/docs/reference-1.1.0.html b/docs/reference-1.1.0.html index 7abf0a70dab..384839396c4 100644 --- a/docs/reference-1.1.0.html +++ b/docs/reference-1.1.0.html @@ -1719,7 +1719,7 @@

      Locate options

      watch Boolean false - If true, starts continous watching of location changes (instead of detecting it + If true, starts continuous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. @@ -2584,7 +2584,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -2597,7 +2597,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -2655,7 +2655,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -2668,7 +2668,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -3318,7 +3318,7 @@ bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3331,7 +3331,7 @@ openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -3389,7 +3389,7 @@ bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3402,7 +3402,7 @@ openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -3645,7 +3645,7 @@

      Options

      'auto' Direction where to open the tooltip. Possible values are: right, left, top, bottom, center, auto. -auto will dynamicaly switch between right and left according to the tooltip +auto will dynamically switch between right and left according to the tooltip position on the map. @@ -3908,7 +3908,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3921,7 +3921,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -3979,7 +3979,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -3992,7 +3992,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -4591,7 +4591,7 @@

      Methods

      createTile(<Object> coords, <Function> done?) HTMLElement

      Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropiate image URL given coords. The done +to return an <img> HTML element with the appropriate image URL given coords. The done callback is called when the tile has been loaded.

      @@ -4761,7 +4761,7 @@

      Extension methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -4774,7 +4774,7 @@

      Extension methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -4832,7 +4832,7 @@

      Extension methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -4845,7 +4845,7 @@

      Extension methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -5530,7 +5530,7 @@

      Methods

      createTile(<Object> coords, <Function> done?) HTMLElement

      Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropiate image URL given coords. The done +to return an <img> HTML element with the appropriate image URL given coords. The done callback is called when the tile has been loaded.

      @@ -5679,7 +5679,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -5692,7 +5692,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -5750,7 +5750,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -5763,7 +5763,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -6403,7 +6403,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -6416,7 +6416,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -6474,7 +6474,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -6487,7 +6487,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -7205,7 +7205,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7218,7 +7218,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -7276,7 +7276,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7289,7 +7289,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -7915,7 +7915,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7928,7 +7928,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -7986,7 +7986,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -7999,7 +7999,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -8763,7 +8763,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -8776,7 +8776,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -8834,7 +8834,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -8847,7 +8847,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -9639,7 +9639,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -9652,7 +9652,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -9710,7 +9710,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -9723,7 +9723,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -10525,7 +10525,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -10538,7 +10538,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -10596,7 +10596,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -10609,7 +10609,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -11364,7 +11364,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11377,7 +11377,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -11435,7 +11435,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -11448,7 +11448,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -12152,7 +12152,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12165,7 +12165,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -12223,7 +12223,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12236,7 +12236,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -12703,7 +12703,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12716,7 +12716,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -12774,7 +12774,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -12787,7 +12787,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -13305,7 +13305,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13318,7 +13318,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -13376,7 +13376,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13389,7 +13389,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -13906,7 +13906,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13919,7 +13919,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -13977,7 +13977,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -13990,7 +13990,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -14582,7 +14582,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -14595,7 +14595,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -14653,7 +14653,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -14666,7 +14666,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -15366,7 +15366,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -15379,7 +15379,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -15437,7 +15437,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -15450,7 +15450,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -16121,7 +16121,7 @@

      Extension methods

      createTile(<Object> coords, <Function> done?) HTMLElement -

      Called only internally, must be overriden by classes extending GridLayer. +

      Called only internally, must be overridden by classes extending GridLayer. Returns the HTMLElement corresponding to the given coords. If the done callback is specified, it must be called when the tile has finished loading and drawing.

      @@ -16201,7 +16201,7 @@

      Extension methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -16214,7 +16214,7 @@

      Extension methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -16272,7 +16272,7 @@

      Extension methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -16285,7 +16285,7 @@

      Extension methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -16515,7 +16515,7 @@

      Methods

      equals(<LatLng> otherLatLng, <Number> maxMargin?) Boolean -

      Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overriden by setting maxMargin to a small number.

      +

      Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

      @@ -16757,7 +16757,7 @@

      Methods

      equals(<LatLngBounds> otherBounds, <Number> maxMargin?) Boolean -

      Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overriden by setting maxMargin to a small number.

      +

      Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting maxMargin to a small number.

      @@ -18510,7 +18510,7 @@

      Functions

      stamp(<Object> obj) Number - Returns the unique ID of an object, assiging it one if it doesn't have it. + Returns the unique ID of an object, assigning it one if it doesn't have it. throttle(<Function> fn, <Number> time, <Object> context) @@ -18675,7 +18675,7 @@

      Creation

      L.transformation(<Array> coefficients) - Expects an coeficients array of the form + Expects an coefficients array of the form [a: Number, b: Number, c: Number, d: Number]. @@ -18717,7 +18717,7 @@

      Methods

      -

      LineUtil

      Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.

      +

      LineUtil

      Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

      Functions

      @@ -18791,7 +18791,7 @@

      Functions

      Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgeman algorithm). Used by Leaflet to only show polygon points that are on the screen or near, increasing performance. Note that polygon points needs different algorithm for clipping -than polyline, so there's a seperate method for it. +than polyline, so there's a separate method for it. @@ -20215,7 +20215,7 @@

      Popup methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20228,7 +20228,7 @@

      Popup methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -20284,7 +20284,7 @@

      Tooltip methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20297,7 +20297,7 @@

      Tooltip methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -20748,7 +20748,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20761,7 +20761,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -20819,7 +20819,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -20832,7 +20832,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -21724,7 +21724,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -21737,7 +21737,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -21795,7 +21795,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -21808,7 +21808,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -22086,17 +22086,17 @@

      MouseEvent

      latlng LatLng - The geographical point where the mouse event occured. + The geographical point where the mouse event occurred. layerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map layer. + Pixel coordinates of the point where the mouse event occurred relative to the map layer. containerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. originalEvent @@ -23170,7 +23170,7 @@

      Methods

      bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?) this

      Binds a popup to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -23183,7 +23183,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -23241,7 +23241,7 @@

      Methods

      bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?) this

      Binds a tooltip to the layer with the passed content and sets up the -neccessary event listeners. If a Function is passed it will receive +necessary event listeners. If a Function is passed it will receive the layer as the first argument and should return a String or HTMLElement.

      @@ -23254,7 +23254,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      diff --git a/docs/reference-1.2.0.html b/docs/reference-1.2.0.html index 911d4205018..fa0fa819e03 100644 --- a/docs/reference-1.2.0.html +++ b/docs/reference-1.2.0.html @@ -1719,7 +1719,7 @@

      Locate options

      watch Boolean false - If true, starts continous watching of location changes (instead of detecting it + If true, starts continuous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. @@ -2597,7 +2597,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -2668,7 +2668,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -3331,7 +3331,7 @@ openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -3402,7 +3402,7 @@ openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -3645,7 +3645,7 @@

      Options

      'auto' Direction where to open the tooltip. Possible values are: right, left, top, bottom, center, auto. -auto will dynamicaly switch between right and left according to the tooltip +auto will dynamically switch between right and left according to the tooltip position on the map. @@ -3921,7 +3921,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -3992,7 +3992,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -4595,7 +4595,7 @@

      Methods

      createTile(<Object> coords, <Function> done?) HTMLElement

      Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropiate image URL given coords. The done +to return an <img> HTML element with the appropriate image URL given coords. The done callback is called when the tile has been loaded.

      @@ -4778,7 +4778,7 @@

      Extension methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -4849,7 +4849,7 @@

      Extension methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -5537,7 +5537,7 @@

      Methods

      createTile(<Object> coords, <Function> done?) HTMLElement

      Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropiate image URL given coords. The done +to return an <img> HTML element with the appropriate image URL given coords. The done callback is called when the tile has been loaded.

      @@ -5699,7 +5699,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -5770,7 +5770,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -6423,7 +6423,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -6494,7 +6494,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -7225,7 +7225,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -7296,7 +7296,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -7935,7 +7935,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -8006,7 +8006,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -8783,7 +8783,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -8854,7 +8854,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -9659,7 +9659,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -9730,7 +9730,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -10545,7 +10545,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -10616,7 +10616,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -11384,7 +11384,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -11455,7 +11455,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -12172,7 +12172,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -12243,7 +12243,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -12723,7 +12723,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -12794,7 +12794,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -13325,7 +13325,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -13396,7 +13396,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -13926,7 +13926,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -13997,7 +13997,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -14602,7 +14602,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -14673,7 +14673,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -15386,7 +15386,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -15457,7 +15457,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -16131,7 +16131,7 @@

      Extension methods

      createTile(<Object> coords, <Function> done?) HTMLElement -

      Called only internally, must be overriden by classes extending GridLayer. +

      Called only internally, must be overridden by classes extending GridLayer. Returns the HTMLElement corresponding to the given coords. If the done callback is specified, it must be called when the tile has finished loading and drawing.

      @@ -16224,7 +16224,7 @@

      Extension methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -16295,7 +16295,7 @@

      Extension methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -16525,7 +16525,7 @@

      Methods

      equals(<LatLng> otherLatLng, <Number> maxMargin?) Boolean -

      Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overriden by setting maxMargin to a small number.

      +

      Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

      @@ -16767,7 +16767,7 @@

      Methods

      equals(<LatLngBounds> otherBounds, <Number> maxMargin?) Boolean -

      Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overriden by setting maxMargin to a small number.

      +

      Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting maxMargin to a small number.

      @@ -18520,7 +18520,7 @@

      Functions

      stamp(<Object> obj) Number - Returns the unique ID of an object, assiging it one if it doesn't have it. + Returns the unique ID of an object, assigning it one if it doesn't have it. throttle(<Function> fn, <Number> time, <Object> context) @@ -18685,7 +18685,7 @@

      Creation

      L.transformation(<Array> coefficients) - Expects an coeficients array of the form + Expects an coefficients array of the form [a: Number, b: Number, c: Number, d: Number]. @@ -18727,7 +18727,7 @@

      Methods

      -

      LineUtil

      Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.

      +

      LineUtil

      Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

      Functions

      @@ -18806,7 +18806,7 @@

      Functions

      Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgeman algorithm). Used by Leaflet to only show polygon points that are on the screen or near, increasing performance. Note that polygon points needs different algorithm for clipping -than polyline, so there's a seperate method for it. +than polyline, so there's a separate method for it. @@ -20243,7 +20243,7 @@

      Popup methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -20312,7 +20312,7 @@

      Tooltip methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -20776,7 +20776,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -20847,7 +20847,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -21752,7 +21752,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -21823,7 +21823,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      @@ -22101,17 +22101,17 @@

      MouseEvent

      latlng LatLng - The geographical point where the mouse event occured. + The geographical point where the mouse event occurred. layerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map layer. + Pixel coordinates of the point where the mouse event occurred relative to the map layer. containerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. originalEvent @@ -23198,7 +23198,7 @@

      Methods

      openPopup(<LatLng> latlng?) this -

      Opens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.

      +

      Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

      @@ -23269,7 +23269,7 @@

      Methods

      openTooltip(<LatLng> latlng?) this -

      Opens the bound tooltip at the specificed latlng or at the default tooltip anchor if no latlng is passed.

      +

      Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

      diff --git a/docs/reference-1.3.0.html b/docs/reference-1.3.0.html index 3442ff76fb4..d7eda573d83 100644 --- a/docs/reference-1.3.0.html +++ b/docs/reference-1.3.0.html @@ -16570,7 +16570,7 @@

      Usage example

      map.panTo({lon: 30, lat: 50}); map.panTo({lat: 50, lng: 30}); map.panTo(L.latLng(50, 30)); -

    Note that LatLng does not inherit from Leafet's Class object, +

    Note that LatLng does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -16717,7 +16717,7 @@

    Usage example

    ]);

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range. -Note that LatLngBounds does not inherit from Leafet's Class object, +Note that LatLngBounds does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -16906,7 +16906,7 @@

    Usage example

    map.panBy([200, 300]);
     map.panBy(L.point(200, 300));
     
    -

    Note that Point does not inherit from Leafet's Class object, +

    Note that Point does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -17108,7 +17108,7 @@

    Usage example

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    otherBounds.intersects([[10, 10], [40, 60]]);
     
    -

    Note that Bounds does not inherit from Leafet's Class object, +

    Note that Bounds does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -21377,7 +21377,7 @@

    Methods

    LatLng

    The inverse of project. Projects a 2D point into a geographical location. Only accepts actual L.Point instances, not arrays. -Note that the projection instances do not inherit from Leafet's Class object, +Note that the projection instances do not inherit from Leaflet's Class object, and can't be instantiated. Also, new classes can't inherit from them, and methods can't be added to them with the include function.

    @@ -21637,7 +21637,7 @@

    Defined CRSs

    Leaflet defines the most usual CRSs by default. If you want to use a CRS not defined by default, take a look at the Proj4Leaflet plugin. -Note that the CRS instances do not inherit from Leafet's Class object, +Note that the CRS instances do not inherit from Leaflet's Class object, and can't be instantiated. Also, new classes can't inherit from them, and methods can't be added to them with the include function. @@ -22315,17 +22315,17 @@

    MouseEvent

    latlng LatLng - The geographical point where the mouse event occured. + The geographical point where the mouse event occurred. layerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map layer. + Pixel coordinates of the point where the mouse event occurred relative to the map layer. containerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. originalEvent diff --git a/docs/reference-1.3.2.html b/docs/reference-1.3.2.html index 0299016d9df..f6a074c6f34 100644 --- a/docs/reference-1.3.2.html +++ b/docs/reference-1.3.2.html @@ -16725,7 +16725,7 @@

    Usage example

    ]);

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range. -Note that LatLngBounds does not inherit from Leafet's Class object, +Note that LatLngBounds does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -16914,7 +16914,7 @@

    Usage example

    map.panBy([200, 300]);
     map.panBy(L.point(200, 300));
     
    -

    Note that Point does not inherit from Leafet's Class object, +

    Note that Point does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -17116,7 +17116,7 @@

    Usage example

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    otherBounds.intersects([[10, 10], [40, 60]]);
     
    -

    Note that Bounds does not inherit from Leafet's Class object, +

    Note that Bounds does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -21397,7 +21397,7 @@

    Methods

    LatLng

    The inverse of project. Projects a 2D point into a geographical location. Only accepts actual L.Point instances, not arrays. -Note that the projection instances do not inherit from Leafet's Class object, +Note that the projection instances do not inherit from Leaflet's Class object, and can't be instantiated. Also, new classes can't inherit from them, and methods can't be added to them with the include function.

    @@ -21650,7 +21650,7 @@

    Defined CRSs

    Leaflet defines the most usual CRSs by default. If you want to use a CRS not defined by default, take a look at the Proj4Leaflet plugin. -Note that the CRS instances do not inherit from Leafet's Class object, +Note that the CRS instances do not inherit from Leaflet's Class object, and can't be instantiated. Also, new classes can't inherit from them, and methods can't be added to them with the include function. @@ -22335,17 +22335,17 @@

    MouseEvent

    latlng LatLng - The geographical point where the mouse event occured. + The geographical point where the mouse event occurred. layerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map layer. + Pixel coordinates of the point where the mouse event occurred relative to the map layer. containerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. originalEvent diff --git a/docs/reference-1.3.4.html b/docs/reference-1.3.4.html index bc1586a1349..a4f7dff66b1 100644 --- a/docs/reference-1.3.4.html +++ b/docs/reference-1.3.4.html @@ -16771,7 +16771,7 @@

    Usage example

    ]);

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range. -Note that LatLngBounds does not inherit from Leafet's Class object, +Note that LatLngBounds does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -16960,7 +16960,7 @@

    Usage example

    map.panBy([200, 300]);
     map.panBy(L.point(200, 300));
     
    -

    Note that Point does not inherit from Leafet's Class object, +

    Note that Point does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -17162,7 +17162,7 @@

    Usage example

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    otherBounds.intersects([[10, 10], [40, 60]]);
     
    -

    Note that Bounds does not inherit from Leafet's Class object, +

    Note that Bounds does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -21443,7 +21443,7 @@

    Methods

    LatLng

    The inverse of project. Projects a 2D point into a geographical location. Only accepts actual L.Point instances, not arrays. -Note that the projection instances do not inherit from Leafet's Class object, +Note that the projection instances do not inherit from Leaflet's Class object, and can't be instantiated. Also, new classes can't inherit from them, and methods can't be added to them with the include function.

    @@ -21696,7 +21696,7 @@

    Defined CRSs

    Leaflet defines the most usual CRSs by default. If you want to use a CRS not defined by default, take a look at the Proj4Leaflet plugin. -Note that the CRS instances do not inherit from Leafet's Class object, +Note that the CRS instances do not inherit from Leaflet's Class object, and can't be instantiated. Also, new classes can't inherit from them, and methods can't be added to them with the include function. @@ -22381,17 +22381,17 @@

    MouseEvent

    latlng LatLng - The geographical point where the mouse event occured. + The geographical point where the mouse event occurred. layerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map layer. + Pixel coordinates of the point where the mouse event occurred relative to the map layer. containerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. originalEvent diff --git a/docs/reference-1.4.0.html b/docs/reference-1.4.0.html index 38e6703c7c6..b1d5183da4a 100644 --- a/docs/reference-1.4.0.html +++ b/docs/reference-1.4.0.html @@ -16784,7 +16784,7 @@

    Usage example

    ]);

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range. -Note that LatLngBounds does not inherit from Leafet's Class object, +Note that LatLngBounds does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -16973,7 +16973,7 @@

    Usage example

    map.panBy([200, 300]);
     map.panBy(L.point(200, 300));
     
    -

    Note that Point does not inherit from Leafet's Class object, +

    Note that Point does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -17175,7 +17175,7 @@

    Usage example

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    otherBounds.intersects([[10, 10], [40, 60]]);
     
    -

    Note that Bounds does not inherit from Leafet's Class object, +

    Note that Bounds does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -21456,7 +21456,7 @@

    Methods

    LatLng

    The inverse of project. Projects a 2D point into a geographical location. Only accepts actual L.Point instances, not arrays. -Note that the projection instances do not inherit from Leafet's Class object, +Note that the projection instances do not inherit from Leaflet's Class object, and can't be instantiated. Also, new classes can't inherit from them, and methods can't be added to them with the include function.

    @@ -21709,7 +21709,7 @@

    Defined CRSs

    Leaflet defines the most usual CRSs by default. If you want to use a CRS not defined by default, take a look at the Proj4Leaflet plugin. -Note that the CRS instances do not inherit from Leafet's Class object, +Note that the CRS instances do not inherit from Leaflet's Class object, and can't be instantiated. Also, new classes can't inherit from them, and methods can't be added to them with the include function. @@ -22394,17 +22394,17 @@

    MouseEvent

    latlng LatLng - The geographical point where the mouse event occured. + The geographical point where the mouse event occurred. layerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map layer. + Pixel coordinates of the point where the mouse event occurred relative to the map layer. containerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. originalEvent diff --git a/docs/reference-1.5.0.html b/docs/reference-1.5.0.html index 4ee68516249..3f6657dfe55 100644 --- a/docs/reference-1.5.0.html +++ b/docs/reference-1.5.0.html @@ -17604,7 +17604,7 @@

    Usage example

    ]);

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range. -Note that LatLngBounds does not inherit from Leafet's Class object, +Note that LatLngBounds does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -17793,7 +17793,7 @@

    Usage example

    map.panBy([200, 300]);
     map.panBy(L.point(200, 300));
     
    -

    Note that Point does not inherit from Leafet's Class object, +

    Note that Point does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -17995,7 +17995,7 @@

    Usage example

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    otherBounds.intersects([[10, 10], [40, 60]]);
     
    -

    Note that Bounds does not inherit from Leafet's Class object, +

    Note that Bounds does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -22277,7 +22277,7 @@

    Methods

    LatLng

    The inverse of project. Projects a 2D point into a geographical location. Only accepts actual L.Point instances, not arrays. -Note that the projection instances do not inherit from Leafet's Class object, +Note that the projection instances do not inherit from Leaflet's Class object, and can't be instantiated. Also, new classes can't inherit from them, and methods can't be added to them with the include function.

    @@ -22537,7 +22537,7 @@

    Defined CRSs

    Leaflet defines the most usual CRSs by default. If you want to use a CRS not defined by default, take a look at the Proj4Leaflet plugin. -Note that the CRS instances do not inherit from Leafet's Class object, +Note that the CRS instances do not inherit from Leaflet's Class object, and can't be instantiated. Also, new classes can't inherit from them, and methods can't be added to them with the include function. @@ -23215,17 +23215,17 @@

    MouseEvent

    latlng LatLng - The geographical point where the mouse event occured. + The geographical point where the mouse event occurred. layerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map layer. + Pixel coordinates of the point where the mouse event occurred relative to the map layer. containerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. originalEvent diff --git a/src/core/Events.leafdoc b/src/core/Events.leafdoc index f5142e1970c..c4d335dc545 100644 --- a/src/core/Events.leafdoc +++ b/src/core/Events.leafdoc @@ -41,11 +41,11 @@ The original [DOM `KeyboardEvent`](https://developer.mozilla.org/en-US/docs/Web/ @miniclass MouseEvent (Event objects) @inherits Event @property latlng: LatLng -The geographical point where the mouse event occured. +The geographical point where the mouse event occurred. @property layerPoint: Point -Pixel coordinates of the point where the mouse event occured relative to the map layer. +Pixel coordinates of the point where the mouse event occurred relative to the map layer. @property containerPoint: Point -Pixel coordinates of the point where the mouse event occured relative to the map сontainer. +Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. @property originalEvent: DOMEvent The original [DOM `MouseEvent`](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent) or [DOM `TouchEvent`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent) that triggered this Leaflet event. diff --git a/src/geo/LatLngBounds.js b/src/geo/LatLngBounds.js index 8fc03c3a9e1..7d8b8cadf42 100644 --- a/src/geo/LatLngBounds.js +++ b/src/geo/LatLngBounds.js @@ -25,7 +25,7 @@ import {LatLng, toLatLng} from './LatLng'; * * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range. * - * Note that `LatLngBounds` does not inherit from Leafet's `Class` object, + * Note that `LatLngBounds` does not inherit from Leaflet's `Class` object, * which means new classes can't inherit from it, and new methods * can't be added to it with the `include` function. */ diff --git a/src/geo/crs/CRS.js b/src/geo/crs/CRS.js index 1c4041c145b..d1ca4ed6a12 100644 --- a/src/geo/crs/CRS.js +++ b/src/geo/crs/CRS.js @@ -16,7 +16,7 @@ import * as Util from '../../core/Util'; * CRS not defined by default, take a look at the * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin. * - * Note that the CRS instances do not inherit from Leafet's `Class` object, + * Note that the CRS instances do not inherit from Leaflet's `Class` object, * and can't be instantiated. Also, new classes can't inherit from them, * and methods can't be added to them with the `include` function. */ diff --git a/src/geo/projection/index.js b/src/geo/projection/index.js index feee60101c6..b577d6b5e58 100644 --- a/src/geo/projection/index.js +++ b/src/geo/projection/index.js @@ -15,7 +15,7 @@ * The inverse of `project`. Projects a 2D point into a geographical location. * Only accepts actual `L.Point` instances, not arrays. - * Note that the projection instances do not inherit from Leafet's `Class` object, + * Note that the projection instances do not inherit from Leaflet's `Class` object, * and can't be instantiated. Also, new classes can't inherit from them, * and methods can't be added to them with the `include` function. diff --git a/src/geometry/Bounds.js b/src/geometry/Bounds.js index 2b3286b86fc..d33c949eeec 100644 --- a/src/geometry/Bounds.js +++ b/src/geometry/Bounds.js @@ -20,7 +20,7 @@ import {Point, toPoint} from './Point'; * otherBounds.intersects([[10, 10], [40, 60]]); * ``` * - * Note that `Bounds` does not inherit from Leafet's `Class` object, + * Note that `Bounds` does not inherit from Leaflet's `Class` object, * which means new classes can't inherit from it, and new methods * can't be added to it with the `include` function. */ diff --git a/src/geometry/Point.js b/src/geometry/Point.js index 3d9d473e167..94359fdc6e5 100644 --- a/src/geometry/Point.js +++ b/src/geometry/Point.js @@ -19,7 +19,7 @@ import {isArray, formatNum} from '../core/Util'; * map.panBy(L.point(200, 300)); * ``` * - * Note that `Point` does not inherit from Leafet's `Class` object, + * Note that `Point` does not inherit from Leaflet's `Class` object, * which means new classes can't inherit from it, and new methods * can't be added to it with the `include` function. */ From 3ce6e3040b80e7d37b62b74e0b7f531680ebd769 Mon Sep 17 00:00:00 2001 From: 0xflotus <0xflotus@gmail.com> Date: Thu, 12 Dec 2019 12:08:21 +0100 Subject: [PATCH 024/306] Plugins: rm whitespace to prettify git previews (#6813) --- docs/plugins.md | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/docs/plugins.md b/docs/plugins.md index e1c2e0f593e..89ba78a89ab 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -13,7 +13,6 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s

    Tile & image layers

    - -

    Overlay data

    -
    -

    Overlay Display

    -
    @@ -3638,7 +3633,6 @@ These plugins extend Leaflet event handling. MazeMap - Leaflet.VisualClick @@ -3694,13 +3688,6 @@ These plugins extend Leaflet event handling. - - - - - - - ### User interface Buttons, sliders, toolbars, sidebars, and panels. @@ -3744,7 +3731,6 @@ Buttons, sliders, toolbars, sidebars, and panels. Anika Halota - @@ -4218,7 +4204,6 @@ The following plugins use external services to calculate driving or walking rout Motion Intelligence GmbH - Leaflet RouteBoxer @@ -4228,7 +4213,6 @@ The following plugins use external services to calculate driving or walking rout Nearest! - Leaflet.Routing.Amap From 104ccba4a0f6027faf559f6a43c998235d38e197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A0=91=E5=8D=8E?= <553105821@qq.com> Date: Thu, 12 Dec 2019 22:17:36 +0800 Subject: [PATCH 025/306] Plugins: add leaflet-zoompanel control (#6673) --- docs/plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 89ba78a89ab..9930fef73cb 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -3081,6 +3081,17 @@ Change the way the user can interactively move around the map. Masashi Takeshita + + + Leaflet.ZoomPanel + + + A Zoom Control Panel Of Leaflet. Demo + + + Shuhua Huang + + From 3b9fe956e2d972b4f60ec1476e3f574d8ce549c3 Mon Sep 17 00:00:00 2001 From: R4M80MrX Date: Fri, 13 Dec 2019 21:52:08 +0800 Subject: [PATCH 026/306] docstrings: disordered comments (#6939) --- src/map/Map.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 20836c90235..5a66c9a57ec 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -1156,10 +1156,10 @@ export var Map = Evented.extend({ // Pane for `GridLayer`s and `TileLayer`s this.createPane('tilePane'); // @pane overlayPane: HTMLElement = 400 - // Pane for vectors (`Path`s, like `Polyline`s and `Polygon`s), `ImageOverlay`s and `VideoOverlay`s + // Pane for overlay shadows (e.g. `Marker` shadows) this.createPane('shadowPane'); // @pane shadowPane: HTMLElement = 500 - // Pane for overlay shadows (e.g. `Marker` shadows) + // Pane for vectors (`Path`s, like `Polyline`s and `Polygon`s), `ImageOverlay`s and `VideoOverlay`s this.createPane('overlayPane'); // @pane markerPane: HTMLElement = 600 // Pane for `Icon`s of `Marker`s From 6b15001bf12ec4b5bfac2f3533a101a59141196e Mon Sep 17 00:00:00 2001 From: Roman Karavia <3082173+rkaravia@users.noreply.github.com> Date: Mon, 16 Dec 2019 09:02:14 +0100 Subject: [PATCH 027/306] Update author name and URLs for Leaflet.TileLayer.Swiss plugin (#6942) Note: The author is still the same person (me), I just changed my name. This can be verified for example by checking that https://github.com/rzoller/Leaflet.TileLayer.Swiss forwards to the new repo URL. --- docs/plugins.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/plugins.md b/docs/plugins.md index 9930fef73cb..139358bbe6c 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -226,12 +226,12 @@ Ready-to-go basemaps, with little or no configuration at all. - Leaflet.TileLayer.Swiss + Leaflet.TileLayer.Swiss - Displays national maps of Switzerland using WMTS services of swisstopo. - Demo. + Displays national maps of Switzerland using map tiles from Swisstopo. + Demo. - Roman Zoller + Roman Karavia From 983092a4975e5a4ab74e8665b38e31a17f38ddb5 Mon Sep 17 00:00:00 2001 From: Jan Pieter Waagmeester Date: Wed, 18 Dec 2019 18:40:50 +0100 Subject: [PATCH 028/306] Pluralize 'layers control'. (#6944) To align it with the way L.Control.Layers is called/documented. --- src/control/Control.Layers.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 38cfa4cc0c3..bca88839a2f 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -289,11 +289,11 @@ export var Layers = Control.extend({ // @namespace Map // @section Layer events // @event baselayerchange: LayersControlEvent - // Fired when the base layer is changed through the [layer control](#control-layers). + // Fired when the base layer is changed through the [layers control](#control-layers). // @event overlayadd: LayersControlEvent - // Fired when an overlay is selected through the [layer control](#control-layers). + // Fired when an overlay is selected through the [layers control](#control-layers). // @event overlayremove: LayersControlEvent - // Fired when an overlay is deselected through the [layer control](#control-layers). + // Fired when an overlay is deselected through the [layers control](#control-layers). // @namespace Control.Layers var type = obj.overlay ? (e.type === 'add' ? 'overlayadd' : 'overlayremove') : From e4b49000843687046cb127811d395394eb93e931 Mon Sep 17 00:00:00 2001 From: Rowan Winsemius Date: Fri, 20 Dec 2019 21:20:50 +1100 Subject: [PATCH 029/306] Plugins: Add simplestyle and SvgShapeMarkers (#6949) --- docs/plugins.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 139358bbe6c..9123969cedf 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1376,6 +1376,15 @@ These plugins provide new markers or news ways of converting abstract data into Mathias Schneider + + + Leaflet.SvgShapeMarkers + + Adds support for additional SVG marker types such as triangles, diamonds and squares. + + Rowan Winsemius + + Leaflet.pattern @@ -1414,6 +1423,15 @@ These plugins provide new markers or news ways of converting abstract data into Alexander Burtsev + + + leaflet-simplestyle + + Extends L.geoJSON to support the simple style spec. + + Rowan Winsemius + + OSM Buildings From 0603741cf7322599a5bd4520eaf3ef90e00e9ada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 7 Jan 2020 11:10:53 +0100 Subject: [PATCH 030/306] Prefix IE-specific "zoom" CSS property Supersedes #6960 --- dist/leaflet.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 983d60592b0..601476fe6dc 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -532,7 +532,7 @@ svg.leaflet-image-layer.leaflet-interactive path { } .leaflet-oldie .leaflet-popup-content-wrapper { - zoom: 1; + -ms-zoom: 1; } .leaflet-oldie .leaflet-popup-tip { width: 24px; From 1e2e1c83ea93c3c019daed29e217d37e84dad882 Mon Sep 17 00:00:00 2001 From: Simon Legner Date: Wed, 8 Jan 2020 13:26:56 +0100 Subject: [PATCH 031/306] fix(Map): rm moveend listener from setMaxBounds (#6958) Calling `map.setMapBounds`, adds the `"moveend"` event listener `_panInsideMaxBounds`. Previously, this did not get cleaned up via `remove`. --- spec/suites/map/MapSpec.js | 2 +- src/map/Map.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index e66f54aea9d..fc8c76f2ac8 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -72,7 +72,7 @@ describe("Map", function () { it("does not throw if removed during animation", function () { var container = document.createElement('div'), - map = new L.Map(container).setView([0, 0], 1); + map = new L.Map(container).setView([0, 0], 1).setMaxBounds([[0, 1], [2, 3]]); // Force creation of animation proxy, // otherwise browser checks disable it diff --git a/src/map/Map.js b/src/map/Map.js index 5a66c9a57ec..0eb1e372c7f 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -752,6 +752,7 @@ export var Map = Evented.extend({ remove: function () { this._initEvents(true); + this.off('moveend', this._panInsideMaxBounds); if (this._containerId !== this._container._leaflet_id) { throw new Error('Map container is being reused by another instance'); From 17a1b6105bfd4d70959fcb865e7c495c3ead85d3 Mon Sep 17 00:00:00 2001 From: Simon Legner Date: Thu, 9 Jan 2020 10:29:25 +0100 Subject: [PATCH 032/306] README: update JS size, add CSS size (#6964) * README: update JS size to 39 KB https://unpkg.com/leaflet@1.6.0/dist/leaflet.js amounts to 39.45 KB gzipped * README: mention 4 KB of CSS https://unpkg.com/leaflet@1.6.0/dist/leaflet.css amounts to 3.65 KB gzipped --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 81d7736a220..f56c4cc8413 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Leaflet Leaflet is the leading open-source JavaScript library for **mobile-friendly interactive maps**. -Weighing just about 37 KB of gzipped JS code, it has all the mapping [features][] most developers ever need. +Weighing just about 39 KB of gzipped JS plus 4 KB of gzipped CSS code, it has all the mapping [features][] most developers ever need. Leaflet is designed with *simplicity*, *performance* and *usability* in mind. It works efficiently across all major desktop and mobile platforms out of the box, From d1a1e97b8290f642eb677284af53c2db64199a76 Mon Sep 17 00:00:00 2001 From: shintonik Date: Thu, 16 Jan 2020 11:03:34 +0100 Subject: [PATCH 033/306] Fix error with bind function in esm build (#6970) Use bind function imported from the Util ES module instead of the one from the global L namespace. Using the L namespace breaks the esm build. --- src/layer/vector/Canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index ce6d3b4c6ff..34186fc9805 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -406,7 +406,7 @@ export var Canvas = Renderer.extend({ } this._mouseHoverThrottled = true; - setTimeout(L.bind(function () { + setTimeout(Util.bind(function () { this._mouseHoverThrottled = false; }, this), 32); }, From 3acb64d9008dce5ef5d163f121579ddc52c62dc9 Mon Sep 17 00:00:00 2001 From: ekbarber Date: Mon, 27 Jan 2020 08:49:17 -0500 Subject: [PATCH 034/306] fix broken url template link (#6982) went to the right page, but an invalid heading --- docs/examples/quick-start/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/quick-start/index.md b/docs/examples/quick-start/index.md index 5e8964be396..bb2f64d4fc9 100644 --- a/docs/examples/quick-start/index.md +++ b/docs/examples/quick-start/index.md @@ -50,7 +50,7 @@ By default (as we didn't pass any options when creating the map instance), all m Note that `setView` call also returns the map object --- most Leaflet methods act like this when they don't return an explicit value, which allows convenient jQuery-like method chaining. -Next we'll add a tile layer to add to our map, in this case it's a Mapbox Streets tile layer. Creating a tile layer usually involves setting the [URL template](/reference.html#url-template) for the tile images, the attribution text and the maximum zoom level of the layer. In this example we'll use the `mapbox/streets-v11` tiles from [Mapbox's Static Tiles API](https://docs.mapbox.com/api/maps/#static-tiles) (in order to use tiles from Mapbox, you must also [request an access token](https://www.mapbox.com/studio/account/tokens/)). +Next we'll add a tile layer to add to our map, in this case it's a Mapbox Streets tile layer. Creating a tile layer usually involves setting the [URL template](/reference.html#tilelayer-url-template) for the tile images, the attribution text and the maximum zoom level of the layer. In this example we'll use the `mapbox/streets-v11` tiles from [Mapbox's Static Tiles API](https://docs.mapbox.com/api/maps/#static-tiles) (in order to use tiles from Mapbox, you must also [request an access token](https://www.mapbox.com/studio/account/tokens/)).
    L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', {
     	attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
    
    From fc0e4a8f0d1656508a980df79aae0ade9a300c0c Mon Sep 17 00:00:00 2001
    From: Philipp Kursawe 
    Date: Mon, 3 Feb 2020 15:14:58 +0100
    Subject: [PATCH 035/306] fix: Don't call potentially undefined closePopup
     function (#6962)
    
    As a result of using importing Marker as ES6 module and *not* importing Popup the function `closePopup` does not exist on the marker object.
    
    This is a quick fix. A better approach would be to make the popup register a move listener on the marker, while its open. And then close itself when the marker is moved.
    
    Closes #6961
    ---
     package.json                    | 8 +++++++-
     src/layer/marker/Marker.Drag.js | 9 ++++++---
     2 files changed, 13 insertions(+), 4 deletions(-)
    
    diff --git a/package.json b/package.json
    index feeb462859b..726c92e61fd 100644
    --- a/package.json
    +++ b/package.json
    @@ -86,7 +86,13 @@
           "strict": 0,
           "wrap-iife": 0,
           "key-spacing": 0,
    -      "consistent-return": 0
    +      "consistent-return": 0,
    +      "no-unused-expressions": [
    +        "error",
    +        { 
    +          "allowShortCircuit": true
    +        }
    +      ]
         }
       },
       "repository": {
    diff --git a/src/layer/marker/Marker.Drag.js b/src/layer/marker/Marker.Drag.js
    index 82a0b8b1fed..64d35f31710 100644
    --- a/src/layer/marker/Marker.Drag.js
    +++ b/src/layer/marker/Marker.Drag.js
    @@ -107,10 +107,13 @@ export var MarkerDrag = Handler.extend({
     		// Fired when the marker starts moving (because of dragging).
     
     		this._oldLatLng = this._marker.getLatLng();
    +
    +		// When using ES6 imports it could not be set when `Popup` was not imported as well
    +		this._marker.closePopup && this._marker.closePopup();
    +
     		this._marker
    -		    .closePopup()
    -		    .fire('movestart')
    -		    .fire('dragstart');
    +			.fire('movestart')
    +			.fire('dragstart');
     	},
     
     	_onPreDrag: function (e) {
    
    From cd12b94a4d1ad4b74734d481bf8f8ad2e3c7f971 Mon Sep 17 00:00:00 2001
    From: Josh Erb 
    Date: Thu, 13 Feb 2020 19:49:03 -0500
    Subject: [PATCH 036/306] [docs] correct Mapbox examples' tileSize (#6995)
    
    * update debug pages
    
    * correct tileSize & zoomOffset for all Mapbox examples
    ---
     debug/map/svgoverlay.html                         | 4 +++-
     debug/map/videooverlay.html                       | 4 +++-
     debug/vector/moving-canvas.html                   | 2 +-
     docs/examples/choropleth/example-basic.md         | 4 +++-
     docs/examples/choropleth/example-color.md         | 4 +++-
     docs/examples/choropleth/example.md               | 4 +++-
     docs/examples/choropleth/index.md                 | 4 +++-
     docs/examples/geojson/example.md                  | 4 +++-
     docs/examples/geojson/geojson-example.html        | 4 +++-
     docs/examples/geojson/geojson.html                | 4 +++-
     docs/examples/layers-control/example.md           | 4 ++--
     docs/examples/layers-control/index.md             | 4 ++--
     docs/examples/mobile/example.md                   | 4 +++-
     docs/examples/mobile/index.md                     | 4 +++-
     docs/examples/quick-start/example-basic.md        | 4 +++-
     docs/examples/quick-start/example-overlays.md     | 4 +++-
     docs/examples/quick-start/example-popups.md       | 4 +++-
     docs/examples/quick-start/example.md              | 4 +++-
     docs/examples/quick-start/index.md                | 4 +++-
     docs/examples/video-overlay/example-bounds.md     | 4 +++-
     docs/examples/video-overlay/example-nocontrols.md | 4 +++-
     docs/examples/video-overlay/example.md            | 4 +++-
     docs/examples/video-overlay/index.md              | 4 +++-
     23 files changed, 65 insertions(+), 25 deletions(-)
    
    diff --git a/debug/map/svgoverlay.html b/debug/map/svgoverlay.html
    index 9fed5dc838c..9c3ed5460fc 100644
    --- a/debug/map/svgoverlay.html
    +++ b/debug/map/svgoverlay.html
    @@ -28,7 +28,9 @@
     			attribution: 'Map data © OpenStreetMap contributors, ' +
     				'CC-BY-SA, ' +
     				'Imagery © Mapbox',
    -			id: 'mapbox/satellite-v9'
    +			id: 'mapbox/satellite-v9',
    +			tileSize: 512,
    +			zoomOffset: -1
     		}).addTo(map);
     
     		var svgElement = document.querySelector('#image'),
    diff --git a/debug/map/videooverlay.html b/debug/map/videooverlay.html
    index 8007b889edb..50f387ecb58 100644
    --- a/debug/map/videooverlay.html
    +++ b/debug/map/videooverlay.html
    @@ -26,7 +26,9 @@
     			attribution: 'Map data © OpenStreetMap contributors, ' +
     				'CC-BY-SA, ' +
     				'Imagery © Mapbox',
    -			id: 'mapbox/satellite-v9'
    +			id: 'mapbox/satellite-v9',
    +			tileSize: 512,
    +			zoomOffset: -1
     		}).addTo(map);
     
     		var videoUrls = [
    diff --git a/debug/vector/moving-canvas.html b/debug/vector/moving-canvas.html
    index 8e7f6a03ea5..ca4728a86b4 100644
    --- a/debug/vector/moving-canvas.html
    +++ b/debug/vector/moving-canvas.html
    @@ -19,7 +19,7 @@
     
     		var osmUrl = 'https://api.mapbox.com/styles/v1/mapbox/light-v9/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw',
     			osmAttrib = '© OpenStreetMap contributors',
    -			osm = L.tileLayer(osmUrl, {maxZoom: 18, attribution: osmAttrib});
    +			osm = L.tileLayer(osmUrl, {maxZoom: 18, tileSize: 512, zoomOffset: -1, attribution: osmAttrib});
     
     		var map = L.map('map', {preferCanvas: true})
     				.setView([50.5, 30.51], 15)
    diff --git a/docs/examples/choropleth/example-basic.md b/docs/examples/choropleth/example-basic.md
    index 2f08b43bdce..6b32fd85969 100644
    --- a/docs/examples/choropleth/example-basic.md
    +++ b/docs/examples/choropleth/example-basic.md
    @@ -12,7 +12,9 @@ title: Choropleth Tutorial
     		attribution: 'Map data © OpenStreetMap contributors, ' +
     			'CC-BY-SA, ' +
     			'Imagery © Mapbox',
    -		id: 'mapbox/light-v9'
    +		id: 'mapbox/light-v9',
    +		tileSize: 512,
    +		zoomOffset: -1
     	}).addTo(map);
     
     	var geojson = L.geoJson(statesData).addTo(map);
    diff --git a/docs/examples/choropleth/example-color.md b/docs/examples/choropleth/example-color.md
    index f01191cd2cb..67b577855d2 100644
    --- a/docs/examples/choropleth/example-color.md
    +++ b/docs/examples/choropleth/example-color.md
    @@ -13,7 +13,9 @@ title: Choropleth Tutorial
     		attribution: 'Map data © OpenStreetMap contributors, ' +
     			'CC-BY-SA, ' +
     			'Imagery © Mapbox',
    -		id: 'mapbox/light-v9'
    +		id: 'mapbox/light-v9',
    +		tileSize: 512,
    +		zoomOffset: -1
     	}).addTo(map);
     
     	// get color depending on population density value
    diff --git a/docs/examples/choropleth/example.md b/docs/examples/choropleth/example.md
    index 88db7da6e0f..0f07f867a85 100644
    --- a/docs/examples/choropleth/example.md
    +++ b/docs/examples/choropleth/example.md
    @@ -43,7 +43,9 @@ css: "#map {
     		attribution: 'Map data © OpenStreetMap contributors, ' +
     			'CC-BY-SA, ' +
     			'Imagery © Mapbox',
    -		id: 'mapbox/light-v9'
    +		id: 'mapbox/light-v9',
    +		tileSize: 512,
    +		zoomOffset: -1
     	}).addTo(map);
     
     
    diff --git a/docs/examples/choropleth/index.md b/docs/examples/choropleth/index.md
    index 917616475e7..7cec4c8ee54 100644
    --- a/docs/examples/choropleth/index.md
    +++ b/docs/examples/choropleth/index.md
    @@ -38,7 +38,9 @@ Let's display our states data on a map with a custom Mapbox style for nice grays
     
     	L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=' + mapboxAccessToken, {
     		id: 'mapbox/light-v9',
    -		attribution: ...
    +		attribution: ...,
    +		tileSize: 512,
    +		zoomOffset: -1
     	}).addTo(map);
     
     	L.geoJson(statesData).addTo(map);
    diff --git a/docs/examples/geojson/example.md b/docs/examples/geojson/example.md
    index eb0e2df9581..63a7b659b3e 100644
    --- a/docs/examples/geojson/example.md
    +++ b/docs/examples/geojson/example.md
    @@ -12,7 +12,9 @@ title: GeoJSON tutorial
     		attribution: 'Map data © OpenStreetMap contributors, ' +
     			'CC-BY-SA, ' +
     			'Imagery © Mapbox',
    -		id: 'mapbox/light-v9'
    +		id: 'mapbox/light-v9',
    +		tileSize: 512,
    +		zoomOffset: -1
     	}).addTo(map);
     
     	var baseballIcon = L.icon({
    diff --git a/docs/examples/geojson/geojson-example.html b/docs/examples/geojson/geojson-example.html
    index ff3e935a592..9bc0e91f3f5 100644
    --- a/docs/examples/geojson/geojson-example.html
    +++ b/docs/examples/geojson/geojson-example.html
    @@ -21,7 +21,9 @@
     			attribution: 'Map data © OpenStreetMap contributors, ' +
     				'CC-BY-SA, ' +
     				'Imagery © Mapbox',
    -			id: 'mapbox/light-v9'
    +			id: 'mapbox/light-v9',
    +			tileSize: 512,
    +			zoomOffset: -1
     		}).addTo(map);
     
     		var baseballIcon = L.icon({
    diff --git a/docs/examples/geojson/geojson.html b/docs/examples/geojson/geojson.html
    index d43630ab9e6..2ecad10fedc 100644
    --- a/docs/examples/geojson/geojson.html
    +++ b/docs/examples/geojson/geojson.html
    @@ -16,7 +16,9 @@ 

    Using GeoJSON with Leaflet

    L.tileLayer(MB_URL, { attribution: MB_ATTR, - id: 'mapbox/light-v9' + id: 'mapbox/light-v9', + tileSize: 512, + zoomOffset: -1 }).addTo(map); var baseballIcon = L.icon({ diff --git a/docs/examples/layers-control/example.md b/docs/examples/layers-control/example.md index a2ae8c2d37c..f4fdf6eeb02 100644 --- a/docs/examples/layers-control/example.md +++ b/docs/examples/layers-control/example.md @@ -16,8 +16,8 @@ title: Layers Control Tutorial 'Imagery © Mapbox', mbUrl = 'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw'; - var grayscale = L.tileLayer(mbUrl, {id: 'mapbox/light-v9', attribution: mbAttr}), - streets = L.tileLayer(mbUrl, {id: 'mapbox/streets-v11', attribution: mbAttr}); + var grayscale = L.tileLayer(mbUrl, {id: 'mapbox/light-v9', tileSize: 512, zoomOffset: -1, attribution: mbAttr}), + streets = L.tileLayer(mbUrl, {id: 'mapbox/streets-v11', tileSize: 512, zoomOffset: -1, attribution: mbAttr}); var map = L.map('map', { center: [39.73, -104.99], diff --git a/docs/examples/layers-control/index.md b/docs/examples/layers-control/index.md index be2fc663de1..5aa394e9255 100644 --- a/docs/examples/layers-control/index.md +++ b/docs/examples/layers-control/index.md @@ -32,8 +32,8 @@ There are two types of layers: (1) base layers that are mutually exclusive (only Now let's create those base layers and add the default ones to the map: -
    var grayscale = L.tileLayer(mapboxUrl, {id: 'MapID', attribution: mapboxAttribution}),
    -	streets   = L.tileLayer(mapboxUrl, {id: 'MapID', attribution: mapboxAttribution});
    +
    var grayscale = L.tileLayer(mapboxUrl, {id: 'MapID', tileSize: 512, zoomOffset: -1, attribution: mapboxAttribution}),
    +	streets   = L.tileLayer(mapboxUrl, {id: 'MapID', tileSize: 512, zoomOffset: -1, attribution: mapboxAttribution});
     
     var map = L.map('map', {
     	center: [39.73, -104.99],
    diff --git a/docs/examples/mobile/example.md b/docs/examples/mobile/example.md
    index 5a72842c457..f93aa99a3d9 100644
    --- a/docs/examples/mobile/example.md
    +++ b/docs/examples/mobile/example.md
    @@ -18,7 +18,9 @@ css: "body {
     		attribution: 'Map data © OpenStreetMap contributors, ' +
     			'CC-BY-SA, ' +
     			'Imagery © Mapbox',
    -		id: 'mapbox/streets-v11'
    +		id: 'mapbox/streets-v11',
    +		tileSize: 512,
    +		zoomOffset: -1
     	}).addTo(map);
     
     	function onLocationFound(e) {
    diff --git a/docs/examples/mobile/index.md b/docs/examples/mobile/index.md
    index 57dcc60d165..4a12dfc2f70 100644
    --- a/docs/examples/mobile/index.md
    +++ b/docs/examples/mobile/index.md
    @@ -35,7 +35,9 @@ We'll now initialize the map in the JavaScript code like we did in the [quick st
     
     L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', {
     	attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
    -	maxZoom: 18
    +	maxZoom: 18,
    +	tileSize: 512,
    +	zoomOffset: -1
     }).addTo(map);
    ### Geolocation diff --git a/docs/examples/quick-start/example-basic.md b/docs/examples/quick-start/example-basic.md index a6fa584e843..f2e114c6e3d 100644 --- a/docs/examples/quick-start/example-basic.md +++ b/docs/examples/quick-start/example-basic.md @@ -13,7 +13,9 @@ customMapContainer: "true" attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox/streets-v11' + id: 'mapbox/streets-v11', + tileSize: 512, + zoomOffset: -1 }).addTo(mymap); diff --git a/docs/examples/quick-start/example-overlays.md b/docs/examples/quick-start/example-overlays.md index 2810d97b064..eb90e199360 100644 --- a/docs/examples/quick-start/example-overlays.md +++ b/docs/examples/quick-start/example-overlays.md @@ -13,7 +13,9 @@ customMapContainer: "true" attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox/streets-v11' + id: 'mapbox/streets-v11', + tileSize: 512, + zoomOffset: -1 }).addTo(mymap); L.marker([51.5, -0.09]).addTo(mymap); diff --git a/docs/examples/quick-start/example-popups.md b/docs/examples/quick-start/example-popups.md index 1a1fa1565af..b9d1df93a72 100644 --- a/docs/examples/quick-start/example-popups.md +++ b/docs/examples/quick-start/example-popups.md @@ -13,7 +13,9 @@ customMapContainer: "true" attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox/streets-v11' + id: 'mapbox/streets-v11', + tileSize: 512, + zoomOffset: -1 }).addTo(mymap); L.marker([51.5, -0.09]).addTo(mymap) diff --git a/docs/examples/quick-start/example.md b/docs/examples/quick-start/example.md index b05fd1cc805..36c8292bd08 100644 --- a/docs/examples/quick-start/example.md +++ b/docs/examples/quick-start/example.md @@ -13,7 +13,9 @@ customMapContainer: "true" attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox/streets-v11' + id: 'mapbox/streets-v11', + tileSize: 512, + zoomOffset: -1 }).addTo(mymap); L.marker([51.5, -0.09]).addTo(mymap) diff --git a/docs/examples/quick-start/index.md b/docs/examples/quick-start/index.md index bb2f64d4fc9..06db77ac192 100644 --- a/docs/examples/quick-start/index.md +++ b/docs/examples/quick-start/index.md @@ -50,12 +50,14 @@ By default (as we didn't pass any options when creating the map instance), all m Note that `setView` call also returns the map object --- most Leaflet methods act like this when they don't return an explicit value, which allows convenient jQuery-like method chaining. -Next we'll add a tile layer to add to our map, in this case it's a Mapbox Streets tile layer. Creating a tile layer usually involves setting the [URL template](/reference.html#tilelayer-url-template) for the tile images, the attribution text and the maximum zoom level of the layer. In this example we'll use the `mapbox/streets-v11` tiles from [Mapbox's Static Tiles API](https://docs.mapbox.com/api/maps/#static-tiles) (in order to use tiles from Mapbox, you must also [request an access token](https://www.mapbox.com/studio/account/tokens/)). +Next we'll add a tile layer to add to our map, in this case it's a Mapbox Streets tile layer. Creating a tile layer usually involves setting the [URL template](/reference.html#tilelayer-url-template) for the tile images, the attribution text and the maximum zoom level of the layer. In this example we'll use the `mapbox/streets-v11` tiles from [Mapbox's Static Tiles API](https://docs.mapbox.com/api/maps/#static-tiles) (in order to use tiles from Mapbox, you must also [request an access token](https://www.mapbox.com/studio/account/tokens/)). Because this API returns 512x512 tiles by default (instead of 256x256), we will also have to explicitly specify this and offset our zoom by a value of -1.
    L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', {
     	attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
     	maxZoom: 18,
     	id: 'mapbox/streets-v11',
    +	tileSize: 512,
    +	zoomOffset: -1,
     	accessToken: 'your.mapbox.access.token'
     }).addTo(mymap);
    diff --git a/docs/examples/video-overlay/example-bounds.md b/docs/examples/video-overlay/example-bounds.md index 259de204780..4e28ef79e58 100644 --- a/docs/examples/video-overlay/example-bounds.md +++ b/docs/examples/video-overlay/example-bounds.md @@ -10,7 +10,9 @@ title: Video Overlay Tutorial attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox/satellite-v9' + id: 'mapbox/satellite-v9', + tileSize: 512, + zoomOffset: -1 }).addTo(map); bounds = L.latLngBounds([[ 32, -130], [ 13, -100]]); diff --git a/docs/examples/video-overlay/example-nocontrols.md b/docs/examples/video-overlay/example-nocontrols.md index 0836788c224..4c72d040065 100644 --- a/docs/examples/video-overlay/example-nocontrols.md +++ b/docs/examples/video-overlay/example-nocontrols.md @@ -10,7 +10,9 @@ title: Video Overlay Tutorial attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox/satellite-v9' + id: 'mapbox/satellite-v9', + tileSize: 512, + zoomOffset: -1 }).addTo(map); var videoUrls = [ diff --git a/docs/examples/video-overlay/example.md b/docs/examples/video-overlay/example.md index c8d6e7592fb..a4ce19ce45f 100644 --- a/docs/examples/video-overlay/example.md +++ b/docs/examples/video-overlay/example.md @@ -10,7 +10,9 @@ title: Video Overlay Tutorial attribution: 'Map data © OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery © Mapbox', - id: 'mapbox/satellite-v9' + id: 'mapbox/satellite-v9', + tileSize: 512, + zoomOffset: -1 }).addTo(map); var videoUrls = [ diff --git a/docs/examples/video-overlay/index.md b/docs/examples/video-overlay/index.md index f52338213c6..ffbdb0acf93 100644 --- a/docs/examples/video-overlay/index.md +++ b/docs/examples/video-overlay/index.md @@ -31,7 +31,9 @@ First of all, create a Leaflet map and add a background `L.TileLayer` in the usu L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=' + mapboxAccessToken, { id: 'mapbox/satellite-v9', - attribution: ... + attribution: ..., + tileSize: 512, + zoomOffset: -1 }).addTo(map); Then, we'll define the geographical bounds that the video will cover. This is an instance of [`L.LatLngBounds`](/reference.html#latlngbounds), which is a rectangular shape: From f662d44af5170bb5ba4ffb8a9b644c9569bcdd66 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Tue, 18 Feb 2020 16:03:04 +0200 Subject: [PATCH 037/306] Fix exception when calling LayerGroup/hasLayer() with wrong layerId (#6998) Now `false` returned, as per docs --- src/layer/LayerGroup.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/layer/LayerGroup.js b/src/layer/LayerGroup.js index 213ef2600b8..202328380ab 100644 --- a/src/layer/LayerGroup.js +++ b/src/layer/LayerGroup.js @@ -73,7 +73,9 @@ export var LayerGroup = Layer.extend({ // @method hasLayer(id: Number): Boolean // Returns `true` if the given internal ID is currently added to the group. hasLayer: function (layer) { - return !!layer && (layer in this._layers || this.getLayerId(layer) in this._layers); + if (!layer) { return false; } + var layerId = typeof layer === 'number' ? layer : this.getLayerId(layer); + return layerId in this._layers; }, // @method clearLayers(): this From 0d06c4256f4312a7122c23626c8bd36e14269d01 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Thu, 20 Feb 2020 00:39:30 +0200 Subject: [PATCH 038/306] docs: fix: map/setMaxBounds argument is LatLngBounds (#7001) --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index 0eb1e372c7f..31146152e8a 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -441,7 +441,7 @@ export var Map = Evented.extend({ return this.flyTo(target.center, target.zoom, options); }, - // @method setMaxBounds(bounds: Bounds): this + // @method setMaxBounds(bounds: LatLngBounds): this // Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option). setMaxBounds: function (bounds) { bounds = toLatLngBounds(bounds); From a4422ed3958c22b96d2799747e6e458e244ee91b Mon Sep 17 00:00:00 2001 From: bozdoz Date: Wed, 11 Mar 2020 07:55:40 -0300 Subject: [PATCH 039/306] Updates links in plugins.md (#7016) My links have changed places --- docs/plugins.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/plugins.md b/docs/plugins.md index 9123969cedf..73014c4b7e3 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2123,7 +2123,7 @@ These plugins create heatmaps and heatmap-like visualizations from vector data. High performance Javascript heatmap plugin using WebGL. - Benjamin J DeLong + Benjamin J DeLong @@ -4701,7 +4701,7 @@ The following plugins integrate Leaflet into third party services or websites. Interactive and flexible shortcode to create multiple maps in posts and pages, and to add multiple markers on those maps. - Benjamin J DeLong + Benjamin J DeLong From 5e93da5c700bd62476fcc82ed66bed88e6933765 Mon Sep 17 00:00:00 2001 From: vncntcltt Date: Fri, 6 Mar 2020 14:39:30 +0100 Subject: [PATCH 040/306] Fix JS error on non-mobile devices (issue #4239) --- docs/examples/extending/tilt.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/examples/extending/tilt.md b/docs/examples/extending/tilt.md index cbaf40bd2f7..38286f59a77 100644 --- a/docs/examples/extending/tilt.md +++ b/docs/examples/extending/tilt.md @@ -39,8 +39,15 @@ title: Tilt handler _tilt: function(ev) { // Treat Gamma angle as horizontal pan (1 degree = 1 pixel) and Beta angle as vertical pan - this._map.panBy( L.point( ev.gamma, ev.beta ) ); - document.getElementById('info').innerHTML = ev.gamma + ',' + ev.beta; + var info; + var offset = L.point(ev.gamma, ev.beta) + if (offset) { + this._map.panBy(offset); + info = ev.gamma + ',' + ev.beta; + } else { + info = 'Device orientation not detected' + } + document.getElementById('info').innerHTML = info } }); From a47f323994925957fea44ac61ed98f87df8504ee Mon Sep 17 00:00:00 2001 From: vncntcltt Date: Fri, 6 Mar 2020 14:48:31 +0100 Subject: [PATCH 041/306] Fix Contrib doc for jekyll install (issue #4239) --- CONTRIBUTING.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 66af7034751..adf1fec0a0c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -153,10 +153,10 @@ If you need to make edits in a local repository to see how it looks in the proce 1. [Install Ruby](http://www.ruby-lang.org/en/) if you don't have it yet. 2. Run `gem install jekyll`. 3. Enter the directory where you cloned the Leaflet repository - 4. Run `bundle install` - 5. Make sure you are in the `master` branch by running `git checkout master` - 6. Enter the documentation subdirectory by running `cd docs` - 7. Run `jekyll serve --watch`. + 4. Make sure you are in the `master` branch by running `git checkout master` + 5. Enter the documentation subdirectory by running `cd docs` + 6. Run `bundle install` + 7. Run `jekyll serve --watch` (if you have a Gem::LoadError error run `bundle exec jekyll serve --watch` instead) 8. Open `localhost:4000` in your web browser. Now any file changes will be updated when you reload pages automatically. From c6d8a51da3b3d0c7348bf503f8f58cd9f744680f Mon Sep 17 00:00:00 2001 From: vncntcltt Date: Fri, 6 Mar 2020 16:58:26 +0100 Subject: [PATCH 042/306] Update WMS tutorial using Mundialis WMS (#4239) --- docs/examples/wms/qgis-wms-layers.png | Bin 37632 -> 17957 bytes docs/examples/wms/wms-example-crs.md | 4 +- docs/examples/wms/wms-example1.md | 4 +- docs/examples/wms/wms-example2.md | 4 +- docs/examples/wms/wms-example3.md | 18 +++---- docs/examples/wms/wms-example4.md | 29 ---------- docs/examples/wms/wms.md | 75 ++++++++++++-------------- 7 files changed, 50 insertions(+), 84 deletions(-) delete mode 100644 docs/examples/wms/wms-example4.md diff --git a/docs/examples/wms/qgis-wms-layers.png b/docs/examples/wms/qgis-wms-layers.png index b168e8415451a3a28fc9bc2f458b7ad942902425..4b356aa98f15d2725f37565a1a242902a18bdf9a 100644 GIT binary patch literal 17957 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 \ No newline at end of file diff --git a/docs/examples/wms/wms-example2.md b/docs/examples/wms/wms-example2.md index 25b2dcc9565..241d89c02d4 100644 --- a/docs/examples/wms/wms-example2.md +++ b/docs/examples/wms/wms-example2.md @@ -9,8 +9,8 @@ title: WMS example zoom: 3 }); - var wmsLayer = L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'nasa:bluemarble' + var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'SRTM30-Colored-Hillshade' }).addTo(map); diff --git a/docs/examples/wms/wms-example3.md b/docs/examples/wms/wms-example3.md index 562f79831cf..e4d4d7d6d43 100644 --- a/docs/examples/wms/wms-example3.md +++ b/docs/examples/wms/wms-example3.md @@ -10,25 +10,25 @@ title: WMS example }); var basemaps = { - Countries: L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'ne:ne_10m_admin_0_countries' + Topography: L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'TOPO-WMS' }), - Boundaries: L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'ne:ne_10m_admin_0_boundary_lines_land' + Places: L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'OSM-Overlay-WMS' }), - 'Countries, then boundaries': L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'ne:ne_10m_admin_0_countries,ne:ne_10m_admin_0_boundary_lines_land' + 'Topography, then places': L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'TOPO-WMS,OSM-Overlay-WMS' }), - 'Boundaries, then countries': L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'ne:ne_10m_admin_0_boundary_lines_land,ne:ne_10m_admin_0_countries' + 'Places, then topography': L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'OSM-Overlay-WMS,TOPO-WMS' }) }; L.control.layers(basemaps, {}, {collapsed: false}).addTo(map); - basemaps.Countries.addTo(map); + basemaps.Topography.addTo(map); diff --git a/docs/examples/wms/wms-example4.md b/docs/examples/wms/wms-example4.md deleted file mode 100644 index e23716f7f80..00000000000 --- a/docs/examples/wms/wms-example4.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: tutorial_frame -title: WMS example ---- - diff --git a/docs/examples/wms/wms.md b/docs/examples/wms/wms.md index 286284fe629..320b9996d4a 100644 --- a/docs/examples/wms/wms.md +++ b/docs/examples/wms/wms.md @@ -14,25 +14,28 @@ iframe { WMS, short for [*web map service*](https://en.wikipedia.org/wiki/Web_Map_Service), is a popular way of publishing maps by professional GIS software (and seldomly used by non-GISers). This format is similar to map tiles, but more generic and not so well optimized for use in web maps. A WMS image is defined by the coordinates of its corners - a calculation that Leaflet does under the hood. -TMS stands for *tiled map service*, and is a map tiling standard more focused on web maps, very similar to the map tiles that Leaflet expects in a `L.TileLayer`. +TMS stands for [*tiled map service*](https://en.wikipedia.org/wiki/Tile_Map_Service), and is a map tiling standard more focused on web maps, very similar to the map tiles that Leaflet expects in a `L.TileLayer`. + +WTMS, for [*web map tile service*](https://en.wikipedia.org/wiki/Web_Map_Tile_Service), is the standard protocol for map tiles and serves map tiles directly usable in a `L.TileLayer`. + ## WMS in Leaflet -When somebody publishes a WMS service, most likely they link to something called a `GetCapabilities` document. For this tutorial, we'll use the demo map services from GeoServer, at https://demo.boundlessgeo.com/geoserver/web/. As you can see in that page, "WMS" links to the following URL: +When somebody publishes a WMS service, most likely they link to something called a `GetCapabilities` document. For this tutorial, we'll use the WMS offered by [*Mundialis*](https://www.mundialis.de) at http://ows.mundialis.de/services/service? . The service capabilities are described at the following URL: - https://demo.boundlessgeo.com/geoserver/ows?service=wms&version=1.3.0&request=GetCapabilities + http://ows.mundialis.de/services/service?request=GetCapabilities Leaflet does not understand WMS `GetCapabilities` documents. Instead, you have to create a `L.TileLayer.WMS` layer, provide the base WMS URL, and specify whatever WMS options you need. The base WMS URL is simply the `GetCapabilities` URL, without any parameters, like so: - https://demo.boundlessgeo.com/geoserver/ows? + http://ows.mundialis.de/services/service? And the way to use that in a Leaflet map is simply: var map = L.map(mapDiv, mapOptions); - var wmsLayer = L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', wmsOptions).addTo(map); + var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', wmsOptions).addTo(map); An instance of `L.TileLayer.WMS` needs at least one option: `layers`. Be careful, as the concept of "layer" in Leaflet is different from the concept of "layer" in WMS! @@ -40,19 +43,19 @@ WMS servers define a set of *layers* in the service. These are defined in the `G ![Discovering WMS layers with QGIS](qgis-wms-layers.png) -We can see that the OpenGeo demo WMS has a WMS layer named `ne:ne` with a basemap. Let's see how it looks: +We can see that the *Mundialis* WMS has a WMS layer named `TOPO-OSM-WMS` with a basemap. Let's see how it looks: - var wmsLayer = L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'ne:ne' + var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'TOPO-OSM-WMS' }).addTo(map); {% include frame.html url="wms-example1.html" %} -Or we can try the `nasa:bluemarble` WMS layer: +Or we can try the `SRTM30-Colored-Hillshade` WMS layer: - var wmsLayer = L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'nasa:bluemarble' + var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'SRTM30-Colored-Hillshade' }).addTo(map); {% include frame.html url="wms-example2.html" %} @@ -60,39 +63,39 @@ Or we can try the `nasa:bluemarble` WMS layer: The `layers` option is a comma-separated list of layers. If a WMS service has defined several layers, then a request for a map image can refer to more than one layer. -For the example WMS server we're using, there is a `ne:ne_10m_admin_0_countries` WMS layer showing country landmasses and country names, and a `ne:ne_10m_admin_0_boundary_lines_land` WMS layer showing country boundaries. The WMS server will compose both layers in one image if we request both, separated with a comma: +For the example WMS server we're using, there is a `TOPO-WMS` WMS layer showing the world topography, and a `OSM-Overlay-WMS` WMS layer showing the names of places. The WMS server will compose both layers in one image if we request both, separated with a comma: - var countriesAndBoundaries = L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'ne:ne_10m_admin_0_countries,ne:ne_10m_admin_0_boundary_lines_land' + var topographyAndPlaces = L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'TOPO-WMS,OSM-Overlay-WMS' }).addTo(map); -Note this will request *one* image to the WMS server. This is different than creating a `L.TileLayer.WMS` for the countries, another one for the boundaries, and adding them both to the map. In the first case, there is one image request and it's the WMS server who decides how to compose (put on top of each other) the image. In the second case, there would be two image requests and it's the Leaflet code running in the web browser who decides how to compose them. +Note this will request *one* image to the WMS server. This is different than creating a `L.TileLayer.WMS` for the topography, another one for the places, and adding them both to the map. In the first case, there is one image request and it's the WMS server who decides how to compose (put on top of each other) the image. In the second case, there would be two image requests and it's the Leaflet code running in the web browser who decides how to compose them. If we combine this with the [layers control](/examples/layers-control.html), then we can build a simple map to see the difference: var basemaps = { - Countries: L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'ne:ne_10m_admin_0_countries' + Topography: L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'TOPO-WMS' }), - Boundaries: L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'ne:ne_10m_admin_0_boundary_lines_land' + Places: L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'OSM-Overlay-WMS' }), - 'Countries, then boundaries': L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'ne:ne_10m_admin_0_countries,ne:ne_10m_admin_0_boundary_lines_land' + 'Topography, then places': L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'TOPO-WMS,OSM-Overlay-WMS' }), - 'Boundaries, then countries': L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'ne:ne_10m_admin_0_boundary_lines_land,ne:ne_10m_admin_0_countries' + 'Places, then topography': L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'OSM-Overlay-WMS,TOPO-WMS' }) }; L.control.layers(basemaps).addTo(map); - basemaps.Countries.addTo(map); + basemaps.Topography.addTo(map); -Change to the "Countries, then boundaries" option, so you can see the boundaries "on top" of the landmasses, but the WMS server is clever enough to display building labels on top of that. It's up to the WMS server how to compose layers when asked for many. +Change to the "Topography, then places" option, so you can see the places "on top" of the topography, but the WMS server is clever enough to display building labels on top of that. It's up to the WMS server how to compose layers when asked for many. {% include frame.html url="wms-example3.html" %} @@ -109,8 +112,8 @@ Also note that Leaflet supports very few [coordinate systems](https://en.wikiped crs: L.CRS.EPSG4326 }); - var wmsLayer = L.tileLayer.wms('https://demo.boundlessgeo.com/geoserver/ows?', { - layers: 'nasa:bluemarble' + var wmsLayer = L.tileLayer.wms('http://ows.mundialis.de/services/service?', { + layers: 'TOPO-OSM-WMS' }).addTo(map); {% include frame.html url="wms-example-crs.html" %} @@ -120,33 +123,25 @@ Also note that Leaflet supports very few [coordinate systems](https://en.wikiped Leaflet doesn't have explicit support for TMS services, but the tile naming structure is so similar to the common `L.TileLayer` naming scheme, that displaying a TMS service is almost trivial. -Using the same OpenGeo WMS/TMS server demo, we can see there's a TMS endpoint at: +Let's consider a TMS server with the following endpoint: - https://demo.boundlessgeo.com/geoserver/gwc/service/tms/1.0.0 + http://base_url/tms/1.0.0 Checking the [MapCache help about TMS](http://mapserver.org/mapcache/services.html) and the [TMS specification](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification) you can see that the URL for a map tile in TMS looks like: http://base_url/tms/1.0.0/ {tileset} / {z} / {x} / {y} .png -To use the OpenGeo TMS services as a `L.TileLayer`, we can check the capabilities document (the same as the base endpoint, in our case [`https://demo.boundlessgeo.com/geoserver/gwc/service/tms/1.0.0`](https://demo.boundlessgeo.com/geoserver/gwc/service/tms/1.0.0)) to see what `tileset`s are available, and build our base URLs: +To use the TMS services as a `L.TileLayer`, we can check the capabilities document (the same as the base endpoint, in our case [`http://base_url/tms/1.0.0`](http://base_url/tms/1.0.0)) to see what `tileset`s are available, and build our base URLs: - https://demo.boundlessgeo.com/geoserver/gwc/service/tms/1.0.0/ne:ne@EPSG:900913@png/{z}/{x}/{y}.png - - https://demo.boundlessgeo.com/geoserver/gwc/service/tms/1.0.0/nasa:bluemarble@EPSG:900913@jpg/{z}/{x}/{y}.jpg + http://base_url/tms/1.0.0/{example_layer}@png/{z}/{x}/{y}.png And use the `tms:true` option when instantiating the layers, like so: - var tms_ne = L.tileLayer('https://demo.boundlessgeo.com/geoserver/gwc/service/tms/1.0.0/ne:ne@EPSG:900913@png/{z}/{x}/{y}.png', { + var tms_example = L.tileLayer('http://base_url/tms/1.0.0/example_layer@png/{z}/{x}/{y}.png', { tms: true }).addTo(map); - var tms_bluemarble = L.tileLayer('https://demo.boundlessgeo.com/geoserver/gwc/service/tms/1.0.0/nasa:bluemarble@EPSG:900913@jpg/{z}/{x}/{y}.jpg', { - tms: true - }); - -{% include frame.html url="wms-example4.html" %} - A new feature in **Leaflet 1.0** is the ability to use `{-y}` in the URL instead of a `tms: true` option, e.g.: From 67102996d042bfbfe23610cf7dbac089e715ad61 Mon Sep 17 00:00:00 2001 From: Yohann Tilotti <5848945+yneet@users.noreply.github.com> Date: Wed, 11 Mar 2020 12:12:45 +0100 Subject: [PATCH 043/306] Use passive event listeners for touchstart/touchend (#7008) * Use passive event listeners To fix the error "Does not use passive listeners to improve scrolling performance" on Lighthouse audit (https://web.dev/uses-passive-event-listeners/?utm_source=lighthouse&utm_medium=devtools) * Specific condition touch Add a specific condition on touchstart and touchend with a passive mode --- src/dom/DomEvent.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 9e0032d0f68..bf6626b2b42 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -96,6 +96,9 @@ function addOne(obj, type, fn, context) { if (type === 'mousewheel') { obj.addEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, Browser.passiveEvents ? {passive: false} : false); + } else if ((type === 'touchstart') || (type === 'touchend')) { + obj.addEventListener(type, handler, Browser.passiveEvents ? {passive: false} : false); + } else if ((type === 'mouseenter') || (type === 'mouseleave')) { handler = function (e) { e = e || window.event; From 05a9bdbb8e159437d05345e1f8607012801bec03 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 11 Mar 2020 13:13:02 +0200 Subject: [PATCH 044/306] remove disqus integration to cut back spam (#7018) --- docs/_layouts/post.html | 15 --------------- docs/docs/css/main.css | 4 ---- 2 files changed, 19 deletions(-) diff --git a/docs/_layouts/post.html b/docs/_layouts/post.html index 54dcea10fd2..4fedd316490 100644 --- a/docs/_layouts/post.html +++ b/docs/_layouts/post.html @@ -13,18 +13,3 @@

    {{ page.title }}

    {{ content }} -
    - - - -
    comments powered by Disqus - diff --git a/docs/docs/css/main.css b/docs/docs/css/main.css index 0377a403296..21f4431026e 100644 --- a/docs/docs/css/main.css +++ b/docs/docs/css/main.css @@ -1083,10 +1083,6 @@ iframe[src*='youtube.com'] { max-width: 100% !important; } -#disqus_thread { - margin-top: 3em; -} - .no-break { display: inline-block; width: 100%; From e213469a296ea00e6f9e6e6beb49d081e8d1c4fe Mon Sep 17 00:00:00 2001 From: johnd0e Date: Wed, 11 Mar 2020 16:53:56 +0200 Subject: [PATCH 045/306] Remove legacy click filter, targeted android 4.x (#7013) --- src/dom/DomEvent.js | 28 +--------------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index bf6626b2b42..788c3607664 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -109,12 +109,7 @@ function addOne(obj, type, fn, context) { obj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false); } else { - if (type === 'click' && Browser.android) { - handler = function (e) { - filterClick(e, originalHandler); - }; - } - obj.addEventListener(type, handler, false); + obj.addEventListener(type, originalHandler, false); } } else if ('attachEvent' in obj) { @@ -289,27 +284,6 @@ export function isExternalTarget(el, e) { return (related !== el); } -var lastClick; - -// this is a horrible workaround for a bug in Android where a single touch triggers two click events -function filterClick(e, handler) { - var timeStamp = (e.timeStamp || (e.originalEvent && e.originalEvent.timeStamp)), - elapsed = lastClick && (timeStamp - lastClick); - - // are they closer together than 500ms yet more than 100ms? - // Android typically triggers them ~300ms apart while multiple listeners - // on the same event should be triggered far faster; - // or check if click is simulated on the element, and if it is, reject any non-simulated events - - if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) { - stop(e); - return; - } - lastClick = timeStamp; - - handler(e); -} - // @function addListener(…): this // Alias to [`L.DomEvent.on`](#domevent-on) export {on as addListener}; From 5902241ff9f965d244afdfad4e0c58be900ccf9b Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 20 Mar 2020 11:26:28 +0200 Subject: [PATCH 046/306] Fix: listeners were not removed because of missed context (#7036) --- src/map/handler/Map.TouchZoom.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index 5daa0ba6410..9febac6d097 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -112,8 +112,8 @@ export var TouchZoom = Handler.extend({ this._zooming = false; Util.cancelAnimFrame(this._animRequest); - DomEvent.off(document, 'touchmove', this._onTouchMove); - DomEvent.off(document, 'touchend', this._onTouchEnd); + DomEvent.off(document, 'touchmove', this._onTouchMove, this); + DomEvent.off(document, 'touchend', this._onTouchEnd, this); // Pinch updates GridLayers' levels only when zoomSnap is off, so zoomSnap becomes noUpdate. if (this._map.options.zoomAnimation) { From efe5c414351b90d736bc00c54acef95af43b6154 Mon Sep 17 00:00:00 2001 From: Boia Alexandru Date: Fri, 20 Mar 2020 11:27:37 +0200 Subject: [PATCH 047/306] Update plugins.md (#7038) Added proposed 3rd party integration: WP-Trip-Summary WordPress plug-in that uses LeafletJS as a mapping component. --- docs/plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 73014c4b7e3..776847f1b38 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -4797,6 +4797,15 @@ The following plugins integrate Leaflet into third party services or websites. Marcin Wasilewski + + + WP-Trip-Summary + + A WordPress trip summary plugin to help travel bloggers manage and display structured information about their train rides and biking or hiking trips. + + Alexandru Boia + + From 5185a6bff454e0b7df3d16c7116329b81a9b705e Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 20 Mar 2020 11:34:07 +0200 Subject: [PATCH 048/306] Fix Microsoft Edge support (pre-Chromium) (#7023) * Prevent Browser.chrome = true for pre-Chromium Edge Sample user agent string: "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763" * fixup! Another blind attemp to work around dblclicks on Edge (#5268) Fix leftover that was meant to change in 2b5d401976f7516f50aa2631e805be42be6476d6 --- src/core/Browser.js | 2 +- src/dom/DomEvent.DoubleTap.js | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/core/Browser.js b/src/core/Browser.js index 8b591e34a17..8572fc26517 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -47,7 +47,7 @@ export var androidStock = android && userAgentContains('Google') && webkitVer < export var opera = !!window.opera; // @property chrome: Boolean; `true` for the Chrome browser. -export var chrome = userAgentContains('chrome'); +export var chrome = !edge && userAgentContains('chrome'); // @property gecko: Boolean; `true` for gecko-based browsers like Firefox. export var gecko = userAgentContains('gecko') && !webkit && !opera && !ie; diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index a1c182870f8..20a579489f5 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -79,9 +79,7 @@ export function removeDoubleTapListener(obj, id) { obj.removeEventListener(_touchstart, touchstart, Browser.passiveEvents ? {passive: false} : false); obj.removeEventListener(_touchend, touchend, Browser.passiveEvents ? {passive: false} : false); - if (!Browser.edge) { - obj.removeEventListener('dblclick', dblclick, false); - } + obj.removeEventListener('dblclick', dblclick, false); return this; } From 95c436638180efff57e50d6356062be96925fcee Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 20 Mar 2020 11:37:07 +0200 Subject: [PATCH 049/306] Fix some issues related to wrong Browser.pointer value (#7010) * Revert "Fix pointer event hendling on iOS13 (#6855)" This reverts commit 747b1f73f998146b861081d4ae9ed1d4b03c7039. Close #6977 * Fix iOS contextmenu issue in more proper way Ref: #6817 * Fix iOS dblclick issue in more proper way * dblclick emulation: simplify code paths a bit * Make use of PointerEvent.isPrimary https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/isPrimary https://caniuse.com/#search=isPrimary IE 10 or later, but it is safe to use here, as for IE we anyway need return from function. --- src/core/Browser.js | 2 +- src/dom/DomEvent.DoubleTap.js | 14 +++++--------- src/dom/DomEvent.Pointer.js | 5 ----- src/dom/DomEvent.js | 15 +++++++++------ src/map/handler/Map.Tap.js | 2 +- 5 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/core/Browser.js b/src/core/Browser.js index 8572fc26517..13c50ae1c5f 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -93,7 +93,7 @@ export var msPointer = !window.PointerEvent && window.MSPointerEvent; // @property pointer: Boolean // `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx). -export var pointer = !webkit && !!(window.PointerEvent || msPointer); +export var pointer = !!(window.PointerEvent || msPointer); // @property touch: Boolean // `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events). diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index 20a579489f5..a302df84bc2 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -1,5 +1,4 @@ import * as Browser from '../core/Browser'; -import {_pointersCount} from './DomEvent.Pointer'; /* * Extends the event handling code with double tap support for mobile browsers. @@ -16,17 +15,14 @@ export function addDoubleTapListener(obj, handler, id) { delay = 250; function onTouchStart(e) { - var count; if (Browser.pointer) { - if ((!Browser.edge) || e.pointerType === 'mouse') { return; } - count = _pointersCount; - } else { - count = e.touches.length; + if (!e.isPrimary) { return; } + if (e.pointerType === 'mouse') { return; } // mouse fires native dblclick + } else if (e.touches.length > 1) { + return; } - if (count > 1) { return; } - var now = Date.now(), delta = now - (last || now); @@ -38,7 +34,7 @@ export function addDoubleTapListener(obj, handler, id) { function onTouchEnd(e) { if (doubleTap && !touch.cancelBubble) { if (Browser.pointer) { - if ((!Browser.edge) || e.pointerType === 'mouse') { return; } + if (e.pointerType === 'mouse') { return; } // work around .type being readonly with MSPointer* events var newTouch = {}, prop, i; diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index e25703a0133..4382ba2db4c 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -16,9 +16,6 @@ var TAG_WHITE_LIST = ['INPUT', 'SELECT', 'OPTION']; var _pointers = {}; var _pointerDocListener = false; -// DomEvent.DoubleTap needs to know about this -export var _pointersCount = 0; - // Provides a touch events wrapper for (ms)pointer events. // ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 @@ -86,7 +83,6 @@ function _addPointerStart(obj, handler, id) { function _globalPointerDown(e) { _pointers[e.pointerId] = e; - _pointersCount++; } function _globalPointerMove(e) { @@ -97,7 +93,6 @@ function _globalPointerMove(e) { function _globalPointerUp(e) { delete _pointers[e.pointerId]; - _pointersCount--; } function _handlePointer(e, handler) { diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 788c3607664..081c8303fdf 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -70,6 +70,13 @@ export function off(obj, types, fn, context) { return this; } +function browserFiresNativeDblClick() { + // See https://github.com/w3c/pointerevents/issues/171 + if (Browser.pointer) { + return !(Browser.edge || Browser.safari); + } +} + function addOne(obj, type, fn, context) { var id = type + Util.stamp(fn) + (context ? '_' + Util.stamp(context) : ''); @@ -85,10 +92,7 @@ function addOne(obj, type, fn, context) { // Needs DomEvent.Pointer.js addPointerListener(obj, type, handler, id); - } else if (Browser.touch && (type === 'dblclick') && addDoubleTapListener && - !(Browser.pointer && Browser.chrome)) { - // Chrome >55 does not need the synthetic dblclicks from addDoubleTapListener - // See #5180 + } else if (Browser.touch && (type === 'dblclick') && !browserFiresNativeDblClick()) { addDoubleTapListener(obj, handler, id); } else if ('addEventListener' in obj) { @@ -130,8 +134,7 @@ function removeOne(obj, type, fn, context) { if (Browser.pointer && type.indexOf('touch') === 0) { removePointerListener(obj, type, id); - } else if (Browser.touch && (type === 'dblclick') && removeDoubleTapListener && - !(Browser.pointer && Browser.chrome)) { + } else if (Browser.touch && (type === 'dblclick') && !browserFiresNativeDblClick()) { removeDoubleTapListener(obj, id); } else if ('removeEventListener' in obj) { diff --git a/src/map/handler/Map.Tap.js b/src/map/handler/Map.Tap.js index 9162637e6c4..cfc3df69e2d 100644 --- a/src/map/handler/Map.Tap.js +++ b/src/map/handler/Map.Tap.js @@ -131,6 +131,6 @@ export var Tap = Handler.extend({ // @section Handlers // @property tap: Handler // Mobile touch hacks (quick tap and touch hold) handler. -if (Browser.touch && !Browser.pointer) { +if (Browser.touch && (!Browser.pointer || Browser.safari)) { Map.addInitHook('addHandler', 'tap', Tap); } From a6b5ca192acb47ae0c8dfd8e1d7e6e4cde78f841 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 20 Mar 2020 11:47:14 +0200 Subject: [PATCH 050/306] only keep reference docs for latest minor versions --- docs/reference-1.0.0.html | 22709 ------------------------------ docs/reference-1.0.2.html | 23201 ------------------------------ docs/reference-1.3.0.html | 23904 ------------------------------- docs/reference-1.3.1.html | 4 - docs/reference-1.3.2.html | 23924 ------------------------------- docs/reference-1.3.3.html | 4 - docs/reference-1.5.0.html | 24804 --------------------------------- docs/reference-versions.html | 6 +- 8 files changed, 1 insertion(+), 118555 deletions(-) delete mode 100644 docs/reference-1.0.0.html delete mode 100644 docs/reference-1.0.2.html delete mode 100644 docs/reference-1.3.0.html delete mode 100644 docs/reference-1.3.1.html delete mode 100644 docs/reference-1.3.2.html delete mode 100644 docs/reference-1.3.3.html delete mode 100644 docs/reference-1.5.0.html diff --git a/docs/reference-1.0.0.html b/docs/reference-1.0.0.html deleted file mode 100644 index 8e48f4c7718..00000000000 --- a/docs/reference-1.0.0.html +++ /dev/null @@ -1,22709 +0,0 @@ ---- -layout: v2 -title: Documentation -bodyclass: api-page ---- - -

    API Reference

    - -

    This reference reflects Leaflet 1.0.0. Check this list if you are using a different version of Leaflet.

    -
    - -
    -

    UI Layers

    - -

    Raster Layers

    - -

    Vector Layers

    - -
    -
    -

    Other Layers

    - -

    Basic Types

    - -

    Controls

    - -
    -
    - - - - - - -

    Utility

    - -

    DOM Utility

    - -
    -
    -

    Base Classes

    - - -

    Misc

    - -
    -
    - -

    Map

    The central class of the API — it is used to create a map on a page and manipulate it.

    - -
    -

    Usage example

    - -
    - - - - - -
    // initialize the map on the "map" div with a given center and zoom
    -var map = L.map('map', {
    -    center: [51.505, -0.09],
    -    zoom: 13
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.map(<String> id, <Map options> options?)Instantiates a map object given the DOM ID of a <div> element -and optionally an object literal with Map options.
    L.map(<HTMLElement> el, <Map options> options?)Instantiates a map object given an instance of a <div> HTML element -and optionally an object literal with Map options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    preferCanvasBoolean - falseWhether Paths should be rendered on a Canvas renderer. -By default, all Paths are rendered in a SVG renderer.
    - -
    - -

    Control options

    - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionControlBoolean - trueWhether a attribution control is added to the map by default.
    zoomControlBoolean - trueWhether a zoom control is added to the map by default.
    - -
    - -

    Interaction Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    closePopupOnClickBoolean - trueSet it to false if you don't want popups to close when user clicks the map.
    zoomSnapNumber - 1Forces the map's zoom level to always be a multiple of this, particularly -right after a fitBounds() or a pinch-zoom. -By default, the zoom level snaps to the nearest integer; lower values -(e.g. 0.5 or 0.1) allow for greater granularity. A value of 0 -means the zoom level will not be snapped after fitBounds or a pinch-zoom.
    zoomDeltaNumber - 1Controls how much the map's zoom level will change after a -zoomIn(), zoomOut(), pressing + -or - on the keyboard, or using the zoom controls. -Values smaller than 1 (e.g. 0.5) allow for greater granularity.
    trackResizeBoolean - trueWhether the map automatically handles browser window resize to update itself.
    boxZoomBoolean - trueWhether the map can be zoomed to a rectangular area specified by -dragging the mouse while pressing the shift key.
    doubleClickZoomBoolean|String - trueWhether the map can be zoomed in by double clicking on it and -zoomed out by double clicking while holding shift. If passed -'center', double-click zoom will zoom to the center of the - view regardless of where the mouse was.
    draggingBoolean - trueWhether the map be draggable with mouse/touch or not.
    - -
    - -

    Map State Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    crsCRS - L.CRS.EPSG3857The Coordinate Reference System to use. Don't change this if you're not -sure what it means.
    centerLatLng - undefinedInitial geographic center of the map
    zoomNumber - undefinedInitial map zoom level
    minZoomNumber - undefinedMinimum zoom level of the map. Overrides any minZoom option set on map layers.
    maxZoomNumber - undefinedMaximum zoom level of the map. Overrides any maxZoom option set on map layers.
    layersLayer[] - []Array of layers that will be added to the map initially
    maxBoundsLatLngBounds - nullWhen this option is set, the map restricts the view to the given -geographical bounds, bouncing the user back when he tries to pan -outside the view. To set the restriction dynamically, use -setMaxBounds method.
    rendererRenderer - *The default method for drawing vector layers on the map. L.SVG -or L.Canvas by default depending on browser support.
    - -
    - -

    Animation Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    fadeAnimationBoolean - trueWhether the tile fade animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    markerZoomAnimationBoolean - trueWhether markers animate their zoom with the zoom animation, if disabled -they will disappear for the length of the animation. By default it's -enabled in all browsers that support CSS3 Transitions except Android.
    transform3DLimitNumber - 2^23Defines the maximum size of a CSS translation transform. The default -value should not be changed unless a web browser positions layers in -the wrong place after doing a large panBy.
    zoomAnimationBoolean - trueWhether the map zoom animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    zoomAnimationThresholdNumber - 4Won't animate zoom if the zoom difference exceeds this value.
    - -
    - -

    Panning Inertia Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    inertiaBoolean - *If enabled, panning of the map will have an inertia effect where -the map builds momentum while dragging and continues moving in -the same direction for some time. Feels especially nice on touch -devices. Enabled by default unless running on old Android devices.
    inertiaDecelerationNumber - 3000The rate with which the inertial movement slows down, in pixels/second².
    inertiaMaxSpeedNumber - InfinityMax speed of the inertial movement, in pixels/second.
    easeLinearityNumber - 0.2
    worldCopyJumpBoolean - falseWith this option enabled, the map tracks when you pan to another "copy" -of the world and seamlessly jumps to the original one so that all overlays -like markers and vector layers are still visible.
    maxBoundsViscosityNumber - 0.0If maxBounds is set, this option will control how solid the bounds -are when dragging the map around. The default value of 0.0 allows the -user to drag outside the bounds at normal speed, higher values will -slow down map dragging outside bounds, and 1.0 makes the bounds fully -solid, preventing the user from dragging outside the bounds.
    - -
    - -

    Keyboard Navigation Options

    - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    keyboardBoolean - trueMakes the map focusable and allows users to navigate the map with keyboard -arrows and +/- keys.
    keyboardPanDeltaNumber - 80Amount of pixels to pan when pressing an arrow key.
    - -
    - -

    Mousewheel options

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    scrollWheelZoomBoolean|String - trueWhether the map can be zoomed by using the mouse wheel. If passed 'center', -it will zoom to the center of the view regardless of where the mouse was.
    wheelDebounceTimeNumber - 40Limits the rate at which a wheel can fire (in milliseconds). By default -user can't zoom via wheel more often than once per 40 ms.
    wheelPxPerZoomLevelNumber - 60How many scroll pixels (as reported by L.DomEvent.getWheelDelta) -mean a change of one full zoom level. Smaller values will make wheel-zooming -faster (and vice versa).
    - -
    - -

    Touch interaction options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tapBoolean - trueEnables mobile hacks for supporting instant taps (fixing 200ms click -delay on iOS/Android) and touch holds (fired as contextmenu events).
    tapToleranceNumber - 15The max number of pixels a user can shift his finger during touch -for it to be considered a valid tap.
    touchZoomBoolean|String - *Whether the map can be zoomed by touch-dragging with two fingers. If -passed 'center', it will zoom to the center of the view regardless of -where the touch events (fingers) were. Enabled for touch-capable web -browsers except for old Androids.
    bounceAtZoomLimitsBoolean - trueSet it to false if you don't want the map to zoom beyond min/max zoom -and then bounce back when pinch-zooming.
    - -
    - - -
    -

    Events

    - -
    - -

    Layer events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    baselayerchange - LayersControlEventFired when the base layer is changed through the layer control.
    overlayadd - LayersControlEventFired when an overlay is selected through the layer control.
    overlayremove - LayersControlEventFired when an overlay is deselected through the layer control.
    layeradd - LayerEventFired when a new layer is added to the map.
    layerremove - LayerEventFired when some layer is removed from the map
    - -
    - -

    Map state change events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    zoomlevelschange - EventFired when the number of zoomlevels on the map is changed due -to adding or removing a layer.
    resize - ResizeEventFired when the map is resized.
    unload - EventFired when the map is destroyed with remove method.
    viewreset - EventFired when the map needs to redraw its content (this usually happens -on map zoom or load). Very useful for creating custom overlays.
    load - EventFired when the map is initialized (when its center and zoom are set -for the first time).
    zoomstart - EventFired when the map zoom is about to change (e.g. before zoom animation).
    movestart - EventFired when the view of the map starts changing (e.g. user starts dragging the map).
    zoom - EventFired repeatedly during any change in zoom level, including zoom -and fly animations.
    move - EventFired repeatedly during any movement of the map, including pan and -fly animations.
    zoomend - EventFired when the map has changed, after any animations.
    moveend - EventFired when the center of the map stops changing (e.g. user stopped -dragging the map).
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup is opened in the map
    popupclose - PopupEventFired when a popup in the map is closed
    autopanstart - EventFired when the map starts autopanning when opening a popup.
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip is opened in the map.
    tooltipclose - TooltipEventFired when a tooltip in the map is closed.
    - -
    - -

    Interaction events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the map.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the map.
    mousedown - MouseEventFired when the user pushes the mouse button on the map.
    mouseup - MouseEventFired when the user releases the mouse button on the map.
    mouseover - MouseEventFired when the mouse enters the map.
    mouseout - MouseEventFired when the mouse leaves the map.
    mousemove - MouseEventFired while the mouse moves over the map.
    contextmenu - MouseEventFired when the user pushes the right mouse button on the map, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    keypress - KeyboardEventFired when the user presses a key from the keyboard while the map is focused.
    preclick - MouseEventFired before mouse click on the map (sometimes useful when you -want something to happen on click before any existing click -handlers start running).
    - -
    - -

    Animation Options

    - - - - - - - - - - - - - -
    EventDataDescription
    zoomanim - ZoomAnimEventFired on every frame of a zoom animation
    - -
    - -

    Location events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    locationerror - ErrorEventFired when geolocation (using the locate method) failed.
    locationfound - LocationEventFired when geolocation (using the locate method) -went successfully.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getRenderer(<Path> layer)Renderer

    Returns the instance of Renderer that should be used to render the given -Path. It will ensure that the renderer options of the map and paths -are respected, and that the renderers do exist on the map.

    -
    - -
    - -

    Methods for Layers and Controls

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addControl(<Control> control)this

    Adds the given control to the map

    -
    removeControl(<Control> control)this

    Removes the given control from the map

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the map

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the map.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the map

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the map, optionally specifying context of the iterator function.

    -
    map.eachLayer(function(layer){
    -    layer.bindPopup('Hello');
    -});
    -
    openPopup(<Popup> popup)this

    Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).

    -
    openPopup(<String|HTMLElement> content, <LatLng> latlng, <Popup options> options?)this

    Creates a popup with the specified content and options and opens it in the given point on a map.

    -
    closePopup(<Popup> popup?)this

    Closes the popup previously opened with openPopup (or the given one).

    -
    openTooltip(<Tooltip> tooltip)this

    Opens the specified tooltip.

    -
    openTooltip(<String|HTMLElement> content, <LatLng> latlng, <Tooltip options> options?)this

    Creates a tooltip with the specified content and options and open it.

    -
    closeTooltip(<Tooltip> tooltip?)this

    Closes the tooltip given as parameter.

    -
    - -
    - -

    Methods for modifying map state

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setView(<LatLng> center, <Number> zoom, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) with the given -animation options.

    -
    setZoom(<Number> zoom, <Zoom/pan options> options)this

    Sets the zoom of the map.

    -
    zoomIn(<Number> delta?, <Zoom options> options?)this

    Increases the zoom of the map by delta (zoomDelta by default).

    -
    zoomOut(<Number> delta?, <Zoom options> options?)this

    Decreases the zoom of the map by delta (zoomDelta by default).

    -
    setZoomAround(<LatLng> latlng, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified geographical point on the map -stationary (e.g. used internally for scroll zoom and double-click zoom).

    -
    setZoomAround(<Point> offset, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.

    -
    fitBounds(<LatLngBounds> bounds, <fitBounds options> options)this

    Sets a map view that contains the given geographical bounds with the -maximum zoom level possible.

    -
    fitWorld(<fitBounds options> options?)this

    Sets a map view that mostly contains the whole world with the maximum -zoom level possible.

    -
    panTo(<LatLng> latlng, <Pan options> options?)this

    Pans the map to a given center.

    -
    panBy(<Point> offset)this

    Pans the map by a given number of pixels (animated).

    -
    setMaxBounds(<Bounds> bounds)this

    Restricts the map view to the given bounds (see the maxBounds option).

    -
    setMinZoom(<Number> zoom)this

    Sets the lower limit for the available zoom levels (see the minZoom option).

    -
    setMaxZoom(<Number> zoom)this

    Sets the upper limit for the available zoom levels (see the maxZoom option).

    -
    panInsideBounds(<LatLngBounds> bounds, <Pan options> options?)this

    Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.

    -
    invalidateSize(<Zoom/Pan options> options)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default. If options.pan is false, panning will not occur. -If options.debounceMoveend is true, it will delay moveend event so -that it doesn't happen often even if the method is called many -times in a row.

    -
    invalidateSize(<Boolean> animate)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default.

    -
    stop()this

    Stops the currently running panTo or flyTo animation, if any.

    -
    flyTo(<LatLng> latlng, <Number> zoom?, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) performing a smooth -pan-zoom animation.

    -
    flyToBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets the view of the map with a smooth animation like flyTo, -but takes a bounds parameter like fitBounds.

    -
    - -
    - -

    Other Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHandler(<String> name, <Function> HandlerClass)this

    Adds a new Handler to the map, given its name and constructor function.

    -
    remove()this

    Destroys the map and clears all related event listeners.

    -
    createPane(<String> name, <HTMLElement> container?)HTMLElement

    Creates a new map pane with the given name if it doesn't exist already, -then returns it. The pane is created as a children of container, or -as a children of the main map pane if not set.

    -
    getPane(<String|HTMLElement> pane)HTMLElement

    Returns a map pane, given its name or its HTML element (its identity).

    -
    getPanes()Object

    Returns a plain object containing the names of all panes as keys and -the panes as values.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the map.

    -
    whenReady(<Function> fn, <Object> context?)this

    Runs the given function fn when the map gets initialized with -a view (center and zoom) and at least one layer, or immediately -if it's already initialized, optionally passing a function context.

    -
    - -
    - -

    Methods for Getting Map State

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getCenter()LatLng

    Returns the geographical center of the map view

    -
    getZoom()Number

    Returns the current zoom level of the map view

    -
    getBounds()LatLngBounds

    Returns the geographical bounds visible in the current map view

    -
    getMinZoom()Number

    Returns the minimum zoom level of the map (if set in the minZoom option of the map or of any layers), or 0 by default.

    -
    getMaxZoom()Number

    Returns the maximum zoom level of the map (if set in the maxZoom option of the map or of any layers).

    -
    getBoundsZoom(<LatLngBounds> bounds, <Boolean> inside?)Number

    Returns the maximum zoom level on which the given bounds fit to the map -view in its entirety. If inside (optional) is set to true, the method -instead returns the minimum zoom level on which the map view fits into -the given bounds in its entirety.

    -
    getSize()Point

    Returns the current size of the map container (in pixels).

    -
    getPixelBounds()Bounds

    Returns the bounds of the current map view in projected pixel -coordinates (sometimes useful in layer and overlay implementations).

    -
    getPixelOrigin()Point

    Returns the projected pixel coordinates of the top left point of -the map layer (useful in custom layer and overlay implementations).

    -
    getPixelWorldBounds(<Number> zoom?)Bounds

    Returns the world's bounds in pixel coordinates for zoom level zoom. -If zoom is omitted, the map's current zoom level is used.

    -
    - -
    - -

    Conversion Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getZoomScale(<Number> toZoom, <Number> fromZoom)Number

    Returns the scale factor to be applied to a map transition from zoom level -fromZoom to toZoom. Used internally to help with zoom animations.

    -
    getScaleZoom(<Number> scale, <Number> fromZoom)Number

    Returns the zoom level that the map would end up at, if it is at fromZoom -level and everything is scaled by a factor of scale. Inverse of -getZoomScale.

    -
    project(<LatLng> latlng, <Number> zoom)Point

    Projects a geographical coordinate LatLng according to the projection -of the map's CRS, then scales it according to zoom and the CRS's -Transformation. The result is pixel coordinate relative to -the CRS origin.

    -
    unproject(<Point> point, <Number> zoom)LatLng

    Inverse of project.

    -
    layerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToLayerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the origin pixel.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -map's CRS's wrapLat and wrapLng properties, if they are outside the -CRS's bounds. -By default this means longitude is wrapped around the dateline so its -value is between -180 and +180 degrees.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates according to -the map's CRS. By default this measures distance in meters.

    -
    containerPointToLayerPoint(<Point> point)Point

    Given a pixel coordinate relative to the map container, returns the corresponding -pixel coordinate relative to the origin pixel.

    -
    layerPointToContainerPoint(<Point> point)Point

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding pixel coordinate relative to the map container.

    -
    containerPointToLatLng(<Point> point)Point

    Given a pixel coordinate relative to the map container, returns -the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToContainerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the map container.

    -
    mouseEventToContainerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to the -map container where the event took place.

    -
    mouseEventToLayerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to -the origin pixel where the event took place.

    -
    mouseEventToLatLng(<MouseEvent> ev)LatLng

    Given a MouseEvent object, returns geographical coordinate where the -event took place.

    -
    - -
    - -

    Geolocation methods

    - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    locate(<Locate options> options?)this

    Tries to locate the user using the Geolocation API, firing a locationfound -event with location data on success or a locationerror event on failure, -and optionally sets the map view to the user's location with respect to -detection accuracy (or to the world view if geolocation failed). -Note that, if your page doesn't use HTTPS, this method will fail in -modern browsers (Chrome 50 and newer) -See Locate options for more details.

    -
    stopLocate()this

    Stops watching location previously initiated by map.locate({watch: true}) -and aborts resetting the map view if map.locate was called with -{setView: true}.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Handlers

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    boxZoom - HandlerBox (shift-drag with mouse) zoom handler.
    doubleClickZoom - HandlerDouble click zoom handler.
    dragging - HandlerMap dragging handler (by both mouse and touch).
    keyboard - HandlerKeyboard navigation handler.
    scrollWheelZoom - HandlerScroll wheel zoom handler.
    tap - HandlerMobile touch hacks (quick tap and touch hold) handler.
    touchZoom - HandlerTouch zoom handler.
    - -
    - - -
    -

    Map panes

    - -
    - - - -
    Panes are DOM elements used to control the ordering of layers on the map. You -can access panes with map.getPane or -map.getPanes methods. New panes can be created with the -map.createPane method. -Every map has the following default panes that differ only in zIndex.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PaneTypeZ-indexDescription
    mapPaneHTMLElement - 'auto'Pane that contains all other map panes
    tilePaneHTMLElement - 200Pane for GridLayers and TileLayers
    overlayPaneHTMLElement - 400Pane for vector overlays (Paths), like Polylines and Polygons
    shadowPaneHTMLElement - 500Pane for overlay shadows (e.g. Marker shadows)
    markerPaneHTMLElement - 600Pane for Icons of Markers
    tooltipPaneHTMLElement - 650Pane for tooltip.
    popupPaneHTMLElement - 700Pane for Popups.
    - -
    - - -
    - -
    -

    Locate options

    - -
    - - - -
    Some of the geolocation methods for Map take in an options parameter. This -is a plain javascript object with the following optional components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    watchBoolean - falseIf true, starts continuous watching of location changes (instead of detecting it -once) using W3C watchPosition method. You can later stop watching using -map.stopLocate() method.
    setViewBoolean - falseIf true, automatically sets the map view to the user location with respect to -detection accuracy, or to world view if geolocation failed.
    maxZoomNumber - InfinityThe maximum zoom for automatic view setting when using setView option.
    timeoutNumber - 10000Number of milliseconds to wait for a response from geolocation before firing a -locationerror event.
    maximumAgeNumber - 0Maximum age of detected location. If less than this amount of milliseconds -passed since last geolocation response, locate will return a cached location.
    enableHighAccuracyBoolean - falseEnables high accuracy, see description in the W3C spec.
    - -
    - - -
    - -
    -

    Zoom options

    - -
    - - - -
    Some of the Map methods which modify the zoom level take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    - - -
    - -
    -

    Pan options

    - -
    - - - -
    Some of the Map methods which modify the center of the map take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If true, panning will always be animated if possible. If false, it will -not animate panning, either resetting the map view if panning more than a -screen away, or just setting a new offset for the map pane (except for panBy -which always does the latter).
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -the less the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    - - -
    - -
    -

    Zoom/pan options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -the less the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -
    - -
    -

    FitBounds options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingTopLeftPoint - [0, 0]Sets the amount of padding in the top left corner of a map container that -shouldn't be accounted for when setting the view to fit bounds. Useful if you -have some control overlays on the map like a sidebar and you don't want them -to obscure objects you're zooming to.
    paddingBottomRightPoint - [0, 0]The same for the bottom right corner of the map.
    paddingPoint - [0, 0]Equivalent of setting both top left and bottom right padding to the same value.
    maxZoomNumber - nullThe maximum possible zoom to use.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -the less the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -

    Marker

    L.Marker is used to display clickable/draggable icons on the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.marker([50.5, 30.5]).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.marker(<LatLng> latlng, <Marker options> options?)Instantiates a Marker object given a geographical point and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconIcon - *Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. If not specified, a new L.Icon.Default is used.
    draggableBoolean - falseWhether the marker is draggable with mouse/touch or not.
    keyboardBoolean - trueWhether the marker can be tabbed to with a keyboard and clicked by pressing enter.
    titleString - ''Text for the browser tooltip that appear on marker hover (no tooltip by default).
    altString - ''Text for the alt attribute of the icon image (useful for accessibility).
    zIndexOffsetNumber - 0By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
    opacityNumber - 1.0The opacity of the marker.
    riseOnHoverBoolean - falseIf true, the marker will get on top of others when you hover the mouse over it.
    riseOffsetNumber - 250The z-index offset used for the riseOnHover feature.
    paneString - 'markerPane'Map pane where the markers icon will be added.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    move - EventFired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    - -
    - -

    Dragging events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    dragstart - EventFired when the user starts dragging the marker.
    movestart - EventFired when the marker starts moving (because of dragging).
    drag - EventFired repeatedly while the user drags the marker.
    dragend - DragEndEventFired when the user stops dragging the marker.
    moveend - EventFired when the marker stops moving (because of dragging).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - -
    In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLng()LatLng

    Returns the current geographical position of the marker.

    -
    setLatLng(<LatLng> latlng)this

    Changes the marker position to the given point.

    -
    setZIndexOffset(<Number> offset)this

    Changes the zIndex offset of the marker.

    -
    setIcon(<Icon> icon)this

    Changes the marker icon.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the marker.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Interaction handlers

    - -
    Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see Handler methods). Example: -
    marker.dragging.disable();
    -
    - - - - - - - - - - - - -
    PropertyTypeDescription
    dragging - HandlerMarker dragging handler (by both mouse and touch).
    - -
    - - -

    Used to open popups in certain places of the map. Use Map.openPopup to -open popups while making sure that only one popup is open at one time -(recommended for usability), or use Map.addLayer to open as many as you want.

    - -
    - - -
    - - - - - -

    If you want to just bind a popup to marker click and then open it, it's really easy:

    -
    marker.bindPopup(popupContent).openPopup();
    -
    -

    Path overlays like polylines also have a bindPopup method. -Here's a more complicated way to open a popup on a map:

    -
    var popup = L.popup()
    -    .setLatLng(latlng)
    -    .setContent('<p>Hello world!<br />This is a nice popup.</p>')
    -    .openOn(map);
    -
    - - - -
    - - -
    - - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    - -
    - - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -

    Tooltip

    Used to display small texts on top of map layers.

    - -
    -

    Usage example

    - -
    - - - - - -
    marker.bindTooltip("my tooltip text").openTooltip();
    -
    -

    Note about tooltip offset. Leaflet takes two options in consideration -for computing tooltip offseting:

    -
      -
    • the offset Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. -Add a positive x offset to move the tooltip to the right, and a positive y offset to -move it to the bottom. Negatives will move to the left and top.
    • -
    • the tooltipAnchor Icon option: this will only be considered for Marker. You -should adapt this value if you use a custom icon.
    • -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tooltip(<Tooltip options> options?, <Layer> source?)Instantiates a Tooltip object given an optional options object that describes its appearance and location and an optional source object that is used to tag the tooltip with a reference to the Layer to which it refers.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'tooltipPane'Map pane where the tooltip will be added.
    offsetPoint - Point(0, 0)Optional offset of the tooltip position.
    directionString - 'auto'Direction where to open the tooltip. Possible values are: right, left, -top, bottom, center, auto. -auto will dynamically switch between right and left according to the tooltip -position on the map.
    permanentBoolean - falseWhether to open the tooltip permanently or only on mouseover.
    stickyBoolean - falseIf true, the tooltip will follow the mouse instead of being fixed at the feature center.
    interactiveBoolean - falseIf true, the tooltip will listen to the feature events.
    opacityNumber - 0.9Tooltip container opacity.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    classNameString - ''A custom CSS class name to assign to the popup.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer

    Used to load and display tile layers on the map. Extends GridLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map);
    -
    - - - -
    - -

    URL template

    - - - -

    A string of the following form:

    -
    'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
    -

    You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

    -
    L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
    -
    - - -
    - - -
    -

    Creation

    - -
    - -

    Extension methods

    - - - - - - - - - - - - -
    FactoryDescription
    L.tilelayer(<String> urlTemplate, <TileLayer options> options?)Instantiates a tile layer object given a URL template and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber - 0Minimum zoom number.
    maxZoomNumber - 18Maximum zoom number.
    maxNativeZoomNumber - nullMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    subdomainsString|String[] - 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString - ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber - 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean - falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean - falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean - falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean - falseIf true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - dependsIf false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile browsers, otherwise false.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true).

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending TileLayer might reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    getTileUrl(<Object> coords)String

    Called only internally, returns the URL for a tile given its coordinates. -Classes extending TileLayer can override this function to provide custom tile URL naming schemes.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer.WMS

    Used to display WMS services as tile layers on the map. Extends TileLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
    -    layers: 'nexrad-n0r-900913',
    -    format: 'image/png',
    -    transparent: true,
    -    attribution: "Weather data © 2012 IEM Nexrad"
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tileLayer.wms(<String> baseUrl, <TileLayer.WMS options> options)Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
    - -
    - - -
    -

    Options

    - -
    - - - -
    If any custom options not documented here are used, they will be sent to the -WMS server as extra parameters in each request URL. This can be useful for -non-standard vendor WMS parameters.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    layersString - ''(required) Comma-separated list of WMS layers to show.
    stylesString - ''Comma-separated list of WMS styles.
    formatString - 'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
    transparentBoolean - falseIf true, the WMS service will return images with transparency.
    versionString - '1.1.1'Version of the WMS service to use
    crsCRS - nullCoordinate Reference System to use for the WMS requests, defaults to -map CRS. Don't change this if you're not sure what it means.
    uppercaseBoolean - falseIf true, WMS request parameter keys will be uppercase.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber - 0Minimum zoom number.
    maxZoomNumber - 18Maximum zoom number.
    maxNativeZoomNumber - nullMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    subdomainsString|String[] - 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString - ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber - 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean - falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean - falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean - falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean - falseIf true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - dependsIf false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile browsers, otherwise false.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setParams(<Object> params, <Boolean> noRedraw?)this

    Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true).

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    ImageOverlay

    Used to load and display a single image over specific bounds of the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
    -    imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
    -L.imageOverlay(imageUrl, imageBounds).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.imageOverlay(<String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options?)Instantiates an image overlay object given the URL of the image and the -geographical bounds it is tied to.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber - 1.0The opacity of the image overlay.
    altString - ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean - falseIf true, the image overlay will emit mouse events when clicked or hovered.
    attributionString - nullAn optional string containing HTML to be shown on the Attribution control
    crossOriginBoolean - falseIf true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Path

    An abstract class that contains options and constants shared between vector -overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polyline

    A class for drawing polyline overlays on a map. Extends Path.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polyline from an array of LatLng points
    -var latlngs = [
    -    [45.51, -122.68],
    -    [37.77, -122.43],
    -    [34.04, -118.2]
    -];
    -var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
    -// zoom the map to the polyline
    -map.fitBounds(polyline.getBounds());
    -
    -

    You can also pass a multi-dimensional array to represent a MultiPolyline shape:

    -
    // create a red polyline from an array of arrays of LatLng points
    -var latlngs = [
    -    [[45.51, -122.68],
    -     [37.77, -122.43],
    -     [34.04, -118.2]],
    -    [[40.78, -73.91],
    -     [41.83, -87.62],
    -     [32.76, -96.72]]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polyline(<LatLng[]> latlngs, <Polyline options> options?)Instantiates a polyline object given an array of geographical points and -optionally an options object. You can create a Polyline object with -multiple separate lines (MultiPolyline) by passing an array of arrays -of geographic points.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

    -
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polygon

    A class for drawing polygon overlays on a map. Extends Polyline. -Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polygon from an array of LatLng points
    -var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
    -var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
    -// zoom the map to the polygon
    -map.fitBounds(polygon.getBounds());
    -
    -

    You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

    -
    var latlngs = [
    -  [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -  [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -];
    -
    -

    Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

    -
    var latlngs = [
    -  [ // first polygon
    -    [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -    [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -  ],
    -  [ // second polygon
    -    [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
    -  ]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polygon(<LatLng[]> latlngs, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Rectangle

    A class for drawing rectangle overlays on a map. Extends Polygon.

    - -
    -

    Usage example

    - -
    - - - - - -
    // define rectangle geographical bounds
    -var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
    -// create an orange rectangle
    -L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
    -// zoom the map to the rectangle bounds
    -map.fitBounds(bounds);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.rectangle(<LatLngBounds> latLngBounds, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setBounds(<LatLngBounds> latLngBounds)this

    Redraws the rectangle with the passed bounds.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Circle

    A class for drawing circle overlays on a map. Extends CircleMarker. -It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).

    - -
    -

    Usage example

    - -
    - - - - - -
    L.circle([50.5, 30.5], 200).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.circle(<LatLng> latlng, <Circle options> options?)Instantiates a circle object given a geographical point, and an options object -which contains the circle radius.
    L.circle(<LatLng> latlng, <Number> radius, <Circle options> options?)Obsolete way of instantiating a circle, for compatibility with 0.7.x code. -Do not use in new applications or plugins.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumber - Radius of the circle, in meters.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setRadius(<Number> radius)this

    Sets the radius of a circle. Units are in meters.

    -
    getRadius()Number

    Returns the current radius of a circle. Units are in meters.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    CircleMarker

    A circle of a fixed size with radius specified in pixels. Extends Path.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.circleMarker(<LatLng> latlng, <CircleMarker options> options?)Instantiates a circle marker object given a geographical point, and an optional options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumber - 10Radius of the circle marker, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - -
    There are several static functions which can be called without instantiating L.GeoJSON:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    setRadius(<Number> radius)this

    Sets the radius of a circle marker. Units are in pixels.

    -
    getRadius()Number

    Returns the current radius of the circle

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    SVG

    Although SVG is not available on IE7 and IE8, these browsers support VML, and the SVG renderer will fall back to VML in this case. -VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility -with old versions of Internet Explorer.

    -

    Allows vector layers to be displayed with SVG. -Inherits Renderer. -Due to technical limitations, SVG is not -available in all web browsers, notably Android 2.x and 3.x. -Although SVG is not available on IE7 and IE8, these browsers support -VML -(a now deprecated technology), and the SVG renderer will fall back to VML in -this case.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use SVG by default for all paths in the map:

    -
    var map = L.map('map', {
    -    renderer: L.svg();
    -});
    -
    -

    Use a SVG renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.svg({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.svg(<Renderer options> options?)Creates a SVG renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - -
    There are several static functions which can be called without instantiating L.SVG:
    - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    create(<String> name)SVGElementReturns a instance of SVGElement, -corresponding to the class name passed. For example, using 'line' will return -an instance of SVGLineElement.
    pointsToPath(<Point[]> rings, <Boolean> closed)StringGenerates a SVG path string for multiple rings, with each ring turning -into "M..L..L.." instructions
    - -
    - - -

    Canvas

    Allows vector layers to be displayed with <canvas>. -Inherits Renderer. -Due to technical limitations, Canvas is not -available in all web browsers, notably IE8, and overlapping geometries might -not display properly in some edge cases.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use Canvas by default for all paths in the map:

    -
    var map = L.map('map', {
    -    renderer: L.canvas()
    -});
    -
    -

    Use a Canvas renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.canvas({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.canvas(<Renderer options> options?)Creates a Canvas renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LayerGroup

    Used to group several layers and handle them as one. If you add it to the map, -any layers added or removed from the group will be added/removed on the map as -well. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.layerGroup([marker1, marker2])
    -    .addLayer(polyline)
    -    .addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.layerGroup(<Layer[]> layers)Create a layer group, optionally given an initial set of layers.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON GeometryCollection).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    FeatureGroup

    Extended LayerGroup that makes it easier to do the same thing to all its member layers:

    -
      -
    • bindPopup binds a popup to all of the layers at once (likewise with bindTooltip)
    • -
    • Events are propagated to the FeatureGroup, so if the group has an event -handler, it will handle events from any of the layers. This includes mouse events -and custom events.
    • -
    • Has layeradd and layerremove events
    • -
    - -
    -

    Usage example

    - -
    - - - - - -
    L.featureGroup([marker1, marker2, polyline])
    -    .bindPopup('Hello world!')
    -    .on('click', function() { alert('Clicked on a member of the group!'); })
    -    .addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.featureGroup(<Layer[]> layers)Create a feature group, optionally given an initial set of layers.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeradd - LayerEventFired when a layer is added to this FeatureGroup
    layerremove - LayerEventFired when a layer is removed from this FeatureGroup
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setStyle(<Path options> style)this

    Sets the given path options to each layer of the group that has a setStyle method.

    -
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON GeometryCollection).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    GeoJSON

    Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse -GeoJSON data and display it on the map. Extends FeatureGroup.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.geoJSON(data, {
    -    style: function (feature) {
    -        return {color: feature.properties.color};
    -    }
    -}).bindPopup(function (layer) {
    -    return layer.feature.properties.description;
    -}).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.geoJSON(<Object> geojson?, <GeoJSON options> options?)Creates a GeoJSON layer. Optionally accepts an object in -GeoJSON format to display on the map -(you can alternatively add it later with addData method) and an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    pointToLayerFunction - *A Function defining how GeoJSON points spawn Leaflet layers. It is internally -called when data is added, passing the GeoJSON point feature and its LatLng. -The default is to spawn a default Marker: -
    function(geoJsonPoint, latlng) {
    -    return L.marker(latlng);
    -}
    -
    styleFunction - *A Function defining the Path options for styling GeoJSON lines and polygons, -called internally when data is added. -The default value is to not override any defaults: -
    function (geoJsonFeature) {
    -    return {}
    -}
    -
    onEachFeatureFunction - *A Function that will be called once for each created Feature, after it has -been created and styled. Useful for attaching events and popups to features. -The default is to do nothing with the newly created layers: -
    function (feature, layer) {}
    -
    filterFunction - *A Function that will be used to decide whether to show a feature or not. -The default is to show all features: -
    function (geoJsonFeature) {
    -    return true;
    -}
    -
    coordsToLatLngFunction - *A Function that will be used for converting GeoJSON coordinates to LatLngs. -The default is the coordsToLatLng static method.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeradd - LayerEventFired when a layer is added to this FeatureGroup
    layerremove - LayerEventFired when a layer is removed from this FeatureGroup
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setStyle(<Path options> style)this

    Sets the given path options to each layer of the group that has a setStyle method.

    -
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON GeometryCollection).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    addData(data)LayerAdds a GeoJSON object to the layer.
    resetStyle(layer)LayerResets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.
    setStyle(style)LayerChanges styles of GeoJSON vector layers with the given style function.
    geometryToLayer(<Object> featureData, <GeoJSON options> options?)LayerCreates a Layer from a given GeoJSON feature. Can use a custom -pointToLayer and/or coordsToLatLng -functions if provided as options.
    coordsToLatLng(<Array> coords)LatLngCreates a LatLng object from an array of 2 numbers (longitude, latitude) -or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
    coordsToLatLngs(<Array> coords, <Number> levelsDeep?, <Function> coordsToLatLng?)ArrayCreates a multidimensional array of LatLngs from a GeoJSON coordinates array. -levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). -Can use a custom coordsToLatLng function.
    latLngToCoords(<LatLng> latlng)ArrayReverse of coordsToLatLng
    latLngsToCoords(<Array> latlngs, <Number> levelsDeep?, <Boolean> closed?)ArrayReverse of coordsToLatLngs -closed determines whether the first point should be appended to the end of the array to close the feature, only used when levelsDeep is 0. False by default.
    asFeature(<Object> geojson)ObjectNormalize GeoJSON geometries/features into GeoJSON features.
    - -
    - - -

    GridLayer

    Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas. -GridLayer can be extended to create a tiled grid of HTML elements like <canvas>, <img> or <div>. GridLayer will handle creating and animating these DOM elements for you.

    - -
    -

    Usage example

    - -
    - -

    Synchronous usage

    - - - -

    To create a custom layer, extend GridLayer and implement the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords){
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -        // get a canvas context and draw something on it using coords.x, coords.y and coords.z
    -        var ctx = tile.getContext('2d');
    -        // return the tile so it can be rendered on screen
    -        return tile;
    -    }
    -});
    -
    - - - -
    - -

    Asynchronous usage

    - - - -

    Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the done() callback.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords, done){
    -        var error;
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -        // draw something asynchronously and pass the tile to the done() callback
    -        setTimeout(function() {
    -            done(error, tile);
    -        }, 1000);
    -        return tile;
    -    }
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
    - -
    - - -
    -

    Options

    - -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - dependsIf false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile browsers, otherwise false.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    minZoomNumber - 0The minimum zoom level that tiles will be loaded at. By default the entire map.
    maxZoomNumber - undefinedThe maximum zoom level that tiles will be loaded at.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending GridLayer shall reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, must be overridden by classes extending GridLayer. -Returns the HTMLElement corresponding to the given coords. If the done callback -is specified, it must be called when the tile has finished loading and drawing.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LatLng

    Represents a geographical point with a certain latitude and longitude.

    - -
    -

    Usage example

    - -
    - - - - - -
    var latlng = L.latLng(50.5, 30.5);
    -

    All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

    -
    map.panTo([50, 30]);
    -map.panTo({lon: 30, lat: 50});
    -map.panTo({lat: 50, lng: 30});
    -map.panTo(L.latLng(50, 30));
    -
    - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLng(<Number> latitude, <Number> longitude, <Number> altitude?)Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
    L.latLng(<Array> coords)Expects an array of the form [Number, Number] or [Number, Number, Number] instead.
    L.latLng(<Object> coords)Expects an plain object of the form {lat: Number, lng: Number} or {lat: Number, lng: Number, alt: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    equals(<LatLng> otherLatLng, <Number> maxMargin?)Boolean

    Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

    -
    toString()String

    Returns a string representation of the point (for debugging purposes).

    -
    distanceTo(<LatLng> otherLatLng)Number

    Returns the distance (in meters) to the given LatLng calculated using the Haversine formula.

    -
    wrap()LatLng

    Returns a new LatLng object with the longitude wrapped so it's always between -180 and +180 degrees.

    -
    toBounds(<Number> sizeInMeters)LatLngBounds

    Returns a new LatLngBounds object in which each boundary is sizeInMeters meters apart from the LatLng.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    lat - NumberLatitude in degrees
    lng - NumberLongitude in degrees
    alt - NumberAltitude in meters (optional)
    - -
    - - -

    LatLngBounds

    Represents a rectangular geographical area on a map.

    - -
    -

    Usage example

    - -
    - - - - - -
    var southWest = L.latLng(40.712, -74.227),
    -northEast = L.latLng(40.774, -74.125),
    -bounds = L.latLngBounds(southWest, northEast);
    -
    -

    All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    map.fitBounds([
    -    [40.712, -74.227],
    -    [40.774, -74.125]
    -]);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLngBounds(<LatLng> southWest, <LatLng> northEast)Creates a LatLngBounds object by defining south-west and north-east corners of the rectangle.
    L.latLngBounds(<LatLng[]> latlngs)Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<LatLng> latlng)this

    Extend the bounds to contain the given point

    -
    extend(<LatLngBounds> otherBounds)this

    Extend the bounds to contain the given bounds

    -
    pad(<Number> bufferRatio)LatLngBounds

    Returns bigger bounds created by extending the current bounds by a given percentage in each direction.

    -
    getCenter()LatLng

    Returns the center point of the bounds.

    -
    getSouthWest()LatLng

    Returns the south-west point of the bounds.

    -
    getNorthEast()LatLng

    Returns the north-east point of the bounds.

    -
    getNorthWest()LatLng

    Returns the north-west point of the bounds.

    -
    getSouthEast()LatLng

    Returns the south-east point of the bounds.

    -
    getWest()Number

    Returns the west longitude of the bounds

    -
    getSouth()Number

    Returns the south latitude of the bounds

    -
    getEast()Number

    Returns the east longitude of the bounds

    -
    getNorth()Number

    Returns the north latitude of the bounds

    -
    contains(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<LatLng> latlng)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.

    -
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.

    -
    toBBoxString()String

    Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.

    -
    equals(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds.

    -
    isValid()Boolean

    Returns true if the bounds are properly initialized.

    -
    - -
    - - -

    Point

    Represents a point with x and y coordinates in pixels.

    - -
    -

    Usage example

    - -
    - - - - - -
    var point = L.point(200, 300);
    -
    -

    All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

    -
    map.panBy([200, 300]);
    -map.panBy(L.point(200, 300));
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.point(<Number> x, <Number> y, <Boolean> round?)Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
    L.point(<Number[]> coords)Expects an array of the form [x, y] instead.
    L.point(<Object> coords)Expects a plain object of the form {x: Number, y: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    clone()Point

    Returns a copy of the current point.

    -
    add(<Point> otherPoint)Point

    Returns the result of addition of the current and the given points.

    -
    subtract(<Point> otherPoint)Point

    Returns the result of subtraction of the given point from the current.

    -
    divideBy(<Number> num)Point

    Returns the result of division of the current point by the given number.

    -
    multiplyBy(<Number> num)Point

    Returns the result of multiplication of the current point by the given number.

    -
    scaleBy(<Point> scale)Point

    Multiply each coordinate of the current point by each coordinate of -scale. In linear algebra terms, multiply the point by the -scaling matrix -defined by scale.

    -
    unscaleBy(<Point> scale)Point

    Inverse of scaleBy. Divide each coordinate of the current point by -each coordinate of scale.

    -
    round()Point

    Returns a copy of the current point with rounded coordinates.

    -
    floor()Point

    Returns a copy of the current point with floored coordinates (rounded down).

    -
    ceil()Point

    Returns a copy of the current point with ceiled coordinates (rounded up).

    -
    distanceTo(<Point> otherPoint)Number

    Returns the cartesian distance between the current and the given points.

    -
    equals(<Point> otherPoint)Boolean

    Returns true if the given point has the same coordinates.

    -
    contains(<Point> otherPoint)Boolean

    Returns true if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).

    -
    toString()String

    Returns a string representation of the point for debugging purposes.

    -
    - -
    - - -

    Bounds

    Represents a rectangular area in pixel coordinates.

    - -
    -

    Usage example

    - -
    - - - - - -
    var p1 = L.point(10, 10),
    -p2 = L.point(40, 60),
    -bounds = L.bounds(p1, p2);
    -
    -

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    otherBounds.intersects([[10, 10], [40, 60]]);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.bounds(<Point> topLeft, <Point> bottomRight)Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).
    L.bounds(<Point[]> points)Creates a Bounds object from the points it contains
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<Point> point)this

    Extends the bounds to contain the given point.

    -
    getCenter(<Boolean> round?)Point

    Returns the center point of the bounds.

    -
    getBottomLeft()Point

    Returns the bottom-left point of the bounds.

    -
    getTopRight()Point

    Returns the top-right point of the bounds.

    -
    getSize()Point

    Returns the size of the given bounds

    -
    contains(<Bounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<Point> point)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<Bounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds -intersect if they have at least one point in common.

    -
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds -overlap if their intersection is an area.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    min - PointThe top left corner of the rectangle.
    max - PointThe bottom right corner of the rectangle.
    - -
    - - -

    Icon

    Represents an icon to provide when creating a marker.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.icon({
    -    iconUrl: 'my-icon.png',
    -    iconSize: [38, 95],
    -    iconAnchor: [22, 94],
    -    popupAnchor: [-3, -76],
    -    shadowUrl: 'my-icon-shadow.png',
    -    shadowSize: [68, 95],
    -    shadowAnchor: [22, 94]
    -});
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.icon(<Icon options> options)Creates an icon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlString - null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString - nullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePoint - nullSize of the icon image in pixels.
    iconAnchorPoint - nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint - nullThe coordinates of the point from which popups will "open", relative to the icon anchor.
    shadowUrlString - nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString - null
    shadowSizePoint - nullSize of the shadow image in pixels.
    shadowAnchorPoint - nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString - ''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    - -
    -

    Icon.Default

    - -
    - - - -
    A trivial subclass of Icon, represents the icon to use in Markers when -no icon is specified. Points to the blue marker image distributed with Leaflet -releases. -In order to change the default icon, just change the properties of L.Icon.Default.prototype.options -(which is a set of Icon options).
    - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    imagePathString - L.Icon.Default will try to auto-detect the absolute location of the -blue icon images. If you are placing these images in a non-standard -way, set this option to point to the right absolute path.
    - -
    - - -

    DivIcon

    Represents a lightweight icon for markers that uses a simple <div> -element instead of an image. Inherits from Icon but ignores the iconUrl and shadow options.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.divIcon({className: 'my-div-icon'});
    -// you can set .my-div-icon styles in CSS
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.divIcon(<DivIcon options> options)Creates a DivIcon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    htmlString - ''Custom HTML code to put inside the div element, empty by default.
    bgPosPoint - [0, 0]Optional relative position of the background, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlString - null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString - nullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePoint - nullSize of the icon image in pixels.
    iconAnchorPoint - nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint - nullThe coordinates of the point from which popups will "open", relative to the icon anchor.
    shadowUrlString - nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString - null
    shadowSizePoint - nullSize of the shadow image in pixels.
    shadowAnchorPoint - nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString - ''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Control.Zoom

    A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.zoom(<Control.Zoom options> options)Creates a zoom control
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    zoomInTextString - '+'The text set on the 'zoom in' button.
    zoomInTitleString - 'Zoom in'The title set on the 'zoom in' button.
    zoomOutTextString - '-'The text set on the 'zoom out' button.
    zoomOutTitleString - 'Zoom out'The title set on the 'zoom out' button.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Attribution

    The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with the getAttribution method automatically. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.attribution(<Control.Attribution options> options)Creates an attribution control.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    prefixString - 'Leaflet'The HTML text shown before the attributions. Pass false to disable.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setPrefix(<String> prefix)this

    Sets the text before the attributions.

    -
    addAttribution(<String> text)this

    Adds an attribution text (e.g. 'Vector data &copy; Mapbox').

    -
    removeAttribution(<String> text)this

    Removes an attribution text.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Layers

    The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    var baseLayers = {
    -    "Mapbox": mapbox,
    -    "OpenStreetMap": osm
    -};
    -var overlays = {
    -    "Marker": marker,
    -    "Roads": roadsLayer
    -};
    -L.control.layers(baseLayers, overlays).addTo(map);
    -
    -

    The baseLayers and overlays parameters are object literals with layer names as keys and Layer objects as values:

    -
    {
    -    "<someName1>": layer1,
    -    "<someName2>": layer2
    -}
    -
    -

    The layer names can contain HTML, which allows you to add additional styling to the items:

    -
    {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.layers(<Object> baselayers?, <Object> overlays?, <Control.Layers options> options?)Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    collapsedBoolean - trueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
    autoZIndexBoolean - trueIf true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
    hideSingleBaseBoolean - falseIf true, the base layers in the control will be hidden when there is only one.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addBaseLayer(<Layer> layer, <String> name)this

    Adds a base layer (radio button entry) with the given name to the control.

    -
    addOverlay(<Layer> layer, <String> name)this

    Adds an overlay (checkbox entry) with the given name to the control.

    -
    removeLayer(<Layer> layer)this

    Remove the given layer from the control.

    -
    expand()this

    Expand the control container if collapsed.

    -
    collapse()this

    Collapse the control container if expanded.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Scale

    A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.control.scale().addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.scale(<Control.Scale options> options?)Creates an scale control with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    maxWidthNumber - 100Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
    metricBoolean - TrueWhether to show the metric scale line (m/km).
    imperialBoolean - TrueWhether to show the imperial scale line (mi/ft).
    updateWhenIdleBoolean - falseIf true, the control is updated on moveend, otherwise it's always up-to-date (updated on move).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Browser

    A namespace with static properties for browser/feature detection used by Leaflet internally.

    - -
    -

    Usage example

    - -
    - - - - - -
    if (L.Browser.ielt9) {
    -  alert('Upgrade your browser, dude!');
    -}
    -
    - - - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    ie - Booleantrue for all Internet Explorer versions (not Edge).
    ielt9 - Booleantrue for Internet Explorer versions less than 9.
    edge - Booleantrue for the Edge web browser.
    webkit - Booleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
    gecko - Booleantrue for gecko-based browsers like Firefox.
    android - Booleantrue for any browser running on an Android platform.
    android23 - Booleantrue for browsers running on Android 2 or Android 3.
    chrome - Booleantrue for the Chrome browser.
    safari - Booleantrue for the Safari browser.
    win - Booleantrue when the browser is running in a Windows platform
    ie3d - Booleantrue for all Internet Explorer versions supporting CSS transforms.
    webkit3d - Booleantrue for webkit-based browsers supporting CSS transforms.
    gecko3d - Booleantrue for gecko-based browsers supporting CSS transforms.
    opera12 - Booleantrue for the Opera browser supporting CSS transforms (version 12 or later).
    any3d - Booleantrue for all browsers supporting CSS transforms.
    mobile - Booleantrue for all browsers running in a mobile device.
    mobileWebkit - Booleantrue for all webkit-based browsers in a mobile device.
    mobileWebkit3d - Booleantrue for all webkit-based browsers in a mobile device supporting CSS transforms.
    mobileOpera - Booleantrue for the Opera browser in a mobile device.
    mobileGecko - Booleantrue for gecko-based browsers running in a mobile device.
    touch - Booleantrue for all browsers supporting touch events.
    msPointer - Booleantrue for browsers implementing the Microsoft touch events model (notably IE10).
    pointer - Booleantrue for all browsers supporting pointer events.
    retina - Booleantrue for browsers on a high-resolution "retina" screen.
    canvas - Booleantrue when the browser supports <canvas>.
    vml - Booleantrue if the browser supports VML.
    svg - Booleantrue when the browser supports SVG.
    - -
    - - -

    Util

    Various utility functions, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> dest, <Object> src?)ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
    create(<Object> proto, <Object> properties?)ObjectCompatibility polyfill for Object.create
    bind(<Function> fn, )FunctionReturns a new function bound to the arguments passed, like Function.prototype.bind. -Has a L.bind() shortcut.
    stamp(<Object> obj)NumberReturns the unique ID of an object, assigning it one if it doesn't have it.
    throttle(<Function> fn, <Number> time, <Object> context)FunctionReturns a function which executes function fn with the given scope context -(so that the this keyword refers to context inside fn's code). The function -fn will be called no more than one time per given amount of time. The arguments -received by the bound function will be any arguments passed when binding the -function, followed by any arguments passed when invoking the bound function. -Has an L.bind shortcut.
    wrapNum(<Number> num, <Number[]> range, <Boolean> includeMax?)NumberReturns the number num modulo range in such a way so it lies within -range[0] and range[1]. The returned value will be always smaller than -range[1] unless includeMax is set to true.
    falseFn()FunctionReturns a function which always returns false.
    formatNum(<Number> num, <Number> digits?)NumberReturns the number num rounded to digits decimals, or to 5 decimals by default.
    trim(<String> str)StringCompatibility polyfill for String.prototype.trim
    splitWords(<String> str)String[]Trims and splits the string on whitespace and returns the array of parts.
    setOptions(<Object> obj, <Object> options)ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.
    getParamString(<Object> obj, <String> existingUrl?, <Boolean> uppercase?)StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} -translates to '?a=foo&b=bar'. If existingUrl is set, the parameters will -be appended at the end. If uppercase is true, the parameter names will -be uppercased (e.g. '?A=foo&B=bar')
    template(<String> str, <Object> data)StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' -and a data object like {a: 'foo', b: 'bar'}, returns evaluated string -('Hello foo, bar'). You can also specify functions instead of strings for -data values — they will be evaluated passing data as an argument.
    isArray(obj)BooleanCompatibility polyfill for Array.isArray
    indexOf(<Array> array, <Object> el)NumberCompatibility polyfill for Array.prototype.indexOf
    requestAnimFrame(<Function> fn, <Object> context?, <Boolean> immediate?)NumberSchedules fn to be executed when the browser repaints. fn is bound to -context if given. When immediate is set, fn is called immediately if -the browser doesn't have native support for -window.requestAnimationFrame, -otherwise it's delayed. Returns a request ID that can be used to cancel the request.
    cancelAnimFrame(<Number> id)undefinedCancels a previous requestAnimFrame. See also window.cancelAnimationFrame.
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    lastId - NumberLast unique ID used by stamp()
    emptyImageUrl - StringData URI string containing a base64-encoded empty GIF image. -Used as a hack to free memory from unused images on WebKit-powered -mobile devices (by setting image src to this string).
    - -
    - - -

    Transformation

    Represents an affine transformation: a set of coefficients a, b, c, d -for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing -the reverse. Used by Leaflet in its projections code.

    - -
    -

    Usage example

    - -
    - - - - - -
    var transformation = new L.Transformation(2, 5, -1, 10),
    -    p = L.point(1, 2),
    -    p2 = transformation.transform(p), //  L.point(7, 8)
    -    p3 = transformation.untransform(p2); //  L.point(1, 2)
    -
    - - - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    transform(<Point> point, <Number> scale?)Point

    Returns a transformed point, optionally multiplied by the given scale. -Only accepts real L.Point instances, not arrays.

    -
    untransform(<Point> point, <Number> scale?)Point

    Returns the reverse transformation of the given point, optionally divided -by the given scale. Only accepts real L.Point instances, not arrays.

    -
    - -
    - - -

    LineUtil

    Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    simplify(<Point[]> points, <Number> tolerance)Point[]Dramatically reduces the number of points in a polyline while retaining -its shape and returns a new array of simplified points, using the -Douglas-Peucker algorithm. -Used for a huge performance boost when processing/displaying Leaflet polylines for -each zoom level and also reducing visual noise. tolerance affects the amount of -simplification (lesser value means higher quality but slower and with more points). -Also released as a separated micro-library Simplify.js.
    pointToSegmentDistance(<Point> p, <Point> p1, <Point> p2)NumberReturns the distance between point p and segment p1 to p2.
    closestPointOnSegment(<Point> p, <Point> p1, <Point> p2)NumberReturns the closest point from a point p on a segment p1 to p2.
    clipSegment(<Point> a, <Point> b, <Bounds> bounds, <Boolean> useLastCode?, <Boolean> round?)Point[]|BooleanClips the segment a to b by rectangular bounds with the -Cohen-Sutherland algorithm -(modifying the segment points directly!). Used by Leaflet to only show polyline -points that are on the screen or near, increasing performance.
    - -
    - - -

    PolyUtil

    Various utility functions for polygon geometries.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    clipPolygon(<Point[]> points, <Bounds> bounds, <Boolean> round?)Point[]Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgeman algorithm). -Used by Leaflet to only show polygon points that are on the screen or near, increasing -performance. Note that polygon points needs different algorithm for clipping -than polyline, so there's a separate method for it.
    - -
    - - -

    DomEvent

    Utility functions to work with the DOM events, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    on(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisAdds a listener function (fn) to a particular DOM event type of the -element el. You can optionally specify the context of the listener -(object the this keyword will point to). You can also pass several -space-separated types (e.g. 'click dblclick').
    on(<HTMLElement> el, <Object> eventMap, <Object> context?)thisAdds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    off(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisRemoves a previously added listener function. If no function is specified, -it will remove all the listeners of that particular DOM event from the element. -Note that if you passed a custom context to on, you must pass the same -context to off in order to remove the listener.
    off(<HTMLElement> el, <Object> eventMap, <Object> context?)thisRemoves a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    stopPropagation(<DOMEvent> ev)thisStop the given event from propagation to parent elements. Used inside the listener functions: -
    L.DomEvent.on(div, 'click', function (ev) {
    -    L.DomEvent.stopPropagation(ev);
    -});
    -
    disableScrollPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'mousewheel' events (plus browser variants).
    disableClickPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'click', 'doubleclick', -'mousedown' and 'touchstart' events (plus browser variants).
    preventDefault(<DOMEvent> ev)thisPrevents the default action of the DOM Event ev from happening (such as -following a link in the href of the a element, or doing a POST request -with page reload when a <form> is submitted). -Use it inside listener functions.
    stop(ev)thisDoes stopPropagation and preventDefault at the same time.
    getMousePosition(<DOMEvent> ev, <HTMLElement> container?)PointGets normalized mouse position from a DOM event relative to the -container or to the whole page if not specified.
    getWheelDelta(<DOMEvent> ev)NumberGets normalized wheel delta from a mousewheel DOM event, in vertical -pixels scrolled (negative if scrolling down). -Events from pointing devices without precise scrolling are mapped to -a best guess of 60 pixels.
    addListener()thisAlias to L.DomEvent.on
    removeListener()thisAlias to L.DomEvent.off
    - -
    - - -

    DomUtil

    Utility functions to work with the DOM -tree, used by Leaflet internally. -Most functions expecting or returning a HTMLElement also work for -SVG elements. The only difference is that classes refer to CSS classes -in HTML and SVG classes in SVG.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    get(<String|HTMLElement> id)HTMLElementReturns an element given its DOM id, or returns the element itself -if it was passed directly.
    getStyle(<HTMLElement> el, <String> styleAttrib)StringReturns the value for a certain style attribute on an element, -including computed values or values set through CSS.
    create(<String> tagName, <String> className?, <HTMLElement> container?)HTMLElementCreates an HTML element with tagName, sets its class to className, and optionally appends it to container element.
    remove(<HTMLElement> el)Removes el from its parent element
    empty(<HTMLElement> el)Removes all of el's children elements from el
    toFront(<HTMLElement> el)Makes el the last children of its parent, so it renders in front of the other children.
    toBack(<HTMLElement> el)Makes el the first children of its parent, so it renders back from the other children.
    hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element's class attribute contains name.
    addClass(<HTMLElement> el, <String> name)Adds name to the element's class attribute.
    removeClass(<HTMLElement> el, <String> name)Removes name from the element's class attribute.
    setClass(<HTMLElement> el, <String> name)Sets the element's class.
    getClass(<HTMLElement> el)StringReturns the element's class.
    setOpacity(<HTMLElement> el, <Number> opacity)Set the opacity of an element (including old IE support). -opacity must be a number from 0 to 1.
    testProp(<String[]> props)String|falseGoes through the array of style names and returns the first name -that is a valid style name for an element. If no such name is found, -it returns false. Useful for vendor-prefixed styles like transform.
    setTransform(<HTMLElement> el, <Point> offset, <Number> scale?)Resets the 3D CSS transform of el so it is translated by offset pixels -and optionally scaled by scale. Does not have an effect if the -browser doesn't support 3D CSS transforms.
    setPosition(<HTMLElement> el, <Point> position)Sets the position of el to coordinates specified by position, -using CSS translate or top/left positioning depending on the browser -(used by Leaflet internally to position its layers).
    getPosition(<HTMLElement> el)PointReturns the coordinates of an element previously positioned with setPosition.
    disableTextSelection()Prevents the user from generating selectstart DOM events, usually generated -when the user drags the mouse through a page with text. Used internally -by Leaflet to override the behaviour of any click-and-drag interaction on -the map. Affects drag interactions on the whole document.
    enableTextSelection()Cancels the effects of a previous L.DomUtil.disableTextSelection.
    disableImageDrag()As L.DomUtil.disableTextSelection, but -for dragstart DOM events, usually generated when the user drags an image.
    enableImageDrag()Cancels the effects of a previous L.DomUtil.disableImageDrag.
    preventOutline(<HTMLElement> el)Makes the outline -of the element el invisible. Used internally by Leaflet to prevent -focusable elements from displaying an outline when the user performs a -drag interaction on them.
    restoreOutline()Cancels the effects of a previous L.DomUtil.preventOutline.
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    TRANSFORM - StringVendor-prefixed fransform style name (e.g. 'webkitTransform' for WebKit).
    TRANSITION - StringVendor-prefixed transform style name.
    - -
    - - -

    PosAnimation

    Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

    - -
    -

    Usage example

    - -
    - - - - - -
    var fx = new L.PosAnimation();
    -fx.run(el, [300, 500], 0.5);
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.PosAnimation()Creates a PosAnimation object.
    - - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    start - EventFired when the animation starts
    step - EventFired continuously during the animation.
    end - EventFired when the animation ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    run(<HTMLElement> el, <Point> newPos, <Number> duration?, <Number> easeLinearity?)

    Run an animation of a given element to a new position, optionally setting -duration in seconds (0.25 by default) and easing linearity factor (3rd -argument of the cubic bezier curve, -0.5 by default).

    -
    stop()

    Stops the animation (if currently running).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Draggable

    A class for making DOM elements draggable (including touch support). -Used internally for map and marker dragging. Only works for elements -that were positioned with L.DomUtil.setPosition.

    - -
    -

    Usage example

    - -
    - - - - - -
    var draggable = new L.Draggable(elementToDrag);
    -draggable.enable();
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.Draggable(<HTMLElement> el, <HTMLElement> dragHandle?, <Boolean> preventOutline)Creates a Draggable object for moving el when you start dragging the dragHandle element (equals el itself by default).
    - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    clickToleranceNumber - 3The max number of pixels a user can shift the mouse pointer during a click -for it to be considered a valid click (as opposed to a mouse drag).
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    down - EventFired when a drag is about to start.
    dragstart - EventFired when a drag starts
    predrag - EventFired continuously during dragging before each corresponding -update of the element's position.
    drag - EventFired continuously during dragging.
    dragend - DragEndEventFired when the drag ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()

    Enables the dragging ability

    -
    disable()

    Disables the dragging ability

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Class

    L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here. -In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

    - -
    -

    Usage example

    - -
    - - - - - -
    var MyClass = L.Class.extend({
    -initialize: function (greeter) {
    -    this.greeter = greeter;
    -    // class constructor
    -},
    -greet: function (name) {
    -    alert(this.greeter + ', ' + name)
    -    }
    -});
    -// create instance of MyClass, passing "Hello" to the constructor
    -var a = new MyClass("Hello");
    -// call greet method, alerting "Hello, World"
    -a.greet("World");
    -
    - - - -
    - -

    Class Factories

    - - - -

    You may have noticed that Leaflet objects are created without using -the new keyword. This is achieved by complementing each class with a -lowercase factory method:

    -
    new L.Map('map'); // becomes:
    -L.map('map');
    -
    -

    The factories are implemented very easily, and you can do this for your own classes:

    -
    L.map = function (id, options) {
    -    return new L.Map(id, options);
    -};
    -
    - - - -
    - -

    Inheritance

    - - - -

    You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

    -
    var MyChildClass = MyClass.extend({
    -    // ... new properties and methods
    -});
    -
    -

    This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

    -
    var a = new MyChildClass();
    -a instanceof MyChildClass; // true
    -a instanceof MyClass; // true
    -
    -

    You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

    -
    var MyChildClass = MyClass.extend({
    -    initialize: function () {
    -        MyClass.prototype.initialize.call(this, "Yo");
    -    },
    -    greet: function (name) {
    -        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
    -    }
    -});
    -var a = new MyChildClass();
    -a.greet('Jason'); // alerts "Yo, bro Jason!"
    -
    - - -
    - -

    Options

    - - - -

    options is a special property that unlike other objects that you pass -to extend will be merged with the parent one instead of overriding it -completely, which makes managing configuration of objects and default -values convenient:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        myOption1: 'foo',
    -        myOption2: 'bar'
    -    }
    -});
    -var MyChildClass = L.Class.extend({
    -    options: {
    -        myOption1: 'baz',
    -        myOption3: 5
    -    }
    -});
    -var a = new MyChildClass();
    -a.options.myOption1; // 'baz'
    -a.options.myOption2; // 'bar'
    -a.options.myOption3; // 5
    -
    -

    There's also L.Util.setOptions, a method for -conveniently merging options passed to constructor with the defaults -defines in the class:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        foo: 'bar',
    -        bla: 5
    -    },
    -    initialize: function (options) {
    -        L.Util.setOptions(this, options);
    -        ...
    -    }
    -});
    -var a = new MyClass({bla: 10});
    -a.options; // {foo: 'bar', bla: 10}
    -
    - - - -
    - -

    Includes

    - - - -

    includes is a special class property that merges all specified objects into the class (such objects are called mixins).

    -
     var MyMixin = {
    -    foo: function () { ... },
    -    bar: 5
    -};
    -var MyClass = L.Class.extend({
    -    includes: MyMixin
    -});
    -var a = new MyClass();
    -a.foo();
    -
    -

    You can also do such includes in runtime with the include method:

    -
    MyClass.include(MyMixin);
    -
    -

    statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

    -
    var MyClass = L.Class.extend({
    -    statics: {
    -        FOO: 'bar',
    -        BLA: 5
    -    }
    -});
    -MyClass.FOO; // 'bar'
    -
    - - - -
    - -

    Constructor hooks

    - - - -

    If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

    -
    MyClass.addInitHook(function () {
    -    // ... do something in constructor additionally
    -    // e.g. add event listeners, set custom properties etc.
    -});
    -
    -

    You can also use the following shortcut when you just need to make one additional method call:

    -
    MyClass.addInitHook('methodName', arg1, arg2, …);
    -
    - - - -
    - - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> props)FunctionExtends the current class given the properties to be included. -Returns a Javascript function that is a class constructor (to be called with new).
    include(<Object> properties)thisIncludes a mixin into the current class.
    mergeOptions(<Object> options)thisMerges options into the defaults of the class.
    addInitHook(<Function> fn)thisAdds a constructor hook to the class.
    - -
    - - -

    Evented

    A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

    - -
    -

    Usage example

    - -
    - - - - - -
    map.on('click', function(e) {
    -    alert(e.latlng);
    -} );
    -
    -

    Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

    -
    function onClick(e) { ... }
    -map.on('click', onClick);
    -map.off('click', onClick);
    -
    - - - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    - - -

    Layer

    A set of methods from the Layer base class that all Leaflet layers use. -Inherits all methods, options and events from L.Evented.

    - -
    -

    Usage example

    - -
    - - - - - -
    var layer = L.Marker(latlng).addTo(map);
    -layer.addTo(map);
    -layer.remove();
    -
    - - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Layer will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    - -

    Popup methods

    - -
    All layers share a set of methods convenient for binding popups to it. -
    var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
    -layer.openPopup();
    -layer.closePopup();
    -
    -

    Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    - -

    Tooltip methods

    - -
    All layers share a set of methods convenient for binding tooltips to it. -
    var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
    -layer.openTooltip();
    -layer.closeTooltip();
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    - -

    Extension methods

    - -
    Every layer should extend from L.Layer and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)this

    Should contain code that creates DOM elements for the layer, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).

    -
    onRemove(<Map> map)this

    Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).

    -
    getEvents()Object

    This optional method should return an object like { viewreset: this._reset } for addEventListener. The event handlers in this object will be automatically added and removed from the map with your layer.

    -
    getAttribution()String

    This optional method should return a string containing HTML to be shown on the Attribution control whenever the layer is visible.

    -
    beforeAdd(<Map> map)this

    Optional method. Called on map.addLayer(layer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Interactive layer

    Some Layers can be made interactive - when the user interacts -with such a layer, mouse events like click and mouseover can be handled. -Use the event handling methods to handle these events.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - -
    - -

    Mouse events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Control

    L.Control is a base class for implementing map controls. Handles positioning. -All other controls extend from this class.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Control will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    - -

    Extension methods

    - -
    Every control should extend from L.Control and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)HTMLElement

    Should return the container DOM element for the control and add listeners on relevant map events. Called on control.addTo(map).

    -
    onRemove(<Map> map)

    Optional method. Should contain all clean up code that removes the listeners previously added in onAdd. Called on control.remove().

    -
    - -
    - - -

    Handler

    Abstract class for map interaction handlers

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()this

    Enables the handler

    -
    disable()this

    Disables the handler

    -
    enabled()Boolean

    Returns true if the handler is enabled

    -
    - -
    - -

    Extension methods

    - -
    Classes inheriting from Handler must implement the two following methods:
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHooks()

    Called when the handler is enabled, should add event hooks.

    -
    removeHooks()

    Called when the handler is disabled, should remove the event hooks added previously.

    -
    - -
    - - -

    Projection

    An object with methods for projecting geographical coordinates of the world onto -a flat surface (and back). See Map projection.

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    project(<LatLng> latlng)Point

    Projects geographical coordinates into a 2D point.

    -
    unproject(<Point> point)LatLng

    The inverse of project. Projects a 2D point into a geographical location.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    bounds - LatLngBoundsThe bounds where the projection is valid
    - -
    - - -
    -

    Defined projections

    - -
    - - - -
    Leaflet comes with a set of already defined Projections out of the box:
    - - - - - - - - - - - - - - - - - - - -
    ProjectionDescription
    L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, -mostly used by GIS enthusiasts. Directly maps x as longitude, and y as -latitude. Also suitable for flat worlds, e.g. game maps. Used by the -EPSG:3395 and Simple CRS.
    L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.
    L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, -used by almost all free and commercial tile providers. Assumes that Earth is -a sphere. Used by the EPSG:3857 CRS.
    - -
    - - -

    CRS

    Abstract class that defines coordinate reference systems for projecting -geographical points into pixel (screen) coordinates and back (and to -coordinates in other units for WMS services). See -spatial reference system. -Leaflet defines the most usual CRSs by default. If you want to use a -CRS not defined by default, take a look at the -Proj4Leaflet plugin.

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    latLngToPoint(<LatLng> latlng, <Number> zoom)Point

    Projects geographical coordinates into pixel coordinates for a given zoom.

    -
    pointToLatLng(<Point> point, <Number> zoom)LatLng

    The inverse of latLngToPoint. Projects pixel coordinates on a given -zoom into geographical coordinates.

    -
    project(<LatLng> latlng)Point

    Projects geographical coordinates into coordinates in units accepted for -this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).

    -
    unproject(<Point> point)LatLng

    Given a projected coordinate returns the corresponding LatLng. -The inverse of project.

    -
    scale(<Number> zoom)Number

    Returns the scale used when transforming projected coordinates into -pixel coordinates for a particular zoom. For example, it returns -256 * 2^zoom for Mercator-based CRS.

    -
    zoom(<Number> scale)Number

    Inverse of scale(), returns the zoom level corresponding to a scale -factor of scale.

    -
    getProjectedBounds(<Number> zoom)Bounds

    Returns the projection's bounds scaled and transformed for the provided zoom.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    code - StringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857')
    wrapLng - Number[]An array of two numbers defining whether the longitude (horizontal) coordinate -axis wraps around a given range and how. Defaults to [-180, 180] in most -geographical CRSs. If undefined, the longitude axis does not wrap around.
    wrapLat - Number[]Like wrapLng, but for the latitude (vertical) axis.
    infinite - BooleanIf true, the coordinate space will be unbounded (infinite in both axes)
    - -
    - - -
    -

    Defined CRSs

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CRSDescription
    L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
    L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial -tile providers. Uses Spherical Mercator projection. Set in by default in -Map's crs option.
    L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.
    L.CRS.EarthServes as the base for CRS that are global such that they cover the earth. -Can only be used as the base for other CRS and cannot be used directly, -since it does not have a code, projection or transformation. distance() returns -meters.
    L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. -May be used for maps of flat surfaces (e.g. game maps). Note that the y -axis should still be inverted (going from bottom to top). distance() returns -simple euclidean distance.
    - -
    - - -

    Renderer

    Base class for vector renderer implementations (SVG, Canvas). Handles the -DOM container of the renderer, its bounds, and its zoom animation. -A Renderer works as an implicit layer group for all Paths - the renderer -itself can be added or removed to the map. All paths use a renderer, which can -be implicit (the map will decide the type of renderer and use it automatically) -or explicit (using the renderer option of the path). -Do not use this class directly, use SVG and Canvas instead.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Event objects

    Whenever a class inheriting from Evented fires an event, a listener function -will be called with an event argument, which is a plain object containing -information about the event. For example:

    -
    map.on('click', function(ev) {
    -    alert(ev.latlng); // ev is an event object (MouseEvent in this case)
    -});
    -
    -

    The information available depends on the event type:

    - - - -
    -

    Event

    - -
    - - - -
    The base event object. All other event objects contain these properties too.
    - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    - - -
    - -
    -

    KeyboardEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    originalEvent - DOMEventThe original DOM KeyboardEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    MouseEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlng - LatLngThe geographical point where the mouse event occurred.
    layerPoint - PointPixel coordinates of the point where the mouse event occurred relative to the map layer.
    containerPoint - PointPixel coordinates of the point where the mouse event occurred relative to the map сontainer.
    originalEvent - DOMEventThe original DOM MouseEvent or DOM TouchEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    LocationEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlng - LatLngDetected geographical location of the user.
    bounds - LatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
    accuracy - NumberAccuracy of location in meters.
    altitude - NumberHeight of the position above the WGS84 ellipsoid in meters.
    altitudeAccuracy - NumberAccuracy of altitude in meters.
    heading - NumberThe direction of travel in degrees counting clockwise from true North.
    speed - NumberCurrent velocity in meters per second.
    timestamp - NumberThe time when the position was acquired.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    ErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    message - StringError message.
    code - NumberError code (if applicable).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    LayerEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    LayersControlEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer that was added or removed.
    name - StringThe name of the layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    TileEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tile - HTMLElementThe tile element (image).
    coords - PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    TileErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tile - HTMLElementThe tile element (image).
    coords - PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    error - *Error passed to the tile's done() callback.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    ResizeEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    oldSize - PointThe old size before resize event.
    newSize - PointThe new size after the resize event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    GeoJSONEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer for the GeoJSON feature that is being added to the map.
    properties - ObjectGeoJSON properties of the feature.
    geometryType - StringGeoJSON geometry type of the feature.
    id - StringGeoJSON ID of the feature (if present).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    PopupEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    popup - PopupThe popup that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    TooltipEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tooltip - TooltipThe tooltip that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    DragEndEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    distance - NumberThe distance in pixels the draggable element was moved by.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -

    DivOverlay

    Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    offsetPoint - Point(0, 7)The offset of the popup position. Useful to control the anchor -of the popup when opening it on some overlays.
    classNameString - ''A custom CSS class name to assign to the popup.
    paneString - 'popupPane'Map pane where the popup will be added.
    - -
    - - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event might can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Global Switches

    Global switches are created for rare cases and generally make -Leaflet to not detect a particular browser feature even if it's -there. You need to set the switch as a global variable to true -before including Leaflet on the page, like this:

    -
    <script>L_NO_TOUCH = true;</script>
    -<script src="leaflet.js"></script>
    -
    - - - - - - - - - - - - - - - - - -
    SwitchDescription
    L_NO_TOUCHForces Leaflet to not use touch events even if it detects them.
    L_DISABLE_3DForces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.
    - -

    noConflict

    This method restores the L global variable to the original value -it had before Leaflet inclusion, and returns the real Leaflet -namespace so you can put it elsewhere, like this:

    -
    <script src='libs/l.js'>
    -<!-- L points to some other library -->
    -<script src='leaflet.js'>
    -<!-- you include Leaflet, it replaces the L variable to Leaflet namespace -->
    -<script>
    -var Leaflet = L.noConflict();
    -// now L points to that other library again, and you can use Leaflet.Map etc.
    -</script>
    -
    - -

    version

    A constant that represents the Leaflet version in use.

    -
    L.version; // contains "1.0.0" (or whatever version is currently in use)
    -
    diff --git a/docs/reference-1.0.2.html b/docs/reference-1.0.2.html deleted file mode 100644 index 27b6eef6f1f..00000000000 --- a/docs/reference-1.0.2.html +++ /dev/null @@ -1,23201 +0,0 @@ ---- -layout: v2 -title: Documentation -bodyclass: api-page ---- - -

    API Reference

    - -

    This reference reflects Leaflet 1.0.2. Check this list if you are using a different version of Leaflet.

    - - -
    - -
    -

    UI Layers

    - -

    Raster Layers

    - -

    Vector Layers

    - -
    -
    -

    Other Layers

    - -

    Basic Types

    - -

    Controls

    - -
    -
    - - - - - - -

    Utility

    - -

    DOM Utility

    - -
    -
    -

    Base Classes

    - - -

    Misc

    - -
    -
    - -

    Map

    The central class of the API — it is used to create a map on a page and manipulate it.

    - -
    -

    Usage example

    - -
    - - - - - -
    // initialize the map on the "map" div with a given center and zoom
    -var map = L.map('map', {
    -    center: [51.505, -0.09],
    -    zoom: 13
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.map(<String> id, <Map options> options?)Instantiates a map object given the DOM ID of a <div> element -and optionally an object literal with Map options.
    L.map(<HTMLElement> el, <Map options> options?)Instantiates a map object given an instance of a <div> HTML element -and optionally an object literal with Map options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    preferCanvasBoolean - falseWhether Paths should be rendered on a Canvas renderer. -By default, all Paths are rendered in a SVG renderer.
    - -
    - -

    Control options

    - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionControlBoolean - trueWhether a attribution control is added to the map by default.
    zoomControlBoolean - trueWhether a zoom control is added to the map by default.
    - -
    - -

    Interaction Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    closePopupOnClickBoolean - trueSet it to false if you don't want popups to close when user clicks the map.
    zoomSnapNumber - 1Forces the map's zoom level to always be a multiple of this, particularly -right after a fitBounds() or a pinch-zoom. -By default, the zoom level snaps to the nearest integer; lower values -(e.g. 0.5 or 0.1) allow for greater granularity. A value of 0 -means the zoom level will not be snapped after fitBounds or a pinch-zoom.
    zoomDeltaNumber - 1Controls how much the map's zoom level will change after a -zoomIn(), zoomOut(), pressing + -or - on the keyboard, or using the zoom controls. -Values smaller than 1 (e.g. 0.5) allow for greater granularity.
    trackResizeBoolean - trueWhether the map automatically handles browser window resize to update itself.
    boxZoomBoolean - trueWhether the map can be zoomed to a rectangular area specified by -dragging the mouse while pressing the shift key.
    doubleClickZoomBoolean|String - trueWhether the map can be zoomed in by double clicking on it and -zoomed out by double clicking while holding shift. If passed -'center', double-click zoom will zoom to the center of the - view regardless of where the mouse was.
    draggingBoolean - trueWhether the map be draggable with mouse/touch or not.
    - -
    - -

    Map State Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    crsCRS - L.CRS.EPSG3857The Coordinate Reference System to use. Don't change this if you're not -sure what it means.
    centerLatLng - undefinedInitial geographic center of the map
    zoomNumber - undefinedInitial map zoom level
    minZoomNumber - undefinedMinimum zoom level of the map. Overrides any minZoom option set on map layers.
    maxZoomNumber - undefinedMaximum zoom level of the map. Overrides any maxZoom option set on map layers.
    layersLayer[] - []Array of layers that will be added to the map initially
    maxBoundsLatLngBounds - nullWhen this option is set, the map restricts the view to the given -geographical bounds, bouncing the user back when he tries to pan -outside the view. To set the restriction dynamically, use -setMaxBounds method.
    rendererRenderer - *The default method for drawing vector layers on the map. L.SVG -or L.Canvas by default depending on browser support.
    - -
    - -

    Animation Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    zoomAnimationBoolean - trueWhether the map zoom animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    zoomAnimationThresholdNumber - 4Won't animate zoom if the zoom difference exceeds this value.
    fadeAnimationBoolean - trueWhether the tile fade animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    markerZoomAnimationBoolean - trueWhether markers animate their zoom with the zoom animation, if disabled -they will disappear for the length of the animation. By default it's -enabled in all browsers that support CSS3 Transitions except Android.
    transform3DLimitNumber - 2^23Defines the maximum size of a CSS translation transform. The default -value should not be changed unless a web browser positions layers in -the wrong place after doing a large panBy.
    - -
    - -

    Panning Inertia Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    inertiaBoolean - *If enabled, panning of the map will have an inertia effect where -the map builds momentum while dragging and continues moving in -the same direction for some time. Feels especially nice on touch -devices. Enabled by default unless running on old Android devices.
    inertiaDecelerationNumber - 3000The rate with which the inertial movement slows down, in pixels/second².
    inertiaMaxSpeedNumber - InfinityMax speed of the inertial movement, in pixels/second.
    easeLinearityNumber - 0.2
    worldCopyJumpBoolean - falseWith this option enabled, the map tracks when you pan to another "copy" -of the world and seamlessly jumps to the original one so that all overlays -like markers and vector layers are still visible.
    maxBoundsViscosityNumber - 0.0If maxBounds is set, this option will control how solid the bounds -are when dragging the map around. The default value of 0.0 allows the -user to drag outside the bounds at normal speed, higher values will -slow down map dragging outside bounds, and 1.0 makes the bounds fully -solid, preventing the user from dragging outside the bounds.
    - -
    - -

    Keyboard Navigation Options

    - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    keyboardBoolean - trueMakes the map focusable and allows users to navigate the map with keyboard -arrows and +/- keys.
    keyboardPanDeltaNumber - 80Amount of pixels to pan when pressing an arrow key.
    - -
    - -

    Mousewheel options

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    scrollWheelZoomBoolean|String - trueWhether the map can be zoomed by using the mouse wheel. If passed 'center', -it will zoom to the center of the view regardless of where the mouse was.
    wheelDebounceTimeNumber - 40Limits the rate at which a wheel can fire (in milliseconds). By default -user can't zoom via wheel more often than once per 40 ms.
    wheelPxPerZoomLevelNumber - 60How many scroll pixels (as reported by L.DomEvent.getWheelDelta) -mean a change of one full zoom level. Smaller values will make wheel-zooming -faster (and vice versa).
    - -
    - -

    Touch interaction options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tapBoolean - trueEnables mobile hacks for supporting instant taps (fixing 200ms click -delay on iOS/Android) and touch holds (fired as contextmenu events).
    tapToleranceNumber - 15The max number of pixels a user can shift his finger during touch -for it to be considered a valid tap.
    touchZoomBoolean|String - *Whether the map can be zoomed by touch-dragging with two fingers. If -passed 'center', it will zoom to the center of the view regardless of -where the touch events (fingers) were. Enabled for touch-capable web -browsers except for old Androids.
    bounceAtZoomLimitsBoolean - trueSet it to false if you don't want the map to zoom beyond min/max zoom -and then bounce back when pinch-zooming.
    - -
    - - -
    -

    Events

    - -
    - -

    Layer events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    baselayerchange - LayersControlEventFired when the base layer is changed through the layer control.
    overlayadd - LayersControlEventFired when an overlay is selected through the layer control.
    overlayremove - LayersControlEventFired when an overlay is deselected through the layer control.
    layeradd - LayerEventFired when a new layer is added to the map.
    layerremove - LayerEventFired when some layer is removed from the map
    - -
    - -

    Map state change events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    zoomlevelschange - EventFired when the number of zoomlevels on the map is changed due -to adding or removing a layer.
    resize - ResizeEventFired when the map is resized.
    unload - EventFired when the map is destroyed with remove method.
    viewreset - EventFired when the map needs to redraw its content (this usually happens -on map zoom or load). Very useful for creating custom overlays.
    load - EventFired when the map is initialized (when its center and zoom are set -for the first time).
    zoomstart - EventFired when the map zoom is about to change (e.g. before zoom animation).
    movestart - EventFired when the view of the map starts changing (e.g. user starts dragging the map).
    zoom - EventFired repeatedly during any change in zoom level, including zoom -and fly animations.
    move - EventFired repeatedly during any movement of the map, including pan and -fly animations.
    zoomend - EventFired when the map has changed, after any animations.
    moveend - EventFired when the center of the map stops changing (e.g. user stopped -dragging the map).
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup is opened in the map
    popupclose - PopupEventFired when a popup in the map is closed
    autopanstart - EventFired when the map starts autopanning when opening a popup.
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip is opened in the map.
    tooltipclose - TooltipEventFired when a tooltip in the map is closed.
    - -
    - -

    Location events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    locationerror - ErrorEventFired when geolocation (using the locate method) failed.
    locationfound - LocationEventFired when geolocation (using the locate method) -went successfully.
    - -
    - -

    Interaction events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the map.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the map.
    mousedown - MouseEventFired when the user pushes the mouse button on the map.
    mouseup - MouseEventFired when the user releases the mouse button on the map.
    mouseover - MouseEventFired when the mouse enters the map.
    mouseout - MouseEventFired when the mouse leaves the map.
    mousemove - MouseEventFired while the mouse moves over the map.
    contextmenu - MouseEventFired when the user pushes the right mouse button on the map, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    keypress - KeyboardEventFired when the user presses a key from the keyboard while the map is focused.
    preclick - MouseEventFired before mouse click on the map (sometimes useful when you -want something to happen on click before any existing click -handlers start running).
    - -
    - -

    Other Methods

    - - - - - - - - - - - - - -
    EventDataDescription
    zoomanim - ZoomAnimEventFired on every frame of a zoom animation
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getRenderer(<Path> layer)Renderer

    Returns the instance of Renderer that should be used to render the given -Path. It will ensure that the renderer options of the map and paths -are respected, and that the renderers do exist on the map.

    -
    - -
    - -

    Methods for Layers and Controls

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addControl(<Control> control)this

    Adds the given control to the map

    -
    removeControl(<Control> control)this

    Removes the given control from the map

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the map

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the map.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the map

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the map, optionally specifying context of the iterator function.

    -
    map.eachLayer(function(layer){
    -    layer.bindPopup('Hello');
    -});
    -
    openPopup(<Popup> popup)this

    Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).

    -
    openPopup(<String|HTMLElement> content, <LatLng> latlng, <Popup options> options?)this

    Creates a popup with the specified content and options and opens it in the given point on a map.

    -
    closePopup(<Popup> popup?)this

    Closes the popup previously opened with openPopup (or the given one).

    -
    openTooltip(<Tooltip> tooltip)this

    Opens the specified tooltip.

    -
    openTooltip(<String|HTMLElement> content, <LatLng> latlng, <Tooltip options> options?)this

    Creates a tooltip with the specified content and options and open it.

    -
    closeTooltip(<Tooltip> tooltip?)this

    Closes the tooltip given as parameter.

    -
    - -
    - -

    Methods for modifying map state

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setView(<LatLng> center, <Number> zoom, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) with the given -animation options.

    -
    setZoom(<Number> zoom, <Zoom/pan options> options)this

    Sets the zoom of the map.

    -
    zoomIn(<Number> delta?, <Zoom options> options?)this

    Increases the zoom of the map by delta (zoomDelta by default).

    -
    zoomOut(<Number> delta?, <Zoom options> options?)this

    Decreases the zoom of the map by delta (zoomDelta by default).

    -
    setZoomAround(<LatLng> latlng, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified geographical point on the map -stationary (e.g. used internally for scroll zoom and double-click zoom).

    -
    setZoomAround(<Point> offset, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.

    -
    fitBounds(<LatLngBounds> bounds, <fitBounds options> options)this

    Sets a map view that contains the given geographical bounds with the -maximum zoom level possible.

    -
    fitWorld(<fitBounds options> options?)this

    Sets a map view that mostly contains the whole world with the maximum -zoom level possible.

    -
    panTo(<LatLng> latlng, <Pan options> options?)this

    Pans the map to a given center.

    -
    panBy(<Point> offset)this

    Pans the map by a given number of pixels (animated).

    -
    flyTo(<LatLng> latlng, <Number> zoom?, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) performing a smooth -pan-zoom animation.

    -
    flyToBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets the view of the map with a smooth animation like flyTo, -but takes a bounds parameter like fitBounds.

    -
    setMaxBounds(<Bounds> bounds)this

    Restricts the map view to the given bounds (see the maxBounds option).

    -
    setMinZoom(<Number> zoom)this

    Sets the lower limit for the available zoom levels (see the minZoom option).

    -
    setMaxZoom(<Number> zoom)this

    Sets the upper limit for the available zoom levels (see the maxZoom option).

    -
    panInsideBounds(<LatLngBounds> bounds, <Pan options> options?)this

    Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.

    -
    invalidateSize(<Zoom/Pan options> options)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default. If options.pan is false, panning will not occur. -If options.debounceMoveend is true, it will delay moveend event so -that it doesn't happen often even if the method is called many -times in a row.

    -
    invalidateSize(<Boolean> animate)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default.

    -
    stop()this

    Stops the currently running panTo or flyTo animation, if any.

    -
    - -
    - -

    Geolocation methods

    - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    locate(<Locate options> options?)this

    Tries to locate the user using the Geolocation API, firing a locationfound -event with location data on success or a locationerror event on failure, -and optionally sets the map view to the user's location with respect to -detection accuracy (or to the world view if geolocation failed). -Note that, if your page doesn't use HTTPS, this method will fail in -modern browsers (Chrome 50 and newer) -See Locate options for more details.

    -
    stopLocate()this

    Stops watching location previously initiated by map.locate({watch: true}) -and aborts resetting the map view if map.locate was called with -{setView: true}.

    -
    - -
    - -

    Other Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHandler(<String> name, <Function> HandlerClass)this

    Adds a new Handler to the map, given its name and constructor function.

    -
    remove()this

    Destroys the map and clears all related event listeners.

    -
    createPane(<String> name, <HTMLElement> container?)HTMLElement

    Creates a new map pane with the given name if it doesn't exist already, -then returns it. The pane is created as a children of container, or -as a children of the main map pane if not set.

    -
    getPane(<String|HTMLElement> pane)HTMLElement

    Returns a map pane, given its name or its HTML element (its identity).

    -
    getPanes()Object

    Returns a plain object containing the names of all panes as keys and -the panes as values.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the map.

    -
    whenReady(<Function> fn, <Object> context?)this

    Runs the given function fn when the map gets initialized with -a view (center and zoom) and at least one layer, or immediately -if it's already initialized, optionally passing a function context.

    -
    - -
    - -

    Methods for Getting Map State

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getCenter()LatLng

    Returns the geographical center of the map view

    -
    getZoom()Number

    Returns the current zoom level of the map view

    -
    getBounds()LatLngBounds

    Returns the geographical bounds visible in the current map view

    -
    getMinZoom()Number

    Returns the minimum zoom level of the map (if set in the minZoom option of the map or of any layers), or 0 by default.

    -
    getMaxZoom()Number

    Returns the maximum zoom level of the map (if set in the maxZoom option of the map or of any layers).

    -
    getBoundsZoom(<LatLngBounds> bounds, <Boolean> inside?)Number

    Returns the maximum zoom level on which the given bounds fit to the map -view in its entirety. If inside (optional) is set to true, the method -instead returns the minimum zoom level on which the map view fits into -the given bounds in its entirety.

    -
    getSize()Point

    Returns the current size of the map container (in pixels).

    -
    getPixelBounds()Bounds

    Returns the bounds of the current map view in projected pixel -coordinates (sometimes useful in layer and overlay implementations).

    -
    getPixelOrigin()Point

    Returns the projected pixel coordinates of the top left point of -the map layer (useful in custom layer and overlay implementations).

    -
    getPixelWorldBounds(<Number> zoom?)Bounds

    Returns the world's bounds in pixel coordinates for zoom level zoom. -If zoom is omitted, the map's current zoom level is used.

    -
    - -
    - -

    Conversion Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getZoomScale(<Number> toZoom, <Number> fromZoom)Number

    Returns the scale factor to be applied to a map transition from zoom level -fromZoom to toZoom. Used internally to help with zoom animations.

    -
    getScaleZoom(<Number> scale, <Number> fromZoom)Number

    Returns the zoom level that the map would end up at, if it is at fromZoom -level and everything is scaled by a factor of scale. Inverse of -getZoomScale.

    -
    project(<LatLng> latlng, <Number> zoom)Point

    Projects a geographical coordinate LatLng according to the projection -of the map's CRS, then scales it according to zoom and the CRS's -Transformation. The result is pixel coordinate relative to -the CRS origin.

    -
    unproject(<Point> point, <Number> zoom)LatLng

    Inverse of project.

    -
    layerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToLayerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the origin pixel.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -map's CRS's wrapLat and wrapLng properties, if they are outside the -CRS's bounds. -By default this means longitude is wrapped around the dateline so its -value is between -180 and +180 degrees.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates according to -the map's CRS. By default this measures distance in meters.

    -
    containerPointToLayerPoint(<Point> point)Point

    Given a pixel coordinate relative to the map container, returns the corresponding -pixel coordinate relative to the origin pixel.

    -
    layerPointToContainerPoint(<Point> point)Point

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding pixel coordinate relative to the map container.

    -
    containerPointToLatLng(<Point> point)Point

    Given a pixel coordinate relative to the map container, returns -the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToContainerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the map container.

    -
    mouseEventToContainerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to the -map container where the event took place.

    -
    mouseEventToLayerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to -the origin pixel where the event took place.

    -
    mouseEventToLatLng(<MouseEvent> ev)LatLng

    Given a MouseEvent object, returns geographical coordinate where the -event took place.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Handlers

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    boxZoom - HandlerBox (shift-drag with mouse) zoom handler.
    doubleClickZoom - HandlerDouble click zoom handler.
    dragging - HandlerMap dragging handler (by both mouse and touch).
    keyboard - HandlerKeyboard navigation handler.
    scrollWheelZoom - HandlerScroll wheel zoom handler.
    tap - HandlerMobile touch hacks (quick tap and touch hold) handler.
    touchZoom - HandlerTouch zoom handler.
    - -
    - - -
    -

    Map panes

    - -
    - - - -
    Panes are DOM elements used to control the ordering of layers on the map. You -can access panes with map.getPane or -map.getPanes methods. New panes can be created with the -map.createPane method. -Every map has the following default panes that differ only in zIndex.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PaneTypeZ-indexDescription
    mapPaneHTMLElement - 'auto'Pane that contains all other map panes
    tilePaneHTMLElement - 200Pane for GridLayers and TileLayers
    overlayPaneHTMLElement - 400Pane for vector overlays (Paths), like Polylines and Polygons
    shadowPaneHTMLElement - 500Pane for overlay shadows (e.g. Marker shadows)
    markerPaneHTMLElement - 600Pane for Icons of Markers
    tooltipPaneHTMLElement - 650Pane for tooltip.
    popupPaneHTMLElement - 700Pane for Popups.
    - -
    - - -
    - -
    -

    Locate options

    - -
    - - - -
    Some of the geolocation methods for Map take in an options parameter. This -is a plain javascript object with the following optional components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    watchBoolean - falseIf true, starts continuous watching of location changes (instead of detecting it -once) using W3C watchPosition method. You can later stop watching using -map.stopLocate() method.
    setViewBoolean - falseIf true, automatically sets the map view to the user location with respect to -detection accuracy, or to world view if geolocation failed.
    maxZoomNumber - InfinityThe maximum zoom for automatic view setting when using setView option.
    timeoutNumber - 10000Number of milliseconds to wait for a response from geolocation before firing a -locationerror event.
    maximumAgeNumber - 0Maximum age of detected location. If less than this amount of milliseconds -passed since last geolocation response, locate will return a cached location.
    enableHighAccuracyBoolean - falseEnables high accuracy, see description in the W3C spec.
    - -
    - - -
    - -
    -

    Zoom options

    - -
    - - - -
    Some of the Map methods which modify the zoom level take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    - - -
    - -
    -

    Pan options

    - -
    - - - -
    Some of the Map methods which modify the center of the map take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If true, panning will always be animated if possible. If false, it will -not animate panning, either resetting the map view if panning more than a -screen away, or just setting a new offset for the map pane (except for panBy -which always does the latter).
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    - - -
    - -
    -

    Zoom/pan options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -
    - -
    -

    FitBounds options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingTopLeftPoint - [0, 0]Sets the amount of padding in the top left corner of a map container that -shouldn't be accounted for when setting the view to fit bounds. Useful if you -have some control overlays on the map like a sidebar and you don't want them -to obscure objects you're zooming to.
    paddingBottomRightPoint - [0, 0]The same for the bottom right corner of the map.
    paddingPoint - [0, 0]Equivalent of setting both top left and bottom right padding to the same value.
    maxZoomNumber - nullThe maximum possible zoom to use.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -

    Marker

    L.Marker is used to display clickable/draggable icons on the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.marker([50.5, 30.5]).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.marker(<LatLng> latlng, <Marker options> options?)Instantiates a Marker object given a geographical point and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconIcon - *Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. If not specified, a new L.Icon.Default is used.
    draggableBoolean - falseWhether the marker is draggable with mouse/touch or not.
    keyboardBoolean - trueWhether the marker can be tabbed to with a keyboard and clicked by pressing enter.
    titleString - ''Text for the browser tooltip that appear on marker hover (no tooltip by default).
    altString - ''Text for the alt attribute of the icon image (useful for accessibility).
    zIndexOffsetNumber - 0By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
    opacityNumber - 1.0The opacity of the marker.
    riseOnHoverBoolean - falseIf true, the marker will get on top of others when you hover the mouse over it.
    riseOffsetNumber - 250The z-index offset used for the riseOnHover feature.
    paneString - 'markerPane'Map pane where the markers icon will be added.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - -
    In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:
    - - - - - - - - - - - - -
    EventDataDescription
    move - EventFired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    - -
    - -

    Dragging events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    dragstart - EventFired when the user starts dragging the marker.
    movestart - EventFired when the marker starts moving (because of dragging).
    drag - EventFired repeatedly while the user drags the marker.
    dragend - DragEndEventFired when the user stops dragging the marker.
    moveend - EventFired when the marker stops moving (because of dragging).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the marker (as a GeoJSON Point Feature).

    -
    getLatLng()LatLng

    Returns the current geographical position of the marker.

    -
    setLatLng(<LatLng> latlng)this

    Changes the marker position to the given point.

    -
    setZIndexOffset(<Number> offset)this

    Changes the zIndex offset of the marker.

    -
    setIcon(<Icon> icon)this

    Changes the marker icon.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the marker.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Interaction handlers

    - -
    Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see Handler methods). Example: -
    marker.dragging.disable();
    -
    - - - - - - - - - - - - -
    PropertyTypeDescription
    dragging - HandlerMarker dragging handler (by both mouse and touch).
    - -
    - - -

    Used to open popups in certain places of the map. Use Map.openPopup to -open popups while making sure that only one popup is open at one time -(recommended for usability), or use Map.addLayer to open as many as you want.

    - -
    - - -
    - - - - - -

    If you want to just bind a popup to marker click and then open it, it's really easy:

    -
    marker.bindPopup(popupContent).openPopup();
    -
    -

    Path overlays like polylines also have a bindPopup method. -Here's a more complicated way to open a popup on a map:

    -
    var popup = L.popup()
    -    .setLatLng(latlng)
    -    .setContent('<p>Hello world!<br />This is a nice popup.</p>')
    -    .openOn(map);
    -
    - - - -
    - - -
    - - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    - -
    - - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -

    Tooltip

    Used to display small texts on top of map layers.

    - -
    -

    Usage example

    - -
    - - - - - -
    marker.bindTooltip("my tooltip text").openTooltip();
    -
    -

    Note about tooltip offset. Leaflet takes two options in consideration -for computing tooltip offseting:

    -
      -
    • the offset Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. -Add a positive x offset to move the tooltip to the right, and a positive y offset to -move it to the bottom. Negatives will move to the left and top.
    • -
    • the tooltipAnchor Icon option: this will only be considered for Marker. You -should adapt this value if you use a custom icon.
    • -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tooltip(<Tooltip options> options?, <Layer> source?)Instantiates a Tooltip object given an optional options object that describes its appearance and location and an optional source object that is used to tag the tooltip with a reference to the Layer to which it refers.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'tooltipPane'Map pane where the tooltip will be added.
    offsetPoint - Point(0, 0)Optional offset of the tooltip position.
    directionString - 'auto'Direction where to open the tooltip. Possible values are: right, left, -top, bottom, center, auto. -auto will dynamically switch between right and left according to the tooltip -position on the map.
    permanentBoolean - falseWhether to open the tooltip permanently or only on mouseover.
    stickyBoolean - falseIf true, the tooltip will follow the mouse instead of being fixed at the feature center.
    interactiveBoolean - falseIf true, the tooltip will listen to the feature events.
    opacityNumber - 0.9Tooltip container opacity.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    classNameString - ''A custom CSS class name to assign to the popup.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer

    Used to load and display tile layers on the map. Extends GridLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map);
    -
    - - - -
    - -

    URL template

    - - - -

    A string of the following form:

    -
    'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
    -

    You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

    -
    L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
    -
    - - -
    - - -
    -

    Creation

    - -
    - -

    Extension methods

    - - - - - - - - - - - - -
    FactoryDescription
    L.tilelayer(<String> urlTemplate, <TileLayer options> options?)Instantiates a tile layer object given a URL template and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber - 0Minimum zoom number.
    maxZoomNumber - 18Maximum zoom number.
    maxNativeZoomNumber - nullMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber - nullMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    subdomainsString|String[] - 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString - ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber - 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean - falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean - falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean - falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean - falseIf true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - dependsIf false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile browsers, otherwise false.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true).

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending TileLayer might reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    getTileUrl(<Object> coords)String

    Called only internally, returns the URL for a tile given its coordinates. -Classes extending TileLayer can override this function to provide custom tile URL naming schemes.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer.WMS

    Used to display WMS services as tile layers on the map. Extends TileLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
    -    layers: 'nexrad-n0r-900913',
    -    format: 'image/png',
    -    transparent: true,
    -    attribution: "Weather data © 2012 IEM Nexrad"
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tileLayer.wms(<String> baseUrl, <TileLayer.WMS options> options)Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
    - -
    - - -
    -

    Options

    - -
    - - - -
    If any custom options not documented here are used, they will be sent to the -WMS server as extra parameters in each request URL. This can be useful for -non-standard vendor WMS parameters.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    layersString - ''(required) Comma-separated list of WMS layers to show.
    stylesString - ''Comma-separated list of WMS styles.
    formatString - 'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
    transparentBoolean - falseIf true, the WMS service will return images with transparency.
    versionString - '1.1.1'Version of the WMS service to use
    crsCRS - nullCoordinate Reference System to use for the WMS requests, defaults to -map CRS. Don't change this if you're not sure what it means.
    uppercaseBoolean - falseIf true, WMS request parameter keys will be uppercase.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber - 0Minimum zoom number.
    maxZoomNumber - 18Maximum zoom number.
    maxNativeZoomNumber - nullMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber - nullMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    subdomainsString|String[] - 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString - ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber - 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean - falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean - falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean - falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean - falseIf true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - dependsIf false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile browsers, otherwise false.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setParams(<Object> params, <Boolean> noRedraw?)this

    Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true).

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    ImageOverlay

    Used to load and display a single image over specific bounds of the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
    -    imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
    -L.imageOverlay(imageUrl, imageBounds).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.imageOverlay(<String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options?)Instantiates an image overlay object given the URL of the image and the -geographical bounds it is tied to.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber - 1.0The opacity of the image overlay.
    altString - ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean - falseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean - falseIf true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Path

    An abstract class that contains options and constants shared between vector -overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polyline

    A class for drawing polyline overlays on a map. Extends Path.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polyline from an array of LatLng points
    -var latlngs = [
    -    [45.51, -122.68],
    -    [37.77, -122.43],
    -    [34.04, -118.2]
    -];
    -var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
    -// zoom the map to the polyline
    -map.fitBounds(polyline.getBounds());
    -
    -

    You can also pass a multi-dimensional array to represent a MultiPolyline shape:

    -
    // create a red polyline from an array of arrays of LatLng points
    -var latlngs = [
    -    [[45.51, -122.68],
    -     [37.77, -122.43],
    -     [34.04, -118.2]],
    -    [[40.78, -73.91],
    -     [41.83, -87.62],
    -     [32.76, -96.72]]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polyline(<LatLng[]> latlngs, <Polyline options> options?)Instantiates a polyline object given an array of geographical points and -optionally an options object. You can create a Polyline object with -multiple separate lines (MultiPolyline) by passing an array of arrays -of geographic points.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

    -
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polygon

    A class for drawing polygon overlays on a map. Extends Polyline. -Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polygon from an array of LatLng points
    -var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
    -var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
    -// zoom the map to the polygon
    -map.fitBounds(polygon.getBounds());
    -
    -

    You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

    -
    var latlngs = [
    -  [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -  [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -];
    -
    -

    Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

    -
    var latlngs = [
    -  [ // first polygon
    -    [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -    [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -  ],
    -  [ // second polygon
    -    [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
    -  ]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polygon(<LatLng[]> latlngs, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Rectangle

    A class for drawing rectangle overlays on a map. Extends Polygon.

    - -
    -

    Usage example

    - -
    - - - - - -
    // define rectangle geographical bounds
    -var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
    -// create an orange rectangle
    -L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
    -// zoom the map to the rectangle bounds
    -map.fitBounds(bounds);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.rectangle(<LatLngBounds> latLngBounds, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setBounds(<LatLngBounds> latLngBounds)this

    Redraws the rectangle with the passed bounds.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Circle

    A class for drawing circle overlays on a map. Extends CircleMarker. -It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).

    - -
    -

    Usage example

    - -
    - - - - - -
    L.circle([50.5, 30.5], {radius: 200}).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.circle(<LatLng> latlng, <Circle options> options?)Instantiates a circle object given a geographical point, and an options object -which contains the circle radius.
    L.circle(<LatLng> latlng, <Number> radius, <Circle options> options?)Obsolete way of instantiating a circle, for compatibility with 0.7.x code. -Do not use in new applications or plugins.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumber - Radius of the circle, in meters.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setRadius(<Number> radius)this

    Sets the radius of a circle. Units are in meters.

    -
    getRadius()Number

    Returns the current radius of a circle. Units are in meters.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    CircleMarker

    A circle of a fixed size with radius specified in pixels. Extends Path.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.circleMarker(<LatLng> latlng, <CircleMarker options> options?)Instantiates a circle marker object given a geographical point, and an optional options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumber - 10Radius of the circle marker, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    setRadius(<Number> radius)this

    Sets the radius of a circle marker. Units are in pixels.

    -
    getRadius()Number

    Returns the current radius of the circle

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    SVG

    Although SVG is not available on IE7 and IE8, these browsers support VML, and the SVG renderer will fall back to VML in this case. -VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility -with old versions of Internet Explorer.

    -

    Allows vector layers to be displayed with SVG. -Inherits Renderer. -Due to technical limitations, SVG is not -available in all web browsers, notably Android 2.x and 3.x. -Although SVG is not available on IE7 and IE8, these browsers support -VML -(a now deprecated technology), and the SVG renderer will fall back to VML in -this case.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use SVG by default for all paths in the map:

    -
    var map = L.map('map', {
    -    renderer: L.svg()
    -});
    -
    -

    Use a SVG renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.svg({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.svg(<Renderer options> options?)Creates a SVG renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - -
    There are several static functions which can be called without instantiating L.SVG:
    - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    create(<String> name)SVGElementReturns a instance of SVGElement, -corresponding to the class name passed. For example, using 'line' will return -an instance of SVGLineElement.
    pointsToPath(<Point[]> rings, <Boolean> closed)StringGenerates a SVG path string for multiple rings, with each ring turning -into "M..L..L.." instructions
    - -
    - - -

    Canvas

    Allows vector layers to be displayed with <canvas>. -Inherits Renderer. -Due to technical limitations, Canvas is not -available in all web browsers, notably IE8, and overlapping geometries might -not display properly in some edge cases.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use Canvas by default for all paths in the map:

    -
    var map = L.map('map', {
    -    renderer: L.canvas()
    -});
    -
    -

    Use a Canvas renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.canvas({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.canvas(<Renderer options> options?)Creates a Canvas renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LayerGroup

    Used to group several layers and handle them as one. If you add it to the map, -any layers added or removed from the group will be added/removed on the map as -well. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.layerGroup([marker1, marker2])
    -    .addLayer(polyline)
    -    .addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.layerGroup(<Layer[]> layers)Create a layer group, optionally given an initial set of layers.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON GeometryCollection).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    FeatureGroup

    Extended LayerGroup that makes it easier to do the same thing to all its member layers:

    -
      -
    • bindPopup binds a popup to all of the layers at once (likewise with bindTooltip)
    • -
    • Events are propagated to the FeatureGroup, so if the group has an event -handler, it will handle events from any of the layers. This includes mouse events -and custom events.
    • -
    • Has layeradd and layerremove events
    • -
    - -
    -

    Usage example

    - -
    - - - - - -
    L.featureGroup([marker1, marker2, polyline])
    -    .bindPopup('Hello world!')
    -    .on('click', function() { alert('Clicked on a member of the group!'); })
    -    .addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.featureGroup(<Layer[]> layers)Create a feature group, optionally given an initial set of layers.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeradd - LayerEventFired when a layer is added to this FeatureGroup
    layerremove - LayerEventFired when a layer is removed from this FeatureGroup
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setStyle(<Path options> style)this

    Sets the given path options to each layer of the group that has a setStyle method.

    -
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON GeometryCollection).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    GeoJSON

    Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse -GeoJSON data and display it on the map. Extends FeatureGroup.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.geoJSON(data, {
    -    style: function (feature) {
    -        return {color: feature.properties.color};
    -    }
    -}).bindPopup(function (layer) {
    -    return layer.feature.properties.description;
    -}).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.geoJSON(<Object> geojson?, <GeoJSON options> options?)Creates a GeoJSON layer. Optionally accepts an object in -GeoJSON format to display on the map -(you can alternatively add it later with addData method) and an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    pointToLayerFunction - *A Function defining how GeoJSON points spawn Leaflet layers. It is internally -called when data is added, passing the GeoJSON point feature and its LatLng. -The default is to spawn a default Marker: -
    function(geoJsonPoint, latlng) {
    -    return L.marker(latlng);
    -}
    -
    styleFunction - *A Function defining the Path options for styling GeoJSON lines and polygons, -called internally when data is added. -The default value is to not override any defaults: -
    function (geoJsonFeature) {
    -    return {}
    -}
    -
    onEachFeatureFunction - *A Function that will be called once for each created Feature, after it has -been created and styled. Useful for attaching events and popups to features. -The default is to do nothing with the newly created layers: -
    function (feature, layer) {}
    -
    filterFunction - *A Function that will be used to decide whether to include a feature or not. -The default is to include all features: -
    function (geoJsonFeature) {
    -    return true;
    -}
    -
    -

    Note: dynamically changing the filter option will have effect only on newly -added data. It will not re-evaluate already included features.

    coordsToLatLngFunction - *A Function that will be used for converting GeoJSON coordinates to LatLngs. -The default is the coordsToLatLng static method.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeradd - LayerEventFired when a layer is added to this FeatureGroup
    layerremove - LayerEventFired when a layer is removed from this FeatureGroup
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addData(data)this

    Adds a GeoJSON object to the layer.

    -
    resetStyle(layer)this

    Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.

    -
    setStyle(style)this

    Changes styles of GeoJSON vector layers with the given style function.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON GeometryCollection).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - -
    There are several static functions which can be called without instantiating L.GeoJSON:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    geometryToLayer(<Object> featureData, <GeoJSON options> options?)LayerCreates a Layer from a given GeoJSON feature. Can use a custom -pointToLayer and/or coordsToLatLng -functions if provided as options.
    coordsToLatLng(<Array> coords)LatLngCreates a LatLng object from an array of 2 numbers (longitude, latitude) -or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
    coordsToLatLngs(<Array> coords, <Number> levelsDeep?, <Function> coordsToLatLng?)ArrayCreates a multidimensional array of LatLngs from a GeoJSON coordinates array. -levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). -Can use a custom coordsToLatLng function.
    latLngToCoords(<LatLng> latlng)ArrayReverse of coordsToLatLng
    latLngsToCoords(<Array> latlngs, <Number> levelsDeep?, <Boolean> closed?)ArrayReverse of coordsToLatLngs -closed determines whether the first point should be appended to the end of the array to close the feature, only used when levelsDeep is 0. False by default.
    asFeature(<Object> geojson)ObjectNormalize GeoJSON geometries/features into GeoJSON features.
    - -
    - - -

    GridLayer

    Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas. -GridLayer can be extended to create a tiled grid of HTML elements like <canvas>, <img> or <div>. GridLayer will handle creating and animating these DOM elements for you.

    - -
    -

    Usage example

    - -
    - -

    Synchronous usage

    - - - -

    To create a custom layer, extend GridLayer and implement the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords){
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -        // get a canvas context and draw something on it using coords.x, coords.y and coords.z
    -        var ctx = tile.getContext('2d');
    -        // return the tile so it can be rendered on screen
    -        return tile;
    -    }
    -});
    -
    - - - -
    - -

    Asynchronous usage

    - - - -

    Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the done() callback.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords, done){
    -        var error;
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -        // draw something asynchronously and pass the tile to the done() callback
    -        setTimeout(function() {
    -            done(error, tile);
    -        }, 1000);
    -        return tile;
    -    }
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
    - -
    - - -
    -

    Options

    - -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - dependsIf false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile browsers, otherwise false.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    minZoomNumber - 0The minimum zoom level that tiles will be loaded at. By default the entire map.
    maxZoomNumber - undefinedThe maximum zoom level that tiles will be loaded at.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending GridLayer shall reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, must be overridden by classes extending GridLayer. -Returns the HTMLElement corresponding to the given coords. If the done callback -is specified, it must be called when the tile has finished loading and drawing.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LatLng

    Represents a geographical point with a certain latitude and longitude.

    - -
    -

    Usage example

    - -
    - - - - - -
    var latlng = L.latLng(50.5, 30.5);
    -

    All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

    -
    map.panTo([50, 30]);
    -map.panTo({lon: 30, lat: 50});
    -map.panTo({lat: 50, lng: 30});
    -map.panTo(L.latLng(50, 30));
    -
    - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLng(<Number> latitude, <Number> longitude, <Number> altitude?)Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
    L.latLng(<Array> coords)Expects an array of the form [Number, Number] or [Number, Number, Number] instead.
    L.latLng(<Object> coords)Expects an plain object of the form {lat: Number, lng: Number} or {lat: Number, lng: Number, alt: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    equals(<LatLng> otherLatLng, <Number> maxMargin?)Boolean

    Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

    -
    toString()String

    Returns a string representation of the point (for debugging purposes).

    -
    distanceTo(<LatLng> otherLatLng)Number

    Returns the distance (in meters) to the given LatLng calculated using the Haversine formula.

    -
    wrap()LatLng

    Returns a new LatLng object with the longitude wrapped so it's always between -180 and +180 degrees.

    -
    toBounds(<Number> sizeInMeters)LatLngBounds

    Returns a new LatLngBounds object in which each boundary is sizeInMeters meters apart from the LatLng.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    lat - NumberLatitude in degrees
    lng - NumberLongitude in degrees
    alt - NumberAltitude in meters (optional)
    - -
    - - -

    LatLngBounds

    Represents a rectangular geographical area on a map.

    - -
    -

    Usage example

    - -
    - - - - - -
    var corner1 = L.latLng(40.712, -74.227),
    -corner2 = L.latLng(40.774, -74.125),
    -bounds = L.latLngBounds(corner1, corner2);
    -
    -

    All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    map.fitBounds([
    -    [40.712, -74.227],
    -    [40.774, -74.125]
    -]);
    -
    -

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLngBounds(<LatLng> corner1, <LatLng> corner2)Creates a LatLngBounds object by defining two diagonally opposite corners of the rectangle.
    L.latLngBounds(<LatLng[]> latlngs)Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<LatLng> latlng)this

    Extend the bounds to contain the given point

    -
    extend(<LatLngBounds> otherBounds)this

    Extend the bounds to contain the given bounds

    -
    pad(<Number> bufferRatio)LatLngBounds

    Returns bigger bounds created by extending the current bounds by a given percentage in each direction.

    -
    getCenter()LatLng

    Returns the center point of the bounds.

    -
    getSouthWest()LatLng

    Returns the south-west point of the bounds.

    -
    getNorthEast()LatLng

    Returns the north-east point of the bounds.

    -
    getNorthWest()LatLng

    Returns the north-west point of the bounds.

    -
    getSouthEast()LatLng

    Returns the south-east point of the bounds.

    -
    getWest()Number

    Returns the west longitude of the bounds

    -
    getSouth()Number

    Returns the south latitude of the bounds

    -
    getEast()Number

    Returns the east longitude of the bounds

    -
    getNorth()Number

    Returns the north latitude of the bounds

    -
    contains(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<LatLng> latlng)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.

    -
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.

    -
    toBBoxString()String

    Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.

    -
    equals(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds.

    -
    isValid()Boolean

    Returns true if the bounds are properly initialized.

    -
    - -
    - - -

    Point

    Represents a point with x and y coordinates in pixels.

    - -
    -

    Usage example

    - -
    - - - - - -
    var point = L.point(200, 300);
    -
    -

    All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

    -
    map.panBy([200, 300]);
    -map.panBy(L.point(200, 300));
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.point(<Number> x, <Number> y, <Boolean> round?)Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
    L.point(<Number[]> coords)Expects an array of the form [x, y] instead.
    L.point(<Object> coords)Expects a plain object of the form {x: Number, y: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    clone()Point

    Returns a copy of the current point.

    -
    add(<Point> otherPoint)Point

    Returns the result of addition of the current and the given points.

    -
    subtract(<Point> otherPoint)Point

    Returns the result of subtraction of the given point from the current.

    -
    divideBy(<Number> num)Point

    Returns the result of division of the current point by the given number.

    -
    multiplyBy(<Number> num)Point

    Returns the result of multiplication of the current point by the given number.

    -
    scaleBy(<Point> scale)Point

    Multiply each coordinate of the current point by each coordinate of -scale. In linear algebra terms, multiply the point by the -scaling matrix -defined by scale.

    -
    unscaleBy(<Point> scale)Point

    Inverse of scaleBy. Divide each coordinate of the current point by -each coordinate of scale.

    -
    round()Point

    Returns a copy of the current point with rounded coordinates.

    -
    floor()Point

    Returns a copy of the current point with floored coordinates (rounded down).

    -
    ceil()Point

    Returns a copy of the current point with ceiled coordinates (rounded up).

    -
    distanceTo(<Point> otherPoint)Number

    Returns the cartesian distance between the current and the given points.

    -
    equals(<Point> otherPoint)Boolean

    Returns true if the given point has the same coordinates.

    -
    contains(<Point> otherPoint)Boolean

    Returns true if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).

    -
    toString()String

    Returns a string representation of the point for debugging purposes.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    x - NumberThe x coordinate of the point
    y - NumberThe y coordinate of the point
    - -
    - - -

    Bounds

    Represents a rectangular area in pixel coordinates.

    - -
    -

    Usage example

    - -
    - - - - - -
    var p1 = L.point(10, 10),
    -p2 = L.point(40, 60),
    -bounds = L.bounds(p1, p2);
    -
    -

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    otherBounds.intersects([[10, 10], [40, 60]]);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.bounds(<Point> topLeft, <Point> bottomRight)Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).
    L.bounds(<Point[]> points)Creates a Bounds object from the points it contains
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<Point> point)this

    Extends the bounds to contain the given point.

    -
    getCenter(<Boolean> round?)Point

    Returns the center point of the bounds.

    -
    getBottomLeft()Point

    Returns the bottom-left point of the bounds.

    -
    getTopRight()Point

    Returns the top-right point of the bounds.

    -
    getSize()Point

    Returns the size of the given bounds

    -
    contains(<Bounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<Point> point)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<Bounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds -intersect if they have at least one point in common.

    -
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds -overlap if their intersection is an area.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    min - PointThe top left corner of the rectangle.
    max - PointThe bottom right corner of the rectangle.
    - -
    - - -

    Icon

    Represents an icon to provide when creating a marker.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.icon({
    -    iconUrl: 'my-icon.png',
    -    iconSize: [38, 95],
    -    iconAnchor: [22, 94],
    -    popupAnchor: [-3, -76],
    -    shadowUrl: 'my-icon-shadow.png',
    -    shadowSize: [68, 95],
    -    shadowAnchor: [22, 94]
    -});
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.icon(<Icon options> options)Creates an icon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlString - null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString - nullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePoint - nullSize of the icon image in pixels.
    iconAnchorPoint - nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint - nullThe coordinates of the point from which popups will "open", relative to the icon anchor.
    shadowUrlString - nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString - null
    shadowSizePoint - nullSize of the shadow image in pixels.
    shadowAnchorPoint - nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString - ''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    - -
    -

    Icon.Default

    - -
    - - - -
    A trivial subclass of Icon, represents the icon to use in Markers when -no icon is specified. Points to the blue marker image distributed with Leaflet -releases. -In order to customize the default icon, just change the properties of L.Icon.Default.prototype.options -(which is a set of Icon options). -If you want to completely replace the default icon, override the -L.Marker.prototype.options.icon with your own icon instead.
    - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    imagePathString - L.Icon.Default will try to auto-detect the absolute location of the -blue icon images. If you are placing these images in a non-standard -way, set this option to point to the right absolute path.
    - -
    - - -

    DivIcon

    Represents a lightweight icon for markers that uses a simple <div> -element instead of an image. Inherits from Icon but ignores the iconUrl and shadow options.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.divIcon({className: 'my-div-icon'});
    -// you can set .my-div-icon styles in CSS
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.divIcon(<DivIcon options> options)Creates a DivIcon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    htmlString - ''Custom HTML code to put inside the div element, empty by default.
    bgPosPoint - [0, 0]Optional relative position of the background, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlString - null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString - nullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePoint - nullSize of the icon image in pixels.
    iconAnchorPoint - nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint - nullThe coordinates of the point from which popups will "open", relative to the icon anchor.
    shadowUrlString - nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString - null
    shadowSizePoint - nullSize of the shadow image in pixels.
    shadowAnchorPoint - nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString - ''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Control.Zoom

    A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.zoom(<Control.Zoom options> options)Creates a zoom control
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    zoomInTextString - '+'The text set on the 'zoom in' button.
    zoomInTitleString - 'Zoom in'The title set on the 'zoom in' button.
    zoomOutTextString - '-'The text set on the 'zoom out' button.
    zoomOutTitleString - 'Zoom out'The title set on the 'zoom out' button.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Attribution

    The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with the getAttribution method automatically. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.attribution(<Control.Attribution options> options)Creates an attribution control.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    prefixString - 'Leaflet'The HTML text shown before the attributions. Pass false to disable.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setPrefix(<String> prefix)this

    Sets the text before the attributions.

    -
    addAttribution(<String> text)this

    Adds an attribution text (e.g. 'Vector data &copy; Mapbox').

    -
    removeAttribution(<String> text)this

    Removes an attribution text.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Layers

    The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    var baseLayers = {
    -    "Mapbox": mapbox,
    -    "OpenStreetMap": osm
    -};
    -var overlays = {
    -    "Marker": marker,
    -    "Roads": roadsLayer
    -};
    -L.control.layers(baseLayers, overlays).addTo(map);
    -
    -

    The baseLayers and overlays parameters are object literals with layer names as keys and Layer objects as values:

    -
    {
    -    "<someName1>": layer1,
    -    "<someName2>": layer2
    -}
    -
    -

    The layer names can contain HTML, which allows you to add additional styling to the items:

    -
    {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.layers(<Object> baselayers?, <Object> overlays?, <Control.Layers options> options?)Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    collapsedBoolean - trueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
    autoZIndexBoolean - trueIf true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
    hideSingleBaseBoolean - falseIf true, the base layers in the control will be hidden when there is only one.
    sortLayersBoolean - falseWhether to sort the layers. When false, layers will keep the order -in which they were added to the control.
    sortFunctionFunction - *A compare function -that will be used for sorting the layers, when sortLayers is true. -The function receives both the L.Layer instances and their names, as in -sortFunction(layerA, layerB, nameA, nameB). -By default, it sorts layers alphabetically by their name.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addBaseLayer(<Layer> layer, <String> name)this

    Adds a base layer (radio button entry) with the given name to the control.

    -
    addOverlay(<Layer> layer, <String> name)this

    Adds an overlay (checkbox entry) with the given name to the control.

    -
    removeLayer(<Layer> layer)this

    Remove the given layer from the control.

    -
    expand()this

    Expand the control container if collapsed.

    -
    collapse()this

    Collapse the control container if expanded.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Scale

    A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.control.scale().addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.scale(<Control.Scale options> options?)Creates an scale control with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    maxWidthNumber - 100Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
    metricBoolean - TrueWhether to show the metric scale line (m/km).
    imperialBoolean - TrueWhether to show the imperial scale line (mi/ft).
    updateWhenIdleBoolean - falseIf true, the control is updated on moveend, otherwise it's always up-to-date (updated on move).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Browser

    A namespace with static properties for browser/feature detection used by Leaflet internally.

    - -
    -

    Usage example

    - -
    - - - - - -
    if (L.Browser.ielt9) {
    -  alert('Upgrade your browser, dude!');
    -}
    -
    - - - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    ie - Booleantrue for all Internet Explorer versions (not Edge).
    ielt9 - Booleantrue for Internet Explorer versions less than 9.
    edge - Booleantrue for the Edge web browser.
    webkit - Booleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
    gecko - Booleantrue for gecko-based browsers like Firefox.
    android - Booleantrue for any browser running on an Android platform.
    android23 - Booleantrue for browsers running on Android 2 or Android 3.
    chrome - Booleantrue for the Chrome browser.
    safari - Booleantrue for the Safari browser.
    win - Booleantrue when the browser is running in a Windows platform
    ie3d - Booleantrue for all Internet Explorer versions supporting CSS transforms.
    webkit3d - Booleantrue for webkit-based browsers supporting CSS transforms.
    gecko3d - Booleantrue for gecko-based browsers supporting CSS transforms.
    opera12 - Booleantrue for the Opera browser supporting CSS transforms (version 12 or later).
    any3d - Booleantrue for all browsers supporting CSS transforms.
    mobile - Booleantrue for all browsers running in a mobile device.
    mobileWebkit - Booleantrue for all webkit-based browsers in a mobile device.
    mobileWebkit3d - Booleantrue for all webkit-based browsers in a mobile device supporting CSS transforms.
    mobileOpera - Booleantrue for the Opera browser in a mobile device.
    mobileGecko - Booleantrue for gecko-based browsers running in a mobile device.
    touch - Booleantrue for all browsers supporting touch events.
    msPointer - Booleantrue for browsers implementing the Microsoft touch events model (notably IE10).
    pointer - Booleantrue for all browsers supporting pointer events.
    retina - Booleantrue for browsers on a high-resolution "retina" screen.
    canvas - Booleantrue when the browser supports <canvas>.
    vml - Booleantrue if the browser supports VML.
    svg - Booleantrue when the browser supports SVG.
    - -
    - - -

    Util

    Various utility functions, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> dest, <Object> src?)ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
    create(<Object> proto, <Object> properties?)ObjectCompatibility polyfill for Object.create
    bind(<Function> fn, )FunctionReturns a new function bound to the arguments passed, like Function.prototype.bind. -Has a L.bind() shortcut.
    stamp(<Object> obj)NumberReturns the unique ID of an object, assigning it one if it doesn't have it.
    throttle(<Function> fn, <Number> time, <Object> context)FunctionReturns a function which executes function fn with the given scope context -(so that the this keyword refers to context inside fn's code). The function -fn will be called no more than one time per given amount of time. The arguments -received by the bound function will be any arguments passed when binding the -function, followed by any arguments passed when invoking the bound function. -Has an L.bind shortcut.
    wrapNum(<Number> num, <Number[]> range, <Boolean> includeMax?)NumberReturns the number num modulo range in such a way so it lies within -range[0] and range[1]. The returned value will be always smaller than -range[1] unless includeMax is set to true.
    falseFn()FunctionReturns a function which always returns false.
    formatNum(<Number> num, <Number> digits?)NumberReturns the number num rounded to digits decimals, or to 5 decimals by default.
    trim(<String> str)StringCompatibility polyfill for String.prototype.trim
    splitWords(<String> str)String[]Trims and splits the string on whitespace and returns the array of parts.
    setOptions(<Object> obj, <Object> options)ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.
    getParamString(<Object> obj, <String> existingUrl?, <Boolean> uppercase?)StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} -translates to '?a=foo&b=bar'. If existingUrl is set, the parameters will -be appended at the end. If uppercase is true, the parameter names will -be uppercased (e.g. '?A=foo&B=bar')
    template(<String> str, <Object> data)StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' -and a data object like {a: 'foo', b: 'bar'}, returns evaluated string -('Hello foo, bar'). You can also specify functions instead of strings for -data values — they will be evaluated passing data as an argument.
    isArray(obj)BooleanCompatibility polyfill for Array.isArray
    indexOf(<Array> array, <Object> el)NumberCompatibility polyfill for Array.prototype.indexOf
    requestAnimFrame(<Function> fn, <Object> context?, <Boolean> immediate?)NumberSchedules fn to be executed when the browser repaints. fn is bound to -context if given. When immediate is set, fn is called immediately if -the browser doesn't have native support for -window.requestAnimationFrame, -otherwise it's delayed. Returns a request ID that can be used to cancel the request.
    cancelAnimFrame(<Number> id)undefinedCancels a previous requestAnimFrame. See also window.cancelAnimationFrame.
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    lastId - NumberLast unique ID used by stamp()
    emptyImageUrl - StringData URI string containing a base64-encoded empty GIF image. -Used as a hack to free memory from unused images on WebKit-powered -mobile devices (by setting image src to this string).
    - -
    - - -

    Transformation

    Represents an affine transformation: a set of coefficients a, b, c, d -for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing -the reverse. Used by Leaflet in its projections code.

    - -
    -

    Usage example

    - -
    - - - - - -
    var transformation = new L.Transformation(2, 5, -1, 10),
    -    p = L.point(1, 2),
    -    p2 = transformation.transform(p), //  L.point(7, 8)
    -    p3 = transformation.untransform(p2); //  L.point(1, 2)
    -
    - - - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    transform(<Point> point, <Number> scale?)Point

    Returns a transformed point, optionally multiplied by the given scale. -Only accepts actual L.Point instances, not arrays.

    -
    untransform(<Point> point, <Number> scale?)Point

    Returns the reverse transformation of the given point, optionally divided -by the given scale. Only accepts actual L.Point instances, not arrays.

    -
    - -
    - - -

    LineUtil

    Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    simplify(<Point[]> points, <Number> tolerance)Point[]Dramatically reduces the number of points in a polyline while retaining -its shape and returns a new array of simplified points, using the -Douglas-Peucker algorithm. -Used for a huge performance boost when processing/displaying Leaflet polylines for -each zoom level and also reducing visual noise. tolerance affects the amount of -simplification (lesser value means higher quality but slower and with more points). -Also released as a separated micro-library Simplify.js.
    pointToSegmentDistance(<Point> p, <Point> p1, <Point> p2)NumberReturns the distance between point p and segment p1 to p2.
    closestPointOnSegment(<Point> p, <Point> p1, <Point> p2)NumberReturns the closest point from a point p on a segment p1 to p2.
    clipSegment(<Point> a, <Point> b, <Bounds> bounds, <Boolean> useLastCode?, <Boolean> round?)Point[]|BooleanClips the segment a to b by rectangular bounds with the -Cohen-Sutherland algorithm -(modifying the segment points directly!). Used by Leaflet to only show polyline -points that are on the screen or near, increasing performance.
    - -
    - - -

    PolyUtil

    Various utility functions for polygon geometries.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    clipPolygon(<Point[]> points, <Bounds> bounds, <Boolean> round?)Point[]Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgeman algorithm). -Used by Leaflet to only show polygon points that are on the screen or near, increasing -performance. Note that polygon points needs different algorithm for clipping -than polyline, so there's a separate method for it.
    - -
    - - -

    DomEvent

    Utility functions to work with the DOM events, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    on(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisAdds a listener function (fn) to a particular DOM event type of the -element el. You can optionally specify the context of the listener -(object the this keyword will point to). You can also pass several -space-separated types (e.g. 'click dblclick').
    on(<HTMLElement> el, <Object> eventMap, <Object> context?)thisAdds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    off(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisRemoves a previously added listener function. If no function is specified, -it will remove all the listeners of that particular DOM event from the element. -Note that if you passed a custom context to on, you must pass the same -context to off in order to remove the listener.
    off(<HTMLElement> el, <Object> eventMap, <Object> context?)thisRemoves a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    stopPropagation(<DOMEvent> ev)thisStop the given event from propagation to parent elements. Used inside the listener functions: -
    L.DomEvent.on(div, 'click', function (ev) {
    -    L.DomEvent.stopPropagation(ev);
    -});
    -
    disableScrollPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'mousewheel' events (plus browser variants).
    disableClickPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'click', 'doubleclick', -'mousedown' and 'touchstart' events (plus browser variants).
    preventDefault(<DOMEvent> ev)thisPrevents the default action of the DOM Event ev from happening (such as -following a link in the href of the a element, or doing a POST request -with page reload when a <form> is submitted). -Use it inside listener functions.
    stop(ev)thisDoes stopPropagation and preventDefault at the same time.
    getMousePosition(<DOMEvent> ev, <HTMLElement> container?)PointGets normalized mouse position from a DOM event relative to the -container or to the whole page if not specified.
    getWheelDelta(<DOMEvent> ev)NumberGets normalized wheel delta from a mousewheel DOM event, in vertical -pixels scrolled (negative if scrolling down). -Events from pointing devices without precise scrolling are mapped to -a best guess of 60 pixels.
    addListener()thisAlias to L.DomEvent.on
    removeListener()thisAlias to L.DomEvent.off
    - -
    - - -

    DomUtil

    Utility functions to work with the DOM -tree, used by Leaflet internally. -Most functions expecting or returning a HTMLElement also work for -SVG elements. The only difference is that classes refer to CSS classes -in HTML and SVG classes in SVG.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    get(<String|HTMLElement> id)HTMLElementReturns an element given its DOM id, or returns the element itself -if it was passed directly.
    getStyle(<HTMLElement> el, <String> styleAttrib)StringReturns the value for a certain style attribute on an element, -including computed values or values set through CSS.
    create(<String> tagName, <String> className?, <HTMLElement> container?)HTMLElementCreates an HTML element with tagName, sets its class to className, and optionally appends it to container element.
    remove(<HTMLElement> el)Removes el from its parent element
    empty(<HTMLElement> el)Removes all of el's children elements from el
    toFront(<HTMLElement> el)Makes el the last children of its parent, so it renders in front of the other children.
    toBack(<HTMLElement> el)Makes el the first children of its parent, so it renders back from the other children.
    hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element's class attribute contains name.
    addClass(<HTMLElement> el, <String> name)Adds name to the element's class attribute.
    removeClass(<HTMLElement> el, <String> name)Removes name from the element's class attribute.
    setClass(<HTMLElement> el, <String> name)Sets the element's class.
    getClass(<HTMLElement> el)StringReturns the element's class.
    setOpacity(<HTMLElement> el, <Number> opacity)Set the opacity of an element (including old IE support). -opacity must be a number from 0 to 1.
    testProp(<String[]> props)String|falseGoes through the array of style names and returns the first name -that is a valid style name for an element. If no such name is found, -it returns false. Useful for vendor-prefixed styles like transform.
    setTransform(<HTMLElement> el, <Point> offset, <Number> scale?)Resets the 3D CSS transform of el so it is translated by offset pixels -and optionally scaled by scale. Does not have an effect if the -browser doesn't support 3D CSS transforms.
    setPosition(<HTMLElement> el, <Point> position)Sets the position of el to coordinates specified by position, -using CSS translate or top/left positioning depending on the browser -(used by Leaflet internally to position its layers).
    getPosition(<HTMLElement> el)PointReturns the coordinates of an element previously positioned with setPosition.
    disableTextSelection()Prevents the user from generating selectstart DOM events, usually generated -when the user drags the mouse through a page with text. Used internally -by Leaflet to override the behaviour of any click-and-drag interaction on -the map. Affects drag interactions on the whole document.
    enableTextSelection()Cancels the effects of a previous L.DomUtil.disableTextSelection.
    disableImageDrag()As L.DomUtil.disableTextSelection, but -for dragstart DOM events, usually generated when the user drags an image.
    enableImageDrag()Cancels the effects of a previous L.DomUtil.disableImageDrag.
    preventOutline(<HTMLElement> el)Makes the outline -of the element el invisible. Used internally by Leaflet to prevent -focusable elements from displaying an outline when the user performs a -drag interaction on them.
    restoreOutline()Cancels the effects of a previous L.DomUtil.preventOutline.
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    TRANSFORM - StringVendor-prefixed fransform style name (e.g. 'webkitTransform' for WebKit).
    TRANSITION - StringVendor-prefixed transform style name.
    - -
    - - -

    PosAnimation

    Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

    - -
    -

    Usage example

    - -
    - - - - - -
    var fx = new L.PosAnimation();
    -fx.run(el, [300, 500], 0.5);
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.PosAnimation()Creates a PosAnimation object.
    - - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    start - EventFired when the animation starts
    step - EventFired continuously during the animation.
    end - EventFired when the animation ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    run(<HTMLElement> el, <Point> newPos, <Number> duration?, <Number> easeLinearity?)

    Run an animation of a given element to a new position, optionally setting -duration in seconds (0.25 by default) and easing linearity factor (3rd -argument of the cubic bezier curve, -0.5 by default).

    -
    stop()

    Stops the animation (if currently running).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Draggable

    A class for making DOM elements draggable (including touch support). -Used internally for map and marker dragging. Only works for elements -that were positioned with L.DomUtil.setPosition.

    - -
    -

    Usage example

    - -
    - - - - - -
    var draggable = new L.Draggable(elementToDrag);
    -draggable.enable();
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.Draggable(<HTMLElement> el, <HTMLElement> dragHandle?, <Boolean> preventOutline)Creates a Draggable object for moving el when you start dragging the dragHandle element (equals el itself by default).
    - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    clickToleranceNumber - 3The max number of pixels a user can shift the mouse pointer during a click -for it to be considered a valid click (as opposed to a mouse drag).
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    down - EventFired when a drag is about to start.
    dragstart - EventFired when a drag starts
    predrag - EventFired continuously during dragging before each corresponding -update of the element's position.
    drag - EventFired continuously during dragging.
    dragend - DragEndEventFired when the drag ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()

    Enables the dragging ability

    -
    disable()

    Disables the dragging ability

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Class

    L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here. -In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

    - -
    -

    Usage example

    - -
    - - - - - -
    var MyClass = L.Class.extend({
    -initialize: function (greeter) {
    -    this.greeter = greeter;
    -    // class constructor
    -},
    -greet: function (name) {
    -    alert(this.greeter + ', ' + name)
    -    }
    -});
    -// create instance of MyClass, passing "Hello" to the constructor
    -var a = new MyClass("Hello");
    -// call greet method, alerting "Hello, World"
    -a.greet("World");
    -
    - - - -
    - -

    Class Factories

    - - - -

    You may have noticed that Leaflet objects are created without using -the new keyword. This is achieved by complementing each class with a -lowercase factory method:

    -
    new L.Map('map'); // becomes:
    -L.map('map');
    -
    -

    The factories are implemented very easily, and you can do this for your own classes:

    -
    L.map = function (id, options) {
    -    return new L.Map(id, options);
    -};
    -
    - - - -
    - -

    Inheritance

    - - - -

    You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

    -
    var MyChildClass = MyClass.extend({
    -    // ... new properties and methods
    -});
    -
    -

    This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

    -
    var a = new MyChildClass();
    -a instanceof MyChildClass; // true
    -a instanceof MyClass; // true
    -
    -

    You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

    -
    var MyChildClass = MyClass.extend({
    -    initialize: function () {
    -        MyClass.prototype.initialize.call(this, "Yo");
    -    },
    -    greet: function (name) {
    -        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
    -    }
    -});
    -var a = new MyChildClass();
    -a.greet('Jason'); // alerts "Yo, bro Jason!"
    -
    - - -
    - -

    Options

    - - - -

    options is a special property that unlike other objects that you pass -to extend will be merged with the parent one instead of overriding it -completely, which makes managing configuration of objects and default -values convenient:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        myOption1: 'foo',
    -        myOption2: 'bar'
    -    }
    -});
    -var MyChildClass = MyClass.extend({
    -    options: {
    -        myOption1: 'baz',
    -        myOption3: 5
    -    }
    -});
    -var a = new MyChildClass();
    -a.options.myOption1; // 'baz'
    -a.options.myOption2; // 'bar'
    -a.options.myOption3; // 5
    -
    -

    There's also L.Util.setOptions, a method for -conveniently merging options passed to constructor with the defaults -defines in the class:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        foo: 'bar',
    -        bla: 5
    -    },
    -    initialize: function (options) {
    -        L.Util.setOptions(this, options);
    -        ...
    -    }
    -});
    -var a = new MyClass({bla: 10});
    -a.options; // {foo: 'bar', bla: 10}
    -
    - - - -
    - -

    Includes

    - - - -

    includes is a special class property that merges all specified objects into the class (such objects are called mixins).

    -
     var MyMixin = {
    -    foo: function () { ... },
    -    bar: 5
    -};
    -var MyClass = L.Class.extend({
    -    includes: MyMixin
    -});
    -var a = new MyClass();
    -a.foo();
    -
    -

    You can also do such includes in runtime with the include method:

    -
    MyClass.include(MyMixin);
    -
    -

    statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

    -
    var MyClass = L.Class.extend({
    -    statics: {
    -        FOO: 'bar',
    -        BLA: 5
    -    }
    -});
    -MyClass.FOO; // 'bar'
    -
    - - - -
    - -

    Constructor hooks

    - - - -

    If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

    -
    MyClass.addInitHook(function () {
    -    // ... do something in constructor additionally
    -    // e.g. add event listeners, set custom properties etc.
    -});
    -
    -

    You can also use the following shortcut when you just need to make one additional method call:

    -
    MyClass.addInitHook('methodName', arg1, arg2, …);
    -
    - - - -
    - - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> props)FunctionExtends the current class given the properties to be included. -Returns a Javascript function that is a class constructor (to be called with new).
    include(<Object> properties)thisIncludes a mixin into the current class.
    mergeOptions(<Object> options)thisMerges options into the defaults of the class.
    addInitHook(<Function> fn)thisAdds a constructor hook to the class.
    - -
    - - -

    Evented

    A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

    - -
    -

    Usage example

    - -
    - - - - - -
    map.on('click', function(e) {
    -    alert(e.latlng);
    -} );
    -
    -

    Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

    -
    function onClick(e) { ... }
    -map.on('click', onClick);
    -map.off('click', onClick);
    -
    - - - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    - - -

    Layer

    A set of methods from the Layer base class that all Leaflet layers use. -Inherits all methods, options and events from L.Evented.

    - -
    -

    Usage example

    - -
    - - - - - -
    var layer = L.Marker(latlng).addTo(map);
    -layer.addTo(map);
    -layer.remove();
    -
    - - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Layer will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    - -

    Extension methods

    - -
    Every layer should extend from L.Layer and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)this

    Should contain code that creates DOM elements for the layer, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).

    -
    onRemove(<Map> map)this

    Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).

    -
    getEvents()Object

    This optional method should return an object like { viewreset: this._reset } for addEventListener. The event handlers in this object will be automatically added and removed from the map with your layer.

    -
    getAttribution()String

    This optional method should return a string containing HTML to be shown on the Attribution control whenever the layer is visible.

    -
    beforeAdd(<Map> map)this

    Optional method. Called on map.addLayer(layer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.

    -
    - -
    - -

    Popup methods

    - -
    All layers share a set of methods convenient for binding popups to it. -
    var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
    -layer.openPopup();
    -layer.closePopup();
    -
    -

    Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    - -

    Tooltip methods

    - -
    All layers share a set of methods convenient for binding tooltips to it. -
    var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
    -layer.openTooltip();
    -layer.closeTooltip();
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Interactive layer

    Some Layers can be made interactive - when the user interacts -with such a layer, mouse events like click and mouseover can be handled. -Use the event handling methods to handle these events.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - -

    Mouse events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Control

    L.Control is a base class for implementing map controls. Handles positioning. -All other controls extend from this class.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Control will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    - -

    Extension methods

    - -
    Every control should extend from L.Control and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)HTMLElement

    Should return the container DOM element for the control and add listeners on relevant map events. Called on control.addTo(map).

    -
    onRemove(<Map> map)

    Optional method. Should contain all clean up code that removes the listeners previously added in onAdd. Called on control.remove().

    -
    - -
    - - -

    Handler

    Abstract class for map interaction handlers

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()this

    Enables the handler

    -
    disable()this

    Disables the handler

    -
    enabled()Boolean

    Returns true if the handler is enabled

    -
    - -
    - -

    Extension methods

    - -
    Classes inheriting from Handler must implement the two following methods:
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHooks()

    Called when the handler is enabled, should add event hooks.

    -
    removeHooks()

    Called when the handler is disabled, should remove the event hooks added previously.

    -
    - -
    - - -

    Projection

    An object with methods for projecting geographical coordinates of the world onto -a flat surface (and back). See Map projection.

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    project(<LatLng> latlng)Point

    Projects geographical coordinates into a 2D point. Only accepts actual L.LatLng instances, not arrays.

    -
    unproject(<Point> point)LatLng

    The inverse of project. Projects a 2D point into a geographical location. Only accepts actual L.Point instances, not arrays.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    bounds - LatLngBoundsThe bounds where the projection is valid
    - -
    - - -
    -

    Defined projections

    - -
    - - - -
    Leaflet comes with a set of already defined Projections out of the box:
    - - - - - - - - - - - - - - - - - - - -
    ProjectionDescription
    L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, -mostly used by GIS enthusiasts. Directly maps x as longitude, and y as -latitude. Also suitable for flat worlds, e.g. game maps. Used by the -EPSG:3395 and Simple CRS.
    L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.
    L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, -used by almost all free and commercial tile providers. Assumes that Earth is -a sphere. Used by the EPSG:3857 CRS.
    - -
    - - -

    CRS

    Abstract class that defines coordinate reference systems for projecting -geographical points into pixel (screen) coordinates and back (and to -coordinates in other units for WMS services). See -spatial reference system. -Leaflet defines the most usual CRSs by default. If you want to use a -CRS not defined by default, take a look at the -Proj4Leaflet plugin.

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    latLngToPoint(<LatLng> latlng, <Number> zoom)Point

    Projects geographical coordinates into pixel coordinates for a given zoom.

    -
    pointToLatLng(<Point> point, <Number> zoom)LatLng

    The inverse of latLngToPoint. Projects pixel coordinates on a given -zoom into geographical coordinates.

    -
    project(<LatLng> latlng)Point

    Projects geographical coordinates into coordinates in units accepted for -this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).

    -
    unproject(<Point> point)LatLng

    Given a projected coordinate returns the corresponding LatLng. -The inverse of project.

    -
    scale(<Number> zoom)Number

    Returns the scale used when transforming projected coordinates into -pixel coordinates for a particular zoom. For example, it returns -256 * 2^zoom for Mercator-based CRS.

    -
    zoom(<Number> scale)Number

    Inverse of scale(), returns the zoom level corresponding to a scale -factor of scale.

    -
    getProjectedBounds(<Number> zoom)Bounds

    Returns the projection's bounds scaled and transformed for the provided zoom.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    code - StringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857')
    wrapLng - Number[]An array of two numbers defining whether the longitude (horizontal) coordinate -axis wraps around a given range and how. Defaults to [-180, 180] in most -geographical CRSs. If undefined, the longitude axis does not wrap around.
    wrapLat - Number[]Like wrapLng, but for the latitude (vertical) axis.
    infinite - BooleanIf true, the coordinate space will be unbounded (infinite in both axes)
    - -
    - - -
    -

    Defined CRSs

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CRSDescription
    L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
    L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial -tile providers. Uses Spherical Mercator projection. Set in by default in -Map's crs option.
    L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. -Leaflet 1.0.x complies with the TMS coordinate scheme for EPSG:4326, -which is a breaking change from 0.7.x behaviour. If you are using a TileLayer -with this CRS, ensure that there are two 256x256 pixel tiles covering the -whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), -or (-180,-90) for TileLayers with the tms option set.
    L.CRS.EarthServes as the base for CRS that are global such that they cover the earth. -Can only be used as the base for other CRS and cannot be used directly, -since it does not have a code, projection or transformation. distance() returns -meters.
    L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. -May be used for maps of flat surfaces (e.g. game maps). Note that the y -axis should still be inverted (going from bottom to top). distance() returns -simple euclidean distance.
    - -
    - - -

    Renderer

    Base class for vector renderer implementations (SVG, Canvas). Handles the -DOM container of the renderer, its bounds, and its zoom animation. -A Renderer works as an implicit layer group for all Paths - the renderer -itself can be added or removed to the map. All paths use a renderer, which can -be implicit (the map will decide the type of renderer and use it automatically) -or explicit (using the renderer option of the path). -Do not use this class directly, use SVG and Canvas instead.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Event objects

    Whenever a class inheriting from Evented fires an event, a listener function -will be called with an event argument, which is a plain object containing -information about the event. For example:

    -
    map.on('click', function(ev) {
    -    alert(ev.latlng); // ev is an event object (MouseEvent in this case)
    -});
    -
    -

    The information available depends on the event type:

    - - - -
    -

    Event

    - -
    - - - -
    The base event object. All other event objects contain these properties too.
    - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    - - -
    - -
    -

    KeyboardEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    originalEvent - DOMEventThe original DOM KeyboardEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    MouseEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlng - LatLngThe geographical point where the mouse event occurred.
    layerPoint - PointPixel coordinates of the point where the mouse event occurred relative to the map layer.
    containerPoint - PointPixel coordinates of the point where the mouse event occurred relative to the map сontainer.
    originalEvent - DOMEventThe original DOM MouseEvent or DOM TouchEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    LocationEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlng - LatLngDetected geographical location of the user.
    bounds - LatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
    accuracy - NumberAccuracy of location in meters.
    altitude - NumberHeight of the position above the WGS84 ellipsoid in meters.
    altitudeAccuracy - NumberAccuracy of altitude in meters.
    heading - NumberThe direction of travel in degrees counting clockwise from true North.
    speed - NumberCurrent velocity in meters per second.
    timestamp - NumberThe time when the position was acquired.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    ErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    message - StringError message.
    code - NumberError code (if applicable).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    LayerEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    LayersControlEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer that was added or removed.
    name - StringThe name of the layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    TileEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tile - HTMLElementThe tile element (image).
    coords - PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    TileErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tile - HTMLElementThe tile element (image).
    coords - PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    error - *Error passed to the tile's done() callback.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    ResizeEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    oldSize - PointThe old size before resize event.
    newSize - PointThe new size after the resize event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    GeoJSONEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer for the GeoJSON feature that is being added to the map.
    properties - ObjectGeoJSON properties of the feature.
    geometryType - StringGeoJSON geometry type of the feature.
    id - StringGeoJSON ID of the feature (if present).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    PopupEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    popup - PopupThe popup that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    TooltipEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tooltip - TooltipThe tooltip that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -
    - -
    -

    DragEndEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    distance - NumberThe distance in pixels the draggable element was moved by.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event.
    - -
    -
    -
    - -

    DivOverlay

    Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    offsetPoint - Point(0, 7)The offset of the popup position. Useful to control the anchor -of the popup when opening it on some overlays.
    classNameString - ''A custom CSS class name to assign to the popup.
    paneString - 'popupPane'Map pane where the popup will be added.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map> map)this

    Adds the layer to the given map

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Global Switches

    Global switches are created for rare cases and generally make -Leaflet to not detect a particular browser feature even if it's -there. You need to set the switch as a global variable to true -before including Leaflet on the page, like this:

    -
    <script>L_NO_TOUCH = true;</script>
    -<script src="leaflet.js"></script>
    -
    - - - - - - - - - - - - - - - - - -
    SwitchDescription
    L_NO_TOUCHForces Leaflet to not use touch events even if it detects them.
    L_DISABLE_3DForces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.
    - -

    noConflict

    This method restores the L global variable to the original value -it had before Leaflet inclusion, and returns the real Leaflet -namespace so you can put it elsewhere, like this:

    -
    <script src='libs/l.js'>
    -<!-- L points to some other library -->
    -<script src='leaflet.js'>
    -<!-- you include Leaflet, it replaces the L variable to Leaflet namespace -->
    -<script>
    -var Leaflet = L.noConflict();
    -// now L points to that other library again, and you can use Leaflet.Map etc.
    -</script>
    -
    - -

    version

    A constant that represents the Leaflet version in use.

    -
    L.version; // contains "1.0.0" (or whatever version is currently in use)
    -
    diff --git a/docs/reference-1.3.0.html b/docs/reference-1.3.0.html deleted file mode 100644 index d7eda573d83..00000000000 --- a/docs/reference-1.3.0.html +++ /dev/null @@ -1,23904 +0,0 @@ ---- -layout: v2 -title: Documentation -bodyclass: api-page ---- - -

    Leaflet API reference

    - -

    This reference reflects Leaflet 1.3.0 and Leaflet 1.3.1. Check this list if you are using a different version of Leaflet.

    - -
    - -
    -

    UI Layers

    - -

    Raster Layers

    - -

    Vector Layers

    - -
    -
    -

    Other Layers

    - -

    Basic Types

    - -

    Controls

    - -
    -
    - - - - - - -

    Utility

    - -

    DOM Utility

    - -
    -
    -

    Base Classes

    - - -

    Misc

    - -
    -
    - -

    Map

    The central class of the API — it is used to create a map on a page and manipulate it.

    - -
    -

    Usage example

    - -
    - - - - - -
    // initialize the map on the "map" div with a given center and zoom
    -var map = L.map('map', {
    -    center: [51.505, -0.09],
    -    zoom: 13
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.map(<String> id, <Map options> options?)Instantiates a map object given the DOM ID of a <div> element -and optionally an object literal with Map options.
    L.map(<HTMLElement> el, <Map options> options?)Instantiates a map object given an instance of a <div> HTML element -and optionally an object literal with Map options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    preferCanvasBoolean - falseWhether Paths should be rendered on a Canvas renderer. -By default, all Paths are rendered in a SVG renderer.
    - -
    - -

    Control options

    - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionControlBoolean - trueWhether a attribution control is added to the map by default.
    zoomControlBoolean - trueWhether a zoom control is added to the map by default.
    - -
    - -

    Interaction Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    closePopupOnClickBoolean - trueSet it to false if you don't want popups to close when user clicks the map.
    zoomSnapNumber - 1Forces the map's zoom level to always be a multiple of this, particularly -right after a fitBounds() or a pinch-zoom. -By default, the zoom level snaps to the nearest integer; lower values -(e.g. 0.5 or 0.1) allow for greater granularity. A value of 0 -means the zoom level will not be snapped after fitBounds or a pinch-zoom.
    zoomDeltaNumber - 1Controls how much the map's zoom level will change after a -zoomIn(), zoomOut(), pressing + -or - on the keyboard, or using the zoom controls. -Values smaller than 1 (e.g. 0.5) allow for greater granularity.
    trackResizeBoolean - trueWhether the map automatically handles browser window resize to update itself.
    boxZoomBoolean - trueWhether the map can be zoomed to a rectangular area specified by -dragging the mouse while pressing the shift key.
    doubleClickZoomBoolean|String - trueWhether the map can be zoomed in by double clicking on it and -zoomed out by double clicking while holding shift. If passed -'center', double-click zoom will zoom to the center of the - view regardless of where the mouse was.
    draggingBoolean - trueWhether the map be draggable with mouse/touch or not.
    - -
    - -

    Map State Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    crsCRS - L.CRS.EPSG3857The Coordinate Reference System to use. Don't change this if you're not -sure what it means.
    centerLatLng - undefinedInitial geographic center of the map
    zoomNumber - undefinedInitial map zoom level
    minZoomNumber - *Minimum zoom level of the map. -If not specified and at least one GridLayer or TileLayer is in the map, -the lowest of their minZoom options will be used instead.
    maxZoomNumber - *Maximum zoom level of the map. -If not specified and at least one GridLayer or TileLayer is in the map, -the highest of their maxZoom options will be used instead.
    layersLayer[] - []Array of layers that will be added to the map initially
    maxBoundsLatLngBounds - nullWhen this option is set, the map restricts the view to the given -geographical bounds, bouncing the user back if the user tries to pan -outside the view. To set the restriction dynamically, use -setMaxBounds method.
    rendererRenderer - *The default method for drawing vector layers on the map. L.SVG -or L.Canvas by default depending on browser support.
    - -
    - -

    Animation Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    zoomAnimationBoolean - trueWhether the map zoom animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    zoomAnimationThresholdNumber - 4Won't animate zoom if the zoom difference exceeds this value.
    fadeAnimationBoolean - trueWhether the tile fade animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    markerZoomAnimationBoolean - trueWhether markers animate their zoom with the zoom animation, if disabled -they will disappear for the length of the animation. By default it's -enabled in all browsers that support CSS3 Transitions except Android.
    transform3DLimitNumber - 2^23Defines the maximum size of a CSS translation transform. The default -value should not be changed unless a web browser positions layers in -the wrong place after doing a large panBy.
    - -
    - -

    Panning Inertia Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    inertiaBoolean - *If enabled, panning of the map will have an inertia effect where -the map builds momentum while dragging and continues moving in -the same direction for some time. Feels especially nice on touch -devices. Enabled by default unless running on old Android devices.
    inertiaDecelerationNumber - 3000The rate with which the inertial movement slows down, in pixels/second².
    inertiaMaxSpeedNumber - InfinityMax speed of the inertial movement, in pixels/second.
    easeLinearityNumber - 0.2
    worldCopyJumpBoolean - falseWith this option enabled, the map tracks when you pan to another "copy" -of the world and seamlessly jumps to the original one so that all overlays -like markers and vector layers are still visible.
    maxBoundsViscosityNumber - 0.0If maxBounds is set, this option will control how solid the bounds -are when dragging the map around. The default value of 0.0 allows the -user to drag outside the bounds at normal speed, higher values will -slow down map dragging outside bounds, and 1.0 makes the bounds fully -solid, preventing the user from dragging outside the bounds.
    - -
    - -

    Keyboard Navigation Options

    - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    keyboardBoolean - trueMakes the map focusable and allows users to navigate the map with keyboard -arrows and +/- keys.
    keyboardPanDeltaNumber - 80Amount of pixels to pan when pressing an arrow key.
    - -
    - -

    Mousewheel options

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    scrollWheelZoomBoolean|String - trueWhether the map can be zoomed by using the mouse wheel. If passed 'center', -it will zoom to the center of the view regardless of where the mouse was.
    wheelDebounceTimeNumber - 40Limits the rate at which a wheel can fire (in milliseconds). By default -user can't zoom via wheel more often than once per 40 ms.
    wheelPxPerZoomLevelNumber - 60How many scroll pixels (as reported by L.DomEvent.getWheelDelta) -mean a change of one full zoom level. Smaller values will make wheel-zooming -faster (and vice versa).
    - -
    - -

    Touch interaction options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tapBoolean - trueEnables mobile hacks for supporting instant taps (fixing 200ms click -delay on iOS/Android) and touch holds (fired as contextmenu events).
    tapToleranceNumber - 15The max number of pixels a user can shift his finger during touch -for it to be considered a valid tap.
    touchZoomBoolean|String - *Whether the map can be zoomed by touch-dragging with two fingers. If -passed 'center', it will zoom to the center of the view regardless of -where the touch events (fingers) were. Enabled for touch-capable web -browsers except for old Androids.
    bounceAtZoomLimitsBoolean - trueSet it to false if you don't want the map to zoom beyond min/max zoom -and then bounce back when pinch-zooming.
    - -
    - - -
    -

    Events

    - -
    - -

    Layer events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    baselayerchange - LayersControlEventFired when the base layer is changed through the layer control.
    overlayadd - LayersControlEventFired when an overlay is selected through the layer control.
    overlayremove - LayersControlEventFired when an overlay is deselected through the layer control.
    layeradd - LayerEventFired when a new layer is added to the map.
    layerremove - LayerEventFired when some layer is removed from the map
    - -
    - -

    Map state change events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    zoomlevelschange - EventFired when the number of zoomlevels on the map is changed due -to adding or removing a layer.
    resize - ResizeEventFired when the map is resized.
    unload - EventFired when the map is destroyed with remove method.
    viewreset - EventFired when the map needs to redraw its content (this usually happens -on map zoom or load). Very useful for creating custom overlays.
    load - EventFired when the map is initialized (when its center and zoom are set -for the first time).
    zoomstart - EventFired when the map zoom is about to change (e.g. before zoom animation).
    movestart - EventFired when the view of the map starts changing (e.g. user starts dragging the map).
    zoom - EventFired repeatedly during any change in zoom level, including zoom -and fly animations.
    move - EventFired repeatedly during any movement of the map, including pan and -fly animations.
    zoomend - EventFired when the map has changed, after any animations.
    moveend - EventFired when the center of the map stops changing (e.g. user stopped -dragging the map).
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup is opened in the map
    popupclose - PopupEventFired when a popup in the map is closed
    autopanstart - EventFired when the map starts autopanning when opening a popup.
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip is opened in the map.
    tooltipclose - TooltipEventFired when a tooltip in the map is closed.
    - -
    - -

    Location events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    locationerror - ErrorEventFired when geolocation (using the locate method) failed.
    locationfound - LocationEventFired when geolocation (using the locate method) -went successfully.
    - -
    - -

    Interaction events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the map.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the map.
    mousedown - MouseEventFired when the user pushes the mouse button on the map.
    mouseup - MouseEventFired when the user releases the mouse button on the map.
    mouseover - MouseEventFired when the mouse enters the map.
    mouseout - MouseEventFired when the mouse leaves the map.
    mousemove - MouseEventFired while the mouse moves over the map.
    contextmenu - MouseEventFired when the user pushes the right mouse button on the map, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    keypress - KeyboardEventFired when the user presses a key from the keyboard while the map is focused.
    preclick - MouseEventFired before mouse click on the map (sometimes useful when you -want something to happen on click before any existing click -handlers start running).
    - -
    - -

    Other Methods

    - - - - - - - - - - - - - -
    EventDataDescription
    zoomanim - ZoomAnimEventFired on every frame of a zoom animation
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getRenderer(<Path> layer)Renderer

    Returns the instance of Renderer that should be used to render the given -Path. It will ensure that the renderer options of the map and paths -are respected, and that the renderers do exist on the map.

    -
    - -
    - -

    Methods for Layers and Controls

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addControl(<Control> control)this

    Adds the given control to the map

    -
    removeControl(<Control> control)this

    Removes the given control from the map

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the map

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the map.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the map

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the map, optionally specifying context of the iterator function.

    -
    map.eachLayer(function(layer){
    -    layer.bindPopup('Hello');
    -});
    -
    openPopup(<Popup> popup)this

    Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).

    -
    openPopup(<String|HTMLElement> content, <LatLng> latlng, <Popup options> options?)this

    Creates a popup with the specified content and options and opens it in the given point on a map.

    -
    closePopup(<Popup> popup?)this

    Closes the popup previously opened with openPopup (or the given one).

    -
    openTooltip(<Tooltip> tooltip)this

    Opens the specified tooltip.

    -
    openTooltip(<String|HTMLElement> content, <LatLng> latlng, <Tooltip options> options?)this

    Creates a tooltip with the specified content and options and open it.

    -
    closeTooltip(<Tooltip> tooltip?)this

    Closes the tooltip given as parameter.

    -
    - -
    - -

    Methods for modifying map state

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setView(<LatLng> center, <Number> zoom, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) with the given -animation options.

    -
    setZoom(<Number> zoom, <Zoom/pan options> options?)this

    Sets the zoom of the map.

    -
    zoomIn(<Number> delta?, <Zoom options> options?)this

    Increases the zoom of the map by delta (zoomDelta by default).

    -
    zoomOut(<Number> delta?, <Zoom options> options?)this

    Decreases the zoom of the map by delta (zoomDelta by default).

    -
    setZoomAround(<LatLng> latlng, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified geographical point on the map -stationary (e.g. used internally for scroll zoom and double-click zoom).

    -
    setZoomAround(<Point> offset, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.

    -
    fitBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets a map view that contains the given geographical bounds with the -maximum zoom level possible.

    -
    fitWorld(<fitBounds options> options?)this

    Sets a map view that mostly contains the whole world with the maximum -zoom level possible.

    -
    panTo(<LatLng> latlng, <Pan options> options?)this

    Pans the map to a given center.

    -
    panBy(<Point> offset, <Pan options> options?)this

    Pans the map by a given number of pixels (animated).

    -
    flyTo(<LatLng> latlng, <Number> zoom?, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) performing a smooth -pan-zoom animation.

    -
    flyToBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets the view of the map with a smooth animation like flyTo, -but takes a bounds parameter like fitBounds.

    -
    setMaxBounds(<Bounds> bounds)this

    Restricts the map view to the given bounds (see the maxBounds option).

    -
    setMinZoom(<Number> zoom)this

    Sets the lower limit for the available zoom levels (see the minZoom option).

    -
    setMaxZoom(<Number> zoom)this

    Sets the upper limit for the available zoom levels (see the maxZoom option).

    -
    panInsideBounds(<LatLngBounds> bounds, <Pan options> options?)this

    Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.

    -
    invalidateSize(<Zoom/pan options> options)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default. If options.pan is false, panning will not occur. -If options.debounceMoveend is true, it will delay moveend event so -that it doesn't happen often even if the method is called many -times in a row.

    -
    invalidateSize(<Boolean> animate)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default.

    -
    stop()this

    Stops the currently running panTo or flyTo animation, if any.

    -
    - -
    - -

    Geolocation methods

    - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    locate(<Locate options> options?)this

    Tries to locate the user using the Geolocation API, firing a locationfound -event with location data on success or a locationerror event on failure, -and optionally sets the map view to the user's location with respect to -detection accuracy (or to the world view if geolocation failed). -Note that, if your page doesn't use HTTPS, this method will fail in -modern browsers (Chrome 50 and newer) -See Locate options for more details.

    -
    stopLocate()this

    Stops watching location previously initiated by map.locate({watch: true}) -and aborts resetting the map view if map.locate was called with -{setView: true}.

    -
    - -
    - -

    Other Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHandler(<String> name, <Function> HandlerClass)this

    Adds a new Handler to the map, given its name and constructor function.

    -
    remove()this

    Destroys the map and clears all related event listeners.

    -
    createPane(<String> name, <HTMLElement> container?)HTMLElement

    Creates a new map pane with the given name if it doesn't exist already, -then returns it. The pane is created as a child of container, or -as a child of the main map pane if not set.

    -
    getPane(<String|HTMLElement> pane)HTMLElement

    Returns a map pane, given its name or its HTML element (its identity).

    -
    getPanes()Object

    Returns a plain object containing the names of all panes as keys and -the panes as values.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the map.

    -
    whenReady(<Function> fn, <Object> context?)this

    Runs the given function fn when the map gets initialized with -a view (center and zoom) and at least one layer, or immediately -if it's already initialized, optionally passing a function context.

    -
    - -
    - -

    Methods for Getting Map State

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getCenter()LatLng

    Returns the geographical center of the map view

    -
    getZoom()Number

    Returns the current zoom level of the map view

    -
    getBounds()LatLngBounds

    Returns the geographical bounds visible in the current map view

    -
    getMinZoom()Number

    Returns the minimum zoom level of the map (if set in the minZoom option of the map or of any layers), or 0 by default.

    -
    getMaxZoom()Number

    Returns the maximum zoom level of the map (if set in the maxZoom option of the map or of any layers).

    -
    getBoundsZoom(<LatLngBounds> bounds, <Boolean> inside?)Number

    Returns the maximum zoom level on which the given bounds fit to the map -view in its entirety. If inside (optional) is set to true, the method -instead returns the minimum zoom level on which the map view fits into -the given bounds in its entirety.

    -
    getSize()Point

    Returns the current size of the map container (in pixels).

    -
    getPixelBounds()Bounds

    Returns the bounds of the current map view in projected pixel -coordinates (sometimes useful in layer and overlay implementations).

    -
    getPixelOrigin()Point

    Returns the projected pixel coordinates of the top left point of -the map layer (useful in custom layer and overlay implementations).

    -
    getPixelWorldBounds(<Number> zoom?)Bounds

    Returns the world's bounds in pixel coordinates for zoom level zoom. -If zoom is omitted, the map's current zoom level is used.

    -
    - -
    - -

    Conversion Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getZoomScale(<Number> toZoom, <Number> fromZoom)Number

    Returns the scale factor to be applied to a map transition from zoom level -fromZoom to toZoom. Used internally to help with zoom animations.

    -
    getScaleZoom(<Number> scale, <Number> fromZoom)Number

    Returns the zoom level that the map would end up at, if it is at fromZoom -level and everything is scaled by a factor of scale. Inverse of -getZoomScale.

    -
    project(<LatLng> latlng, <Number> zoom)Point

    Projects a geographical coordinate LatLng according to the projection -of the map's CRS, then scales it according to zoom and the CRS's -Transformation. The result is pixel coordinate relative to -the CRS origin.

    -
    unproject(<Point> point, <Number> zoom)LatLng

    Inverse of project.

    -
    layerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToLayerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the origin pixel.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -map's CRS's wrapLat and wrapLng properties, if they are outside the -CRS's bounds. -By default this means longitude is wrapped around the dateline so its -value is between -180 and +180 degrees.

    -
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring that -its center is within the CRS's bounds. -By default this means the center longitude is wrapped around the dateline so its -value is between -180 and +180 degrees, and the majority of the bounds -overlaps the CRS's bounds.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates according to -the map's CRS. By default this measures distance in meters.

    -
    containerPointToLayerPoint(<Point> point)Point

    Given a pixel coordinate relative to the map container, returns the corresponding -pixel coordinate relative to the origin pixel.

    -
    layerPointToContainerPoint(<Point> point)Point

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding pixel coordinate relative to the map container.

    -
    containerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the map container, returns -the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToContainerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the map container.

    -
    mouseEventToContainerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to the -map container where the event took place.

    -
    mouseEventToLayerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to -the origin pixel where the event took place.

    -
    mouseEventToLatLng(<MouseEvent> ev)LatLng

    Given a MouseEvent object, returns geographical coordinate where the -event took place.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Handlers

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    boxZoom - HandlerBox (shift-drag with mouse) zoom handler.
    doubleClickZoom - HandlerDouble click zoom handler.
    dragging - HandlerMap dragging handler (by both mouse and touch).
    keyboard - HandlerKeyboard navigation handler.
    scrollWheelZoom - HandlerScroll wheel zoom handler.
    tap - HandlerMobile touch hacks (quick tap and touch hold) handler.
    touchZoom - HandlerTouch zoom handler.
    - -
    - - -
    -

    Map panes

    - -
    - - - -
    Panes are DOM elements used to control the ordering of layers on the map. You -can access panes with map.getPane or -map.getPanes methods. New panes can be created with the -map.createPane method. -Every map has the following default panes that differ only in zIndex.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PaneTypeZ-indexDescription
    mapPaneHTMLElement - 'auto'Pane that contains all other map panes
    tilePaneHTMLElement - 200Pane for GridLayers and TileLayers
    overlayPaneHTMLElement - 400Pane for vectors (Paths, like Polylines and Polygons), ImageOverlays and VideoOverlays
    shadowPaneHTMLElement - 500Pane for overlay shadows (e.g. Marker shadows)
    markerPaneHTMLElement - 600Pane for Icons of Markers
    tooltipPaneHTMLElement - 650Pane for Tooltips.
    popupPaneHTMLElement - 700Pane for Popups.
    - -
    - - -
    - -
    -

    Locate options

    - -
    - - - -
    Some of the geolocation methods for Map take in an options parameter. This -is a plain javascript object with the following optional components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    watchBoolean - falseIf true, starts continuous watching of location changes (instead of detecting it -once) using W3C watchPosition method. You can later stop watching using -map.stopLocate() method.
    setViewBoolean - falseIf true, automatically sets the map view to the user location with respect to -detection accuracy, or to world view if geolocation failed.
    maxZoomNumber - InfinityThe maximum zoom for automatic view setting when using setView option.
    timeoutNumber - 10000Number of milliseconds to wait for a response from geolocation before firing a -locationerror event.
    maximumAgeNumber - 0Maximum age of detected location. If less than this amount of milliseconds -passed since last geolocation response, locate will return a cached location.
    enableHighAccuracyBoolean - falseEnables high accuracy, see description in the W3C spec.
    - -
    - - -
    - -
    -

    Zoom options

    - -
    - - - -
    Some of the Map methods which modify the zoom level take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    - - -
    - -
    -

    Pan options

    - -
    - - - -
    Some of the Map methods which modify the center of the map take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If true, panning will always be animated if possible. If false, it will -not animate panning, either resetting the map view if panning more than a -screen away, or just setting a new offset for the map pane (except for panBy -which always does the latter).
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    - - -
    - -
    -

    Zoom/pan options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -
    - -
    -

    FitBounds options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingTopLeftPoint - [0, 0]Sets the amount of padding in the top left corner of a map container that -shouldn't be accounted for when setting the view to fit bounds. Useful if you -have some control overlays on the map like a sidebar and you don't want them -to obscure objects you're zooming to.
    paddingBottomRightPoint - [0, 0]The same for the bottom right corner of the map.
    paddingPoint - [0, 0]Equivalent of setting both top left and bottom right padding to the same value.
    maxZoomNumber - nullThe maximum possible zoom to use.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -

    Marker

    L.Marker is used to display clickable/draggable icons on the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.marker([50.5, 30.5]).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.marker(<LatLng> latlng, <Marker options> options?)Instantiates a Marker object given a geographical point and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconIcon - *Icon instance to use for rendering the marker. -See Icon documentation for details on how to customize the marker icon. -If not specified, a common instance of L.Icon.Default is used.
    draggableBoolean - falseWhether the marker is draggable with mouse/touch or not.
    autoPanBoolean - falseSet it to true if you want the map to do panning animation when marker hits the edges.
    autoPanPaddingPoint - Point(50, 50)Equivalent of setting both top left and bottom right autopan padding to the same value.
    autoPanSpeedNumber - 10Number of pixels the map should move by.
    keyboardBoolean - trueWhether the marker can be tabbed to with a keyboard and clicked by pressing enter.
    titleString - ''Text for the browser tooltip that appear on marker hover (no tooltip by default).
    altString - ''Text for the alt attribute of the icon image (useful for accessibility).
    zIndexOffsetNumber - 0By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
    opacityNumber - 1.0The opacity of the marker.
    riseOnHoverBoolean - falseIf true, the marker will get on top of others when you hover the mouse over it.
    riseOffsetNumber - 250The z-index offset used for the riseOnHover feature.
    paneString - 'markerPane'Map pane where the markers icon will be added.
    bubblingMouseEventsBoolean - falseWhen true, a mouse event on this marker will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - -
    In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:
    - - - - - - - - - - - - -
    EventDataDescription
    move - EventFired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    - -
    - -

    Dragging events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    dragstart - EventFired when the user starts dragging the marker.
    movestart - EventFired when the marker starts moving (because of dragging).
    drag - EventFired repeatedly while the user drags the marker.
    dragend - DragEndEventFired when the user stops dragging the marker.
    moveend - EventFired when the marker stops moving (because of dragging).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the marker (as a GeoJSON Point Feature).

    -
    getLatLng()LatLng

    Returns the current geographical position of the marker.

    -
    setLatLng(<LatLng> latlng)this

    Changes the marker position to the given point.

    -
    setZIndexOffset(<Number> offset)this

    Changes the zIndex offset of the marker.

    -
    setIcon(<Icon> icon)this

    Changes the marker icon.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the marker.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Interaction handlers

    - -
    Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see Handler methods). Example: -
    marker.dragging.disable();
    -
    - - - - - - - - - - - - -
    PropertyTypeDescription
    dragging - HandlerMarker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set marker.options.draggable).
    - -
    - - -

    Used to open popups in certain places of the map. Use Map.openPopup to -open popups while making sure that only one popup is open at one time -(recommended for usability), or use Map.addLayer to open as many as you want.

    - -
    - - -
    - - - - - -

    If you want to just bind a popup to marker click and then open it, it's really easy:

    -
    marker.bindPopup(popupContent).openPopup();
    -
    -

    Path overlays like polylines also have a bindPopup method. -Here's a more complicated way to open a popup on a map:

    -
    var popup = L.popup()
    -    .setLatLng(latlng)
    -    .setContent('<p>Hello world!<br />This is a nice popup.</p>')
    -    .openOn(map);
    -
    - - - -
    - - -
    - - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    - -
    - - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -

    Tooltip

    Used to display small texts on top of map layers.

    - -
    -

    Usage example

    - -
    - - - - - -
    marker.bindTooltip("my tooltip text").openTooltip();
    -
    -

    Note about tooltip offset. Leaflet takes two options in consideration -for computing tooltip offsetting:

    -
      -
    • the offset Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. -Add a positive x offset to move the tooltip to the right, and a positive y offset to -move it to the bottom. Negatives will move to the left and top.
    • -
    • the tooltipAnchor Icon option: this will only be considered for Marker. You -should adapt this value if you use a custom icon.
    • -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tooltip(<Tooltip options> options?, <Layer> source?)Instantiates a Tooltip object given an optional options object that describes its appearance and location and an optional source object that is used to tag the tooltip with a reference to the Layer to which it refers.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'tooltipPane'Map pane where the tooltip will be added.
    offsetPoint - Point(0, 0)Optional offset of the tooltip position.
    directionString - 'auto'Direction where to open the tooltip. Possible values are: right, left, -top, bottom, center, auto. -auto will dynamically switch between right and left according to the tooltip -position on the map.
    permanentBoolean - falseWhether to open the tooltip permanently or only on mouseover.
    stickyBoolean - falseIf true, the tooltip will follow the mouse instead of being fixed at the feature center.
    interactiveBoolean - falseIf true, the tooltip will listen to the feature events.
    opacityNumber - 0.9Tooltip container opacity.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    classNameString - ''A custom CSS class name to assign to the popup.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer

    Used to load and display tile layers on the map. Extends GridLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map);
    -
    - - - -
    - -

    URL template

    - - - -

    A string of the following form:

    -
    'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
    -

    {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates. {r} can be used to add "@2x" to the URL to load retina tiles. -You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

    -
    L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
    -
    - - -
    - - -
    -

    Creation

    - -
    - -

    Extension methods

    - - - - - - - - - - - - -
    FactoryDescription
    L.tilelayer(<String> urlTemplate, <TileLayer options> options?)Instantiates a tile layer object given a URL template and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber - 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber - 18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[] - 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString - ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber - 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean - falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean - falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean - falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean - falseIf true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - (depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumber - undefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber - undefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true).

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending TileLayer might reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    getTileUrl(<Object> coords)String

    Called only internally, returns the URL for a tile given its coordinates. -Classes extending TileLayer can override this function to provide custom tile URL naming schemes.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer.WMS

    Used to display WMS services as tile layers on the map. Extends TileLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
    -    layers: 'nexrad-n0r-900913',
    -    format: 'image/png',
    -    transparent: true,
    -    attribution: "Weather data © 2012 IEM Nexrad"
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tileLayer.wms(<String> baseUrl, <TileLayer.WMS options> options)Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
    - -
    - - -
    -

    Options

    - -
    - - - -
    If any custom options not documented here are used, they will be sent to the -WMS server as extra parameters in each request URL. This can be useful for -non-standard vendor WMS parameters.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    layersString - ''(required) Comma-separated list of WMS layers to show.
    stylesString - ''Comma-separated list of WMS styles.
    formatString - 'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
    transparentBoolean - falseIf true, the WMS service will return images with transparency.
    versionString - '1.1.1'Version of the WMS service to use
    crsCRS - nullCoordinate Reference System to use for the WMS requests, defaults to -map CRS. Don't change this if you're not sure what it means.
    uppercaseBoolean - falseIf true, WMS request parameter keys will be uppercase.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber - 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber - 18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[] - 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString - ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber - 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean - falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean - falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean - falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean - falseIf true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - (depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumber - undefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber - undefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setParams(<Object> params, <Boolean> noRedraw?)this

    Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true).

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    ImageOverlay

    Used to load and display a single image over specific bounds of the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
    -    imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
    -L.imageOverlay(imageUrl, imageBounds).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.imageOverlay(<String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options?)Instantiates an image overlay object given the URL of the image and the -geographical bounds it is tied to.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber - 1.0The opacity of the image overlay.
    altString - ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean - falseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean - falseIf true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data.
    errorOverlayUrlString - ''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    classNameString - ''A custom class name to assign to the image. Empty by default.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    load - EventFired when the ImageOverlay layer has loaded its image
    error - EventFired when the ImageOverlay layer has loaded its image
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers -Changes the zIndex of the image overlay.

    -
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    -
    getElement()HTMLElement

    Returns the instance of HTMLImageElement -used by this overlay.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    VideoOverlay

    Used to load and display a video player over specific bounds of the map. Extends ImageOverlay. -A video overlay uses the <video> -HTML5 element.

    - -
    -

    Usage example

    - -
    - - - - - -
    var videoUrl = 'https://www.mapbox.com/bites/00188/patricia_nasa.webm',
    -    videoBounds = [[ 32, -130], [ 13, -100]];
    -L.VideoOverlay(videoUrl, videoBounds ).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.videoOverlay(<String|Array|HTMLVideoElement> video, <LatLngBounds> bounds, <VideoOverlay options> options?)Instantiates an image overlay object given the URL of the video (or array of URLs, or even a video element) and the -geographical bounds it is tied to.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    autoplayBoolean - trueWhether the video starts playing automatically when loaded.
    loopBoolean - trueWhether the video will loop back to the beginning when played.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber - 1.0The opacity of the image overlay.
    altString - ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean - falseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean - falseIf true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data.
    errorOverlayUrlString - ''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    classNameString - ''A custom class name to assign to the image. Empty by default.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    load - EventFired when the video has finished loading the first frame
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    error - EventFired when the ImageOverlay layer has loaded its image
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getElement()HTMLVideoElement

    Returns the instance of HTMLVideoElement -used by this overlay.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers -Changes the zIndex of the image overlay.

    -
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Path

    An abstract class that contains options and constants shared between vector -overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polyline

    A class for drawing polyline overlays on a map. Extends Path.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polyline from an array of LatLng points
    -var latlngs = [
    -    [45.51, -122.68],
    -    [37.77, -122.43],
    -    [34.04, -118.2]
    -];
    -var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
    -// zoom the map to the polyline
    -map.fitBounds(polyline.getBounds());
    -
    -

    You can also pass a multi-dimensional array to represent a MultiPolyline shape:

    -
    // create a red polyline from an array of arrays of LatLng points
    -var latlngs = [
    -    [[45.51, -122.68],
    -     [37.77, -122.43],
    -     [34.04, -118.2]],
    -    [[40.78, -73.91],
    -     [41.83, -87.62],
    -     [32.76, -96.72]]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polyline(<LatLng[]> latlngs, <Polyline options> options?)Instantiates a polyline object given an array of geographical points and -optionally an options object. You can create a Polyline object with -multiple separate lines (MultiPolyline) by passing an array of arrays -of geographic points.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

    -
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint()Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polygon

    A class for drawing polygon overlays on a map. Extends Polyline. -Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polygon from an array of LatLng points
    -var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
    -var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
    -// zoom the map to the polygon
    -map.fitBounds(polygon.getBounds());
    -
    -

    You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

    -
    var latlngs = [
    -  [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -  [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -];
    -
    -

    Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

    -
    var latlngs = [
    -  [ // first polygon
    -    [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -    [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -  ],
    -  [ // second polygon
    -    [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
    -  ]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polygon(<LatLng[]> latlngs, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint()Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Rectangle

    A class for drawing rectangle overlays on a map. Extends Polygon.

    - -
    -

    Usage example

    - -
    - - - - - -
    // define rectangle geographical bounds
    -var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
    -// create an orange rectangle
    -L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
    -// zoom the map to the rectangle bounds
    -map.fitBounds(bounds);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.rectangle(<LatLngBounds> latLngBounds, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setBounds(<LatLngBounds> latLngBounds)this

    Redraws the rectangle with the passed bounds.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint()Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Circle

    A class for drawing circle overlays on a map. Extends CircleMarker. -It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).

    - -
    -

    Usage example

    - -
    - - - - - -
    L.circle([50.5, 30.5], {radius: 200}).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.circle(<LatLng> latlng, <Circle options> options?)Instantiates a circle object given a geographical point, and an options object -which contains the circle radius.
    L.circle(<LatLng> latlng, <Number> radius, <Circle options> options?)Obsolete way of instantiating a circle, for compatibility with 0.7.x code. -Do not use in new applications or plugins.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumber - Radius of the circle, in meters.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setRadius(<Number> radius)this

    Sets the radius of a circle. Units are in meters.

    -
    getRadius()Number

    Returns the current radius of a circle. Units are in meters.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    CircleMarker

    A circle of a fixed size with radius specified in pixels. Extends Path.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.circleMarker(<LatLng> latlng, <CircleMarker options> options?)Instantiates a circle marker object given a geographical point, and an optional options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumber - 10Radius of the circle marker, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    setRadius(<Number> radius)this

    Sets the radius of a circle marker. Units are in pixels.

    -
    getRadius()Number

    Returns the current radius of the circle

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    SVG

    Although SVG is not available on IE7 and IE8, these browsers support VML, and the SVG renderer will fall back to VML in this case. -VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility -with old versions of Internet Explorer.

    -

    Allows vector layers to be displayed with SVG. -Inherits Renderer. -Due to technical limitations, SVG is not -available in all web browsers, notably Android 2.x and 3.x. -Although SVG is not available on IE7 and IE8, these browsers support -VML -(a now deprecated technology), and the SVG renderer will fall back to VML in -this case.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use SVG by default for all paths in the map:

    -
    var map = L.map('map', {
    -    renderer: L.svg()
    -});
    -
    -

    Use a SVG renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.svg({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.svg(<Renderer options> options?)Creates a SVG renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber - 0How much to extend click tolerance round a path/object on the map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - -
    There are several static functions which can be called without instantiating L.SVG:
    - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    create(<String> name)SVGElementReturns a instance of SVGElement, -corresponding to the class name passed. For example, using 'line' will return -an instance of SVGLineElement.
    pointsToPath(<Point[]> rings, <Boolean> closed)StringGenerates a SVG path string for multiple rings, with each ring turning -into "M..L..L.." instructions
    - -
    - - -

    Canvas

    Allows vector layers to be displayed with <canvas>. -Inherits Renderer. -Due to technical limitations, Canvas is not -available in all web browsers, notably IE8, and overlapping geometries might -not display properly in some edge cases.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use Canvas by default for all paths in the map:

    -
    var map = L.map('map', {
    -    renderer: L.canvas()
    -});
    -
    -

    Use a Canvas renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.canvas({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.canvas(<Renderer options> options?)Creates a Canvas renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber - 0How much to extend click tolerance round a path/object on the map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LayerGroup

    Used to group several layers and handle them as one. If you add it to the map, -any layers added or removed from the group will be added/removed on the map as -well. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.layerGroup([marker1, marker2])
    -    .addLayer(polyline)
    -    .addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.layerGroup(<Layer[]> layers?, <Object> options?)Create a layer group, optionally given an initial set of layers and an options object.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    FeatureGroup

    Extended LayerGroup that makes it easier to do the same thing to all its member layers:

    -
      -
    • bindPopup binds a popup to all of the layers at once (likewise with bindTooltip)
    • -
    • Events are propagated to the FeatureGroup, so if the group has an event -handler, it will handle events from any of the layers. This includes mouse events -and custom events.
    • -
    • Has layeradd and layerremove events
    • -
    - -
    -

    Usage example

    - -
    - - - - - -
    L.featureGroup([marker1, marker2, polyline])
    -    .bindPopup('Hello world!')
    -    .on('click', function() { alert('Clicked on a member of the group!'); })
    -    .addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.featureGroup(<Layer[]> layers)Create a feature group, optionally given an initial set of layers.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeradd - LayerEventFired when a layer is added to this FeatureGroup
    layerremove - LayerEventFired when a layer is removed from this FeatureGroup
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setStyle(<Path options> style)this

    Sets the given path options to each layer of the group that has a setStyle method.

    -
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    GeoJSON

    Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse -GeoJSON data and display it on the map. Extends FeatureGroup.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.geoJSON(data, {
    -    style: function (feature) {
    -        return {color: feature.properties.color};
    -    }
    -}).bindPopup(function (layer) {
    -    return layer.feature.properties.description;
    -}).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.geoJSON(<Object> geojson?, <GeoJSON options> options?)Creates a GeoJSON layer. Optionally accepts an object in -GeoJSON format to display on the map -(you can alternatively add it later with addData method) and an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    pointToLayerFunction - *A Function defining how GeoJSON points spawn Leaflet layers. It is internally -called when data is added, passing the GeoJSON point feature and its LatLng. -The default is to spawn a default Marker: -
    function(geoJsonPoint, latlng) {
    -    return L.marker(latlng);
    -}
    -
    styleFunction - *A Function defining the Path options for styling GeoJSON lines and polygons, -called internally when data is added. -The default value is to not override any defaults: -
    function (geoJsonFeature) {
    -    return {}
    -}
    -
    onEachFeatureFunction - *A Function that will be called once for each created Feature, after it has -been created and styled. Useful for attaching events and popups to features. -The default is to do nothing with the newly created layers: -
    function (feature, layer) {}
    -
    filterFunction - *A Function that will be used to decide whether to include a feature or not. -The default is to include all features: -
    function (geoJsonFeature) {
    -    return true;
    -}
    -
    -

    Note: dynamically changing the filter option will have effect only on newly -added data. It will not re-evaluate already included features.

    coordsToLatLngFunction - *A Function that will be used for converting GeoJSON coordinates to LatLngs. -The default is the coordsToLatLng static method.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeradd - LayerEventFired when a layer is added to this FeatureGroup
    layerremove - LayerEventFired when a layer is removed from this FeatureGroup
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addData(data)this

    Adds a GeoJSON object to the layer.

    -
    resetStyle(layer)this

    Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.

    -
    setStyle(style)this

    Changes styles of GeoJSON vector layers with the given style function.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - -
    There are several static functions which can be called without instantiating L.GeoJSON:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    geometryToLayer(<Object> featureData, <GeoJSON options> options?)LayerCreates a Layer from a given GeoJSON feature. Can use a custom -pointToLayer and/or coordsToLatLng -functions if provided as options.
    coordsToLatLng(<Array> coords)LatLngCreates a LatLng object from an array of 2 numbers (longitude, latitude) -or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
    coordsToLatLngs(<Array> coords, <Number> levelsDeep?, <Function> coordsToLatLng?)ArrayCreates a multidimensional array of LatLngs from a GeoJSON coordinates array. -levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). -Can use a custom coordsToLatLng function.
    latLngToCoords(<LatLng> latlng, <Number> precision?)ArrayReverse of coordsToLatLng
    latLngsToCoords(<Array> latlngs, <Number> levelsDeep?, <Boolean> closed?)ArrayReverse of coordsToLatLngs -closed determines whether the first point should be appended to the end of the array to close the feature, only used when levelsDeep is 0. False by default.
    asFeature(<Object> geojson)ObjectNormalize GeoJSON geometries/features into GeoJSON features.
    - -
    - - -

    GridLayer

    Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas. -GridLayer can be extended to create a tiled grid of HTML elements like <canvas>, <img> or <div>. GridLayer will handle creating and animating these DOM elements for you.

    - -
    -

    Usage example

    - -
    - -

    Synchronous usage

    - - - -

    To create a custom layer, extend GridLayer and implement the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords){
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -        // get a canvas context and draw something on it using coords.x, coords.y and coords.z
    -        var ctx = tile.getContext('2d');
    -        // return the tile so it can be rendered on screen
    -        return tile;
    -    }
    -});
    -
    - - - -
    - -

    Asynchronous usage

    - - - -

    Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the done() callback.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords, done){
    -        var error;
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -        // draw something asynchronously and pass the tile to the done() callback
    -        setTimeout(function() {
    -            done(error, tile);
    -        }, 1000);
    -        return tile;
    -    }
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
    - -
    - - -
    -

    Options

    - -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - (depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    minZoomNumber - 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber - undefinedThe maximum zoom level up to which this layer will be displayed (inclusive).
    maxNativeZoomNumber - undefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber - undefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending GridLayer shall reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, must be overridden by classes extending GridLayer. -Returns the HTMLElement corresponding to the given coords. If the done callback -is specified, it must be called when the tile has finished loading and drawing.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LatLng

    Represents a geographical point with a certain latitude and longitude.

    - -
    -

    Usage example

    - -
    - - - - - -
    var latlng = L.latLng(50.5, 30.5);
    -

    All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

    -
    map.panTo([50, 30]);
    -map.panTo({lon: 30, lat: 50});
    -map.panTo({lat: 50, lng: 30});
    -map.panTo(L.latLng(50, 30));
    -

    Note that LatLng does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLng(<Number> latitude, <Number> longitude, <Number> altitude?)Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
    L.latLng(<Array> coords)Expects an array of the form [Number, Number] or [Number, Number, Number] instead.
    L.latLng(<Object> coords)Expects an plain object of the form {lat: Number, lng: Number} or {lat: Number, lng: Number, alt: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    equals(<LatLng> otherLatLng, <Number> maxMargin?)Boolean

    Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

    -
    toString()String

    Returns a string representation of the point (for debugging purposes).

    -
    distanceTo(<LatLng> otherLatLng)Number

    Returns the distance (in meters) to the given LatLng calculated using the Spherical Law of Cosines.

    -
    wrap()LatLng

    Returns a new LatLng object with the longitude wrapped so it's always between -180 and +180 degrees.

    -
    toBounds(<Number> sizeInMeters)LatLngBounds

    Returns a new LatLngBounds object in which each boundary is sizeInMeters/2 meters apart from the LatLng.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    lat - NumberLatitude in degrees
    lng - NumberLongitude in degrees
    alt - NumberAltitude in meters (optional)
    - -
    - - -

    LatLngBounds

    Represents a rectangular geographical area on a map.

    - -
    -

    Usage example

    - -
    - - - - - -
    var corner1 = L.latLng(40.712, -74.227),
    -corner2 = L.latLng(40.774, -74.125),
    -bounds = L.latLngBounds(corner1, corner2);
    -
    -

    All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    map.fitBounds([
    -    [40.712, -74.227],
    -    [40.774, -74.125]
    -]);
    -
    -

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range. -Note that LatLngBounds does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLngBounds(<LatLng> corner1, <LatLng> corner2)Creates a LatLngBounds object by defining two diagonally opposite corners of the rectangle.
    L.latLngBounds(<LatLng[]> latlngs)Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<LatLng> latlng)this

    Extend the bounds to contain the given point

    -
    extend(<LatLngBounds> otherBounds)this

    Extend the bounds to contain the given bounds

    -
    pad(<Number> bufferRatio)LatLngBounds

    Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. -For example, a ratio of 0.5 extends the bounds by 50% in each direction. -Negative values will retract the bounds.

    -
    getCenter()LatLng

    Returns the center point of the bounds.

    -
    getSouthWest()LatLng

    Returns the south-west point of the bounds.

    -
    getNorthEast()LatLng

    Returns the north-east point of the bounds.

    -
    getNorthWest()LatLng

    Returns the north-west point of the bounds.

    -
    getSouthEast()LatLng

    Returns the south-east point of the bounds.

    -
    getWest()Number

    Returns the west longitude of the bounds

    -
    getSouth()Number

    Returns the south latitude of the bounds

    -
    getEast()Number

    Returns the east longitude of the bounds

    -
    getNorth()Number

    Returns the north latitude of the bounds

    -
    contains(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<LatLng> latlng)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.

    -
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.

    -
    toBBoxString()String

    Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.

    -
    equals(<LatLngBounds> otherBounds, <Number> maxMargin?)Boolean

    Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting maxMargin to a small number.

    -
    isValid()Boolean

    Returns true if the bounds are properly initialized.

    -
    - -
    - - -

    Point

    Represents a point with x and y coordinates in pixels.

    - -
    -

    Usage example

    - -
    - - - - - -
    var point = L.point(200, 300);
    -
    -

    All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

    -
    map.panBy([200, 300]);
    -map.panBy(L.point(200, 300));
    -
    -

    Note that Point does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.point(<Number> x, <Number> y, <Boolean> round?)Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
    L.point(<Number[]> coords)Expects an array of the form [x, y] instead.
    L.point(<Object> coords)Expects a plain object of the form {x: Number, y: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    clone()Point

    Returns a copy of the current point.

    -
    add(<Point> otherPoint)Point

    Returns the result of addition of the current and the given points.

    -
    subtract(<Point> otherPoint)Point

    Returns the result of subtraction of the given point from the current.

    -
    divideBy(<Number> num)Point

    Returns the result of division of the current point by the given number.

    -
    multiplyBy(<Number> num)Point

    Returns the result of multiplication of the current point by the given number.

    -
    scaleBy(<Point> scale)Point

    Multiply each coordinate of the current point by each coordinate of -scale. In linear algebra terms, multiply the point by the -scaling matrix -defined by scale.

    -
    unscaleBy(<Point> scale)Point

    Inverse of scaleBy. Divide each coordinate of the current point by -each coordinate of scale.

    -
    round()Point

    Returns a copy of the current point with rounded coordinates.

    -
    floor()Point

    Returns a copy of the current point with floored coordinates (rounded down).

    -
    ceil()Point

    Returns a copy of the current point with ceiled coordinates (rounded up).

    -
    trunc()Point

    Returns a copy of the current point with truncated coordinates (rounded towards zero).

    -
    distanceTo(<Point> otherPoint)Number

    Returns the cartesian distance between the current and the given points.

    -
    equals(<Point> otherPoint)Boolean

    Returns true if the given point has the same coordinates.

    -
    contains(<Point> otherPoint)Boolean

    Returns true if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).

    -
    toString()String

    Returns a string representation of the point for debugging purposes.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    x - NumberThe x coordinate of the point
    y - NumberThe y coordinate of the point
    - -
    - - -

    Bounds

    Represents a rectangular area in pixel coordinates.

    - -
    -

    Usage example

    - -
    - - - - - -
    var p1 = L.point(10, 10),
    -p2 = L.point(40, 60),
    -bounds = L.bounds(p1, p2);
    -
    -

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    otherBounds.intersects([[10, 10], [40, 60]]);
    -
    -

    Note that Bounds does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.bounds(<Point> corner1, <Point> corner2)Creates a Bounds object from two corners coordinate pairs.
    L.bounds(<Point[]> points)Creates a Bounds object from the given array of points.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<Point> point)this

    Extends the bounds to contain the given point.

    -
    getCenter(<Boolean> round?)Point

    Returns the center point of the bounds.

    -
    getBottomLeft()Point

    Returns the bottom-left point of the bounds.

    -
    getTopRight()Point

    Returns the top-right point of the bounds.

    -
    getTopLeft()Point

    Returns the top-left point of the bounds (i.e. this.min).

    -
    getBottomRight()Point

    Returns the bottom-right point of the bounds (i.e. this.max).

    -
    getSize()Point

    Returns the size of the given bounds

    -
    contains(<Bounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<Point> point)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<Bounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds -intersect if they have at least one point in common.

    -
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds -overlap if their intersection is an area.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    min - PointThe top left corner of the rectangle.
    max - PointThe bottom right corner of the rectangle.
    - -
    - - -

    Icon

    Represents an icon to provide when creating a marker.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.icon({
    -    iconUrl: 'my-icon.png',
    -    iconSize: [38, 95],
    -    iconAnchor: [22, 94],
    -    popupAnchor: [-3, -76],
    -    shadowUrl: 'my-icon-shadow.png',
    -    shadowSize: [68, 95],
    -    shadowAnchor: [22, 94]
    -});
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.icon(<Icon options> options)Creates an icon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlString - null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString - nullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePoint - nullSize of the icon image in pixels.
    iconAnchorPoint - nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint - [0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint - [0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlString - nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString - null
    shadowSizePoint - nullSize of the shadow image in pixels.
    shadowAnchorPoint - nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString - ''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    - - -
    - -
    -

    Icon.Default

    - -
    - - - -
    A trivial subclass of Icon, represents the icon to use in Markers when -no icon is specified. Points to the blue marker image distributed with Leaflet -releases. -In order to customize the default icon, just change the properties of L.Icon.Default.prototype.options -(which is a set of Icon options). -If you want to completely replace the default icon, override the -L.Marker.prototype.options.icon with your own icon instead.
    - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    imagePathString - Icon.Default will try to auto-detect the location of the -blue icon images. If you are placing these images in a non-standard -way, set this option to point to the right path.
    - -
    - - -

    DivIcon

    Represents a lightweight icon for markers that uses a simple <div> -element instead of an image. Inherits from Icon but ignores the iconUrl and shadow options.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.divIcon({className: 'my-div-icon'});
    -// you can set .my-div-icon styles in CSS
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.divIcon(<DivIcon options> options)Creates a DivIcon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    htmlString - ''Custom HTML code to put inside the div element, empty by default.
    bgPosPoint - [0, 0]Optional relative position of the background, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlString - null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString - nullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePoint - nullSize of the icon image in pixels.
    iconAnchorPoint - nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint - [0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint - [0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlString - nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString - null
    shadowSizePoint - nullSize of the shadow image in pixels.
    shadowAnchorPoint - nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString - ''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    -
    -
    - -

    Control.Zoom

    A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.zoom(<Control.Zoom options> options)Creates a zoom control
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    zoomInTextString - '+'The text set on the 'zoom in' button.
    zoomInTitleString - 'Zoom in'The title set on the 'zoom in' button.
    zoomOutTextString - '&#x2212' -The text set on the 'zoom out' button.
    zoomOutTitleString - 'Zoom out'The title set on the 'zoom out' button.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Attribution

    The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with the getAttribution method automatically. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.attribution(<Control.Attribution options> options)Creates an attribution control.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    prefixString - 'Leaflet'The HTML text shown before the attributions. Pass false to disable.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setPrefix(<String> prefix)this

    Sets the text before the attributions.

    -
    addAttribution(<String> text)this

    Adds an attribution text (e.g. 'Vector data &copy; Mapbox').

    -
    removeAttribution(<String> text)this

    Removes an attribution text.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Layers

    The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    var baseLayers = {
    -    "Mapbox": mapbox,
    -    "OpenStreetMap": osm
    -};
    -var overlays = {
    -    "Marker": marker,
    -    "Roads": roadsLayer
    -};
    -L.control.layers(baseLayers, overlays).addTo(map);
    -
    -

    The baseLayers and overlays parameters are object literals with layer names as keys and Layer objects as values:

    -
    {
    -    "<someName1>": layer1,
    -    "<someName2>": layer2
    -}
    -
    -

    The layer names can contain HTML, which allows you to add additional styling to the items:

    -
    {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.layers(<Object> baselayers?, <Object> overlays?, <Control.Layers options> options?)Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    collapsedBoolean - trueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
    autoZIndexBoolean - trueIf true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
    hideSingleBaseBoolean - falseIf true, the base layers in the control will be hidden when there is only one.
    sortLayersBoolean - falseWhether to sort the layers. When false, layers will keep the order -in which they were added to the control.
    sortFunctionFunction - *A compare function -that will be used for sorting the layers, when sortLayers is true. -The function receives both the L.Layer instances and their names, as in -sortFunction(layerA, layerB, nameA, nameB). -By default, it sorts layers alphabetically by their name.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addBaseLayer(<Layer> layer, <String> name)this

    Adds a base layer (radio button entry) with the given name to the control.

    -
    addOverlay(<Layer> layer, <String> name)this

    Adds an overlay (checkbox entry) with the given name to the control.

    -
    removeLayer(<Layer> layer)this

    Remove the given layer from the control.

    -
    expand()this

    Expand the control container if collapsed.

    -
    collapse()this

    Collapse the control container if expanded.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Scale

    A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.control.scale().addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.scale(<Control.Scale options> options?)Creates an scale control with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    maxWidthNumber - 100Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
    metricBoolean - TrueWhether to show the metric scale line (m/km).
    imperialBoolean - TrueWhether to show the imperial scale line (mi/ft).
    updateWhenIdleBoolean - falseIf true, the control is updated on moveend, otherwise it's always up-to-date (updated on move).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Browser

    A namespace with static properties for browser/feature detection used by Leaflet internally.

    - -
    -

    Usage example

    - -
    - - - - - -
    if (L.Browser.ielt9) {
    -  alert('Upgrade your browser, dude!');
    -}
    -
    - - - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    ie - Booleantrue for all Internet Explorer versions (not Edge).
    ielt9 - Booleantrue for Internet Explorer versions less than 9.
    edge - Booleantrue for the Edge web browser.
    webkit - Booleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
    android - Booleantrue for any browser running on an Android platform.
    android23 - Booleantrue for browsers running on Android 2 or Android 3.
    androidStock - Booleantrue for the Android stock browser (i.e. not Chrome)
    opera - Booleantrue for the Opera browser
    chrome - Booleantrue for the Chrome browser.
    gecko - Booleantrue for gecko-based browsers like Firefox.
    safari - Booleantrue for the Safari browser.
    opera12 - Booleantrue for the Opera browser supporting CSS transforms (version 12 or later).
    win - Booleantrue when the browser is running in a Windows platform
    ie3d - Booleantrue for all Internet Explorer versions supporting CSS transforms.
    webkit3d - Booleantrue for webkit-based browsers supporting CSS transforms.
    gecko3d - Booleantrue for gecko-based browsers supporting CSS transforms.
    any3d - Booleantrue for all browsers supporting CSS transforms.
    mobile - Booleantrue for all browsers running in a mobile device.
    mobileWebkit - Booleantrue for all webkit-based browsers in a mobile device.
    mobileWebkit3d - Booleantrue for all webkit-based browsers in a mobile device supporting CSS transforms.
    msPointer - Booleantrue for browsers implementing the Microsoft touch events model (notably IE10).
    pointer - Booleantrue for all browsers supporting pointer events.
    touch - Booleantrue for all browsers supporting touch events. -This does not necessarily mean that the browser is running in a computer with -a touchscreen, it only means that the browser is capable of understanding -touch events.
    mobileOpera - Booleantrue for the Opera browser in a mobile device.
    mobileGecko - Booleantrue for gecko-based browsers running in a mobile device.
    retina - Booleantrue for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%.
    canvas - Booleantrue when the browser supports <canvas>.
    svg - Booleantrue when the browser supports SVG.
    vml - Booleantrue if the browser supports VML.
    - -
    - - -

    Util

    Various utility functions, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> dest, <Object> src?)ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
    create(<Object> proto, <Object> properties?)ObjectCompatibility polyfill for Object.create
    bind(<Function> fn, )FunctionReturns a new function bound to the arguments passed, like Function.prototype.bind. -Has a L.bind() shortcut.
    stamp(<Object> obj)NumberReturns the unique ID of an object, assigning it one if it doesn't have it.
    throttle(<Function> fn, <Number> time, <Object> context)FunctionReturns a function which executes function fn with the given scope context -(so that the this keyword refers to context inside fn's code). The function -fn will be called no more than one time per given amount of time. The arguments -received by the bound function will be any arguments passed when binding the -function, followed by any arguments passed when invoking the bound function. -Has an L.throttle shortcut.
    wrapNum(<Number> num, <Number[]> range, <Boolean> includeMax?)NumberReturns the number num modulo range in such a way so it lies within -range[0] and range[1]. The returned value will be always smaller than -range[1] unless includeMax is set to true.
    falseFn()FunctionReturns a function which always returns false.
    formatNum(<Number> num, <Number> digits?)NumberReturns the number num rounded to digits decimals, or to 6 decimals by default.
    trim(<String> str)StringCompatibility polyfill for String.prototype.trim
    splitWords(<String> str)String[]Trims and splits the string on whitespace and returns the array of parts.
    setOptions(<Object> obj, <Object> options)ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.
    getParamString(<Object> obj, <String> existingUrl?, <Boolean> uppercase?)StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} -translates to '?a=foo&b=bar'. If existingUrl is set, the parameters will -be appended at the end. If uppercase is true, the parameter names will -be uppercased (e.g. '?A=foo&B=bar')
    template(<String> str, <Object> data)StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' -and a data object like {a: 'foo', b: 'bar'}, returns evaluated string -('Hello foo, bar'). You can also specify functions instead of strings for -data values — they will be evaluated passing data as an argument.
    isArray(obj)BooleanCompatibility polyfill for Array.isArray
    indexOf(<Array> array, <Object> el)NumberCompatibility polyfill for Array.prototype.indexOf
    requestAnimFrame(<Function> fn, <Object> context?, <Boolean> immediate?)NumberSchedules fn to be executed when the browser repaints. fn is bound to -context if given. When immediate is set, fn is called immediately if -the browser doesn't have native support for -window.requestAnimationFrame, -otherwise it's delayed. Returns a request ID that can be used to cancel the request.
    cancelAnimFrame(<Number> id)undefinedCancels a previous requestAnimFrame. See also window.cancelAnimationFrame.
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    lastId - NumberLast unique ID used by stamp()
    emptyImageUrl - StringData URI string containing a base64-encoded empty GIF image. -Used as a hack to free memory from unused images on WebKit-powered -mobile devices (by setting image src to this string).
    - -
    - - -

    Transformation

    Represents an affine transformation: a set of coefficients a, b, c, d -for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing -the reverse. Used by Leaflet in its projections code.

    - -
    -

    Usage example

    - -
    - - - - - -
    var transformation = L.transformation(2, 5, -1, 10),
    -    p = L.point(1, 2),
    -    p2 = transformation.transform(p), //  L.point(7, 8)
    -    p3 = transformation.untransform(p2); //  L.point(1, 2)
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.transformation(<Number> a, <Number> b, <Number> c, <Number> d)Instantiates a Transformation object with the given coefficients.
    L.transformation(<Array> coefficients)Expects an coefficients array of the form -[a: Number, b: Number, c: Number, d: Number].
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    transform(<Point> point, <Number> scale?)Point

    Returns a transformed point, optionally multiplied by the given scale. -Only accepts actual L.Point instances, not arrays.

    -
    untransform(<Point> point, <Number> scale?)Point

    Returns the reverse transformation of the given point, optionally divided -by the given scale. Only accepts actual L.Point instances, not arrays.

    -
    - -
    - - -

    LineUtil

    Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    simplify(<Point[]> points, <Number> tolerance)Point[]Dramatically reduces the number of points in a polyline while retaining -its shape and returns a new array of simplified points, using the -Douglas-Peucker algorithm. -Used for a huge performance boost when processing/displaying Leaflet polylines for -each zoom level and also reducing visual noise. tolerance affects the amount of -simplification (lesser value means higher quality but slower and with more points). -Also released as a separated micro-library Simplify.js.
    pointToSegmentDistance(<Point> p, <Point> p1, <Point> p2)NumberReturns the distance between point p and segment p1 to p2.
    closestPointOnSegment(<Point> p, <Point> p1, <Point> p2)NumberReturns the closest point from a point p on a segment p1 to p2.
    clipSegment(<Point> a, <Point> b, <Bounds> bounds, <Boolean> useLastCode?, <Boolean> round?)Point[]|BooleanClips the segment a to b by rectangular bounds with the -Cohen-Sutherland algorithm -(modifying the segment points directly!). Used by Leaflet to only show polyline -points that are on the screen or near, increasing performance.
    isFlat(<LatLng[]> latlngs)BooleanReturns true if latlngs is a flat array, false is nested.
    - -
    - - -

    PolyUtil

    Various utility functions for polygon geometries.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    clipPolygon(<Point[]> points, <Bounds> bounds, <Boolean> round?)Point[]Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgman algorithm). -Used by Leaflet to only show polygon points that are on the screen or near, increasing -performance. Note that polygon points needs different algorithm for clipping -than polyline, so there's a separate method for it.
    - -
    - - -

    DomEvent

    Utility functions to work with the DOM events, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    on(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisAdds a listener function (fn) to a particular DOM event type of the -element el. You can optionally specify the context of the listener -(object the this keyword will point to). You can also pass several -space-separated types (e.g. 'click dblclick').
    on(<HTMLElement> el, <Object> eventMap, <Object> context?)thisAdds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    off(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisRemoves a previously added listener function. -Note that if you passed a custom context to on, you must pass the same -context to off in order to remove the listener.
    off(<HTMLElement> el, <Object> eventMap, <Object> context?)thisRemoves a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    stopPropagation(<DOMEvent> ev)thisStop the given event from propagation to parent elements. Used inside the listener functions: -
    L.DomEvent.on(div, 'click', function (ev) {
    -    L.DomEvent.stopPropagation(ev);
    -});
    -
    disableScrollPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'mousewheel' events (plus browser variants).
    disableClickPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'click', 'doubleclick', -'mousedown' and 'touchstart' events (plus browser variants).
    preventDefault(<DOMEvent> ev)thisPrevents the default action of the DOM Event ev from happening (such as -following a link in the href of the a element, or doing a POST request -with page reload when a <form> is submitted). -Use it inside listener functions.
    stop(<DOMEvent> ev)thisDoes stopPropagation and preventDefault at the same time.
    getMousePosition(<DOMEvent> ev, <HTMLElement> container?)PointGets normalized mouse position from a DOM event relative to the -container or to the whole page if not specified.
    getWheelDelta(<DOMEvent> ev)NumberGets normalized wheel delta from a mousewheel DOM event, in vertical -pixels scrolled (negative if scrolling down). -Events from pointing devices without precise scrolling are mapped to -a best guess of 60 pixels.
    addListener()thisAlias to L.DomEvent.on
    removeListener()thisAlias to L.DomEvent.off
    - -
    - - -

    DomUtil

    Utility functions to work with the DOM -tree, used by Leaflet internally. -Most functions expecting or returning a HTMLElement also work for -SVG elements. The only difference is that classes refer to CSS classes -in HTML and SVG classes in SVG.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    get(<String|HTMLElement> id)HTMLElementReturns an element given its DOM id, or returns the element itself -if it was passed directly.
    getStyle(<HTMLElement> el, <String> styleAttrib)StringReturns the value for a certain style attribute on an element, -including computed values or values set through CSS.
    create(<String> tagName, <String> className?, <HTMLElement> container?)HTMLElementCreates an HTML element with tagName, sets its class to className, and optionally appends it to container element.
    remove(<HTMLElement> el)Removes el from its parent element
    empty(<HTMLElement> el)Removes all of el's children elements from el
    toFront(<HTMLElement> el)Makes el the last child of its parent, so it renders in front of the other children.
    toBack(<HTMLElement> el)Makes el the first child of its parent, so it renders behind the other children.
    hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element's class attribute contains name.
    addClass(<HTMLElement> el, <String> name)Adds name to the element's class attribute.
    removeClass(<HTMLElement> el, <String> name)Removes name from the element's class attribute.
    setClass(<HTMLElement> el, <String> name)Sets the element's class.
    getClass(<HTMLElement> el)StringReturns the element's class.
    setOpacity(<HTMLElement> el, <Number> opacity)Set the opacity of an element (including old IE support). -opacity must be a number from 0 to 1.
    testProp(<String[]> props)String|falseGoes through the array of style names and returns the first name -that is a valid style name for an element. If no such name is found, -it returns false. Useful for vendor-prefixed styles like transform.
    setTransform(<HTMLElement> el, <Point> offset, <Number> scale?)Resets the 3D CSS transform of el so it is translated by offset pixels -and optionally scaled by scale. Does not have an effect if the -browser doesn't support 3D CSS transforms.
    setPosition(<HTMLElement> el, <Point> position)Sets the position of el to coordinates specified by position, -using CSS translate or top/left positioning depending on the browser -(used by Leaflet internally to position its layers).
    getPosition(<HTMLElement> el)PointReturns the coordinates of an element previously positioned with setPosition.
    disableTextSelection()Prevents the user from generating selectstart DOM events, usually generated -when the user drags the mouse through a page with text. Used internally -by Leaflet to override the behaviour of any click-and-drag interaction on -the map. Affects drag interactions on the whole document.
    enableTextSelection()Cancels the effects of a previous L.DomUtil.disableTextSelection.
    disableImageDrag()As L.DomUtil.disableTextSelection, but -for dragstart DOM events, usually generated when the user drags an image.
    enableImageDrag()Cancels the effects of a previous L.DomUtil.disableImageDrag.
    preventOutline(<HTMLElement> el)Makes the outline -of the element el invisible. Used internally by Leaflet to prevent -focusable elements from displaying an outline when the user performs a -drag interaction on them.
    restoreOutline()Cancels the effects of a previous L.DomUtil.preventOutline.
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    TRANSFORM - StringVendor-prefixed transform style name (e.g. 'webkitTransform' for WebKit).
    TRANSITION - StringVendor-prefixed transition style name.
    TRANSITION_END - StringVendor-prefixed transitionend event name.
    - -
    - - -

    PosAnimation

    Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

    - -
    -

    Usage example

    - -
    - - - - - -
    var fx = new L.PosAnimation();
    -fx.run(el, [300, 500], 0.5);
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.PosAnimation()Creates a PosAnimation object.
    - - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    start - EventFired when the animation starts
    step - EventFired continuously during the animation.
    end - EventFired when the animation ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    run(<HTMLElement> el, <Point> newPos, <Number> duration?, <Number> easeLinearity?)

    Run an animation of a given element to a new position, optionally setting -duration in seconds (0.25 by default) and easing linearity factor (3rd -argument of the cubic bezier curve, -0.5 by default).

    -
    stop()

    Stops the animation (if currently running).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Draggable

    A class for making DOM elements draggable (including touch support). -Used internally for map and marker dragging. Only works for elements -that were positioned with L.DomUtil.setPosition.

    - -
    -

    Usage example

    - -
    - - - - - -
    var draggable = new L.Draggable(elementToDrag);
    -draggable.enable();
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.Draggable(<HTMLElement> el, <HTMLElement> dragHandle?, <Boolean> preventOutline?, <Draggable options> options?)Creates a Draggable object for moving el when you start dragging the dragHandle element (equals el itself by default).
    - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    clickToleranceNumber - 3The max number of pixels a user can shift the mouse pointer during a click -for it to be considered a valid click (as opposed to a mouse drag).
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    down - EventFired when a drag is about to start.
    dragstart - EventFired when a drag starts
    predrag - EventFired continuously during dragging before each corresponding -update of the element's position.
    drag - EventFired continuously during dragging.
    dragend - DragEndEventFired when the drag ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()

    Enables the dragging ability

    -
    disable()

    Disables the dragging ability

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Class

    L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here. -In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

    - -
    -

    Usage example

    - -
    - - - - - -
    var MyClass = L.Class.extend({
    -initialize: function (greeter) {
    -    this.greeter = greeter;
    -    // class constructor
    -},
    -greet: function (name) {
    -    alert(this.greeter + ', ' + name)
    -    }
    -});
    -// create instance of MyClass, passing "Hello" to the constructor
    -var a = new MyClass("Hello");
    -// call greet method, alerting "Hello, World"
    -a.greet("World");
    -
    - - - -
    - -

    Class Factories

    - - - -

    You may have noticed that Leaflet objects are created without using -the new keyword. This is achieved by complementing each class with a -lowercase factory method:

    -
    new L.Map('map'); // becomes:
    -L.map('map');
    -
    -

    The factories are implemented very easily, and you can do this for your own classes:

    -
    L.map = function (id, options) {
    -    return new L.Map(id, options);
    -};
    -
    - - - -
    - -

    Inheritance

    - - - -

    You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

    -
    var MyChildClass = MyClass.extend({
    -    // ... new properties and methods
    -});
    -
    -

    This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

    -
    var a = new MyChildClass();
    -a instanceof MyChildClass; // true
    -a instanceof MyClass; // true
    -
    -

    You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

    -
    var MyChildClass = MyClass.extend({
    -    initialize: function () {
    -        MyClass.prototype.initialize.call(this, "Yo");
    -    },
    -    greet: function (name) {
    -        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
    -    }
    -});
    -var a = new MyChildClass();
    -a.greet('Jason'); // alerts "Yo, bro Jason!"
    -
    - - -
    - -

    Options

    - - - -

    options is a special property that unlike other objects that you pass -to extend will be merged with the parent one instead of overriding it -completely, which makes managing configuration of objects and default -values convenient:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        myOption1: 'foo',
    -        myOption2: 'bar'
    -    }
    -});
    -var MyChildClass = MyClass.extend({
    -    options: {
    -        myOption1: 'baz',
    -        myOption3: 5
    -    }
    -});
    -var a = new MyChildClass();
    -a.options.myOption1; // 'baz'
    -a.options.myOption2; // 'bar'
    -a.options.myOption3; // 5
    -
    -

    There's also L.Util.setOptions, a method for -conveniently merging options passed to constructor with the defaults -defines in the class:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        foo: 'bar',
    -        bla: 5
    -    },
    -    initialize: function (options) {
    -        L.Util.setOptions(this, options);
    -        ...
    -    }
    -});
    -var a = new MyClass({bla: 10});
    -a.options; // {foo: 'bar', bla: 10}
    -
    -

    Note that the options object allows any keys, not just -the options defined by the class and its base classes. -This means you can use the options object to store -application specific information, as long as you avoid -keys that are already used by the class in question.

    - - - -
    - -

    Includes

    - - - -

    includes is a special class property that merges all specified objects into the class (such objects are called mixins).

    -
     var MyMixin = {
    -    foo: function () { ... },
    -    bar: 5
    -};
    -var MyClass = L.Class.extend({
    -    includes: MyMixin
    -});
    -var a = new MyClass();
    -a.foo();
    -
    -

    You can also do such includes in runtime with the include method:

    -
    MyClass.include(MyMixin);
    -
    -

    statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

    -
    var MyClass = L.Class.extend({
    -    statics: {
    -        FOO: 'bar',
    -        BLA: 5
    -    }
    -});
    -MyClass.FOO; // 'bar'
    -
    - - - -
    - -

    Constructor hooks

    - - - -

    If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

    -
    MyClass.addInitHook(function () {
    -    // ... do something in constructor additionally
    -    // e.g. add event listeners, set custom properties etc.
    -});
    -
    -

    You can also use the following shortcut when you just need to make one additional method call:

    -
    MyClass.addInitHook('methodName', arg1, arg2, …);
    -
    - - - -
    - - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> props)FunctionExtends the current class given the properties to be included. -Returns a Javascript function that is a class constructor (to be called with new).
    include(<Object> properties)thisIncludes a mixin into the current class.
    mergeOptions(<Object> options)thisMerges options into the defaults of the class.
    addInitHook(<Function> fn)thisAdds a constructor hook to the class.
    - -
    - - -

    Evented

    A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

    - -
    -

    Usage example

    - -
    - - - - - -
    map.on('click', function(e) {
    -    alert(e.latlng);
    -} );
    -
    -

    Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

    -
    function onClick(e) { ... }
    -map.on('click', onClick);
    -map.off('click', onClick);
    -
    - - - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    - - -

    Layer

    A set of methods from the Layer base class that all Leaflet layers use. -Inherits all methods, options and events from L.Evented.

    - -
    -

    Usage example

    - -
    - - - - - -
    var layer = L.Marker(latlng).addTo(map);
    -layer.addTo(map);
    -layer.remove();
    -
    - - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Layer will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    - -

    Extension methods

    - -
    Every layer should extend from L.Layer and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)this

    Should contain code that creates DOM elements for the layer, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).

    -
    onRemove(<Map> map)this

    Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).

    -
    getEvents()Object

    This optional method should return an object like { viewreset: this._reset } for addEventListener. The event handlers in this object will be automatically added and removed from the map with your layer.

    -
    getAttribution()String

    This optional method should return a string containing HTML to be shown on the Attribution control whenever the layer is visible.

    -
    beforeAdd(<Map> map)this

    Optional method. Called on map.addLayer(layer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.

    -
    - -
    - -

    Popup methods

    - -
    All layers share a set of methods convenient for binding popups to it. -
    var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
    -layer.openPopup();
    -layer.closePopup();
    -
    -

    Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    - -

    Tooltip methods

    - -
    All layers share a set of methods convenient for binding tooltips to it. -
    var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
    -layer.openTooltip();
    -layer.closeTooltip();
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Interactive layer

    Some Layers can be made interactive - when the user interacts -with such a layer, mouse events like click and mouseover can be handled. -Use the event handling methods to handle these events.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - -

    Mouse events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Control

    L.Control is a base class for implementing map controls. Handles positioning. -All other controls extend from this class.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Control will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    - -

    Extension methods

    - -
    Every control should extend from L.Control and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)HTMLElement

    Should return the container DOM element for the control and add listeners on relevant map events. Called on control.addTo(map).

    -
    onRemove(<Map> map)

    Optional method. Should contain all clean up code that removes the listeners previously added in onAdd. Called on control.remove().

    -
    - -
    - - -

    Handler

    Abstract class for map interaction handlers

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()this

    Enables the handler

    -
    disable()this

    Disables the handler

    -
    enabled()Boolean

    Returns true if the handler is enabled

    -
    - -
    - -

    Extension methods

    - -
    Classes inheriting from Handler must implement the two following methods:
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHooks()

    Called when the handler is enabled, should add event hooks.

    -
    removeHooks()

    Called when the handler is disabled, should remove the event hooks added previously.

    -
    - -
    - - -
    -

    Functions

    - -
    - -

    There is static function which can be called without instantiating L.Handler:

    - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    addTo(<Map> map, <String> name)thisAdds a new Handler to the given map with the given name.
    - -
    - - -

    Projection

    An object with methods for projecting geographical coordinates of the world onto -a flat surface (and back). See Map projection.

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    project(<LatLng> latlng)Point

    Projects geographical coordinates into a 2D point. -Only accepts actual L.LatLng instances, not arrays.

    -
    unproject(<Point> point)LatLng

    The inverse of project. Projects a 2D point into a geographical location. -Only accepts actual L.Point instances, not arrays. -Note that the projection instances do not inherit from Leaflet's Class object, -and can't be instantiated. Also, new classes can't inherit from them, -and methods can't be added to them with the include function.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    bounds - BoundsThe bounds (specified in CRS units) where the projection is valid
    - -
    - - -
    -

    Defined projections

    - -
    - - - -
    Leaflet comes with a set of already defined Projections out of the box:
    - - - - - - - - - - - - - - - - - - - -
    ProjectionDescription
    L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, -mostly used by GIS enthusiasts. Directly maps x as longitude, and y as -latitude. Also suitable for flat worlds, e.g. game maps. Used by the -EPSG:4326 and Simple CRS.
    L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.
    L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, -used by almost all free and commercial tile providers. Assumes that Earth is -a sphere. Used by the EPSG:3857 CRS.
    - -
    - - -

    CRS

    -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    latLngToPoint(<LatLng> latlng, <Number> zoom)Point

    Projects geographical coordinates into pixel coordinates for a given zoom.

    -
    pointToLatLng(<Point> point, <Number> zoom)LatLng

    The inverse of latLngToPoint. Projects pixel coordinates on a given -zoom into geographical coordinates.

    -
    project(<LatLng> latlng)Point

    Projects geographical coordinates into coordinates in units accepted for -this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).

    -
    unproject(<Point> point)LatLng

    Given a projected coordinate returns the corresponding LatLng. -The inverse of project.

    -
    scale(<Number> zoom)Number

    Returns the scale used when transforming projected coordinates into -pixel coordinates for a particular zoom. For example, it returns -256 * 2^zoom for Mercator-based CRS.

    -
    zoom(<Number> scale)Number

    Inverse of scale(), returns the zoom level corresponding to a scale -factor of scale.

    -
    getProjectedBounds(<Number> zoom)Bounds

    Returns the projection's bounds scaled and transformed for the provided zoom.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds.

    -
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring -that its center is within the CRS's bounds. -Only accepts actual L.LatLngBounds instances, not arrays.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    code - StringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857')
    wrapLng - Number[]An array of two numbers defining whether the longitude (horizontal) coordinate -axis wraps around a given range and how. Defaults to [-180, 180] in most -geographical CRSs. If undefined, the longitude axis does not wrap around.
    wrapLat - Number[]Like wrapLng, but for the latitude (vertical) axis.
    infinite - BooleanIf true, the coordinate space will be unbounded (infinite in both axes)
    - -
    - - -
    -

    Defined CRSs

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CRSDescription
    L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
    L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial -tile providers. Uses Spherical Mercator projection. Set in by default in -Map's crs option.
    L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. -Leaflet 1.0.x complies with the TMS coordinate scheme for EPSG:4326, -which is a breaking change from 0.7.x behaviour. If you are using a TileLayer -with this CRS, ensure that there are two 256x256 pixel tiles covering the -whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), -or (-180,-90) for TileLayers with the tms option set.
    L.CRS.EarthServes as the base for CRS that are global such that they cover the earth. -Can only be used as the base for other CRS and cannot be used directly, -since it does not have a code, projection or transformation. distance() returns -meters.
    L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. -May be used for maps of flat surfaces (e.g. game maps). Note that the y -axis should still be inverted (going from bottom to top). distance() returns -simple euclidean distance.
    L.CRS.BaseObject that defines coordinate reference systems for projecting -geographical points into pixel (screen) coordinates and back (and to -coordinates in other units for WMS services). See -spatial reference system. -Leaflet defines the most usual CRSs by default. If you want to use a -CRS not defined by default, take a look at the -Proj4Leaflet plugin. -Note that the CRS instances do not inherit from Leaflet's Class object, -and can't be instantiated. Also, new classes can't inherit from them, -and methods can't be added to them with the include function.
    - -
    - - -

    Renderer

    Base class for vector renderer implementations (SVG, Canvas). Handles the -DOM container of the renderer, its bounds, and its zoom animation. -A Renderer works as an implicit layer group for all Paths - the renderer -itself can be added or removed to the map. All paths use a renderer, which can -be implicit (the map will decide the type of renderer and use it automatically) -or explicit (using the renderer option of the path). -Do not use this class directly, use SVG and Canvas instead.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber - 0How much to extend click tolerance round a path/object on the map
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Event objects

    Whenever a class inheriting from Evented fires an event, a listener function -will be called with an event argument, which is a plain object containing -information about the event. For example:

    -
    map.on('click', function(ev) {
    -    alert(ev.latlng); // ev is an event object (MouseEvent in this case)
    -});
    -
    -

    The information available depends on the event type:

    - - - -
    -

    Event

    - -
    - - - -
    The base event object. All other event objects contain these properties too.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    - - -
    - -
    -

    KeyboardEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    originalEvent - DOMEventThe original DOM KeyboardEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    MouseEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlng - LatLngThe geographical point where the mouse event occurred.
    layerPoint - PointPixel coordinates of the point where the mouse event occurred relative to the map layer.
    containerPoint - PointPixel coordinates of the point where the mouse event occurred relative to the map сontainer.
    originalEvent - DOMEventThe original DOM MouseEvent or DOM TouchEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    LocationEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlng - LatLngDetected geographical location of the user.
    bounds - LatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
    accuracy - NumberAccuracy of location in meters.
    altitude - NumberHeight of the position above the WGS84 ellipsoid in meters.
    altitudeAccuracy - NumberAccuracy of altitude in meters.
    heading - NumberThe direction of travel in degrees counting clockwise from true North.
    speed - NumberCurrent velocity in meters per second.
    timestamp - NumberThe time when the position was acquired.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    message - StringError message.
    code - NumberError code (if applicable).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    LayerEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    LayersControlEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer that was added or removed.
    name - StringThe name of the layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    TileEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tile - HTMLElementThe tile element (image).
    coords - PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    TileErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tile - HTMLElementThe tile element (image).
    coords - PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    error - *Error passed to the tile's done() callback.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ResizeEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    oldSize - PointThe old size before resize event.
    newSize - PointThe new size after the resize event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    GeoJSONEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer for the GeoJSON feature that is being added to the map.
    properties - ObjectGeoJSON properties of the feature.
    geometryType - StringGeoJSON geometry type of the feature.
    id - StringGeoJSON ID of the feature (if present).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    PopupEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    popup - PopupThe popup that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    TooltipEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tooltip - TooltipThe tooltip that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    DragEndEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    distance - NumberThe distance in pixels the draggable element was moved by.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ZoomAnimEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    center - LatLngThe current center of the map
    zoom - NumberThe current zoom level of the map
    noUpdate - BooleanWhether layers should update their contents due to this event
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -

    DivOverlay

    Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    offsetPoint - Point(0, 7)The offset of the popup position. Useful to control the anchor -of the popup when opening it on some overlays.
    classNameString - ''A custom CSS class name to assign to the popup.
    paneString - 'popupPane'Map pane where the popup will be added.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Global Switches

    Global switches are created for rare cases and generally make -Leaflet to not detect a particular browser feature even if it's -there. You need to set the switch as a global variable to true -before including Leaflet on the page, like this:

    -
    <script>L_NO_TOUCH = true;</script>
    -<script src="leaflet.js"></script>
    -
    - - - - - - - - - - - - - - - - - -
    SwitchDescription
    L_NO_TOUCHForces Leaflet to not use touch events even if it detects them.
    L_DISABLE_3DForces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.
    - -

    noConflict

    This method restores the L global variable to the original value -it had before Leaflet inclusion, and returns the real Leaflet -namespace so you can put it elsewhere, like this:

    -
    <script src='libs/l.js'>
    -<!-- L points to some other library -->
    -<script src='leaflet.js'>
    -<!-- you include Leaflet, it replaces the L variable to Leaflet namespace -->
    -<script>
    -var Leaflet = L.noConflict();
    -// now L points to that other library again, and you can use Leaflet.Map etc.
    -</script>
    -
    - -

    version

    A constant that represents the Leaflet version in use.

    -
    L.version; // contains "1.0.0" (or whatever version is currently in use)
    -
    diff --git a/docs/reference-1.3.1.html b/docs/reference-1.3.1.html deleted file mode 100644 index 35d96e2b997..00000000000 --- a/docs/reference-1.3.1.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -layout: redirected -redirect_to: reference-1.3.0.html ---- \ No newline at end of file diff --git a/docs/reference-1.3.2.html b/docs/reference-1.3.2.html deleted file mode 100644 index f6a074c6f34..00000000000 --- a/docs/reference-1.3.2.html +++ /dev/null @@ -1,23924 +0,0 @@ ---- -layout: v2 -title: Documentation -bodyclass: api-page ---- - -

    Leaflet API reference

    - -

    This reference reflects Leaflet 1.3.2 and Leaflet 1.3.3. Check this list if you are using a different version of Leaflet.

    - -
    - -
    -

    UI Layers

    - -

    Raster Layers

    - -

    Vector Layers

    - -
    -
    -

    Other Layers

    - -

    Basic Types

    - -

    Controls

    - -
    -
    - - - - - - -

    Utility

    - -

    DOM Utility

    - -
    -
    -

    Base Classes

    - - -

    Misc

    - -
    -
    - -

    Map

    The central class of the API — it is used to create a map on a page and manipulate it.

    - -
    -

    Usage example

    - -
    - - - - - -
    // initialize the map on the "map" div with a given center and zoom
    -var map = L.map('map', {
    -    center: [51.505, -0.09],
    -    zoom: 13
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.map(<String> id, <Map options> options?)Instantiates a map object given the DOM ID of a <div> element -and optionally an object literal with Map options.
    L.map(<HTMLElement> el, <Map options> options?)Instantiates a map object given an instance of a <div> HTML element -and optionally an object literal with Map options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    preferCanvasBoolean - falseWhether Paths should be rendered on a Canvas renderer. -By default, all Paths are rendered in a SVG renderer.
    - -
    - -

    Control options

    - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionControlBoolean - trueWhether a attribution control is added to the map by default.
    zoomControlBoolean - trueWhether a zoom control is added to the map by default.
    - -
    - -

    Interaction Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    closePopupOnClickBoolean - trueSet it to false if you don't want popups to close when user clicks the map.
    boxZoomBoolean - trueWhether the map can be zoomed to a rectangular area specified by -dragging the mouse while pressing the shift key.
    doubleClickZoomBoolean|String - trueWhether the map can be zoomed in by double clicking on it and -zoomed out by double clicking while holding shift. If passed -'center', double-click zoom will zoom to the center of the - view regardless of where the mouse was.
    draggingBoolean - trueWhether the map be draggable with mouse/touch or not.
    zoomSnapNumber - 1Forces the map's zoom level to always be a multiple of this, particularly -right after a fitBounds() or a pinch-zoom. -By default, the zoom level snaps to the nearest integer; lower values -(e.g. 0.5 or 0.1) allow for greater granularity. A value of 0 -means the zoom level will not be snapped after fitBounds or a pinch-zoom.
    zoomDeltaNumber - 1Controls how much the map's zoom level will change after a -zoomIn(), zoomOut(), pressing + -or - on the keyboard, or using the zoom controls. -Values smaller than 1 (e.g. 0.5) allow for greater granularity.
    trackResizeBoolean - trueWhether the map automatically handles browser window resize to update itself.
    - -
    - -

    Panning Inertia Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    inertiaBoolean - *If enabled, panning of the map will have an inertia effect where -the map builds momentum while dragging and continues moving in -the same direction for some time. Feels especially nice on touch -devices. Enabled by default unless running on old Android devices.
    inertiaDecelerationNumber - 3000The rate with which the inertial movement slows down, in pixels/second².
    inertiaMaxSpeedNumber - InfinityMax speed of the inertial movement, in pixels/second.
    easeLinearityNumber - 0.2
    worldCopyJumpBoolean - falseWith this option enabled, the map tracks when you pan to another "copy" -of the world and seamlessly jumps to the original one so that all overlays -like markers and vector layers are still visible.
    maxBoundsViscosityNumber - 0.0If maxBounds is set, this option will control how solid the bounds -are when dragging the map around. The default value of 0.0 allows the -user to drag outside the bounds at normal speed, higher values will -slow down map dragging outside bounds, and 1.0 makes the bounds fully -solid, preventing the user from dragging outside the bounds.
    - -
    - -

    Keyboard Navigation Options

    - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    keyboardBoolean - trueMakes the map focusable and allows users to navigate the map with keyboard -arrows and +/- keys.
    keyboardPanDeltaNumber - 80Amount of pixels to pan when pressing an arrow key.
    - -
    - -

    Mousewheel options

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    scrollWheelZoomBoolean|String - trueWhether the map can be zoomed by using the mouse wheel. If passed 'center', -it will zoom to the center of the view regardless of where the mouse was.
    wheelDebounceTimeNumber - 40Limits the rate at which a wheel can fire (in milliseconds). By default -user can't zoom via wheel more often than once per 40 ms.
    wheelPxPerZoomLevelNumber - 60How many scroll pixels (as reported by L.DomEvent.getWheelDelta) -mean a change of one full zoom level. Smaller values will make wheel-zooming -faster (and vice versa).
    - -
    - -

    Touch interaction options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tapBoolean - trueEnables mobile hacks for supporting instant taps (fixing 200ms click -delay on iOS/Android) and touch holds (fired as contextmenu events).
    tapToleranceNumber - 15The max number of pixels a user can shift his finger during touch -for it to be considered a valid tap.
    touchZoomBoolean|String - *Whether the map can be zoomed by touch-dragging with two fingers. If -passed 'center', it will zoom to the center of the view regardless of -where the touch events (fingers) were. Enabled for touch-capable web -browsers except for old Androids.
    bounceAtZoomLimitsBoolean - trueSet it to false if you don't want the map to zoom beyond min/max zoom -and then bounce back when pinch-zooming.
    - -
    - -

    Map State Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    crsCRS - L.CRS.EPSG3857The Coordinate Reference System to use. Don't change this if you're not -sure what it means.
    centerLatLng - undefinedInitial geographic center of the map
    zoomNumber - undefinedInitial map zoom level
    minZoomNumber - *Minimum zoom level of the map. -If not specified and at least one GridLayer or TileLayer is in the map, -the lowest of their minZoom options will be used instead.
    maxZoomNumber - *Maximum zoom level of the map. -If not specified and at least one GridLayer or TileLayer is in the map, -the highest of their maxZoom options will be used instead.
    layersLayer[] - []Array of layers that will be added to the map initially
    maxBoundsLatLngBounds - nullWhen this option is set, the map restricts the view to the given -geographical bounds, bouncing the user back if the user tries to pan -outside the view. To set the restriction dynamically, use -setMaxBounds method.
    rendererRenderer - *The default method for drawing vector layers on the map. L.SVG -or L.Canvas by default depending on browser support.
    - -
    - -

    Animation Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    zoomAnimationBoolean - trueWhether the map zoom animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    zoomAnimationThresholdNumber - 4Won't animate zoom if the zoom difference exceeds this value.
    fadeAnimationBoolean - trueWhether the tile fade animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    markerZoomAnimationBoolean - trueWhether markers animate their zoom with the zoom animation, if disabled -they will disappear for the length of the animation. By default it's -enabled in all browsers that support CSS3 Transitions except Android.
    transform3DLimitNumber - 2^23Defines the maximum size of a CSS translation transform. The default -value should not be changed unless a web browser positions layers in -the wrong place after doing a large panBy.
    - -
    - - -
    -

    Events

    - -
    - -

    Layer events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    baselayerchange - LayersControlEventFired when the base layer is changed through the layer control.
    overlayadd - LayersControlEventFired when an overlay is selected through the layer control.
    overlayremove - LayersControlEventFired when an overlay is deselected through the layer control.
    layeradd - LayerEventFired when a new layer is added to the map.
    layerremove - LayerEventFired when some layer is removed from the map
    - -
    - -

    Map state change events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    zoomlevelschange - EventFired when the number of zoomlevels on the map is changed due -to adding or removing a layer.
    resize - ResizeEventFired when the map is resized.
    unload - EventFired when the map is destroyed with remove method.
    viewreset - EventFired when the map needs to redraw its content (this usually happens -on map zoom or load). Very useful for creating custom overlays.
    load - EventFired when the map is initialized (when its center and zoom are set -for the first time).
    zoomstart - EventFired when the map zoom is about to change (e.g. before zoom animation).
    movestart - EventFired when the view of the map starts changing (e.g. user starts dragging the map).
    zoom - EventFired repeatedly during any change in zoom level, including zoom -and fly animations.
    move - EventFired repeatedly during any movement of the map, including pan and -fly animations.
    zoomend - EventFired when the map has changed, after any animations.
    moveend - EventFired when the center of the map stops changing (e.g. user stopped -dragging the map).
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup is opened in the map
    popupclose - PopupEventFired when a popup in the map is closed
    autopanstart - EventFired when the map starts autopanning when opening a popup.
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip is opened in the map.
    tooltipclose - TooltipEventFired when a tooltip in the map is closed.
    - -
    - -

    Location events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    locationerror - ErrorEventFired when geolocation (using the locate method) failed.
    locationfound - LocationEventFired when geolocation (using the locate method) -went successfully.
    - -
    - -

    Interaction events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the map.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the map.
    mousedown - MouseEventFired when the user pushes the mouse button on the map.
    mouseup - MouseEventFired when the user releases the mouse button on the map.
    mouseover - MouseEventFired when the mouse enters the map.
    mouseout - MouseEventFired when the mouse leaves the map.
    mousemove - MouseEventFired while the mouse moves over the map.
    contextmenu - MouseEventFired when the user pushes the right mouse button on the map, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    keypress - KeyboardEventFired when the user presses a key from the keyboard while the map is focused.
    preclick - MouseEventFired before mouse click on the map (sometimes useful when you -want something to happen on click before any existing click -handlers start running).
    - -
    - -

    Other Methods

    - - - - - - - - - - - - - -
    EventDataDescription
    zoomanim - ZoomAnimEventFired on every frame of a zoom animation
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getRenderer(<Path> layer)Renderer

    Returns the instance of Renderer that should be used to render the given -Path. It will ensure that the renderer options of the map and paths -are respected, and that the renderers do exist on the map.

    -
    - -
    - -

    Methods for Layers and Controls

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addControl(<Control> control)this

    Adds the given control to the map

    -
    removeControl(<Control> control)this

    Removes the given control from the map

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the map

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the map.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the map

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the map, optionally specifying context of the iterator function.

    -
    map.eachLayer(function(layer){
    -    layer.bindPopup('Hello');
    -});
    -
    openPopup(<Popup> popup)this

    Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).

    -
    openPopup(<String|HTMLElement> content, <LatLng> latlng, <Popup options> options?)this

    Creates a popup with the specified content and options and opens it in the given point on a map.

    -
    closePopup(<Popup> popup?)this

    Closes the popup previously opened with openPopup (or the given one).

    -
    openTooltip(<Tooltip> tooltip)this

    Opens the specified tooltip.

    -
    openTooltip(<String|HTMLElement> content, <LatLng> latlng, <Tooltip options> options?)this

    Creates a tooltip with the specified content and options and open it.

    -
    closeTooltip(<Tooltip> tooltip?)this

    Closes the tooltip given as parameter.

    -
    - -
    - -

    Methods for modifying map state

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setView(<LatLng> center, <Number> zoom, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) with the given -animation options.

    -
    setZoom(<Number> zoom, <Zoom/pan options> options?)this

    Sets the zoom of the map.

    -
    zoomIn(<Number> delta?, <Zoom options> options?)this

    Increases the zoom of the map by delta (zoomDelta by default).

    -
    zoomOut(<Number> delta?, <Zoom options> options?)this

    Decreases the zoom of the map by delta (zoomDelta by default).

    -
    setZoomAround(<LatLng> latlng, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified geographical point on the map -stationary (e.g. used internally for scroll zoom and double-click zoom).

    -
    setZoomAround(<Point> offset, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.

    -
    fitBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets a map view that contains the given geographical bounds with the -maximum zoom level possible.

    -
    fitWorld(<fitBounds options> options?)this

    Sets a map view that mostly contains the whole world with the maximum -zoom level possible.

    -
    panTo(<LatLng> latlng, <Pan options> options?)this

    Pans the map to a given center.

    -
    panBy(<Point> offset, <Pan options> options?)this

    Pans the map by a given number of pixels (animated).

    -
    flyTo(<LatLng> latlng, <Number> zoom?, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) performing a smooth -pan-zoom animation.

    -
    flyToBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets the view of the map with a smooth animation like flyTo, -but takes a bounds parameter like fitBounds.

    -
    setMaxBounds(<Bounds> bounds)this

    Restricts the map view to the given bounds (see the maxBounds option).

    -
    setMinZoom(<Number> zoom)this

    Sets the lower limit for the available zoom levels (see the minZoom option).

    -
    setMaxZoom(<Number> zoom)this

    Sets the upper limit for the available zoom levels (see the maxZoom option).

    -
    panInsideBounds(<LatLngBounds> bounds, <Pan options> options?)this

    Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.

    -
    invalidateSize(<Zoom/pan options> options)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default. If options.pan is false, panning will not occur. -If options.debounceMoveend is true, it will delay moveend event so -that it doesn't happen often even if the method is called many -times in a row.

    -
    invalidateSize(<Boolean> animate)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default.

    -
    stop()this

    Stops the currently running panTo or flyTo animation, if any.

    -
    - -
    - -

    Geolocation methods

    - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    locate(<Locate options> options?)this

    Tries to locate the user using the Geolocation API, firing a locationfound -event with location data on success or a locationerror event on failure, -and optionally sets the map view to the user's location with respect to -detection accuracy (or to the world view if geolocation failed). -Note that, if your page doesn't use HTTPS, this method will fail in -modern browsers (Chrome 50 and newer) -See Locate options for more details.

    -
    stopLocate()this

    Stops watching location previously initiated by map.locate({watch: true}) -and aborts resetting the map view if map.locate was called with -{setView: true}.

    -
    - -
    - -

    Other Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHandler(<String> name, <Function> HandlerClass)this

    Adds a new Handler to the map, given its name and constructor function.

    -
    remove()this

    Destroys the map and clears all related event listeners.

    -
    createPane(<String> name, <HTMLElement> container?)HTMLElement

    Creates a new map pane with the given name if it doesn't exist already, -then returns it. The pane is created as a child of container, or -as a child of the main map pane if not set.

    -
    getPane(<String|HTMLElement> pane)HTMLElement

    Returns a map pane, given its name or its HTML element (its identity).

    -
    getPanes()Object

    Returns a plain object containing the names of all panes as keys and -the panes as values.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the map.

    -
    whenReady(<Function> fn, <Object> context?)this

    Runs the given function fn when the map gets initialized with -a view (center and zoom) and at least one layer, or immediately -if it's already initialized, optionally passing a function context.

    -
    - -
    - -

    Methods for Getting Map State

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getCenter()LatLng

    Returns the geographical center of the map view

    -
    getZoom()Number

    Returns the current zoom level of the map view

    -
    getBounds()LatLngBounds

    Returns the geographical bounds visible in the current map view

    -
    getMinZoom()Number

    Returns the minimum zoom level of the map (if set in the minZoom option of the map or of any layers), or 0 by default.

    -
    getMaxZoom()Number

    Returns the maximum zoom level of the map (if set in the maxZoom option of the map or of any layers).

    -
    getBoundsZoom(<LatLngBounds> bounds, <Boolean> inside?, <Point> padding?)Number

    Returns the maximum zoom level on which the given bounds fit to the map -view in its entirety. If inside (optional) is set to true, the method -instead returns the minimum zoom level on which the map view fits into -the given bounds in its entirety.

    -
    getSize()Point

    Returns the current size of the map container (in pixels).

    -
    getPixelBounds()Bounds

    Returns the bounds of the current map view in projected pixel -coordinates (sometimes useful in layer and overlay implementations).

    -
    getPixelOrigin()Point

    Returns the projected pixel coordinates of the top left point of -the map layer (useful in custom layer and overlay implementations).

    -
    getPixelWorldBounds(<Number> zoom?)Bounds

    Returns the world's bounds in pixel coordinates for zoom level zoom. -If zoom is omitted, the map's current zoom level is used.

    -
    - -
    - -

    Conversion Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getZoomScale(<Number> toZoom, <Number> fromZoom)Number

    Returns the scale factor to be applied to a map transition from zoom level -fromZoom to toZoom. Used internally to help with zoom animations.

    -
    getScaleZoom(<Number> scale, <Number> fromZoom)Number

    Returns the zoom level that the map would end up at, if it is at fromZoom -level and everything is scaled by a factor of scale. Inverse of -getZoomScale.

    -
    project(<LatLng> latlng, <Number> zoom)Point

    Projects a geographical coordinate LatLng according to the projection -of the map's CRS, then scales it according to zoom and the CRS's -Transformation. The result is pixel coordinate relative to -the CRS origin.

    -
    unproject(<Point> point, <Number> zoom)LatLng

    Inverse of project.

    -
    layerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToLayerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the origin pixel.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -map's CRS's wrapLat and wrapLng properties, if they are outside the -CRS's bounds. -By default this means longitude is wrapped around the dateline so its -value is between -180 and +180 degrees.

    -
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring that -its center is within the CRS's bounds. -By default this means the center longitude is wrapped around the dateline so its -value is between -180 and +180 degrees, and the majority of the bounds -overlaps the CRS's bounds.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates according to -the map's CRS. By default this measures distance in meters.

    -
    containerPointToLayerPoint(<Point> point)Point

    Given a pixel coordinate relative to the map container, returns the corresponding -pixel coordinate relative to the origin pixel.

    -
    layerPointToContainerPoint(<Point> point)Point

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding pixel coordinate relative to the map container.

    -
    containerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the map container, returns -the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToContainerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the map container.

    -
    mouseEventToContainerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to the -map container where the event took place.

    -
    mouseEventToLayerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to -the origin pixel where the event took place.

    -
    mouseEventToLatLng(<MouseEvent> ev)LatLng

    Given a MouseEvent object, returns geographical coordinate where the -event took place.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Handlers

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    boxZoom - HandlerBox (shift-drag with mouse) zoom handler.
    doubleClickZoom - HandlerDouble click zoom handler.
    dragging - HandlerMap dragging handler (by both mouse and touch).
    keyboard - HandlerKeyboard navigation handler.
    scrollWheelZoom - HandlerScroll wheel zoom handler.
    tap - HandlerMobile touch hacks (quick tap and touch hold) handler.
    touchZoom - HandlerTouch zoom handler.
    - -
    - - -
    -

    Map panes

    - -
    - - - -
    Panes are DOM elements used to control the ordering of layers on the map. You -can access panes with map.getPane or -map.getPanes methods. New panes can be created with the -map.createPane method. -Every map has the following default panes that differ only in zIndex.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PaneTypeZ-indexDescription
    mapPaneHTMLElement - 'auto'Pane that contains all other map panes
    tilePaneHTMLElement - 200Pane for GridLayers and TileLayers
    overlayPaneHTMLElement - 400Pane for vectors (Paths, like Polylines and Polygons), ImageOverlays and VideoOverlays
    shadowPaneHTMLElement - 500Pane for overlay shadows (e.g. Marker shadows)
    markerPaneHTMLElement - 600Pane for Icons of Markers
    tooltipPaneHTMLElement - 650Pane for Tooltips.
    popupPaneHTMLElement - 700Pane for Popups.
    - -
    - - -
    - -
    -

    Locate options

    - -
    - - - -
    Some of the geolocation methods for Map take in an options parameter. This -is a plain javascript object with the following optional components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    watchBoolean - falseIf true, starts continuous watching of location changes (instead of detecting it -once) using W3C watchPosition method. You can later stop watching using -map.stopLocate() method.
    setViewBoolean - falseIf true, automatically sets the map view to the user location with respect to -detection accuracy, or to world view if geolocation failed.
    maxZoomNumber - InfinityThe maximum zoom for automatic view setting when using setView option.
    timeoutNumber - 10000Number of milliseconds to wait for a response from geolocation before firing a -locationerror event.
    maximumAgeNumber - 0Maximum age of detected location. If less than this amount of milliseconds -passed since last geolocation response, locate will return a cached location.
    enableHighAccuracyBoolean - falseEnables high accuracy, see description in the W3C spec.
    - -
    - - -
    - -
    -

    Zoom options

    - -
    - - - -
    Some of the Map methods which modify the zoom level take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    - - -
    - -
    -

    Pan options

    - -
    - - - -
    Some of the Map methods which modify the center of the map take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If true, panning will always be animated if possible. If false, it will -not animate panning, either resetting the map view if panning more than a -screen away, or just setting a new offset for the map pane (except for panBy -which always does the latter).
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    - - -
    - -
    -

    Zoom/pan options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -
    - -
    -

    FitBounds options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingTopLeftPoint - [0, 0]Sets the amount of padding in the top left corner of a map container that -shouldn't be accounted for when setting the view to fit bounds. Useful if you -have some control overlays on the map like a sidebar and you don't want them -to obscure objects you're zooming to.
    paddingBottomRightPoint - [0, 0]The same for the bottom right corner of the map.
    paddingPoint - [0, 0]Equivalent of setting both top left and bottom right padding to the same value.
    maxZoomNumber - nullThe maximum possible zoom to use.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -

    Marker

    L.Marker is used to display clickable/draggable icons on the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.marker([50.5, 30.5]).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.marker(<LatLng> latlng, <Marker options> options?)Instantiates a Marker object given a geographical point and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconIcon - *Icon instance to use for rendering the marker. -See Icon documentation for details on how to customize the marker icon. -If not specified, a common instance of L.Icon.Default is used.
    draggableBoolean - falseWhether the marker is draggable with mouse/touch or not.
    autoPanBoolean - falseSet it to true if you want the map to do panning animation when marker hits the edges.
    autoPanPaddingPoint - Point(50, 50)Equivalent of setting both top left and bottom right autopan padding to the same value.
    autoPanSpeedNumber - 10Number of pixels the map should move by.
    keyboardBoolean - trueWhether the marker can be tabbed to with a keyboard and clicked by pressing enter.
    titleString - ''Text for the browser tooltip that appear on marker hover (no tooltip by default).
    altString - ''Text for the alt attribute of the icon image (useful for accessibility).
    zIndexOffsetNumber - 0By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
    opacityNumber - 1.0The opacity of the marker.
    riseOnHoverBoolean - falseIf true, the marker will get on top of others when you hover the mouse over it.
    riseOffsetNumber - 250The z-index offset used for the riseOnHover feature.
    paneString - 'markerPane'Map pane where the markers icon will be added.
    bubblingMouseEventsBoolean - falseWhen true, a mouse event on this marker will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - -
    In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:
    - - - - - - - - - - - - -
    EventDataDescription
    move - EventFired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    - -
    - -

    Dragging events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    dragstart - EventFired when the user starts dragging the marker.
    movestart - EventFired when the marker starts moving (because of dragging).
    drag - EventFired repeatedly while the user drags the marker.
    dragend - DragEndEventFired when the user stops dragging the marker.
    moveend - EventFired when the marker stops moving (because of dragging).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the marker (as a GeoJSON Point Feature).

    -
    getLatLng()LatLng

    Returns the current geographical position of the marker.

    -
    setLatLng(<LatLng> latlng)this

    Changes the marker position to the given point.

    -
    setZIndexOffset(<Number> offset)this

    Changes the zIndex offset of the marker.

    -
    setIcon(<Icon> icon)this

    Changes the marker icon.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the marker.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Interaction handlers

    - -
    Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see Handler methods). Example: -
    marker.dragging.disable();
    -
    - - - - - - - - - - - - -
    PropertyTypeDescription
    dragging - HandlerMarker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set marker.options.draggable).
    - -
    - - -

    Used to open popups in certain places of the map. Use Map.openPopup to -open popups while making sure that only one popup is open at one time -(recommended for usability), or use Map.addLayer to open as many as you want.

    - -
    - - -
    - - - - - -

    If you want to just bind a popup to marker click and then open it, it's really easy:

    -
    marker.bindPopup(popupContent).openPopup();
    -
    -

    Path overlays like polylines also have a bindPopup method. -Here's a more complicated way to open a popup on a map:

    -
    var popup = L.popup()
    -    .setLatLng(latlng)
    -    .setContent('<p>Hello world!<br />This is a nice popup.</p>')
    -    .openOn(map);
    -
    - - - -
    - - -
    - - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    - -
    - - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -

    Tooltip

    Used to display small texts on top of map layers.

    - -
    -

    Usage example

    - -
    - - - - - -
    marker.bindTooltip("my tooltip text").openTooltip();
    -
    -

    Note about tooltip offset. Leaflet takes two options in consideration -for computing tooltip offsetting:

    -
      -
    • the offset Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. -Add a positive x offset to move the tooltip to the right, and a positive y offset to -move it to the bottom. Negatives will move to the left and top.
    • -
    • the tooltipAnchor Icon option: this will only be considered for Marker. You -should adapt this value if you use a custom icon.
    • -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tooltip(<Tooltip options> options?, <Layer> source?)Instantiates a Tooltip object given an optional options object that describes its appearance and location and an optional source object that is used to tag the tooltip with a reference to the Layer to which it refers.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'tooltipPane'Map pane where the tooltip will be added.
    offsetPoint - Point(0, 0)Optional offset of the tooltip position.
    directionString - 'auto'Direction where to open the tooltip. Possible values are: right, left, -top, bottom, center, auto. -auto will dynamically switch between right and left according to the tooltip -position on the map.
    permanentBoolean - falseWhether to open the tooltip permanently or only on mouseover.
    stickyBoolean - falseIf true, the tooltip will follow the mouse instead of being fixed at the feature center.
    interactiveBoolean - falseIf true, the tooltip will listen to the feature events.
    opacityNumber - 0.9Tooltip container opacity.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    classNameString - ''A custom CSS class name to assign to the popup.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer

    Used to load and display tile layers on the map. Extends GridLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map);
    -
    - - - -
    - -

    URL template

    - - - -

    A string of the following form:

    -
    'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
    -

    {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates. {r} can be used to add "@2x" to the URL to load retina tiles. -You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

    -
    L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
    -
    - - -
    - - -
    -

    Creation

    - -
    - -

    Extension methods

    - - - - - - - - - - - - -
    FactoryDescription
    L.tilelayer(<String> urlTemplate, <TileLayer options> options?)Instantiates a tile layer object given a URL template and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber - 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber - 18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[] - 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString - ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber - 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean - falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean - falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean - falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|String - falseWhether the crossOrigin attribute will be added to the tiles. -If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. -Refer to CORS Settings for valid String values.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - (depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumber - undefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber - undefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true).

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending TileLayer might reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    getTileUrl(<Object> coords)String

    Called only internally, returns the URL for a tile given its coordinates. -Classes extending TileLayer can override this function to provide custom tile URL naming schemes.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer.WMS

    Used to display WMS services as tile layers on the map. Extends TileLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
    -    layers: 'nexrad-n0r-900913',
    -    format: 'image/png',
    -    transparent: true,
    -    attribution: "Weather data © 2012 IEM Nexrad"
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tileLayer.wms(<String> baseUrl, <TileLayer.WMS options> options)Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
    - -
    - - -
    -

    Options

    - -
    - - - -
    If any custom options not documented here are used, they will be sent to the -WMS server as extra parameters in each request URL. This can be useful for -non-standard vendor WMS parameters.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    layersString - ''(required) Comma-separated list of WMS layers to show.
    stylesString - ''Comma-separated list of WMS styles.
    formatString - 'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
    transparentBoolean - falseIf true, the WMS service will return images with transparency.
    versionString - '1.1.1'Version of the WMS service to use
    crsCRS - nullCoordinate Reference System to use for the WMS requests, defaults to -map CRS. Don't change this if you're not sure what it means.
    uppercaseBoolean - falseIf true, WMS request parameter keys will be uppercase.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber - 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber - 18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[] - 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString - ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber - 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean - falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean - falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean - falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|String - falseWhether the crossOrigin attribute will be added to the tiles. -If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. -Refer to CORS Settings for valid String values.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - (depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumber - undefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber - undefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setParams(<Object> params, <Boolean> noRedraw?)this

    Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true).

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    ImageOverlay

    Used to load and display a single image over specific bounds of the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
    -    imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
    -L.imageOverlay(imageUrl, imageBounds).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.imageOverlay(<String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options?)Instantiates an image overlay object given the URL of the image and the -geographical bounds it is tied to.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber - 1.0The opacity of the image overlay.
    altString - ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean - falseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|String - falseWhether the crossOrigin attribute will be added to the image. -If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. -Refer to CORS Settings for valid String values.
    errorOverlayUrlString - ''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    classNameString - ''A custom class name to assign to the image. Empty by default.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    load - EventFired when the ImageOverlay layer has loaded its image
    error - EventFired when the ImageOverlay layer has loaded its image
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers -Changes the zIndex of the image overlay.

    -
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    -
    getElement()HTMLElement

    Returns the instance of HTMLImageElement -used by this overlay.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    VideoOverlay

    Used to load and display a video player over specific bounds of the map. Extends ImageOverlay. -A video overlay uses the <video> -HTML5 element.

    - -
    -

    Usage example

    - -
    - - - - - -
    var videoUrl = 'https://www.mapbox.com/bites/00188/patricia_nasa.webm',
    -    videoBounds = [[ 32, -130], [ 13, -100]];
    -L.videoOverlay(videoUrl, videoBounds ).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.videoOverlay(<String|Array|HTMLVideoElement> video, <LatLngBounds> bounds, <VideoOverlay options> options?)Instantiates an image overlay object given the URL of the video (or array of URLs, or even a video element) and the -geographical bounds it is tied to.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    autoplayBoolean - trueWhether the video starts playing automatically when loaded.
    loopBoolean - trueWhether the video will loop back to the beginning when played.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber - 1.0The opacity of the image overlay.
    altString - ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean - falseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|String - falseWhether the crossOrigin attribute will be added to the image. -If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. -Refer to CORS Settings for valid String values.
    errorOverlayUrlString - ''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    classNameString - ''A custom class name to assign to the image. Empty by default.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    load - EventFired when the video has finished loading the first frame
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    error - EventFired when the ImageOverlay layer has loaded its image
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getElement()HTMLVideoElement

    Returns the instance of HTMLVideoElement -used by this overlay.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers -Changes the zIndex of the image overlay.

    -
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Path

    An abstract class that contains options and constants shared between vector -overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polyline

    A class for drawing polyline overlays on a map. Extends Path.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polyline from an array of LatLng points
    -var latlngs = [
    -    [45.51, -122.68],
    -    [37.77, -122.43],
    -    [34.04, -118.2]
    -];
    -var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
    -// zoom the map to the polyline
    -map.fitBounds(polyline.getBounds());
    -
    -

    You can also pass a multi-dimensional array to represent a MultiPolyline shape:

    -
    // create a red polyline from an array of arrays of LatLng points
    -var latlngs = [
    -    [[45.51, -122.68],
    -     [37.77, -122.43],
    -     [34.04, -118.2]],
    -    [[40.78, -73.91],
    -     [41.83, -87.62],
    -     [32.76, -96.72]]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polyline(<LatLng[]> latlngs, <Polyline options> options?)Instantiates a polyline object given an array of geographical points and -optionally an options object. You can create a Polyline object with -multiple separate lines (MultiPolyline) by passing an array of arrays -of geographic points.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

    -
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polygon

    A class for drawing polygon overlays on a map. Extends Polyline. -Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polygon from an array of LatLng points
    -var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
    -var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
    -// zoom the map to the polygon
    -map.fitBounds(polygon.getBounds());
    -
    -

    You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

    -
    var latlngs = [
    -  [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -  [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -];
    -
    -

    Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

    -
    var latlngs = [
    -  [ // first polygon
    -    [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -    [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -  ],
    -  [ // second polygon
    -    [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
    -  ]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polygon(<LatLng[]> latlngs, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Rectangle

    A class for drawing rectangle overlays on a map. Extends Polygon.

    - -
    -

    Usage example

    - -
    - - - - - -
    // define rectangle geographical bounds
    -var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
    -// create an orange rectangle
    -L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
    -// zoom the map to the rectangle bounds
    -map.fitBounds(bounds);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.rectangle(<LatLngBounds> latLngBounds, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setBounds(<LatLngBounds> latLngBounds)this

    Redraws the rectangle with the passed bounds.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Circle

    A class for drawing circle overlays on a map. Extends CircleMarker. -It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).

    - -
    -

    Usage example

    - -
    - - - - - -
    L.circle([50.5, 30.5], {radius: 200}).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.circle(<LatLng> latlng, <Circle options> options?)Instantiates a circle object given a geographical point, and an options object -which contains the circle radius.
    L.circle(<LatLng> latlng, <Number> radius, <Circle options> options?)Obsolete way of instantiating a circle, for compatibility with 0.7.x code. -Do not use in new applications or plugins.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumber - Radius of the circle, in meters.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setRadius(<Number> radius)this

    Sets the radius of a circle. Units are in meters.

    -
    getRadius()Number

    Returns the current radius of a circle. Units are in meters.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    CircleMarker

    A circle of a fixed size with radius specified in pixels. Extends Path.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.circleMarker(<LatLng> latlng, <CircleMarker options> options?)Instantiates a circle marker object given a geographical point, and an optional options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumber - 10Radius of the circle marker, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    setRadius(<Number> radius)this

    Sets the radius of a circle marker. Units are in pixels.

    -
    getRadius()Number

    Returns the current radius of the circle

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    SVG

    Allows vector layers to be displayed with SVG. -Inherits Renderer. -Due to technical limitations, SVG is not -available in all web browsers, notably Android 2.x and 3.x. -Although SVG is not available on IE7 and IE8, these browsers support -VML -(a now deprecated technology), and the SVG renderer will fall back to VML in -this case. -Although SVG is not available on IE7 and IE8, these browsers support VML, and the SVG renderer will fall back to VML in this case. -VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility -with old versions of Internet Explorer.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use SVG by default for all paths in the map:

    -
    var map = L.map('map', {
    -    renderer: L.svg()
    -});
    -
    -

    Use a SVG renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.svg({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.svg(<Renderer options> options?)Creates a SVG renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber - 0How much to extend click tolerance round a path/object on the map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - -
    There are several static functions which can be called without instantiating L.SVG:
    - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    create(<String> name)SVGElementReturns a instance of SVGElement, -corresponding to the class name passed. For example, using 'line' will return -an instance of SVGLineElement.
    pointsToPath(<Point[]> rings, <Boolean> closed)StringGenerates a SVG path string for multiple rings, with each ring turning -into "M..L..L.." instructions
    - -
    - - -

    Canvas

    Allows vector layers to be displayed with <canvas>. -Inherits Renderer. -Due to technical limitations, Canvas is not -available in all web browsers, notably IE8, and overlapping geometries might -not display properly in some edge cases.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use Canvas by default for all paths in the map:

    -
    var map = L.map('map', {
    -    renderer: L.canvas()
    -});
    -
    -

    Use a Canvas renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.canvas({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.canvas(<Renderer options> options?)Creates a Canvas renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber - 0How much to extend click tolerance round a path/object on the map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LayerGroup

    Used to group several layers and handle them as one. If you add it to the map, -any layers added or removed from the group will be added/removed on the map as -well. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.layerGroup([marker1, marker2])
    -    .addLayer(polyline)
    -    .addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.layerGroup(<Layer[]> layers?, <Object> options?)Create a layer group, optionally given an initial set of layers and an options object.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    FeatureGroup

    Extended LayerGroup that makes it easier to do the same thing to all its member layers:

    -
      -
    • bindPopup binds a popup to all of the layers at once (likewise with bindTooltip)
    • -
    • Events are propagated to the FeatureGroup, so if the group has an event -handler, it will handle events from any of the layers. This includes mouse events -and custom events.
    • -
    • Has layeradd and layerremove events
    • -
    - -
    -

    Usage example

    - -
    - - - - - -
    L.featureGroup([marker1, marker2, polyline])
    -    .bindPopup('Hello world!')
    -    .on('click', function() { alert('Clicked on a member of the group!'); })
    -    .addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.featureGroup(<Layer[]> layers)Create a feature group, optionally given an initial set of layers.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeradd - LayerEventFired when a layer is added to this FeatureGroup
    layerremove - LayerEventFired when a layer is removed from this FeatureGroup
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setStyle(<Path options> style)this

    Sets the given path options to each layer of the group that has a setStyle method.

    -
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    GeoJSON

    Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse -GeoJSON data and display it on the map. Extends FeatureGroup.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.geoJSON(data, {
    -    style: function (feature) {
    -        return {color: feature.properties.color};
    -    }
    -}).bindPopup(function (layer) {
    -    return layer.feature.properties.description;
    -}).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.geoJSON(<Object> geojson?, <GeoJSON options> options?)Creates a GeoJSON layer. Optionally accepts an object in -GeoJSON format to display on the map -(you can alternatively add it later with addData method) and an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    pointToLayerFunction - *A Function defining how GeoJSON points spawn Leaflet layers. It is internally -called when data is added, passing the GeoJSON point feature and its LatLng. -The default is to spawn a default Marker: -
    function(geoJsonPoint, latlng) {
    -    return L.marker(latlng);
    -}
    -
    styleFunction - *A Function defining the Path options for styling GeoJSON lines and polygons, -called internally when data is added. -The default value is to not override any defaults: -
    function (geoJsonFeature) {
    -    return {}
    -}
    -
    onEachFeatureFunction - *A Function that will be called once for each created Feature, after it has -been created and styled. Useful for attaching events and popups to features. -The default is to do nothing with the newly created layers: -
    function (feature, layer) {}
    -
    filterFunction - *A Function that will be used to decide whether to include a feature or not. -The default is to include all features: -
    function (geoJsonFeature) {
    -    return true;
    -}
    -
    -

    Note: dynamically changing the filter option will have effect only on newly -added data. It will not re-evaluate already included features.

    coordsToLatLngFunction - *A Function that will be used for converting GeoJSON coordinates to LatLngs. -The default is the coordsToLatLng static method.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeradd - LayerEventFired when a layer is added to this FeatureGroup
    layerremove - LayerEventFired when a layer is removed from this FeatureGroup
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addData(data)this

    Adds a GeoJSON object to the layer.

    -
    resetStyle(layer)this

    Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.

    -
    setStyle(style)this

    Changes styles of GeoJSON vector layers with the given style function.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON()Object

    Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - -
    There are several static functions which can be called without instantiating L.GeoJSON:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    geometryToLayer(<Object> featureData, <GeoJSON options> options?)LayerCreates a Layer from a given GeoJSON feature. Can use a custom -pointToLayer and/or coordsToLatLng -functions if provided as options.
    coordsToLatLng(<Array> coords)LatLngCreates a LatLng object from an array of 2 numbers (longitude, latitude) -or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
    coordsToLatLngs(<Array> coords, <Number> levelsDeep?, <Function> coordsToLatLng?)ArrayCreates a multidimensional array of LatLngs from a GeoJSON coordinates array. -levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). -Can use a custom coordsToLatLng function.
    latLngToCoords(<LatLng> latlng, <Number> precision?)ArrayReverse of coordsToLatLng
    latLngsToCoords(<Array> latlngs, <Number> levelsDeep?, <Boolean> closed?)ArrayReverse of coordsToLatLngs -closed determines whether the first point should be appended to the end of the array to close the feature, only used when levelsDeep is 0. False by default.
    asFeature(<Object> geojson)ObjectNormalize GeoJSON geometries/features into GeoJSON features.
    - -
    - - -

    GridLayer

    Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas. -GridLayer can be extended to create a tiled grid of HTML elements like <canvas>, <img> or <div>. GridLayer will handle creating and animating these DOM elements for you.

    - -
    -

    Usage example

    - -
    - -

    Synchronous usage

    - - - -

    To create a custom layer, extend GridLayer and implement the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords){
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -        // get a canvas context and draw something on it using coords.x, coords.y and coords.z
    -        var ctx = tile.getContext('2d');
    -        // return the tile so it can be rendered on screen
    -        return tile;
    -    }
    -});
    -
    - - - -
    - -

    Asynchronous usage

    - - - -

    Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the done() callback.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords, done){
    -        var error;
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -        // draw something asynchronously and pass the tile to the done() callback
    -        setTimeout(function() {
    -            done(error, tile);
    -        }, 1000);
    -        return tile;
    -    }
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
    - -
    - - -
    -

    Options

    - -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - (depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    minZoomNumber - 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber - undefinedThe maximum zoom level up to which this layer will be displayed (inclusive).
    maxNativeZoomNumber - undefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber - undefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending GridLayer shall reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, must be overridden by classes extending GridLayer. -Returns the HTMLElement corresponding to the given coords. If the done callback -is specified, it must be called when the tile has finished loading and drawing.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LatLng

    Represents a geographical point with a certain latitude and longitude.

    - -
    -

    Usage example

    - -
    - - - - - -
    var latlng = L.latLng(50.5, 30.5);
    -

    All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

    -
    map.panTo([50, 30]);
    -map.panTo({lon: 30, lat: 50});
    -map.panTo({lat: 50, lng: 30});
    -map.panTo(L.latLng(50, 30));
    -

    Note that LatLng does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLng(<Number> latitude, <Number> longitude, <Number> altitude?)Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
    L.latLng(<Array> coords)Expects an array of the form [Number, Number] or [Number, Number, Number] instead.
    L.latLng(<Object> coords)Expects an plain object of the form {lat: Number, lng: Number} or {lat: Number, lng: Number, alt: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    equals(<LatLng> otherLatLng, <Number> maxMargin?)Boolean

    Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

    -
    toString()String

    Returns a string representation of the point (for debugging purposes).

    -
    distanceTo(<LatLng> otherLatLng)Number

    Returns the distance (in meters) to the given LatLng calculated using the Spherical Law of Cosines.

    -
    wrap()LatLng

    Returns a new LatLng object with the longitude wrapped so it's always between -180 and +180 degrees.

    -
    toBounds(<Number> sizeInMeters)LatLngBounds

    Returns a new LatLngBounds object in which each boundary is sizeInMeters/2 meters apart from the LatLng.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    lat - NumberLatitude in degrees
    lng - NumberLongitude in degrees
    alt - NumberAltitude in meters (optional)
    - -
    - - -

    LatLngBounds

    Represents a rectangular geographical area on a map.

    - -
    -

    Usage example

    - -
    - - - - - -
    var corner1 = L.latLng(40.712, -74.227),
    -corner2 = L.latLng(40.774, -74.125),
    -bounds = L.latLngBounds(corner1, corner2);
    -
    -

    All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    map.fitBounds([
    -    [40.712, -74.227],
    -    [40.774, -74.125]
    -]);
    -
    -

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range. -Note that LatLngBounds does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLngBounds(<LatLng> corner1, <LatLng> corner2)Creates a LatLngBounds object by defining two diagonally opposite corners of the rectangle.
    L.latLngBounds(<LatLng[]> latlngs)Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<LatLng> latlng)this

    Extend the bounds to contain the given point

    -
    extend(<LatLngBounds> otherBounds)this

    Extend the bounds to contain the given bounds

    -
    pad(<Number> bufferRatio)LatLngBounds

    Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. -For example, a ratio of 0.5 extends the bounds by 50% in each direction. -Negative values will retract the bounds.

    -
    getCenter()LatLng

    Returns the center point of the bounds.

    -
    getSouthWest()LatLng

    Returns the south-west point of the bounds.

    -
    getNorthEast()LatLng

    Returns the north-east point of the bounds.

    -
    getNorthWest()LatLng

    Returns the north-west point of the bounds.

    -
    getSouthEast()LatLng

    Returns the south-east point of the bounds.

    -
    getWest()Number

    Returns the west longitude of the bounds

    -
    getSouth()Number

    Returns the south latitude of the bounds

    -
    getEast()Number

    Returns the east longitude of the bounds

    -
    getNorth()Number

    Returns the north latitude of the bounds

    -
    contains(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<LatLng> latlng)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.

    -
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.

    -
    toBBoxString()String

    Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.

    -
    equals(<LatLngBounds> otherBounds, <Number> maxMargin?)Boolean

    Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting maxMargin to a small number.

    -
    isValid()Boolean

    Returns true if the bounds are properly initialized.

    -
    - -
    - - -

    Point

    Represents a point with x and y coordinates in pixels.

    - -
    -

    Usage example

    - -
    - - - - - -
    var point = L.point(200, 300);
    -
    -

    All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

    -
    map.panBy([200, 300]);
    -map.panBy(L.point(200, 300));
    -
    -

    Note that Point does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.point(<Number> x, <Number> y, <Boolean> round?)Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
    L.point(<Number[]> coords)Expects an array of the form [x, y] instead.
    L.point(<Object> coords)Expects a plain object of the form {x: Number, y: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    clone()Point

    Returns a copy of the current point.

    -
    add(<Point> otherPoint)Point

    Returns the result of addition of the current and the given points.

    -
    subtract(<Point> otherPoint)Point

    Returns the result of subtraction of the given point from the current.

    -
    divideBy(<Number> num)Point

    Returns the result of division of the current point by the given number.

    -
    multiplyBy(<Number> num)Point

    Returns the result of multiplication of the current point by the given number.

    -
    scaleBy(<Point> scale)Point

    Multiply each coordinate of the current point by each coordinate of -scale. In linear algebra terms, multiply the point by the -scaling matrix -defined by scale.

    -
    unscaleBy(<Point> scale)Point

    Inverse of scaleBy. Divide each coordinate of the current point by -each coordinate of scale.

    -
    round()Point

    Returns a copy of the current point with rounded coordinates.

    -
    floor()Point

    Returns a copy of the current point with floored coordinates (rounded down).

    -
    ceil()Point

    Returns a copy of the current point with ceiled coordinates (rounded up).

    -
    trunc()Point

    Returns a copy of the current point with truncated coordinates (rounded towards zero).

    -
    distanceTo(<Point> otherPoint)Number

    Returns the cartesian distance between the current and the given points.

    -
    equals(<Point> otherPoint)Boolean

    Returns true if the given point has the same coordinates.

    -
    contains(<Point> otherPoint)Boolean

    Returns true if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).

    -
    toString()String

    Returns a string representation of the point for debugging purposes.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    x - NumberThe x coordinate of the point
    y - NumberThe y coordinate of the point
    - -
    - - -

    Bounds

    Represents a rectangular area in pixel coordinates.

    - -
    -

    Usage example

    - -
    - - - - - -
    var p1 = L.point(10, 10),
    -p2 = L.point(40, 60),
    -bounds = L.bounds(p1, p2);
    -
    -

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    otherBounds.intersects([[10, 10], [40, 60]]);
    -
    -

    Note that Bounds does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.bounds(<Point> corner1, <Point> corner2)Creates a Bounds object from two corners coordinate pairs.
    L.bounds(<Point[]> points)Creates a Bounds object from the given array of points.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<Point> point)this

    Extends the bounds to contain the given point.

    -
    getCenter(<Boolean> round?)Point

    Returns the center point of the bounds.

    -
    getBottomLeft()Point

    Returns the bottom-left point of the bounds.

    -
    getTopRight()Point

    Returns the top-right point of the bounds.

    -
    getTopLeft()Point

    Returns the top-left point of the bounds (i.e. this.min).

    -
    getBottomRight()Point

    Returns the bottom-right point of the bounds (i.e. this.max).

    -
    getSize()Point

    Returns the size of the given bounds

    -
    contains(<Bounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<Point> point)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<Bounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds -intersect if they have at least one point in common.

    -
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds -overlap if their intersection is an area.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    min - PointThe top left corner of the rectangle.
    max - PointThe bottom right corner of the rectangle.
    - -
    - - -

    Icon

    Represents an icon to provide when creating a marker.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.icon({
    -    iconUrl: 'my-icon.png',
    -    iconSize: [38, 95],
    -    iconAnchor: [22, 94],
    -    popupAnchor: [-3, -76],
    -    shadowUrl: 'my-icon-shadow.png',
    -    shadowSize: [68, 95],
    -    shadowAnchor: [22, 94]
    -});
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.icon(<Icon options> options)Creates an icon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlString - null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString - nullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePoint - nullSize of the icon image in pixels.
    iconAnchorPoint - nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint - [0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint - [0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlString - nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString - null
    shadowSizePoint - nullSize of the shadow image in pixels.
    shadowAnchorPoint - nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString - ''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    - - -
    - -
    -

    Icon.Default

    - -
    - - - -
    A trivial subclass of Icon, represents the icon to use in Markers when -no icon is specified. Points to the blue marker image distributed with Leaflet -releases. -In order to customize the default icon, just change the properties of L.Icon.Default.prototype.options -(which is a set of Icon options). -If you want to completely replace the default icon, override the -L.Marker.prototype.options.icon with your own icon instead.
    - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    imagePathString - Icon.Default will try to auto-detect the location of the -blue icon images. If you are placing these images in a non-standard -way, set this option to point to the right path.
    - -
    - - -

    DivIcon

    Represents a lightweight icon for markers that uses a simple <div> -element instead of an image. Inherits from Icon but ignores the iconUrl and shadow options.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.divIcon({className: 'my-div-icon'});
    -// you can set .my-div-icon styles in CSS
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.divIcon(<DivIcon options> options)Creates a DivIcon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    htmlString - ''Custom HTML code to put inside the div element, empty by default.
    bgPosPoint - [0, 0]Optional relative position of the background, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlString - null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString - nullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePoint - nullSize of the icon image in pixels.
    iconAnchorPoint - nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint - [0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint - [0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlString - nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString - null
    shadowSizePoint - nullSize of the shadow image in pixels.
    shadowAnchorPoint - nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString - ''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    -
    -
    - -

    Control.Zoom

    A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.zoom(<Control.Zoom options> options)Creates a zoom control
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    zoomInTextString - '+'The text set on the 'zoom in' button.
    zoomInTitleString - 'Zoom in'The title set on the 'zoom in' button.
    zoomOutTextString - '&#x2212' -The text set on the 'zoom out' button.
    zoomOutTitleString - 'Zoom out'The title set on the 'zoom out' button.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Attribution

    The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with the getAttribution method automatically. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.attribution(<Control.Attribution options> options)Creates an attribution control.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    prefixString - 'Leaflet'The HTML text shown before the attributions. Pass false to disable.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setPrefix(<String> prefix)this

    Sets the text before the attributions.

    -
    addAttribution(<String> text)this

    Adds an attribution text (e.g. 'Vector data &copy; Mapbox').

    -
    removeAttribution(<String> text)this

    Removes an attribution text.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Layers

    The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    var baseLayers = {
    -    "Mapbox": mapbox,
    -    "OpenStreetMap": osm
    -};
    -var overlays = {
    -    "Marker": marker,
    -    "Roads": roadsLayer
    -};
    -L.control.layers(baseLayers, overlays).addTo(map);
    -
    -

    The baseLayers and overlays parameters are object literals with layer names as keys and Layer objects as values:

    -
    {
    -    "<someName1>": layer1,
    -    "<someName2>": layer2
    -}
    -
    -

    The layer names can contain HTML, which allows you to add additional styling to the items:

    -
    {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.layers(<Object> baselayers?, <Object> overlays?, <Control.Layers options> options?)Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    collapsedBoolean - trueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
    autoZIndexBoolean - trueIf true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
    hideSingleBaseBoolean - falseIf true, the base layers in the control will be hidden when there is only one.
    sortLayersBoolean - falseWhether to sort the layers. When false, layers will keep the order -in which they were added to the control.
    sortFunctionFunction - *A compare function -that will be used for sorting the layers, when sortLayers is true. -The function receives both the L.Layer instances and their names, as in -sortFunction(layerA, layerB, nameA, nameB). -By default, it sorts layers alphabetically by their name.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addBaseLayer(<Layer> layer, <String> name)this

    Adds a base layer (radio button entry) with the given name to the control.

    -
    addOverlay(<Layer> layer, <String> name)this

    Adds an overlay (checkbox entry) with the given name to the control.

    -
    removeLayer(<Layer> layer)this

    Remove the given layer from the control.

    -
    expand()this

    Expand the control container if collapsed.

    -
    collapse()this

    Collapse the control container if expanded.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Scale

    A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.control.scale().addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.scale(<Control.Scale options> options?)Creates an scale control with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    maxWidthNumber - 100Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
    metricBoolean - TrueWhether to show the metric scale line (m/km).
    imperialBoolean - TrueWhether to show the imperial scale line (mi/ft).
    updateWhenIdleBoolean - falseIf true, the control is updated on moveend, otherwise it's always up-to-date (updated on move).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Browser

    A namespace with static properties for browser/feature detection used by Leaflet internally.

    - -
    -

    Usage example

    - -
    - - - - - -
    if (L.Browser.ielt9) {
    -  alert('Upgrade your browser, dude!');
    -}
    -
    - - - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    ie - Booleantrue for all Internet Explorer versions (not Edge).
    ielt9 - Booleantrue for Internet Explorer versions less than 9.
    edge - Booleantrue for the Edge web browser.
    webkit - Booleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
    android - Booleantrue for any browser running on an Android platform.
    android23 - Booleantrue for browsers running on Android 2 or Android 3.
    androidStock - Booleantrue for the Android stock browser (i.e. not Chrome)
    opera - Booleantrue for the Opera browser
    chrome - Booleantrue for the Chrome browser.
    gecko - Booleantrue for gecko-based browsers like Firefox.
    safari - Booleantrue for the Safari browser.
    opera12 - Booleantrue for the Opera browser supporting CSS transforms (version 12 or later).
    win - Booleantrue when the browser is running in a Windows platform
    ie3d - Booleantrue for all Internet Explorer versions supporting CSS transforms.
    webkit3d - Booleantrue for webkit-based browsers supporting CSS transforms.
    gecko3d - Booleantrue for gecko-based browsers supporting CSS transforms.
    any3d - Booleantrue for all browsers supporting CSS transforms.
    mobile - Booleantrue for all browsers running in a mobile device.
    mobileWebkit - Booleantrue for all webkit-based browsers in a mobile device.
    mobileWebkit3d - Booleantrue for all webkit-based browsers in a mobile device supporting CSS transforms.
    msPointer - Booleantrue for browsers implementing the Microsoft touch events model (notably IE10).
    pointer - Booleantrue for all browsers supporting pointer events.
    touch - Booleantrue for all browsers supporting touch events. -This does not necessarily mean that the browser is running in a computer with -a touchscreen, it only means that the browser is capable of understanding -touch events.
    mobileOpera - Booleantrue for the Opera browser in a mobile device.
    mobileGecko - Booleantrue for gecko-based browsers running in a mobile device.
    retina - Booleantrue for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%.
    canvas - Booleantrue when the browser supports <canvas>.
    svg - Booleantrue when the browser supports SVG.
    vml - Booleantrue if the browser supports VML.
    - -
    - - -

    Util

    Various utility functions, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> dest, <Object> src?)ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
    create(<Object> proto, <Object> properties?)ObjectCompatibility polyfill for Object.create
    bind(<Function> fn, )FunctionReturns a new function bound to the arguments passed, like Function.prototype.bind. -Has a L.bind() shortcut.
    stamp(<Object> obj)NumberReturns the unique ID of an object, assigning it one if it doesn't have it.
    throttle(<Function> fn, <Number> time, <Object> context)FunctionReturns a function which executes function fn with the given scope context -(so that the this keyword refers to context inside fn's code). The function -fn will be called no more than one time per given amount of time. The arguments -received by the bound function will be any arguments passed when binding the -function, followed by any arguments passed when invoking the bound function. -Has an L.throttle shortcut.
    wrapNum(<Number> num, <Number[]> range, <Boolean> includeMax?)NumberReturns the number num modulo range in such a way so it lies within -range[0] and range[1]. The returned value will be always smaller than -range[1] unless includeMax is set to true.
    falseFn()FunctionReturns a function which always returns false.
    formatNum(<Number> num, <Number> digits?)NumberReturns the number num rounded to digits decimals, or to 6 decimals by default.
    trim(<String> str)StringCompatibility polyfill for String.prototype.trim
    splitWords(<String> str)String[]Trims and splits the string on whitespace and returns the array of parts.
    setOptions(<Object> obj, <Object> options)ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.
    getParamString(<Object> obj, <String> existingUrl?, <Boolean> uppercase?)StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} -translates to '?a=foo&b=bar'. If existingUrl is set, the parameters will -be appended at the end. If uppercase is true, the parameter names will -be uppercased (e.g. '?A=foo&B=bar')
    template(<String> str, <Object> data)StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' -and a data object like {a: 'foo', b: 'bar'}, returns evaluated string -('Hello foo, bar'). You can also specify functions instead of strings for -data values — they will be evaluated passing data as an argument.
    isArray(obj)BooleanCompatibility polyfill for Array.isArray
    indexOf(<Array> array, <Object> el)NumberCompatibility polyfill for Array.prototype.indexOf
    requestAnimFrame(<Function> fn, <Object> context?, <Boolean> immediate?)NumberSchedules fn to be executed when the browser repaints. fn is bound to -context if given. When immediate is set, fn is called immediately if -the browser doesn't have native support for -window.requestAnimationFrame, -otherwise it's delayed. Returns a request ID that can be used to cancel the request.
    cancelAnimFrame(<Number> id)undefinedCancels a previous requestAnimFrame. See also window.cancelAnimationFrame.
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    lastId - NumberLast unique ID used by stamp()
    emptyImageUrl - StringData URI string containing a base64-encoded empty GIF image. -Used as a hack to free memory from unused images on WebKit-powered -mobile devices (by setting image src to this string).
    - -
    - - -

    Transformation

    Represents an affine transformation: a set of coefficients a, b, c, d -for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing -the reverse. Used by Leaflet in its projections code.

    - -
    -

    Usage example

    - -
    - - - - - -
    var transformation = L.transformation(2, 5, -1, 10),
    -    p = L.point(1, 2),
    -    p2 = transformation.transform(p), //  L.point(7, 8)
    -    p3 = transformation.untransform(p2); //  L.point(1, 2)
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.transformation(<Number> a, <Number> b, <Number> c, <Number> d)Instantiates a Transformation object with the given coefficients.
    L.transformation(<Array> coefficients)Expects an coefficients array of the form -[a: Number, b: Number, c: Number, d: Number].
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    transform(<Point> point, <Number> scale?)Point

    Returns a transformed point, optionally multiplied by the given scale. -Only accepts actual L.Point instances, not arrays.

    -
    untransform(<Point> point, <Number> scale?)Point

    Returns the reverse transformation of the given point, optionally divided -by the given scale. Only accepts actual L.Point instances, not arrays.

    -
    - -
    - - -

    LineUtil

    Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    simplify(<Point[]> points, <Number> tolerance)Point[]Dramatically reduces the number of points in a polyline while retaining -its shape and returns a new array of simplified points, using the -Douglas-Peucker algorithm. -Used for a huge performance boost when processing/displaying Leaflet polylines for -each zoom level and also reducing visual noise. tolerance affects the amount of -simplification (lesser value means higher quality but slower and with more points). -Also released as a separated micro-library Simplify.js.
    pointToSegmentDistance(<Point> p, <Point> p1, <Point> p2)NumberReturns the distance between point p and segment p1 to p2.
    closestPointOnSegment(<Point> p, <Point> p1, <Point> p2)NumberReturns the closest point from a point p on a segment p1 to p2.
    clipSegment(<Point> a, <Point> b, <Bounds> bounds, <Boolean> useLastCode?, <Boolean> round?)Point[]|BooleanClips the segment a to b by rectangular bounds with the -Cohen-Sutherland algorithm -(modifying the segment points directly!). Used by Leaflet to only show polyline -points that are on the screen or near, increasing performance.
    isFlat(<LatLng[]> latlngs)BooleanReturns true if latlngs is a flat array, false is nested.
    - -
    - - -

    PolyUtil

    Various utility functions for polygon geometries.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    clipPolygon(<Point[]> points, <Bounds> bounds, <Boolean> round?)Point[]Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgman algorithm). -Used by Leaflet to only show polygon points that are on the screen or near, increasing -performance. Note that polygon points needs different algorithm for clipping -than polyline, so there's a separate method for it.
    - -
    - - -

    DomEvent

    Utility functions to work with the DOM events, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    on(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisAdds a listener function (fn) to a particular DOM event type of the -element el. You can optionally specify the context of the listener -(object the this keyword will point to). You can also pass several -space-separated types (e.g. 'click dblclick').
    on(<HTMLElement> el, <Object> eventMap, <Object> context?)thisAdds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    off(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisRemoves a previously added listener function. -Note that if you passed a custom context to on, you must pass the same -context to off in order to remove the listener.
    off(<HTMLElement> el, <Object> eventMap, <Object> context?)thisRemoves a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    stopPropagation(<DOMEvent> ev)thisStop the given event from propagation to parent elements. Used inside the listener functions: -
    L.DomEvent.on(div, 'click', function (ev) {
    -    L.DomEvent.stopPropagation(ev);
    -});
    -
    disableScrollPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'mousewheel' events (plus browser variants).
    disableClickPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'click', 'doubleclick', -'mousedown' and 'touchstart' events (plus browser variants).
    preventDefault(<DOMEvent> ev)thisPrevents the default action of the DOM Event ev from happening (such as -following a link in the href of the a element, or doing a POST request -with page reload when a <form> is submitted). -Use it inside listener functions.
    stop(<DOMEvent> ev)thisDoes stopPropagation and preventDefault at the same time.
    getMousePosition(<DOMEvent> ev, <HTMLElement> container?)PointGets normalized mouse position from a DOM event relative to the -container (border excluded) or to the whole page if not specified.
    getWheelDelta(<DOMEvent> ev)NumberGets normalized wheel delta from a mousewheel DOM event, in vertical -pixels scrolled (negative if scrolling down). -Events from pointing devices without precise scrolling are mapped to -a best guess of 60 pixels.
    addListener()thisAlias to L.DomEvent.on
    removeListener()thisAlias to L.DomEvent.off
    - -
    - - -

    DomUtil

    Utility functions to work with the DOM -tree, used by Leaflet internally. -Most functions expecting or returning a HTMLElement also work for -SVG elements. The only difference is that classes refer to CSS classes -in HTML and SVG classes in SVG.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    get(<String|HTMLElement> id)HTMLElementReturns an element given its DOM id, or returns the element itself -if it was passed directly.
    getStyle(<HTMLElement> el, <String> styleAttrib)StringReturns the value for a certain style attribute on an element, -including computed values or values set through CSS.
    create(<String> tagName, <String> className?, <HTMLElement> container?)HTMLElementCreates an HTML element with tagName, sets its class to className, and optionally appends it to container element.
    remove(<HTMLElement> el)Removes el from its parent element
    empty(<HTMLElement> el)Removes all of el's children elements from el
    toFront(<HTMLElement> el)Makes el the last child of its parent, so it renders in front of the other children.
    toBack(<HTMLElement> el)Makes el the first child of its parent, so it renders behind the other children.
    hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element's class attribute contains name.
    addClass(<HTMLElement> el, <String> name)Adds name to the element's class attribute.
    removeClass(<HTMLElement> el, <String> name)Removes name from the element's class attribute.
    setClass(<HTMLElement> el, <String> name)Sets the element's class.
    getClass(<HTMLElement> el)StringReturns the element's class.
    setOpacity(<HTMLElement> el, <Number> opacity)Set the opacity of an element (including old IE support). -opacity must be a number from 0 to 1.
    testProp(<String[]> props)String|falseGoes through the array of style names and returns the first name -that is a valid style name for an element. If no such name is found, -it returns false. Useful for vendor-prefixed styles like transform.
    setTransform(<HTMLElement> el, <Point> offset, <Number> scale?)Resets the 3D CSS transform of el so it is translated by offset pixels -and optionally scaled by scale. Does not have an effect if the -browser doesn't support 3D CSS transforms.
    setPosition(<HTMLElement> el, <Point> position)Sets the position of el to coordinates specified by position, -using CSS translate or top/left positioning depending on the browser -(used by Leaflet internally to position its layers).
    getPosition(<HTMLElement> el)PointReturns the coordinates of an element previously positioned with setPosition.
    disableTextSelection()Prevents the user from generating selectstart DOM events, usually generated -when the user drags the mouse through a page with text. Used internally -by Leaflet to override the behaviour of any click-and-drag interaction on -the map. Affects drag interactions on the whole document.
    enableTextSelection()Cancels the effects of a previous L.DomUtil.disableTextSelection.
    disableImageDrag()As L.DomUtil.disableTextSelection, but -for dragstart DOM events, usually generated when the user drags an image.
    enableImageDrag()Cancels the effects of a previous L.DomUtil.disableImageDrag.
    preventOutline(<HTMLElement> el)Makes the outline -of the element el invisible. Used internally by Leaflet to prevent -focusable elements from displaying an outline when the user performs a -drag interaction on them.
    restoreOutline()Cancels the effects of a previous L.DomUtil.preventOutline.
    getSizedParentNode(<HTMLElement> el)HTMLElementFinds the closest parent node which size (width and height) is not null.
    getScale(<HTMLElement> el)ObjectComputes the CSS scale currently applied on the element. -Returns an object with x and y members as horizontal and vertical scales respectively, -and boundingClientRect as the result of getBoundingClientRect().
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    TRANSFORM - StringVendor-prefixed transform style name (e.g. 'webkitTransform' for WebKit).
    TRANSITION - StringVendor-prefixed transition style name.
    TRANSITION_END - StringVendor-prefixed transitionend event name.
    - -
    - - -

    PosAnimation

    Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

    - -
    -

    Usage example

    - -
    - - - - - -
    var fx = new L.PosAnimation();
    -fx.run(el, [300, 500], 0.5);
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.PosAnimation()Creates a PosAnimation object.
    - - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    start - EventFired when the animation starts
    step - EventFired continuously during the animation.
    end - EventFired when the animation ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    run(<HTMLElement> el, <Point> newPos, <Number> duration?, <Number> easeLinearity?)

    Run an animation of a given element to a new position, optionally setting -duration in seconds (0.25 by default) and easing linearity factor (3rd -argument of the cubic bezier curve, -0.5 by default).

    -
    stop()

    Stops the animation (if currently running).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Draggable

    A class for making DOM elements draggable (including touch support). -Used internally for map and marker dragging. Only works for elements -that were positioned with L.DomUtil.setPosition.

    - -
    -

    Usage example

    - -
    - - - - - -
    var draggable = new L.Draggable(elementToDrag);
    -draggable.enable();
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.Draggable(<HTMLElement> el, <HTMLElement> dragHandle?, <Boolean> preventOutline?, <Draggable options> options?)Creates a Draggable object for moving el when you start dragging the dragHandle element (equals el itself by default).
    - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    clickToleranceNumber - 3The max number of pixels a user can shift the mouse pointer during a click -for it to be considered a valid click (as opposed to a mouse drag).
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    down - EventFired when a drag is about to start.
    dragstart - EventFired when a drag starts
    predrag - EventFired continuously during dragging before each corresponding -update of the element's position.
    drag - EventFired continuously during dragging.
    dragend - DragEndEventFired when the drag ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()

    Enables the dragging ability

    -
    disable()

    Disables the dragging ability

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Class

    L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here. -In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

    - -
    -

    Usage example

    - -
    - - - - - -
    var MyClass = L.Class.extend({
    -initialize: function (greeter) {
    -    this.greeter = greeter;
    -    // class constructor
    -},
    -greet: function (name) {
    -    alert(this.greeter + ', ' + name)
    -    }
    -});
    -// create instance of MyClass, passing "Hello" to the constructor
    -var a = new MyClass("Hello");
    -// call greet method, alerting "Hello, World"
    -a.greet("World");
    -
    - - - -
    - -

    Class Factories

    - - - -

    You may have noticed that Leaflet objects are created without using -the new keyword. This is achieved by complementing each class with a -lowercase factory method:

    -
    new L.Map('map'); // becomes:
    -L.map('map');
    -
    -

    The factories are implemented very easily, and you can do this for your own classes:

    -
    L.map = function (id, options) {
    -    return new L.Map(id, options);
    -};
    -
    - - - -
    - -

    Inheritance

    - - - -

    You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

    -
    var MyChildClass = MyClass.extend({
    -    // ... new properties and methods
    -});
    -
    -

    This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

    -
    var a = new MyChildClass();
    -a instanceof MyChildClass; // true
    -a instanceof MyClass; // true
    -
    -

    You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

    -
    var MyChildClass = MyClass.extend({
    -    initialize: function () {
    -        MyClass.prototype.initialize.call(this, "Yo");
    -    },
    -    greet: function (name) {
    -        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
    -    }
    -});
    -var a = new MyChildClass();
    -a.greet('Jason'); // alerts "Yo, bro Jason!"
    -
    - - -
    - -

    Options

    - - - -

    options is a special property that unlike other objects that you pass -to extend will be merged with the parent one instead of overriding it -completely, which makes managing configuration of objects and default -values convenient:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        myOption1: 'foo',
    -        myOption2: 'bar'
    -    }
    -});
    -var MyChildClass = MyClass.extend({
    -    options: {
    -        myOption1: 'baz',
    -        myOption3: 5
    -    }
    -});
    -var a = new MyChildClass();
    -a.options.myOption1; // 'baz'
    -a.options.myOption2; // 'bar'
    -a.options.myOption3; // 5
    -
    -

    There's also L.Util.setOptions, a method for -conveniently merging options passed to constructor with the defaults -defines in the class:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        foo: 'bar',
    -        bla: 5
    -    },
    -    initialize: function (options) {
    -        L.Util.setOptions(this, options);
    -        ...
    -    }
    -});
    -var a = new MyClass({bla: 10});
    -a.options; // {foo: 'bar', bla: 10}
    -
    -

    Note that the options object allows any keys, not just -the options defined by the class and its base classes. -This means you can use the options object to store -application specific information, as long as you avoid -keys that are already used by the class in question.

    - - - -
    - -

    Includes

    - - - -

    includes is a special class property that merges all specified objects into the class (such objects are called mixins).

    -
     var MyMixin = {
    -    foo: function () { ... },
    -    bar: 5
    -};
    -var MyClass = L.Class.extend({
    -    includes: MyMixin
    -});
    -var a = new MyClass();
    -a.foo();
    -
    -

    You can also do such includes in runtime with the include method:

    -
    MyClass.include(MyMixin);
    -
    -

    statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

    -
    var MyClass = L.Class.extend({
    -    statics: {
    -        FOO: 'bar',
    -        BLA: 5
    -    }
    -});
    -MyClass.FOO; // 'bar'
    -
    - - - -
    - -

    Constructor hooks

    - - - -

    If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

    -
    MyClass.addInitHook(function () {
    -    // ... do something in constructor additionally
    -    // e.g. add event listeners, set custom properties etc.
    -});
    -
    -

    You can also use the following shortcut when you just need to make one additional method call:

    -
    MyClass.addInitHook('methodName', arg1, arg2, …);
    -
    - - - -
    - - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> props)FunctionExtends the current class given the properties to be included. -Returns a Javascript function that is a class constructor (to be called with new).
    include(<Object> properties)thisIncludes a mixin into the current class.
    mergeOptions(<Object> options)thisMerges options into the defaults of the class.
    addInitHook(<Function> fn)thisAdds a constructor hook to the class.
    - -
    - - -

    Evented

    A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

    - -
    -

    Usage example

    - -
    - - - - - -
    map.on('click', function(e) {
    -    alert(e.latlng);
    -} );
    -
    -

    Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

    -
    function onClick(e) { ... }
    -map.on('click', onClick);
    -map.off('click', onClick);
    -
    - - - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    - - -

    Layer

    A set of methods from the Layer base class that all Leaflet layers use. -Inherits all methods, options and events from L.Evented.

    - -
    -

    Usage example

    - -
    - - - - - -
    var layer = L.Marker(latlng).addTo(map);
    -layer.addTo(map);
    -layer.remove();
    -
    - - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Layer will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    - -

    Extension methods

    - -
    Every layer should extend from L.Layer and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)this

    Should contain code that creates DOM elements for the layer, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).

    -
    onRemove(<Map> map)this

    Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).

    -
    getEvents()Object

    This optional method should return an object like { viewreset: this._reset } for addEventListener. The event handlers in this object will be automatically added and removed from the map with your layer.

    -
    getAttribution()String

    This optional method should return a string containing HTML to be shown on the Attribution control whenever the layer is visible.

    -
    beforeAdd(<Map> map)this

    Optional method. Called on map.addLayer(layer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.

    -
    - -
    - -

    Popup methods

    - -
    All layers share a set of methods convenient for binding popups to it. -
    var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
    -layer.openPopup();
    -layer.closePopup();
    -
    -

    Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    - -

    Tooltip methods

    - -
    All layers share a set of methods convenient for binding tooltips to it. -
    var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
    -layer.openTooltip();
    -layer.closeTooltip();
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Interactive layer

    Some Layers can be made interactive - when the user interacts -with such a layer, mouse events like click and mouseover can be handled. -Use the event handling methods to handle these events.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - -

    Mouse events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Control

    L.Control is a base class for implementing map controls. Handles positioning. -All other controls extend from this class.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Control will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    - -

    Extension methods

    - -
    Every control should extend from L.Control and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)HTMLElement

    Should return the container DOM element for the control and add listeners on relevant map events. Called on control.addTo(map).

    -
    onRemove(<Map> map)

    Optional method. Should contain all clean up code that removes the listeners previously added in onAdd. Called on control.remove().

    -
    - -
    - - -

    Handler

    Abstract class for map interaction handlers

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()this

    Enables the handler

    -
    disable()this

    Disables the handler

    -
    enabled()Boolean

    Returns true if the handler is enabled

    -
    - -
    - -

    Extension methods

    - -
    Classes inheriting from Handler must implement the two following methods:
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHooks()

    Called when the handler is enabled, should add event hooks.

    -
    removeHooks()

    Called when the handler is disabled, should remove the event hooks added previously.

    -
    - -
    - - -
    -

    Functions

    - -
    - -

    There is static function which can be called without instantiating L.Handler:

    - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    addTo(<Map> map, <String> name)thisAdds a new Handler to the given map with the given name.
    - -
    - - -

    Projection

    An object with methods for projecting geographical coordinates of the world onto -a flat surface (and back). See Map projection.

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    project(<LatLng> latlng)Point

    Projects geographical coordinates into a 2D point. -Only accepts actual L.LatLng instances, not arrays.

    -
    unproject(<Point> point)LatLng

    The inverse of project. Projects a 2D point into a geographical location. -Only accepts actual L.Point instances, not arrays. -Note that the projection instances do not inherit from Leaflet's Class object, -and can't be instantiated. Also, new classes can't inherit from them, -and methods can't be added to them with the include function.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    bounds - BoundsThe bounds (specified in CRS units) where the projection is valid
    - -
    - - -
    -

    Defined projections

    - -
    - - - -
    Leaflet comes with a set of already defined Projections out of the box:
    - - - - - - - - - - - - - - - - - - - -
    ProjectionDescription
    L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, -mostly used by GIS enthusiasts. Directly maps x as longitude, and y as -latitude. Also suitable for flat worlds, e.g. game maps. Used by the -EPSG:4326 and Simple CRS.
    L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.
    L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, -used by almost all free and commercial tile providers. Assumes that Earth is -a sphere. Used by the EPSG:3857 CRS.
    - -
    - - -

    CRS

    -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    latLngToPoint(<LatLng> latlng, <Number> zoom)Point

    Projects geographical coordinates into pixel coordinates for a given zoom.

    -
    pointToLatLng(<Point> point, <Number> zoom)LatLng

    The inverse of latLngToPoint. Projects pixel coordinates on a given -zoom into geographical coordinates.

    -
    project(<LatLng> latlng)Point

    Projects geographical coordinates into coordinates in units accepted for -this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).

    -
    unproject(<Point> point)LatLng

    Given a projected coordinate returns the corresponding LatLng. -The inverse of project.

    -
    scale(<Number> zoom)Number

    Returns the scale used when transforming projected coordinates into -pixel coordinates for a particular zoom. For example, it returns -256 * 2^zoom for Mercator-based CRS.

    -
    zoom(<Number> scale)Number

    Inverse of scale(), returns the zoom level corresponding to a scale -factor of scale.

    -
    getProjectedBounds(<Number> zoom)Bounds

    Returns the projection's bounds scaled and transformed for the provided zoom.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds.

    -
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring -that its center is within the CRS's bounds. -Only accepts actual L.LatLngBounds instances, not arrays.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    code - StringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857')
    wrapLng - Number[]An array of two numbers defining whether the longitude (horizontal) coordinate -axis wraps around a given range and how. Defaults to [-180, 180] in most -geographical CRSs. If undefined, the longitude axis does not wrap around.
    wrapLat - Number[]Like wrapLng, but for the latitude (vertical) axis.
    infinite - BooleanIf true, the coordinate space will be unbounded (infinite in both axes)
    - -
    - - -
    -

    Defined CRSs

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CRSDescription
    L.CRS.EarthServes as the base for CRS that are global such that they cover the earth. -Can only be used as the base for other CRS and cannot be used directly, -since it does not have a code, projection or transformation. distance() returns -meters.
    L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
    L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial -tile providers. Uses Spherical Mercator projection. Set in by default in -Map's crs option.
    L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. -Leaflet 1.0.x complies with the TMS coordinate scheme for EPSG:4326, -which is a breaking change from 0.7.x behaviour. If you are using a TileLayer -with this CRS, ensure that there are two 256x256 pixel tiles covering the -whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), -or (-180,-90) for TileLayers with the tms option set.
    L.CRS.BaseObject that defines coordinate reference systems for projecting -geographical points into pixel (screen) coordinates and back (and to -coordinates in other units for WMS services). See -spatial reference system. -Leaflet defines the most usual CRSs by default. If you want to use a -CRS not defined by default, take a look at the -Proj4Leaflet plugin. -Note that the CRS instances do not inherit from Leaflet's Class object, -and can't be instantiated. Also, new classes can't inherit from them, -and methods can't be added to them with the include function.
    L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. -May be used for maps of flat surfaces (e.g. game maps). Note that the y -axis should still be inverted (going from bottom to top). distance() returns -simple euclidean distance.
    - -
    - - -

    Renderer

    Base class for vector renderer implementations (SVG, Canvas). Handles the -DOM container of the renderer, its bounds, and its zoom animation. -A Renderer works as an implicit layer group for all Paths - the renderer -itself can be added or removed to the map. All paths use a renderer, which can -be implicit (the map will decide the type of renderer and use it automatically) -or explicit (using the renderer option of the path). -Do not use this class directly, use SVG and Canvas instead.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber - 0How much to extend click tolerance round a path/object on the map
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Event objects

    Whenever a class inheriting from Evented fires an event, a listener function -will be called with an event argument, which is a plain object containing -information about the event. For example:

    -
    map.on('click', function(ev) {
    -    alert(ev.latlng); // ev is an event object (MouseEvent in this case)
    -});
    -
    -

    The information available depends on the event type:

    - - - -
    -

    Event

    - -
    - - - -
    The base event object. All other event objects contain these properties too.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    - - -
    - -
    -

    KeyboardEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    originalEvent - DOMEventThe original DOM KeyboardEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    MouseEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlng - LatLngThe geographical point where the mouse event occurred.
    layerPoint - PointPixel coordinates of the point where the mouse event occurred relative to the map layer.
    containerPoint - PointPixel coordinates of the point where the mouse event occurred relative to the map сontainer.
    originalEvent - DOMEventThe original DOM MouseEvent or DOM TouchEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    LocationEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlng - LatLngDetected geographical location of the user.
    bounds - LatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
    accuracy - NumberAccuracy of location in meters.
    altitude - NumberHeight of the position above the WGS84 ellipsoid in meters.
    altitudeAccuracy - NumberAccuracy of altitude in meters.
    heading - NumberThe direction of travel in degrees counting clockwise from true North.
    speed - NumberCurrent velocity in meters per second.
    timestamp - NumberThe time when the position was acquired.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    message - StringError message.
    code - NumberError code (if applicable).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    LayerEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    LayersControlEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer that was added or removed.
    name - StringThe name of the layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    TileEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tile - HTMLElementThe tile element (image).
    coords - PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    TileErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tile - HTMLElementThe tile element (image).
    coords - PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    error - *Error passed to the tile's done() callback.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ResizeEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    oldSize - PointThe old size before resize event.
    newSize - PointThe new size after the resize event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    GeoJSONEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer for the GeoJSON feature that is being added to the map.
    properties - ObjectGeoJSON properties of the feature.
    geometryType - StringGeoJSON geometry type of the feature.
    id - StringGeoJSON ID of the feature (if present).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    PopupEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    popup - PopupThe popup that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    TooltipEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tooltip - TooltipThe tooltip that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    DragEndEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    distance - NumberThe distance in pixels the draggable element was moved by.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ZoomAnimEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    center - LatLngThe current center of the map
    zoom - NumberThe current zoom level of the map
    noUpdate - BooleanWhether layers should update their contents due to this event
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -

    DivOverlay

    Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    offsetPoint - Point(0, 7)The offset of the popup position. Useful to control the anchor -of the popup when opening it on some overlays.
    classNameString - ''A custom CSS class name to assign to the popup.
    paneString - 'popupPane'Map pane where the popup will be added.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, describes the layer data, e.g. "© Mapbox".
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Global Switches

    Global switches are created for rare cases and generally make -Leaflet to not detect a particular browser feature even if it's -there. You need to set the switch as a global variable to true -before including Leaflet on the page, like this:

    -
    <script>L_NO_TOUCH = true;</script>
    -<script src="leaflet.js"></script>
    -
    - - - - - - - - - - - - - - - - - -
    SwitchDescription
    L_NO_TOUCHForces Leaflet to not use touch events even if it detects them.
    L_DISABLE_3DForces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.
    - -

    noConflict

    This method restores the L global variable to the original value -it had before Leaflet inclusion, and returns the real Leaflet -namespace so you can put it elsewhere, like this:

    -
    <script src='libs/l.js'>
    -<!-- L points to some other library -->
    -<script src='leaflet.js'>
    -<!-- you include Leaflet, it replaces the L variable to Leaflet namespace -->
    -<script>
    -var Leaflet = L.noConflict();
    -// now L points to that other library again, and you can use Leaflet.Map etc.
    -</script>
    -
    - -

    version

    A constant that represents the Leaflet version in use.

    -
    L.version; // contains "1.0.0" (or whatever version is currently in use)
    -
    diff --git a/docs/reference-1.3.3.html b/docs/reference-1.3.3.html deleted file mode 100644 index 7b7c70d47a2..00000000000 --- a/docs/reference-1.3.3.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -layout: redirected -redirect_to: reference-1.3.2.html ---- \ No newline at end of file diff --git a/docs/reference-1.5.0.html b/docs/reference-1.5.0.html deleted file mode 100644 index 3f6657dfe55..00000000000 --- a/docs/reference-1.5.0.html +++ /dev/null @@ -1,24804 +0,0 @@ ---- -layout: v2 -title: Documentation -bodyclass: api-page ---- - -

    Leaflet API reference

    - -

    This reference reflects Leaflet 1.5.0 and Leaflet 1.5.1. Check this list if you are using a different version of Leaflet.

    - -
    - -
    -

    UI Layers

    - -

    Raster Layers

    - -

    Vector Layers

    - -
    -
    -

    Other Layers

    - -

    Basic Types

    - -

    Controls

    - -
    -
    - - - - - - -

    Utility

    - -

    DOM Utility

    - -
    -
    -

    Base Classes

    - - -

    Misc

    - -
    -
    - -

    Map

    The central class of the API — it is used to create a map on a page and manipulate it.

    - -
    -

    Usage example

    - -
    - - - - - -
    // initialize the map on the "map" div with a given center and zoom
    -var map = L.map('map', {
    -    center: [51.505, -0.09],
    -    zoom: 13
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.map(<String> id, <Map options> options?)Instantiates a map object given the DOM ID of a <div> element -and optionally an object literal with Map options.
    L.map(<HTMLElement> el, <Map options> options?)Instantiates a map object given an instance of a <div> HTML element -and optionally an object literal with Map options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    preferCanvasBoolean - falseWhether Paths should be rendered on a Canvas renderer. -By default, all Paths are rendered in a SVG renderer.
    - -
    - -

    Control options

    - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionControlBoolean - trueWhether a attribution control is added to the map by default.
    zoomControlBoolean - trueWhether a zoom control is added to the map by default.
    - -
    - -

    Interaction Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    closePopupOnClickBoolean - trueSet it to false if you don't want popups to close when user clicks the map.
    zoomSnapNumber - 1Forces the map's zoom level to always be a multiple of this, particularly -right after a fitBounds() or a pinch-zoom. -By default, the zoom level snaps to the nearest integer; lower values -(e.g. 0.5 or 0.1) allow for greater granularity. A value of 0 -means the zoom level will not be snapped after fitBounds or a pinch-zoom.
    zoomDeltaNumber - 1Controls how much the map's zoom level will change after a -zoomIn(), zoomOut(), pressing + -or - on the keyboard, or using the zoom controls. -Values smaller than 1 (e.g. 0.5) allow for greater granularity.
    trackResizeBoolean - trueWhether the map automatically handles browser window resize to update itself.
    boxZoomBoolean - trueWhether the map can be zoomed to a rectangular area specified by -dragging the mouse while pressing the shift key.
    doubleClickZoomBoolean|String - trueWhether the map can be zoomed in by double clicking on it and -zoomed out by double clicking while holding shift. If passed -'center', double-click zoom will zoom to the center of the - view regardless of where the mouse was.
    draggingBoolean - trueWhether the map be draggable with mouse/touch or not.
    - -
    - -

    Map State Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    crsCRS - L.CRS.EPSG3857The Coordinate Reference System to use. Don't change this if you're not -sure what it means.
    centerLatLng - undefinedInitial geographic center of the map
    zoomNumber - undefinedInitial map zoom level
    minZoomNumber - *Minimum zoom level of the map. -If not specified and at least one GridLayer or TileLayer is in the map, -the lowest of their minZoom options will be used instead.
    maxZoomNumber - *Maximum zoom level of the map. -If not specified and at least one GridLayer or TileLayer is in the map, -the highest of their maxZoom options will be used instead.
    layersLayer[] - []Array of layers that will be added to the map initially
    maxBoundsLatLngBounds - nullWhen this option is set, the map restricts the view to the given -geographical bounds, bouncing the user back if the user tries to pan -outside the view. To set the restriction dynamically, use -setMaxBounds method.
    rendererRenderer - *The default method for drawing vector layers on the map. L.SVG -or L.Canvas by default depending on browser support.
    - -
    - -

    Animation Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    zoomAnimationBoolean - trueWhether the map zoom animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    zoomAnimationThresholdNumber - 4Won't animate zoom if the zoom difference exceeds this value.
    fadeAnimationBoolean - trueWhether the tile fade animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    markerZoomAnimationBoolean - trueWhether markers animate their zoom with the zoom animation, if disabled -they will disappear for the length of the animation. By default it's -enabled in all browsers that support CSS3 Transitions except Android.
    transform3DLimitNumber - 2^23Defines the maximum size of a CSS translation transform. The default -value should not be changed unless a web browser positions layers in -the wrong place after doing a large panBy.
    - -
    - -

    Panning Inertia Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    inertiaBoolean - *If enabled, panning of the map will have an inertia effect where -the map builds momentum while dragging and continues moving in -the same direction for some time. Feels especially nice on touch -devices. Enabled by default unless running on old Android devices.
    inertiaDecelerationNumber - 3000The rate with which the inertial movement slows down, in pixels/second².
    inertiaMaxSpeedNumber - InfinityMax speed of the inertial movement, in pixels/second.
    easeLinearityNumber - 0.2
    worldCopyJumpBoolean - falseWith this option enabled, the map tracks when you pan to another "copy" -of the world and seamlessly jumps to the original one so that all overlays -like markers and vector layers are still visible.
    maxBoundsViscosityNumber - 0.0If maxBounds is set, this option will control how solid the bounds -are when dragging the map around. The default value of 0.0 allows the -user to drag outside the bounds at normal speed, higher values will -slow down map dragging outside bounds, and 1.0 makes the bounds fully -solid, preventing the user from dragging outside the bounds.
    - -
    - -

    Keyboard Navigation Options

    - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    keyboardBoolean - trueMakes the map focusable and allows users to navigate the map with keyboard -arrows and +/- keys.
    keyboardPanDeltaNumber - 80Amount of pixels to pan when pressing an arrow key.
    - -
    - -

    Mousewheel options

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    scrollWheelZoomBoolean|String - trueWhether the map can be zoomed by using the mouse wheel. If passed 'center', -it will zoom to the center of the view regardless of where the mouse was.
    wheelDebounceTimeNumber - 40Limits the rate at which a wheel can fire (in milliseconds). By default -user can't zoom via wheel more often than once per 40 ms.
    wheelPxPerZoomLevelNumber - 60How many scroll pixels (as reported by L.DomEvent.getWheelDelta) -mean a change of one full zoom level. Smaller values will make wheel-zooming -faster (and vice versa).
    - -
    - -

    Touch interaction options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tapBoolean - trueEnables mobile hacks for supporting instant taps (fixing 200ms click -delay on iOS/Android) and touch holds (fired as contextmenu events).
    tapToleranceNumber - 15The max number of pixels a user can shift his finger during touch -for it to be considered a valid tap.
    touchZoomBoolean|String - *Whether the map can be zoomed by touch-dragging with two fingers. If -passed 'center', it will zoom to the center of the view regardless of -where the touch events (fingers) were. Enabled for touch-capable web -browsers except for old Androids.
    bounceAtZoomLimitsBoolean - trueSet it to false if you don't want the map to zoom beyond min/max zoom -and then bounce back when pinch-zooming.
    - -
    - - -
    -

    Events

    - -
    - -

    Layer events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    baselayerchange - LayersControlEventFired when the base layer is changed through the layer control.
    overlayadd - LayersControlEventFired when an overlay is selected through the layer control.
    overlayremove - LayersControlEventFired when an overlay is deselected through the layer control.
    layeradd - LayerEventFired when a new layer is added to the map.
    layerremove - LayerEventFired when some layer is removed from the map
    - -
    - -

    Map state change events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    zoomlevelschange - EventFired when the number of zoomlevels on the map is changed due -to adding or removing a layer.
    resize - ResizeEventFired when the map is resized.
    unload - EventFired when the map is destroyed with remove method.
    viewreset - EventFired when the map needs to redraw its content (this usually happens -on map zoom or load). Very useful for creating custom overlays.
    load - EventFired when the map is initialized (when its center and zoom are set -for the first time).
    zoomstart - EventFired when the map zoom is about to change (e.g. before zoom animation).
    movestart - EventFired when the view of the map starts changing (e.g. user starts dragging the map).
    zoom - EventFired repeatedly during any change in zoom level, including zoom -and fly animations.
    move - EventFired repeatedly during any movement of the map, including pan and -fly animations.
    zoomend - EventFired when the map has changed, after any animations.
    moveend - EventFired when the center of the map stops changing (e.g. user stopped -dragging the map).
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup is opened in the map
    popupclose - PopupEventFired when a popup in the map is closed
    autopanstart - EventFired when the map starts autopanning when opening a popup.
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip is opened in the map.
    tooltipclose - TooltipEventFired when a tooltip in the map is closed.
    - -
    - -

    Location events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    locationerror - ErrorEventFired when geolocation (using the locate method) failed.
    locationfound - LocationEventFired when geolocation (using the locate method) -went successfully.
    - -
    - -

    Interaction events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the map.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the map.
    mousedown - MouseEventFired when the user pushes the mouse button on the map.
    mouseup - MouseEventFired when the user releases the mouse button on the map.
    mouseover - MouseEventFired when the mouse enters the map.
    mouseout - MouseEventFired when the mouse leaves the map.
    mousemove - MouseEventFired while the mouse moves over the map.
    contextmenu - MouseEventFired when the user pushes the right mouse button on the map, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    keypress - KeyboardEventFired when the user presses a key from the keyboard that produces a character value while the map is focused.
    keydown - KeyboardEventFired when the user presses a key from the keyboard while the map is focused. Unlike the keypress event, -the keydown event is fired for keys that produce a character value and for keys -that do not produce a character value.
    keyup - KeyboardEventFired when the user releases a key from the keyboard while the map is focused.
    preclick - MouseEventFired before mouse click on the map (sometimes useful when you -want something to happen on click before any existing click -handlers start running).
    - -
    - -

    Other Methods

    - - - - - - - - - - - - - -
    EventDataDescription
    zoomanim - ZoomAnimEventFired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getRenderer(<Path> layer)Renderer

    Returns the instance of Renderer that should be used to render the given -Path. It will ensure that the renderer options of the map and paths -are respected, and that the renderers do exist on the map.

    -
    - -
    - -

    Methods for Layers and Controls

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addControl(<Control> control)this

    Adds the given control to the map

    -
    removeControl(<Control> control)this

    Removes the given control from the map

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the map

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the map.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the map

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the map, optionally specifying context of the iterator function.

    -
    map.eachLayer(function(layer){
    -    layer.bindPopup('Hello');
    -});
    -
    openPopup(<Popup> popup)this

    Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).

    -
    openPopup(<String|HTMLElement> content, <LatLng> latlng, <Popup options> options?)this

    Creates a popup with the specified content and options and opens it in the given point on a map.

    -
    closePopup(<Popup> popup?)this

    Closes the popup previously opened with openPopup (or the given one).

    -
    openTooltip(<Tooltip> tooltip)this

    Opens the specified tooltip.

    -
    openTooltip(<String|HTMLElement> content, <LatLng> latlng, <Tooltip options> options?)this

    Creates a tooltip with the specified content and options and open it.

    -
    closeTooltip(<Tooltip> tooltip?)this

    Closes the tooltip given as parameter.

    -
    - -
    - -

    Methods for modifying map state

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setView(<LatLng> center, <Number> zoom, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) with the given -animation options.

    -
    setZoom(<Number> zoom, <Zoom/pan options> options?)this

    Sets the zoom of the map.

    -
    zoomIn(<Number> delta?, <Zoom options> options?)this

    Increases the zoom of the map by delta (zoomDelta by default).

    -
    zoomOut(<Number> delta?, <Zoom options> options?)this

    Decreases the zoom of the map by delta (zoomDelta by default).

    -
    setZoomAround(<LatLng> latlng, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified geographical point on the map -stationary (e.g. used internally for scroll zoom and double-click zoom).

    -
    setZoomAround(<Point> offset, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.

    -
    fitBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets a map view that contains the given geographical bounds with the -maximum zoom level possible.

    -
    fitWorld(<fitBounds options> options?)this

    Sets a map view that mostly contains the whole world with the maximum -zoom level possible.

    -
    panTo(<LatLng> latlng, <Pan options> options?)this

    Pans the map to a given center.

    -
    panBy(<Point> offset, <Pan options> options?)this

    Pans the map by a given number of pixels (animated).

    -
    flyTo(<LatLng> latlng, <Number> zoom?, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) performing a smooth -pan-zoom animation.

    -
    flyToBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets the view of the map with a smooth animation like flyTo, -but takes a bounds parameter like fitBounds.

    -
    setMaxBounds(<Bounds> bounds)this

    Restricts the map view to the given bounds (see the maxBounds option).

    -
    setMinZoom(<Number> zoom)this

    Sets the lower limit for the available zoom levels (see the minZoom option).

    -
    setMaxZoom(<Number> zoom)this

    Sets the upper limit for the available zoom levels (see the maxZoom option).

    -
    panInsideBounds(<LatLngBounds> bounds, <Pan options> options?)this

    Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.

    -
    panInside(<LatLng> latlng, <options> options?)this

    Pans the map the minimum amount to make the latlng visible. Use -padding, paddingTopLeft and paddingTopRight options to fit -the display to more restricted bounds, like fitBounds. -If latlng is already within the (optionally padded) display bounds, -the map will not be panned.

    -
    invalidateSize(<Zoom/pan options> options)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default. If options.pan is false, panning will not occur. -If options.debounceMoveend is true, it will delay moveend event so -that it doesn't happen often even if the method is called many -times in a row.

    -
    invalidateSize(<Boolean> animate)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default.

    -
    stop()this

    Stops the currently running panTo or flyTo animation, if any.

    -
    - -
    - -

    Geolocation methods

    - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    locate(<Locate options> options?)this

    Tries to locate the user using the Geolocation API, firing a locationfound -event with location data on success or a locationerror event on failure, -and optionally sets the map view to the user's location with respect to -detection accuracy (or to the world view if geolocation failed). -Note that, if your page doesn't use HTTPS, this method will fail in -modern browsers (Chrome 50 and newer) -See Locate options for more details.

    -
    stopLocate()this

    Stops watching location previously initiated by map.locate({watch: true}) -and aborts resetting the map view if map.locate was called with -{setView: true}.

    -
    - -
    - -

    Other Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHandler(<String> name, <Function> HandlerClass)this

    Adds a new Handler to the map, given its name and constructor function.

    -
    remove()this

    Destroys the map and clears all related event listeners.

    -
    createPane(<String> name, <HTMLElement> container?)HTMLElement

    Creates a new map pane with the given name if it doesn't exist already, -then returns it. The pane is created as a child of container, or -as a child of the main map pane if not set.

    -
    getPane(<String|HTMLElement> pane)HTMLElement

    Returns a map pane, given its name or its HTML element (its identity).

    -
    getPanes()Object

    Returns a plain object containing the names of all panes as keys and -the panes as values.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the map.

    -
    whenReady(<Function> fn, <Object> context?)this

    Runs the given function fn when the map gets initialized with -a view (center and zoom) and at least one layer, or immediately -if it's already initialized, optionally passing a function context.

    -
    - -
    - -

    Methods for Getting Map State

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getCenter()LatLng

    Returns the geographical center of the map view

    -
    getZoom()Number

    Returns the current zoom level of the map view

    -
    getBounds()LatLngBounds

    Returns the geographical bounds visible in the current map view

    -
    getMinZoom()Number

    Returns the minimum zoom level of the map (if set in the minZoom option of the map or of any layers), or 0 by default.

    -
    getMaxZoom()Number

    Returns the maximum zoom level of the map (if set in the maxZoom option of the map or of any layers).

    -
    getBoundsZoom(<LatLngBounds> bounds, <Boolean> inside?, <Point> padding?)Number

    Returns the maximum zoom level on which the given bounds fit to the map -view in its entirety. If inside (optional) is set to true, the method -instead returns the minimum zoom level on which the map view fits into -the given bounds in its entirety.

    -
    getSize()Point

    Returns the current size of the map container (in pixels).

    -
    getPixelBounds()Bounds

    Returns the bounds of the current map view in projected pixel -coordinates (sometimes useful in layer and overlay implementations).

    -
    getPixelOrigin()Point

    Returns the projected pixel coordinates of the top left point of -the map layer (useful in custom layer and overlay implementations).

    -
    getPixelWorldBounds(<Number> zoom?)Bounds

    Returns the world's bounds in pixel coordinates for zoom level zoom. -If zoom is omitted, the map's current zoom level is used.

    -
    - -
    - -

    Conversion Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getZoomScale(<Number> toZoom, <Number> fromZoom)Number

    Returns the scale factor to be applied to a map transition from zoom level -fromZoom to toZoom. Used internally to help with zoom animations.

    -
    getScaleZoom(<Number> scale, <Number> fromZoom)Number

    Returns the zoom level that the map would end up at, if it is at fromZoom -level and everything is scaled by a factor of scale. Inverse of -getZoomScale.

    -
    project(<LatLng> latlng, <Number> zoom)Point

    Projects a geographical coordinate LatLng according to the projection -of the map's CRS, then scales it according to zoom and the CRS's -Transformation. The result is pixel coordinate relative to -the CRS origin.

    -
    unproject(<Point> point, <Number> zoom)LatLng

    Inverse of project.

    -
    layerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToLayerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the origin pixel.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -map's CRS's wrapLat and wrapLng properties, if they are outside the -CRS's bounds. -By default this means longitude is wrapped around the dateline so its -value is between -180 and +180 degrees.

    -
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring that -its center is within the CRS's bounds. -By default this means the center longitude is wrapped around the dateline so its -value is between -180 and +180 degrees, and the majority of the bounds -overlaps the CRS's bounds.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates according to -the map's CRS. By default this measures distance in meters.

    -
    containerPointToLayerPoint(<Point> point)Point

    Given a pixel coordinate relative to the map container, returns the corresponding -pixel coordinate relative to the origin pixel.

    -
    layerPointToContainerPoint(<Point> point)Point

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding pixel coordinate relative to the map container.

    -
    containerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the map container, returns -the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToContainerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the map container.

    -
    mouseEventToContainerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to the -map container where the event took place.

    -
    mouseEventToLayerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to -the origin pixel where the event took place.

    -
    mouseEventToLatLng(<MouseEvent> ev)LatLng

    Given a MouseEvent object, returns geographical coordinate where the -event took place.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Controls

    - - - - - - - - - - - - - -
    PropertyTypeDescription
    zoomControl - Control.ZoomThe default zoom control (only available if the -zoomControl option was true when creating the map).
    - -
    - -

    Handlers

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    boxZoom - HandlerBox (shift-drag with mouse) zoom handler.
    doubleClickZoom - HandlerDouble click zoom handler.
    dragging - HandlerMap dragging handler (by both mouse and touch).
    keyboard - HandlerKeyboard navigation handler.
    scrollWheelZoom - HandlerScroll wheel zoom handler.
    tap - HandlerMobile touch hacks (quick tap and touch hold) handler.
    touchZoom - HandlerTouch zoom handler.
    - -
    - - -
    -

    Map panes

    - -
    - - - -
    Panes are DOM elements used to control the ordering of layers on the map. You -can access panes with map.getPane or -map.getPanes methods. New panes can be created with the -map.createPane method. -Every map has the following default panes that differ only in zIndex.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PaneTypeZ-indexDescription
    mapPaneHTMLElement - 'auto'Pane that contains all other map panes
    tilePaneHTMLElement - 200Pane for GridLayers and TileLayers
    overlayPaneHTMLElement - 400Pane for vectors (Paths, like Polylines and Polygons), ImageOverlays and VideoOverlays
    shadowPaneHTMLElement - 500Pane for overlay shadows (e.g. Marker shadows)
    markerPaneHTMLElement - 600Pane for Icons of Markers
    tooltipPaneHTMLElement - 650Pane for Tooltips.
    popupPaneHTMLElement - 700Pane for Popups.
    - -
    - - -
    - -
    -

    Locate options

    - -
    - - - -
    Some of the geolocation methods for Map take in an options parameter. This -is a plain javascript object with the following optional components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    watchBoolean - falseIf true, starts continuous watching of location changes (instead of detecting it -once) using W3C watchPosition method. You can later stop watching using -map.stopLocate() method.
    setViewBoolean - falseIf true, automatically sets the map view to the user location with respect to -detection accuracy, or to world view if geolocation failed.
    maxZoomNumber - InfinityThe maximum zoom for automatic view setting when using setView option.
    timeoutNumber - 10000Number of milliseconds to wait for a response from geolocation before firing a -locationerror event.
    maximumAgeNumber - 0Maximum age of detected location. If less than this amount of milliseconds -passed since last geolocation response, locate will return a cached location.
    enableHighAccuracyBoolean - falseEnables high accuracy, see description in the W3C spec.
    - -
    - - -
    - -
    -

    Zoom options

    - -
    - - - -
    Some of the Map methods which modify the zoom level take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    - - -
    - -
    -

    Pan options

    - -
    - - - -
    Some of the Map methods which modify the center of the map take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If true, panning will always be animated if possible. If false, it will -not animate panning, either resetting the map view if panning more than a -screen away, or just setting a new offset for the map pane (except for panBy -which always does the latter).
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    - - -
    - -
    -

    Zoom/pan options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -
    - -
    -

    FitBounds options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingTopLeftPoint - [0, 0]Sets the amount of padding in the top left corner of a map container that -shouldn't be accounted for when setting the view to fit bounds. Useful if you -have some control overlays on the map like a sidebar and you don't want them -to obscure objects you're zooming to.
    paddingBottomRightPoint - [0, 0]The same for the bottom right corner of the map.
    paddingPoint - [0, 0]Equivalent of setting both top left and bottom right padding to the same value.
    maxZoomNumber - nullThe maximum possible zoom to use.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBoolean - If not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber - 0.25Duration of animated panning, in seconds.
    easeLinearityNumber - 0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBoolean - falseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -

    Marker

    L.Marker is used to display clickable/draggable icons on the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.marker([50.5, 30.5]).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.marker(<LatLng> latlng, <Marker options> options?)Instantiates a Marker object given a geographical point and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconIcon - *Icon instance to use for rendering the marker. -See Icon documentation for details on how to customize the marker icon. -If not specified, a common instance of L.Icon.Default is used.
    keyboardBoolean - trueWhether the marker can be tabbed to with a keyboard and clicked by pressing enter.
    titleString - ''Text for the browser tooltip that appear on marker hover (no tooltip by default).
    altString - ''Text for the alt attribute of the icon image (useful for accessibility).
    zIndexOffsetNumber - 0By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
    opacityNumber - 1.0The opacity of the marker.
    riseOnHoverBoolean - falseIf true, the marker will get on top of others when you hover the mouse over it.
    riseOffsetNumber - 250The z-index offset used for the riseOnHover feature.
    paneString - 'markerPane'Map pane where the markers icon will be added. -Map pane where the markers shadow will be added.
    bubblingMouseEventsBoolean - falseWhen true, a mouse event on this marker will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    - -

    Draggable marker options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    draggableBoolean - falseWhether the marker is draggable with mouse/touch or not.
    autoPanBoolean - falseWhether to pan the map when dragging this marker near its edge or not.
    autoPanPaddingPoint - Point(50, 50)Distance (in pixels to the left/right and to the top/bottom) of the -map edge to start panning the map.
    autoPanSpeedNumber - 10Number of pixels the map should pan by.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - -
    In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:
    - - - - - - - - - - - - -
    EventDataDescription
    move - EventFired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    - -
    - -

    Dragging events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    dragstart - EventFired when the user starts dragging the marker.
    movestart - EventFired when the marker starts moving (because of dragging).
    drag - EventFired repeatedly while the user drags the marker.
    dragend - DragEndEventFired when the user stops dragging the marker.
    moveend - EventFired when the marker stops moving (because of dragging).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the marker (as a GeoJSON Point Feature).

    -
    getLatLng()LatLng

    Returns the current geographical position of the marker.

    -
    setLatLng(<LatLng> latlng)this

    Changes the marker position to the given point.

    -
    setZIndexOffset(<Number> offset)this

    Changes the zIndex offset of the marker.

    -
    getIcon()Icon

    Returns the current icon used by the marker

    -
    setIcon(<Icon> icon)this

    Changes the marker icon.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the marker.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Interaction handlers

    - -
    Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see Handler methods). Example: -
    marker.dragging.disable();
    -
    - - - - - - - - - - - - -
    PropertyTypeDescription
    dragging - HandlerMarker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set marker.options.draggable).
    - -
    - - -

    Used to open popups in certain places of the map. Use Map.openPopup to -open popups while making sure that only one popup is open at one time -(recommended for usability), or use Map.addLayer to open as many as you want.

    - -
    - - -
    - - - - - -

    If you want to just bind a popup to marker click and then open it, it's really easy:

    -
    marker.bindPopup(popupContent).openPopup();
    -
    -

    Path overlays like polylines also have a bindPopup method. -Here's a more complicated way to open a popup on a map:

    -
    var popup = L.popup()
    -    .setLatLng(latlng)
    -    .setContent('<p>Hello world!<br />This is a nice popup.</p>')
    -    .openOn(map);
    -
    - - - -
    - - -
    - - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    - -
    - - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -

    Tooltip

    Used to display small texts on top of map layers.

    - -
    -

    Usage example

    - -
    - - - - - -
    marker.bindTooltip("my tooltip text").openTooltip();
    -
    -

    Note about tooltip offset. Leaflet takes two options in consideration -for computing tooltip offsetting:

    -
      -
    • the offset Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. -Add a positive x offset to move the tooltip to the right, and a positive y offset to -move it to the bottom. Negatives will move to the left and top.
    • -
    • the tooltipAnchor Icon option: this will only be considered for Marker. You -should adapt this value if you use a custom icon.
    • -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tooltip(<Tooltip options> options?, <Layer> source?)Instantiates a Tooltip object given an optional options object that describes its appearance and location and an optional source object that is used to tag the tooltip with a reference to the Layer to which it refers.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'tooltipPane'Map pane where the tooltip will be added.
    offsetPoint - Point(0, 0)Optional offset of the tooltip position.
    directionString - 'auto'Direction where to open the tooltip. Possible values are: right, left, -top, bottom, center, auto. -auto will dynamically switch between right and left according to the tooltip -position on the map.
    permanentBoolean - falseWhether to open the tooltip permanently or only on mouseover.
    stickyBoolean - falseIf true, the tooltip will follow the mouse instead of being fixed at the feature center.
    interactiveBoolean - falseIf true, the tooltip will listen to the feature events.
    opacityNumber - 0.9Tooltip container opacity.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    classNameString - ''A custom CSS class name to assign to the popup.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer

    Used to load and display tile layers on the map. Note that most tile servers require attribution, which you can set under Layer. Extends GridLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar', attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'}).addTo(map);
    -
    - - - -
    - -

    URL template

    - - - -

    A string of the following form:

    -
    'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
    -

    {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates. {r} can be used to add "@2x" to the URL to load retina tiles. -You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

    -
    L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
    -
    - - -
    - - -
    -

    Creation

    - -
    - -

    Extension methods

    - - - - - - - - - - - - -
    FactoryDescription
    L.tilelayer(<String> urlTemplate, <TileLayer options> options?)Instantiates a tile layer object given a URL template and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber - 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber - 18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[] - 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString - ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber - 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean - falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean - falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean - falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|String - falseWhether the crossOrigin attribute will be added to the tiles. -If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. -Refer to CORS Settings for valid String values.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - (depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumber - undefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber - undefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true). -If the URL does not change, the layer will not be redrawn unless -the noRedraw parameter is set to false.

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending TileLayer might reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    getTileUrl(<Object> coords)String

    Called only internally, returns the URL for a tile given its coordinates. -Classes extending TileLayer can override this function to provide custom tile URL naming schemes.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer.WMS

    Used to display WMS services as tile layers on the map. Extends TileLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
    -    layers: 'nexrad-n0r-900913',
    -    format: 'image/png',
    -    transparent: true,
    -    attribution: "Weather data © 2012 IEM Nexrad"
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tileLayer.wms(<String> baseUrl, <TileLayer.WMS options> options)Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
    - -
    - - -
    -

    Options

    - -
    - - - -
    If any custom options not documented here are used, they will be sent to the -WMS server as extra parameters in each request URL. This can be useful for -non-standard vendor WMS parameters.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    layersString - ''(required) Comma-separated list of WMS layers to show.
    stylesString - ''Comma-separated list of WMS styles.
    formatString - 'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
    transparentBoolean - falseIf true, the WMS service will return images with transparency.
    versionString - '1.1.1'Version of the WMS service to use
    crsCRS - nullCoordinate Reference System to use for the WMS requests, defaults to -map CRS. Don't change this if you're not sure what it means.
    uppercaseBoolean - falseIf true, WMS request parameter keys will be uppercase.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber - 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber - 18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[] - 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString - ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber - 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean - falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean - falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean - falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|String - falseWhether the crossOrigin attribute will be added to the tiles. -If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. -Refer to CORS Settings for valid String values.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - (depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumber - undefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber - undefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setParams(<Object> params, <Boolean> noRedraw?)this

    Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true). -If the URL does not change, the layer will not be redrawn unless -the noRedraw parameter is set to false.

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    ImageOverlay

    Used to load and display a single image over specific bounds of the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
    -    imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
    -L.imageOverlay(imageUrl, imageBounds).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.imageOverlay(<String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options?)Instantiates an image overlay object given the URL of the image and the -geographical bounds it is tied to.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber - 1.0The opacity of the image overlay.
    altString - ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean - falseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|String - falseWhether the crossOrigin attribute will be added to the image. -If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. -Refer to CORS Settings for valid String values.
    errorOverlayUrlString - ''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber - 1The explicit zIndex of the overlay layer.
    classNameString - ''A custom class name to assign to the image. Empty by default.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    load - EventFired when the ImageOverlay layer has loaded its image
    error - EventFired when the ImageOverlay layer fails to load its image
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    -
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    -
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    -
    getElement()HTMLElement

    Returns the instance of HTMLImageElement -used by this overlay.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    VideoOverlay

    Used to load and display a video player over specific bounds of the map. Extends ImageOverlay. -A video overlay uses the <video> -HTML5 element.

    - -
    -

    Usage example

    - -
    - - - - - -
    var videoUrl = 'https://www.mapbox.com/bites/00188/patricia_nasa.webm',
    -    videoBounds = [[ 32, -130], [ 13, -100]];
    -L.videoOverlay(videoUrl, videoBounds ).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.videoOverlay(<String|Array|HTMLVideoElement> video, <LatLngBounds> bounds, <VideoOverlay options> options?)Instantiates an image overlay object given the URL of the video (or array of URLs, or even a video element) and the -geographical bounds it is tied to.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    autoplayBoolean - trueWhether the video starts playing automatically when loaded.
    loopBoolean - trueWhether the video will loop back to the beginning when played.
    keepAspectRatioBoolean - trueWhether the video will save aspect ratio after the projection. -Relevant for supported browsers. Browser compatibility- https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber - 1.0The opacity of the image overlay.
    altString - ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean - falseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|String - falseWhether the crossOrigin attribute will be added to the image. -If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. -Refer to CORS Settings for valid String values.
    errorOverlayUrlString - ''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber - 1The explicit zIndex of the overlay layer.
    classNameString - ''A custom class name to assign to the image. Empty by default.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    load - EventFired when the video has finished loading the first frame
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    error - EventFired when the ImageOverlay layer fails to load its image
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getElement()HTMLVideoElement

    Returns the instance of HTMLVideoElement -used by this overlay.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    -
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    -
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    SVGOverlay

    Used to load, display and provide DOM access to an SVG file over specific bounds of the map. Extends ImageOverlay. -An SVG overlay uses the <svg> element.

    - -
    -

    Usage example

    - -
    - - - - - -
    var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
    -svgElement.setAttribute('xmlns', "http://www.w3.org/2000/svg");
    -svgElement.setAttribute('viewBox', "0 0 200 200");
    -svgElement.innerHTML = '<rect width="200" height="200"/><rect x="75" y="23" width="50" height="50" style="fill:red"/><rect x="75" y="123" width="50" height="50" style="fill:#0013ff"/>';
    -var svgElementBounds = [ [ 32, -130 ], [ 13, -100 ] ];
    -L.svgOverlay(svgElement, svgElementBounds).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.svgOverlay(<String|SVGElement> svg, <LatLngBounds> bounds, <SVGOverlay options> options?)Instantiates an image overlay object given an SVG element and the geographical bounds it is tied to. -A viewBox attribute is required on the SVG element to zoom in and out properly.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber - 1.0The opacity of the image overlay.
    altString - ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean - falseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|String - falseWhether the crossOrigin attribute will be added to the image. -If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. -Refer to CORS Settings for valid String values.
    errorOverlayUrlString - ''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber - 1The explicit zIndex of the overlay layer.
    classNameString - ''A custom class name to assign to the image. Empty by default.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    load - EventFired when the ImageOverlay layer has loaded its image
    error - EventFired when the ImageOverlay layer fails to load its image
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getElement()SVGElement

    Returns the instance of SVGElement -used by this overlay.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    -
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    -
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Path

    An abstract class that contains options and constants shared between vector -overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polyline

    A class for drawing polyline overlays on a map. Extends Path.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polyline from an array of LatLng points
    -var latlngs = [
    -    [45.51, -122.68],
    -    [37.77, -122.43],
    -    [34.04, -118.2]
    -];
    -var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
    -// zoom the map to the polyline
    -map.fitBounds(polyline.getBounds());
    -
    -

    You can also pass a multi-dimensional array to represent a MultiPolyline shape:

    -
    // create a red polyline from an array of arrays of LatLng points
    -var latlngs = [
    -    [[45.51, -122.68],
    -     [37.77, -122.43],
    -     [34.04, -118.2]],
    -    [[40.78, -73.91],
    -     [41.83, -87.62],
    -     [32.76, -96.72]]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polyline(<LatLng[]> latlngs, <Polyline options> options?)Instantiates a polyline object given an array of geographical points and -optionally an options object. You can create a Polyline object with -multiple separate lines (MultiPolyline) by passing an array of arrays -of geographic points.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

    -
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polygon

    A class for drawing polygon overlays on a map. Extends Polyline. -Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polygon from an array of LatLng points
    -var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
    -var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
    -// zoom the map to the polygon
    -map.fitBounds(polygon.getBounds());
    -
    -

    You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

    -
    var latlngs = [
    -  [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -  [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -];
    -
    -

    Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

    -
    var latlngs = [
    -  [ // first polygon
    -    [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -    [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -  ],
    -  [ // second polygon
    -    [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
    -  ]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polygon(<LatLng[]> latlngs, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Rectangle

    A class for drawing rectangle overlays on a map. Extends Polygon.

    - -
    -

    Usage example

    - -
    - - - - - -
    // define rectangle geographical bounds
    -var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
    -// create an orange rectangle
    -L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
    -// zoom the map to the rectangle bounds
    -map.fitBounds(bounds);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.rectangle(<LatLngBounds> latLngBounds, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber - 1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBoolean - falseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setBounds(<LatLngBounds> latLngBounds)this

    Redraws the rectangle with the passed bounds.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Circle

    A class for drawing circle overlays on a map. Extends CircleMarker. -It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).

    - -
    -

    Usage example

    - -
    - - - - - -
    L.circle([50.5, 30.5], {radius: 200}).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.circle(<LatLng> latlng, <Circle options> options?)Instantiates a circle object given a geographical point, and an options object -which contains the circle radius.
    L.circle(<LatLng> latlng, <Number> radius, <Circle options> options?)Obsolete way of instantiating a circle, for compatibility with 0.7.x code. -Do not use in new applications or plugins.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumber - Radius of the circle, in meters.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setRadius(<Number> radius)this

    Sets the radius of a circle. Units are in meters.

    -
    getRadius()Number

    Returns the current radius of a circle. Units are in meters.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    CircleMarker

    A circle of a fixed size with radius specified in pixels. Extends Path.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.circleMarker(<LatLng> latlng, <CircleMarker options> options?)Instantiates a circle marker object given a geographical point, and an optional options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumber - 10Radius of the circle marker, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBoolean - trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString - '#3388ff'Stroke color
    weightNumber - 3Stroke width in pixels
    opacityNumber - 1.0Stroke opacity
    lineCapString - 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString - 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString - nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString - nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean - dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString - *Fill color. Defaults to the value of the color option
    fillOpacityNumber - 0.2Fill opacity.
    fillRuleString - 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRenderer - Use this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameString - nullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    setRadius(<Number> radius)this

    Sets the radius of a circle marker. Units are in pixels.

    -
    getRadius()Number

    Returns the current radius of the circle

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    SVG

    VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility -with old versions of Internet Explorer.

    -

    Allows vector layers to be displayed with SVG. -Inherits Renderer. -Due to technical limitations, SVG is not -available in all web browsers, notably Android 2.x and 3.x. -Although SVG is not available on IE7 and IE8, these browsers support -VML -(a now deprecated technology), and the SVG renderer will fall back to VML in -this case.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use SVG by default for all paths in the map:

    -
    var map = L.map('map', {
    -    renderer: L.svg()
    -});
    -
    -

    Use a SVG renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.svg({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.svg(<Renderer options> options?)Creates a SVG renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber - 0How much to extend click tolerance round a path/object on the map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - -
    There are several static functions which can be called without instantiating L.SVG:
    - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    create(<String> name)SVGElementReturns a instance of SVGElement, -corresponding to the class name passed. For example, using 'line' will return -an instance of SVGLineElement.
    pointsToPath(<Point[]> rings, <Boolean> closed)StringGenerates a SVG path string for multiple rings, with each ring turning -into "M..L..L.." instructions
    - -
    - - -

    Canvas

    Allows vector layers to be displayed with <canvas>. -Inherits Renderer. -Due to technical limitations, Canvas is not -available in all web browsers, notably IE8, and overlapping geometries might -not display properly in some edge cases.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use Canvas by default for all paths in the map:

    -
    var map = L.map('map', {
    -    renderer: L.canvas()
    -});
    -
    -

    Use a Canvas renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.canvas({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.canvas(<Renderer options> options?)Creates a Canvas renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber - 0How much to extend click tolerance round a path/object on the map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LayerGroup

    Used to group several layers and handle them as one. If you add it to the map, -any layers added or removed from the group will be added/removed on the map as -well. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.layerGroup([marker1, marker2])
    -    .addLayer(polyline)
    -    .addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.layerGroup(<Layer[]> layers?, <Object> options?)Create a layer group, optionally given an initial set of layers and an options object.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    FeatureGroup

    Extended LayerGroup that makes it easier to do the same thing to all its member layers:

    -
      -
    • bindPopup binds a popup to all of the layers at once (likewise with bindTooltip)
    • -
    • Events are propagated to the FeatureGroup, so if the group has an event -handler, it will handle events from any of the layers. This includes mouse events -and custom events.
    • -
    • Has layeradd and layerremove events
    • -
    - -
    -

    Usage example

    - -
    - - - - - -
    L.featureGroup([marker1, marker2, polyline])
    -    .bindPopup('Hello world!')
    -    .on('click', function() { alert('Clicked on a member of the group!'); })
    -    .addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.featureGroup(<Layer[]> layers)Create a feature group, optionally given an initial set of layers.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeradd - LayerEventFired when a layer is added to this FeatureGroup
    layerremove - LayerEventFired when a layer is removed from this FeatureGroup
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setStyle(<Path options> style)this

    Sets the given path options to each layer of the group that has a setStyle method.

    -
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    GeoJSON

    Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse -GeoJSON data and display it on the map. Extends FeatureGroup.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.geoJSON(data, {
    -    style: function (feature) {
    -        return {color: feature.properties.color};
    -    }
    -}).bindPopup(function (layer) {
    -    return layer.feature.properties.description;
    -}).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.geoJSON(<Object> geojson?, <GeoJSON options> options?)Creates a GeoJSON layer. Optionally accepts an object in -GeoJSON format to display on the map -(you can alternatively add it later with addData method) and an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    pointToLayerFunction - *A Function defining how GeoJSON points spawn Leaflet layers. It is internally -called when data is added, passing the GeoJSON point feature and its LatLng. -The default is to spawn a default Marker: -
    function(geoJsonPoint, latlng) {
    -    return L.marker(latlng);
    -}
    -
    styleFunction - *A Function defining the Path options for styling GeoJSON lines and polygons, -called internally when data is added. -The default value is to not override any defaults: -
    function (geoJsonFeature) {
    -    return {}
    -}
    -
    onEachFeatureFunction - *A Function that will be called once for each created Feature, after it has -been created and styled. Useful for attaching events and popups to features. -The default is to do nothing with the newly created layers: -
    function (feature, layer) {}
    -
    filterFunction - *A Function that will be used to decide whether to include a feature or not. -The default is to include all features: -
    function (geoJsonFeature) {
    -    return true;
    -}
    -
    -

    Note: dynamically changing the filter option will have effect only on newly -added data. It will not re-evaluate already included features.

    coordsToLatLngFunction - *A Function that will be used for converting GeoJSON coordinates to LatLngs. -The default is the coordsToLatLng static method.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeradd - LayerEventFired when a layer is added to this FeatureGroup
    layerremove - LayerEventFired when a layer is removed from this FeatureGroup
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addData(data)this

    Adds a GeoJSON object to the layer.

    -
    resetStyle(layer)this

    Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.

    -
    setStyle(style)this

    Changes styles of GeoJSON vector layers with the given style function.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -    layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - -
    There are several static functions which can be called without instantiating L.GeoJSON:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    geometryToLayer(<Object> featureData, <GeoJSON options> options?)LayerCreates a Layer from a given GeoJSON feature. Can use a custom -pointToLayer and/or coordsToLatLng -functions if provided as options.
    coordsToLatLng(<Array> coords)LatLngCreates a LatLng object from an array of 2 numbers (longitude, latitude) -or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
    coordsToLatLngs(<Array> coords, <Number> levelsDeep?, <Function> coordsToLatLng?)ArrayCreates a multidimensional array of LatLngs from a GeoJSON coordinates array. -levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). -Can use a custom coordsToLatLng function.
    latLngToCoords(<LatLng> latlng, <Number> precision?)ArrayReverse of coordsToLatLng
    latLngsToCoords(<Array> latlngs, <Number> levelsDeep?, <Boolean> closed?)ArrayReverse of coordsToLatLngs -closed determines whether the first point should be appended to the end of the array to close the feature, only used when levelsDeep is 0. False by default.
    asFeature(<Object> geojson)ObjectNormalize GeoJSON geometries/features into GeoJSON features.
    - -
    - - -

    GridLayer

    Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas. -GridLayer can be extended to create a tiled grid of HTML elements like <canvas>, <img> or <div>. GridLayer will handle creating and animating these DOM elements for you.

    - -
    -

    Usage example

    - -
    - -

    Synchronous usage

    - - - -

    To create a custom layer, extend GridLayer and implement the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords){
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -        // get a canvas context and draw something on it using coords.x, coords.y and coords.z
    -        var ctx = tile.getContext('2d');
    -        // return the tile so it can be rendered on screen
    -        return tile;
    -    }
    -});
    -
    - - - -
    - -

    Asynchronous usage

    - - - -

    Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the done() callback.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords, done){
    -        var error;
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -        // draw something asynchronously and pass the tile to the done() callback
    -        setTimeout(function() {
    -            done(error, tile);
    -        }, 1000);
    -        return tile;
    -    }
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
    - -
    - - -
    -

    Options

    - -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point - 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber - 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean - (depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean - trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber - 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber - 1The explicit zIndex of the tile layer.
    boundsLatLngBounds - undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    minZoomNumber - 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber - undefinedThe maximum zoom level up to which this layer will be displayed (inclusive).
    maxNativeZoomNumber - undefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber - undefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBoolean - falseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString - 'tilePane'Map pane where the grid layer will be added.
    classNameString - ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber - 2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loading - EventFired when the grid layer starts loading tiles.
    tileunload - TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart - TileEventFired when a tile is requested and starts loading.
    tileerror - TileErrorEventFired when there is an error loading a tile.
    tileload - TileEventFired when a tile loads.
    load - EventFired when the grid layer loaded all visible tiles.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending GridLayer shall reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, must be overridden by classes extending GridLayer. -Returns the HTMLElement corresponding to the given coords. If the done callback -is specified, it must be called when the tile has finished loading and drawing.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LatLng

    Represents a geographical point with a certain latitude and longitude.

    - -
    -

    Usage example

    - -
    - - - - - -
    var latlng = L.latLng(50.5, 30.5);
    -

    All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

    -
    map.panTo([50, 30]);
    -map.panTo({lon: 30, lat: 50});
    -map.panTo({lat: 50, lng: 30});
    -map.panTo(L.latLng(50, 30));
    -

    Note that LatLng does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLng(<Number> latitude, <Number> longitude, <Number> altitude?)Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
    L.latLng(<Array> coords)Expects an array of the form [Number, Number] or [Number, Number, Number] instead.
    L.latLng(<Object> coords)Expects an plain object of the form {lat: Number, lng: Number} or {lat: Number, lng: Number, alt: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    equals(<LatLng> otherLatLng, <Number> maxMargin?)Boolean

    Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

    -
    toString()String

    Returns a string representation of the point (for debugging purposes).

    -
    distanceTo(<LatLng> otherLatLng)Number

    Returns the distance (in meters) to the given LatLng calculated using the Spherical Law of Cosines.

    -
    wrap()LatLng

    Returns a new LatLng object with the longitude wrapped so it's always between -180 and +180 degrees.

    -
    toBounds(<Number> sizeInMeters)LatLngBounds

    Returns a new LatLngBounds object in which each boundary is sizeInMeters/2 meters apart from the LatLng.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    lat - NumberLatitude in degrees
    lng - NumberLongitude in degrees
    alt - NumberAltitude in meters (optional)
    - -
    - - -

    LatLngBounds

    Represents a rectangular geographical area on a map.

    - -
    -

    Usage example

    - -
    - - - - - -
    var corner1 = L.latLng(40.712, -74.227),
    -corner2 = L.latLng(40.774, -74.125),
    -bounds = L.latLngBounds(corner1, corner2);
    -
    -

    All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    map.fitBounds([
    -    [40.712, -74.227],
    -    [40.774, -74.125]
    -]);
    -
    -

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range. -Note that LatLngBounds does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLngBounds(<LatLng> corner1, <LatLng> corner2)Creates a LatLngBounds object by defining two diagonally opposite corners of the rectangle.
    L.latLngBounds(<LatLng[]> latlngs)Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<LatLng> latlng)this

    Extend the bounds to contain the given point

    -
    extend(<LatLngBounds> otherBounds)this

    Extend the bounds to contain the given bounds

    -
    pad(<Number> bufferRatio)LatLngBounds

    Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. -For example, a ratio of 0.5 extends the bounds by 50% in each direction. -Negative values will retract the bounds.

    -
    getCenter()LatLng

    Returns the center point of the bounds.

    -
    getSouthWest()LatLng

    Returns the south-west point of the bounds.

    -
    getNorthEast()LatLng

    Returns the north-east point of the bounds.

    -
    getNorthWest()LatLng

    Returns the north-west point of the bounds.

    -
    getSouthEast()LatLng

    Returns the south-east point of the bounds.

    -
    getWest()Number

    Returns the west longitude of the bounds

    -
    getSouth()Number

    Returns the south latitude of the bounds

    -
    getEast()Number

    Returns the east longitude of the bounds

    -
    getNorth()Number

    Returns the north latitude of the bounds

    -
    contains(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<LatLng> latlng)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.

    -
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.

    -
    toBBoxString()String

    Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.

    -
    equals(<LatLngBounds> otherBounds, <Number> maxMargin?)Boolean

    Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting maxMargin to a small number.

    -
    isValid()Boolean

    Returns true if the bounds are properly initialized.

    -
    - -
    - - -

    Point

    Represents a point with x and y coordinates in pixels.

    - -
    -

    Usage example

    - -
    - - - - - -
    var point = L.point(200, 300);
    -
    -

    All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

    -
    map.panBy([200, 300]);
    -map.panBy(L.point(200, 300));
    -
    -

    Note that Point does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.point(<Number> x, <Number> y, <Boolean> round?)Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
    L.point(<Number[]> coords)Expects an array of the form [x, y] instead.
    L.point(<Object> coords)Expects a plain object of the form {x: Number, y: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    clone()Point

    Returns a copy of the current point.

    -
    add(<Point> otherPoint)Point

    Returns the result of addition of the current and the given points.

    -
    subtract(<Point> otherPoint)Point

    Returns the result of subtraction of the given point from the current.

    -
    divideBy(<Number> num)Point

    Returns the result of division of the current point by the given number.

    -
    multiplyBy(<Number> num)Point

    Returns the result of multiplication of the current point by the given number.

    -
    scaleBy(<Point> scale)Point

    Multiply each coordinate of the current point by each coordinate of -scale. In linear algebra terms, multiply the point by the -scaling matrix -defined by scale.

    -
    unscaleBy(<Point> scale)Point

    Inverse of scaleBy. Divide each coordinate of the current point by -each coordinate of scale.

    -
    round()Point

    Returns a copy of the current point with rounded coordinates.

    -
    floor()Point

    Returns a copy of the current point with floored coordinates (rounded down).

    -
    ceil()Point

    Returns a copy of the current point with ceiled coordinates (rounded up).

    -
    trunc()Point

    Returns a copy of the current point with truncated coordinates (rounded towards zero).

    -
    distanceTo(<Point> otherPoint)Number

    Returns the cartesian distance between the current and the given points.

    -
    equals(<Point> otherPoint)Boolean

    Returns true if the given point has the same coordinates.

    -
    contains(<Point> otherPoint)Boolean

    Returns true if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).

    -
    toString()String

    Returns a string representation of the point for debugging purposes.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    x - NumberThe x coordinate of the point
    y - NumberThe y coordinate of the point
    - -
    - - -

    Bounds

    Represents a rectangular area in pixel coordinates.

    - -
    -

    Usage example

    - -
    - - - - - -
    var p1 = L.point(10, 10),
    -p2 = L.point(40, 60),
    -bounds = L.bounds(p1, p2);
    -
    -

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    otherBounds.intersects([[10, 10], [40, 60]]);
    -
    -

    Note that Bounds does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.bounds(<Point> corner1, <Point> corner2)Creates a Bounds object from two corners coordinate pairs.
    L.bounds(<Point[]> points)Creates a Bounds object from the given array of points.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<Point> point)this

    Extends the bounds to contain the given point.

    -
    getCenter(<Boolean> round?)Point

    Returns the center point of the bounds.

    -
    getBottomLeft()Point

    Returns the bottom-left point of the bounds.

    -
    getTopRight()Point

    Returns the top-right point of the bounds.

    -
    getTopLeft()Point

    Returns the top-left point of the bounds (i.e. this.min).

    -
    getBottomRight()Point

    Returns the bottom-right point of the bounds (i.e. this.max).

    -
    getSize()Point

    Returns the size of the given bounds

    -
    contains(<Bounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<Point> point)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<Bounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds -intersect if they have at least one point in common.

    -
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds -overlap if their intersection is an area.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    min - PointThe top left corner of the rectangle.
    max - PointThe bottom right corner of the rectangle.
    - -
    - - -

    Icon

    Represents an icon to provide when creating a marker.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.icon({
    -    iconUrl: 'my-icon.png',
    -    iconSize: [38, 95],
    -    iconAnchor: [22, 94],
    -    popupAnchor: [-3, -76],
    -    shadowUrl: 'my-icon-shadow.png',
    -    shadowSize: [68, 95],
    -    shadowAnchor: [22, 94]
    -});
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.icon(<Icon options> options)Creates an icon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlString - null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString - nullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePoint - nullSize of the icon image in pixels.
    iconAnchorPoint - nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint - [0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint - [0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlString - nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString - null
    shadowSizePoint - nullSize of the shadow image in pixels.
    shadowAnchorPoint - nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString - ''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    - - -
    - -
    -

    Icon.Default

    - -
    - - - -
    A trivial subclass of Icon, represents the icon to use in Markers when -no icon is specified. Points to the blue marker image distributed with Leaflet -releases. -In order to customize the default icon, just change the properties of L.Icon.Default.prototype.options -(which is a set of Icon options). -If you want to completely replace the default icon, override the -L.Marker.prototype.options.icon with your own icon instead.
    - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    imagePathString - Icon.Default will try to auto-detect the location of the -blue icon images. If you are placing these images in a non-standard -way, set this option to point to the right path.
    - -
    - - -

    DivIcon

    Represents a lightweight icon for markers that uses a simple <div> -element instead of an image. Inherits from Icon but ignores the iconUrl and shadow options.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.divIcon({className: 'my-div-icon'});
    -// you can set .my-div-icon styles in CSS
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.divIcon(<DivIcon options> options)Creates a DivIcon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    htmlString|HTMLElement - ''Custom HTML code to put inside the div element, empty by default. Alternatively, -an instance of HTMLElement.
    bgPosPoint - [0, 0]Optional relative position of the background, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlString - null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString - nullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePoint - nullSize of the icon image in pixels.
    iconAnchorPoint - nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint - [0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint - [0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlString - nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString - null
    shadowSizePoint - nullSize of the shadow image in pixels.
    shadowAnchorPoint - nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString - ''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    -
    -
    - -

    Control.Zoom

    A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.zoom(<Control.Zoom options> options)Creates a zoom control
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    zoomInTextString - '+'The text set on the 'zoom in' button.
    zoomInTitleString - 'Zoom in'The title set on the 'zoom in' button.
    zoomOutTextString - '&#x2212' -The text set on the 'zoom out' button.
    zoomOutTitleString - 'Zoom out'The title set on the 'zoom out' button.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Attribution

    The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with the getAttribution method automatically. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.attribution(<Control.Attribution options> options)Creates an attribution control.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    prefixString - 'Leaflet'The HTML text shown before the attributions. Pass false to disable.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setPrefix(<String> prefix)this

    Sets the text before the attributions.

    -
    addAttribution(<String> text)this

    Adds an attribution text (e.g. 'Vector data &copy; Mapbox').

    -
    removeAttribution(<String> text)this

    Removes an attribution text.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Layers

    The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    var baseLayers = {
    -    "Mapbox": mapbox,
    -    "OpenStreetMap": osm
    -};
    -var overlays = {
    -    "Marker": marker,
    -    "Roads": roadsLayer
    -};
    -L.control.layers(baseLayers, overlays).addTo(map);
    -
    -

    The baseLayers and overlays parameters are object literals with layer names as keys and Layer objects as values:

    -
    {
    -    "<someName1>": layer1,
    -    "<someName2>": layer2
    -}
    -
    -

    The layer names can contain HTML, which allows you to add additional styling to the items:

    -
    {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.layers(<Object> baselayers?, <Object> overlays?, <Control.Layers options> options?)Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    collapsedBoolean - trueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
    autoZIndexBoolean - trueIf true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
    hideSingleBaseBoolean - falseIf true, the base layers in the control will be hidden when there is only one.
    sortLayersBoolean - falseWhether to sort the layers. When false, layers will keep the order -in which they were added to the control.
    sortFunctionFunction - *A compare function -that will be used for sorting the layers, when sortLayers is true. -The function receives both the L.Layer instances and their names, as in -sortFunction(layerA, layerB, nameA, nameB). -By default, it sorts layers alphabetically by their name.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addBaseLayer(<Layer> layer, <String> name)this

    Adds a base layer (radio button entry) with the given name to the control.

    -
    addOverlay(<Layer> layer, <String> name)this

    Adds an overlay (checkbox entry) with the given name to the control.

    -
    removeLayer(<Layer> layer)this

    Remove the given layer from the control.

    -
    expand()this

    Expand the control container if collapsed.

    -
    collapse()this

    Collapse the control container if expanded.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Scale

    A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.control.scale().addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.scale(<Control.Scale options> options?)Creates an scale control with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    maxWidthNumber - 100Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
    metricBoolean - TrueWhether to show the metric scale line (m/km).
    imperialBoolean - TrueWhether to show the imperial scale line (mi/ft).
    updateWhenIdleBoolean - falseIf true, the control is updated on moveend, otherwise it's always up-to-date (updated on move).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Browser

    A namespace with static properties for browser/feature detection used by Leaflet internally.

    - -
    -

    Usage example

    - -
    - - - - - -
    if (L.Browser.ielt9) {
    -  alert('Upgrade your browser, dude!');
    -}
    -
    - - - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    ie - Booleantrue for all Internet Explorer versions (not Edge).
    ielt9 - Booleantrue for Internet Explorer versions less than 9.
    edge - Booleantrue for the Edge web browser.
    webkit - Booleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
    android - Booleantrue for any browser running on an Android platform.
    android23 - Booleantrue for browsers running on Android 2 or Android 3.
    androidStock - Booleantrue for the Android stock browser (i.e. not Chrome)
    opera - Booleantrue for the Opera browser
    chrome - Booleantrue for the Chrome browser.
    gecko - Booleantrue for gecko-based browsers like Firefox.
    safari - Booleantrue for the Safari browser.
    opera12 - Booleantrue for the Opera browser supporting CSS transforms (version 12 or later).
    win - Booleantrue when the browser is running in a Windows platform
    ie3d - Booleantrue for all Internet Explorer versions supporting CSS transforms.
    webkit3d - Booleantrue for webkit-based browsers supporting CSS transforms.
    gecko3d - Booleantrue for gecko-based browsers supporting CSS transforms.
    any3d - Booleantrue for all browsers supporting CSS transforms.
    mobile - Booleantrue for all browsers running in a mobile device.
    mobileWebkit - Booleantrue for all webkit-based browsers in a mobile device.
    mobileWebkit3d - Booleantrue for all webkit-based browsers in a mobile device supporting CSS transforms.
    msPointer - Booleantrue for browsers implementing the Microsoft touch events model (notably IE10).
    pointer - Booleantrue for all browsers supporting pointer events.
    touch - Booleantrue for all browsers supporting touch events. -This does not necessarily mean that the browser is running in a computer with -a touchscreen, it only means that the browser is capable of understanding -touch events.
    mobileOpera - Booleantrue for the Opera browser in a mobile device.
    mobileGecko - Booleantrue for gecko-based browsers running in a mobile device.
    retina - Booleantrue for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%.
    canvas - Booleantrue when the browser supports <canvas>.
    svg - Booleantrue when the browser supports SVG.
    vml - Booleantrue if the browser supports VML.
    - -
    - - -

    Util

    Various utility functions, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> dest, <Object> src?)ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
    create(<Object> proto, <Object> properties?)ObjectCompatibility polyfill for Object.create
    bind(<Function> fn, )FunctionReturns a new function bound to the arguments passed, like Function.prototype.bind. -Has a L.bind() shortcut.
    stamp(<Object> obj)NumberReturns the unique ID of an object, assigning it one if it doesn't have it.
    throttle(<Function> fn, <Number> time, <Object> context)FunctionReturns a function which executes function fn with the given scope context -(so that the this keyword refers to context inside fn's code). The function -fn will be called no more than one time per given amount of time. The arguments -received by the bound function will be any arguments passed when binding the -function, followed by any arguments passed when invoking the bound function. -Has an L.throttle shortcut.
    wrapNum(<Number> num, <Number[]> range, <Boolean> includeMax?)NumberReturns the number num modulo range in such a way so it lies within -range[0] and range[1]. The returned value will be always smaller than -range[1] unless includeMax is set to true.
    falseFn()FunctionReturns a function which always returns false.
    formatNum(<Number> num, <Number> digits?)NumberReturns the number num rounded to digits decimals, or to 6 decimals by default.
    trim(<String> str)StringCompatibility polyfill for String.prototype.trim
    splitWords(<String> str)String[]Trims and splits the string on whitespace and returns the array of parts.
    setOptions(<Object> obj, <Object> options)ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.
    getParamString(<Object> obj, <String> existingUrl?, <Boolean> uppercase?)StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} -translates to '?a=foo&b=bar'. If existingUrl is set, the parameters will -be appended at the end. If uppercase is true, the parameter names will -be uppercased (e.g. '?A=foo&B=bar')
    template(<String> str, <Object> data)StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' -and a data object like {a: 'foo', b: 'bar'}, returns evaluated string -('Hello foo, bar'). You can also specify functions instead of strings for -data values — they will be evaluated passing data as an argument.
    isArray(obj)BooleanCompatibility polyfill for Array.isArray
    indexOf(<Array> array, <Object> el)NumberCompatibility polyfill for Array.prototype.indexOf
    requestAnimFrame(<Function> fn, <Object> context?, <Boolean> immediate?)NumberSchedules fn to be executed when the browser repaints. fn is bound to -context if given. When immediate is set, fn is called immediately if -the browser doesn't have native support for -window.requestAnimationFrame, -otherwise it's delayed. Returns a request ID that can be used to cancel the request.
    cancelAnimFrame(<Number> id)undefinedCancels a previous requestAnimFrame. See also window.cancelAnimationFrame.
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    lastId - NumberLast unique ID used by stamp()
    emptyImageUrl - StringData URI string containing a base64-encoded empty GIF image. -Used as a hack to free memory from unused images on WebKit-powered -mobile devices (by setting image src to this string).
    - -
    - - -

    Transformation

    Represents an affine transformation: a set of coefficients a, b, c, d -for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing -the reverse. Used by Leaflet in its projections code.

    - -
    -

    Usage example

    - -
    - - - - - -
    var transformation = L.transformation(2, 5, -1, 10),
    -    p = L.point(1, 2),
    -    p2 = transformation.transform(p), //  L.point(7, 8)
    -    p3 = transformation.untransform(p2); //  L.point(1, 2)
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.transformation(<Number> a, <Number> b, <Number> c, <Number> d)Instantiates a Transformation object with the given coefficients.
    L.transformation(<Array> coefficients)Expects an coefficients array of the form -[a: Number, b: Number, c: Number, d: Number].
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    transform(<Point> point, <Number> scale?)Point

    Returns a transformed point, optionally multiplied by the given scale. -Only accepts actual L.Point instances, not arrays.

    -
    untransform(<Point> point, <Number> scale?)Point

    Returns the reverse transformation of the given point, optionally divided -by the given scale. Only accepts actual L.Point instances, not arrays.

    -
    - -
    - - -

    LineUtil

    Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    simplify(<Point[]> points, <Number> tolerance)Point[]Dramatically reduces the number of points in a polyline while retaining -its shape and returns a new array of simplified points, using the -Douglas-Peucker algorithm. -Used for a huge performance boost when processing/displaying Leaflet polylines for -each zoom level and also reducing visual noise. tolerance affects the amount of -simplification (lesser value means higher quality but slower and with more points). -Also released as a separated micro-library Simplify.js.
    pointToSegmentDistance(<Point> p, <Point> p1, <Point> p2)NumberReturns the distance between point p and segment p1 to p2.
    closestPointOnSegment(<Point> p, <Point> p1, <Point> p2)NumberReturns the closest point from a point p on a segment p1 to p2.
    clipSegment(<Point> a, <Point> b, <Bounds> bounds, <Boolean> useLastCode?, <Boolean> round?)Point[]|BooleanClips the segment a to b by rectangular bounds with the -Cohen-Sutherland algorithm -(modifying the segment points directly!). Used by Leaflet to only show polyline -points that are on the screen or near, increasing performance.
    isFlat(<LatLng[]> latlngs)BooleanReturns true if latlngs is a flat array, false is nested.
    - -
    - - -

    PolyUtil

    Various utility functions for polygon geometries.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    clipPolygon(<Point[]> points, <Bounds> bounds, <Boolean> round?)Point[]Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgman algorithm). -Used by Leaflet to only show polygon points that are on the screen or near, increasing -performance. Note that polygon points needs different algorithm for clipping -than polyline, so there's a separate method for it.
    - -
    - - -

    DomEvent

    Utility functions to work with the DOM events, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    on(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisAdds a listener function (fn) to a particular DOM event type of the -element el. You can optionally specify the context of the listener -(object the this keyword will point to). You can also pass several -space-separated types (e.g. 'click dblclick').
    on(<HTMLElement> el, <Object> eventMap, <Object> context?)thisAdds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    off(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisRemoves a previously added listener function. -Note that if you passed a custom context to on, you must pass the same -context to off in order to remove the listener.
    off(<HTMLElement> el, <Object> eventMap, <Object> context?)thisRemoves a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    stopPropagation(<DOMEvent> ev)thisStop the given event from propagation to parent elements. Used inside the listener functions: -
    L.DomEvent.on(div, 'click', function (ev) {
    -    L.DomEvent.stopPropagation(ev);
    -});
    -
    disableScrollPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'mousewheel' events (plus browser variants).
    disableClickPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'click', 'doubleclick', -'mousedown' and 'touchstart' events (plus browser variants).
    preventDefault(<DOMEvent> ev)thisPrevents the default action of the DOM Event ev from happening (such as -following a link in the href of the a element, or doing a POST request -with page reload when a <form> is submitted). -Use it inside listener functions.
    stop(<DOMEvent> ev)thisDoes stopPropagation and preventDefault at the same time.
    getMousePosition(<DOMEvent> ev, <HTMLElement> container?)PointGets normalized mouse position from a DOM event relative to the -container (border excluded) or to the whole page if not specified.
    getWheelDelta(<DOMEvent> ev)NumberGets normalized wheel delta from a mousewheel DOM event, in vertical -pixels scrolled (negative if scrolling down). -Events from pointing devices without precise scrolling are mapped to -a best guess of 60 pixels.
    addListener()thisAlias to L.DomEvent.on
    removeListener()thisAlias to L.DomEvent.off
    - -
    - - -

    DomUtil

    Utility functions to work with the DOM -tree, used by Leaflet internally. -Most functions expecting or returning a HTMLElement also work for -SVG elements. The only difference is that classes refer to CSS classes -in HTML and SVG classes in SVG.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    get(<String|HTMLElement> id)HTMLElementReturns an element given its DOM id, or returns the element itself -if it was passed directly.
    getStyle(<HTMLElement> el, <String> styleAttrib)StringReturns the value for a certain style attribute on an element, -including computed values or values set through CSS.
    create(<String> tagName, <String> className?, <HTMLElement> container?)HTMLElementCreates an HTML element with tagName, sets its class to className, and optionally appends it to container element.
    remove(<HTMLElement> el)Removes el from its parent element
    empty(<HTMLElement> el)Removes all of el's children elements from el
    toFront(<HTMLElement> el)Makes el the last child of its parent, so it renders in front of the other children.
    toBack(<HTMLElement> el)Makes el the first child of its parent, so it renders behind the other children.
    hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element's class attribute contains name.
    addClass(<HTMLElement> el, <String> name)Adds name to the element's class attribute.
    removeClass(<HTMLElement> el, <String> name)Removes name from the element's class attribute.
    setClass(<HTMLElement> el, <String> name)Sets the element's class.
    getClass(<HTMLElement> el)StringReturns the element's class.
    setOpacity(<HTMLElement> el, <Number> opacity)Set the opacity of an element (including old IE support). -opacity must be a number from 0 to 1.
    testProp(<String[]> props)String|falseGoes through the array of style names and returns the first name -that is a valid style name for an element. If no such name is found, -it returns false. Useful for vendor-prefixed styles like transform.
    setTransform(<HTMLElement> el, <Point> offset, <Number> scale?)Resets the 3D CSS transform of el so it is translated by offset pixels -and optionally scaled by scale. Does not have an effect if the -browser doesn't support 3D CSS transforms.
    setPosition(<HTMLElement> el, <Point> position)Sets the position of el to coordinates specified by position, -using CSS translate or top/left positioning depending on the browser -(used by Leaflet internally to position its layers).
    getPosition(<HTMLElement> el)PointReturns the coordinates of an element previously positioned with setPosition.
    disableTextSelection()Prevents the user from generating selectstart DOM events, usually generated -when the user drags the mouse through a page with text. Used internally -by Leaflet to override the behaviour of any click-and-drag interaction on -the map. Affects drag interactions on the whole document.
    enableTextSelection()Cancels the effects of a previous L.DomUtil.disableTextSelection.
    disableImageDrag()As L.DomUtil.disableTextSelection, but -for dragstart DOM events, usually generated when the user drags an image.
    enableImageDrag()Cancels the effects of a previous L.DomUtil.disableImageDrag.
    preventOutline(<HTMLElement> el)Makes the outline -of the element el invisible. Used internally by Leaflet to prevent -focusable elements from displaying an outline when the user performs a -drag interaction on them.
    restoreOutline()Cancels the effects of a previous L.DomUtil.preventOutline.
    getSizedParentNode(<HTMLElement> el)HTMLElementFinds the closest parent node which size (width and height) is not null.
    getScale(<HTMLElement> el)ObjectComputes the CSS scale currently applied on the element. -Returns an object with x and y members as horizontal and vertical scales respectively, -and boundingClientRect as the result of getBoundingClientRect().
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    TRANSFORM - StringVendor-prefixed transform style name (e.g. 'webkitTransform' for WebKit).
    TRANSITION - StringVendor-prefixed transition style name.
    TRANSITION_END - StringVendor-prefixed transitionend event name.
    - -
    - - -

    PosAnimation

    Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

    - -
    -

    Usage example

    - -
    - - - - - -
    var fx = new L.PosAnimation();
    -fx.run(el, [300, 500], 0.5);
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.PosAnimation()Creates a PosAnimation object.
    - - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    start - EventFired when the animation starts
    step - EventFired continuously during the animation.
    end - EventFired when the animation ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    run(<HTMLElement> el, <Point> newPos, <Number> duration?, <Number> easeLinearity?)

    Run an animation of a given element to a new position, optionally setting -duration in seconds (0.25 by default) and easing linearity factor (3rd -argument of the cubic bezier curve, -0.5 by default).

    -
    stop()

    Stops the animation (if currently running).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Draggable

    A class for making DOM elements draggable (including touch support). -Used internally for map and marker dragging. Only works for elements -that were positioned with L.DomUtil.setPosition.

    - -
    -

    Usage example

    - -
    - - - - - -
    var draggable = new L.Draggable(elementToDrag);
    -draggable.enable();
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.Draggable(<HTMLElement> el, <HTMLElement> dragHandle?, <Boolean> preventOutline?, <Draggable options> options?)Creates a Draggable object for moving el when you start dragging the dragHandle element (equals el itself by default).
    - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    clickToleranceNumber - 3The max number of pixels a user can shift the mouse pointer during a click -for it to be considered a valid click (as opposed to a mouse drag).
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    down - EventFired when a drag is about to start.
    dragstart - EventFired when a drag starts
    predrag - EventFired continuously during dragging before each corresponding -update of the element's position.
    drag - EventFired continuously during dragging.
    dragend - DragEndEventFired when the drag ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()

    Enables the dragging ability

    -
    disable()

    Disables the dragging ability

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Class

    L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here. -In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

    - -
    -

    Usage example

    - -
    - - - - - -
    var MyClass = L.Class.extend({
    -initialize: function (greeter) {
    -    this.greeter = greeter;
    -    // class constructor
    -},
    -greet: function (name) {
    -    alert(this.greeter + ', ' + name)
    -    }
    -});
    -// create instance of MyClass, passing "Hello" to the constructor
    -var a = new MyClass("Hello");
    -// call greet method, alerting "Hello, World"
    -a.greet("World");
    -
    - - - -
    - -

    Class Factories

    - - - -

    You may have noticed that Leaflet objects are created without using -the new keyword. This is achieved by complementing each class with a -lowercase factory method:

    -
    new L.Map('map'); // becomes:
    -L.map('map');
    -
    -

    The factories are implemented very easily, and you can do this for your own classes:

    -
    L.map = function (id, options) {
    -    return new L.Map(id, options);
    -};
    -
    - - - -
    - -

    Inheritance

    - - - -

    You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

    -
    var MyChildClass = MyClass.extend({
    -    // ... new properties and methods
    -});
    -
    -

    This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

    -
    var a = new MyChildClass();
    -a instanceof MyChildClass; // true
    -a instanceof MyClass; // true
    -
    -

    You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

    -
    var MyChildClass = MyClass.extend({
    -    initialize: function () {
    -        MyClass.prototype.initialize.call(this, "Yo");
    -    },
    -    greet: function (name) {
    -        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
    -    }
    -});
    -var a = new MyChildClass();
    -a.greet('Jason'); // alerts "Yo, bro Jason!"
    -
    - - -
    - -

    Options

    - - - -

    options is a special property that unlike other objects that you pass -to extend will be merged with the parent one instead of overriding it -completely, which makes managing configuration of objects and default -values convenient:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        myOption1: 'foo',
    -        myOption2: 'bar'
    -    }
    -});
    -var MyChildClass = MyClass.extend({
    -    options: {
    -        myOption1: 'baz',
    -        myOption3: 5
    -    }
    -});
    -var a = new MyChildClass();
    -a.options.myOption1; // 'baz'
    -a.options.myOption2; // 'bar'
    -a.options.myOption3; // 5
    -
    -

    There's also L.Util.setOptions, a method for -conveniently merging options passed to constructor with the defaults -defines in the class:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        foo: 'bar',
    -        bla: 5
    -    },
    -    initialize: function (options) {
    -        L.Util.setOptions(this, options);
    -        ...
    -    }
    -});
    -var a = new MyClass({bla: 10});
    -a.options; // {foo: 'bar', bla: 10}
    -
    -

    Note that the options object allows any keys, not just -the options defined by the class and its base classes. -This means you can use the options object to store -application specific information, as long as you avoid -keys that are already used by the class in question.

    - - - -
    - -

    Includes

    - - - -

    includes is a special class property that merges all specified objects into the class (such objects are called mixins).

    -
     var MyMixin = {
    -    foo: function () { ... },
    -    bar: 5
    -};
    -var MyClass = L.Class.extend({
    -    includes: MyMixin
    -});
    -var a = new MyClass();
    -a.foo();
    -
    -

    You can also do such includes in runtime with the include method:

    -
    MyClass.include(MyMixin);
    -
    -

    statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

    -
    var MyClass = L.Class.extend({
    -    statics: {
    -        FOO: 'bar',
    -        BLA: 5
    -    }
    -});
    -MyClass.FOO; // 'bar'
    -
    - - - -
    - -

    Constructor hooks

    - - - -

    If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

    -
    MyClass.addInitHook(function () {
    -    // ... do something in constructor additionally
    -    // e.g. add event listeners, set custom properties etc.
    -});
    -
    -

    You can also use the following shortcut when you just need to make one additional method call:

    -
    MyClass.addInitHook('methodName', arg1, arg2, …);
    -
    - - - -
    - - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> props)FunctionExtends the current class given the properties to be included. -Returns a Javascript function that is a class constructor (to be called with new).
    include(<Object> properties)thisIncludes a mixin into the current class.
    mergeOptions(<Object> options)thisMerges options into the defaults of the class.
    addInitHook(<Function> fn)thisAdds a constructor hook to the class.
    - -
    - - -

    Evented

    A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

    - -
    -

    Usage example

    - -
    - - - - - -
    map.on('click', function(e) {
    -    alert(e.latlng);
    -} );
    -
    -

    Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

    -
    function onClick(e) { ... }
    -map.on('click', onClick);
    -map.off('click', onClick);
    -
    - - - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    - - -

    Layer

    A set of methods from the Layer base class that all Leaflet layers use. -Inherits all methods, options and events from L.Evented.

    - -
    -

    Usage example

    - -
    - - - - - -
    var layer = L.marker(latlng).addTo(map);
    -layer.addTo(map);
    -layer.remove();
    -
    - - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Layer will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    - -

    Extension methods

    - -
    Every layer should extend from L.Layer and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)this

    Should contain code that creates DOM elements for the layer, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).

    -
    onRemove(<Map> map)this

    Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).

    -
    getEvents()Object

    This optional method should return an object like { viewreset: this._reset } for addEventListener. The event handlers in this object will be automatically added and removed from the map with your layer.

    -
    getAttribution()String

    This optional method should return a string containing HTML to be shown on the Attribution control whenever the layer is visible.

    -
    beforeAdd(<Map> map)this

    Optional method. Called on map.addLayer(layer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.

    -
    - -
    - -

    Popup methods

    - -
    All layers share a set of methods convenient for binding popups to it. -
    var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
    -layer.openPopup();
    -layer.closePopup();
    -
    -

    Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    - -

    Tooltip methods

    - -
    All layers share a set of methods convenient for binding tooltips to it. -
    var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
    -layer.openTooltip();
    -layer.closeTooltip();
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Interactive layer

    Some Layers can be made interactive - when the user interacts -with such a layer, mouse events like click and mouseover can be handled. -Use the event handling methods to handle these events.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBoolean - trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    bubblingMouseEventsBoolean - trueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - -

    Mouse events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    click - MouseEventFired when the user clicks (or taps) the layer.
    dblclick - MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown - MouseEventFired when the user pushes the mouse button on the layer.
    mouseup - MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover - MouseEventFired when the mouse enters the layer.
    mouseout - MouseEventFired when the mouse leaves the layer.
    contextmenu - MouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Control

    L.Control is a base class for implementing map controls. Handles positioning. -All other controls extend from this class.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString - 'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Control will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    - -

    Extension methods

    - -
    Every control should extend from L.Control and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)HTMLElement

    Should return the container DOM element for the control and add listeners on relevant map events. Called on control.addTo(map).

    -
    onRemove(<Map> map)

    Optional method. Should contain all clean up code that removes the listeners previously added in onAdd. Called on control.remove().

    -
    - -
    - - -

    Handler

    Abstract class for map interaction handlers

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()this

    Enables the handler

    -
    disable()this

    Disables the handler

    -
    enabled()Boolean

    Returns true if the handler is enabled

    -
    - -
    - -

    Extension methods

    - -
    Classes inheriting from Handler must implement the two following methods:
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHooks()

    Called when the handler is enabled, should add event hooks.

    -
    removeHooks()

    Called when the handler is disabled, should remove the event hooks added previously.

    -
    - -
    - - -
    -

    Functions

    - -
    - -

    There is static function which can be called without instantiating L.Handler:

    - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    addTo(<Map> map, <String> name)thisAdds a new Handler to the given map with the given name.
    - -
    - - -

    Projection

    An object with methods for projecting geographical coordinates of the world onto -a flat surface (and back). See Map projection.

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    project(<LatLng> latlng)Point

    Projects geographical coordinates into a 2D point. -Only accepts actual L.LatLng instances, not arrays.

    -
    unproject(<Point> point)LatLng

    The inverse of project. Projects a 2D point into a geographical location. -Only accepts actual L.Point instances, not arrays. -Note that the projection instances do not inherit from Leaflet's Class object, -and can't be instantiated. Also, new classes can't inherit from them, -and methods can't be added to them with the include function.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    bounds - BoundsThe bounds (specified in CRS units) where the projection is valid
    - -
    - - -
    -

    Defined projections

    - -
    - - - -
    Leaflet comes with a set of already defined Projections out of the box:
    - - - - - - - - - - - - - - - - - - - -
    ProjectionDescription
    L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, -mostly used by GIS enthusiasts. Directly maps x as longitude, and y as -latitude. Also suitable for flat worlds, e.g. game maps. Used by the -EPSG:4326 and Simple CRS.
    L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS.
    L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, -used by almost all free and commercial tile providers. Assumes that Earth is -a sphere. Used by the EPSG:3857 CRS.
    - -
    - - -

    CRS

    -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    latLngToPoint(<LatLng> latlng, <Number> zoom)Point

    Projects geographical coordinates into pixel coordinates for a given zoom.

    -
    pointToLatLng(<Point> point, <Number> zoom)LatLng

    The inverse of latLngToPoint. Projects pixel coordinates on a given -zoom into geographical coordinates.

    -
    project(<LatLng> latlng)Point

    Projects geographical coordinates into coordinates in units accepted for -this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).

    -
    unproject(<Point> point)LatLng

    Given a projected coordinate returns the corresponding LatLng. -The inverse of project.

    -
    scale(<Number> zoom)Number

    Returns the scale used when transforming projected coordinates into -pixel coordinates for a particular zoom. For example, it returns -256 * 2^zoom for Mercator-based CRS.

    -
    zoom(<Number> scale)Number

    Inverse of scale(), returns the zoom level corresponding to a scale -factor of scale.

    -
    getProjectedBounds(<Number> zoom)Bounds

    Returns the projection's bounds scaled and transformed for the provided zoom.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds.

    -
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring -that its center is within the CRS's bounds. -Only accepts actual L.LatLngBounds instances, not arrays.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    code - StringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857')
    wrapLng - Number[]An array of two numbers defining whether the longitude (horizontal) coordinate -axis wraps around a given range and how. Defaults to [-180, 180] in most -geographical CRSs. If undefined, the longitude axis does not wrap around.
    wrapLat - Number[]Like wrapLng, but for the latitude (vertical) axis.
    infinite - BooleanIf true, the coordinate space will be unbounded (infinite in both axes)
    - -
    - - -
    -

    Defined CRSs

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CRSDescription
    L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
    L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial -tile providers. Uses Spherical Mercator projection. Set in by default in -Map's crs option.
    L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. -Leaflet 1.0.x complies with the TMS coordinate scheme for EPSG:4326, -which is a breaking change from 0.7.x behaviour. If you are using a TileLayer -with this CRS, ensure that there are two 256x256 pixel tiles covering the -whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), -or (-180,-90) for TileLayers with the tms option set.
    L.CRS.EarthServes as the base for CRS that are global such that they cover the earth. -Can only be used as the base for other CRS and cannot be used directly, -since it does not have a code, projection or transformation. distance() returns -meters.
    L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. -May be used for maps of flat surfaces (e.g. game maps). Note that the y -axis should still be inverted (going from bottom to top). distance() returns -simple euclidean distance.
    L.CRS.BaseObject that defines coordinate reference systems for projecting -geographical points into pixel (screen) coordinates and back (and to -coordinates in other units for WMS services). See -spatial reference system. -Leaflet defines the most usual CRSs by default. If you want to use a -CRS not defined by default, take a look at the -Proj4Leaflet plugin. -Note that the CRS instances do not inherit from Leaflet's Class object, -and can't be instantiated. Also, new classes can't inherit from them, -and methods can't be added to them with the include function.
    - -
    - - -

    Renderer

    Base class for vector renderer implementations (SVG, Canvas). Handles the -DOM container of the renderer, its bounds, and its zoom animation. -A Renderer works as an implicit layer group for all Paths - the renderer -itself can be added or removed to the map. All paths use a renderer, which can -be implicit (the map will decide the type of renderer and use it automatically) -or explicit (using the renderer option of the path). -Do not use this class directly, use SVG and Canvas instead.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber - 0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber - 0How much to extend click tolerance round a path/object on the map
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString - 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - -
    EventDataDescription
    update - EventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Event objects

    Whenever a class inheriting from Evented fires an event, a listener function -will be called with an event argument, which is a plain object containing -information about the event. For example:

    -
    map.on('click', function(ev) {
    -    alert(ev.latlng); // ev is an event object (MouseEvent in this case)
    -});
    -
    -

    The information available depends on the event type:

    - - - -
    -

    Event

    - -
    - - - -
    The base event object. All other event objects contain these properties too.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    - - -
    - -
    -

    KeyboardEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    originalEvent - DOMEventThe original DOM KeyboardEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    MouseEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlng - LatLngThe geographical point where the mouse event occurred.
    layerPoint - PointPixel coordinates of the point where the mouse event occurred relative to the map layer.
    containerPoint - PointPixel coordinates of the point where the mouse event occurred relative to the map сontainer.
    originalEvent - DOMEventThe original DOM MouseEvent or DOM TouchEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    LocationEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlng - LatLngDetected geographical location of the user.
    bounds - LatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
    accuracy - NumberAccuracy of location in meters.
    altitude - NumberHeight of the position above the WGS84 ellipsoid in meters.
    altitudeAccuracy - NumberAccuracy of altitude in meters.
    heading - NumberThe direction of travel in degrees counting clockwise from true North.
    speed - NumberCurrent velocity in meters per second.
    timestamp - NumberThe time when the position was acquired.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    message - StringError message.
    code - NumberError code (if applicable).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    LayerEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    LayersControlEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer that was added or removed.
    name - StringThe name of the layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    TileEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tile - HTMLElementThe tile element (image).
    coords - PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    TileErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tile - HTMLElementThe tile element (image).
    coords - PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    error - *Error passed to the tile's done() callback.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ResizeEvent

    - -
    - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    oldSize - PointThe old size before resize event.
    newSize - PointThe new size after the resize event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    GeoJSONEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layer - LayerThe layer for the GeoJSON feature that is being added to the map.
    properties - ObjectGeoJSON properties of the feature.
    geometryType - StringGeoJSON geometry type of the feature.
    id - StringGeoJSON ID of the feature (if present).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    PopupEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    popup - PopupThe popup that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    TooltipEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tooltip - TooltipThe tooltip that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    DragEndEvent

    - -
    - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    distance - NumberThe distance in pixels the draggable element was moved by.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ZoomAnimEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    center - LatLngThe current center of the map
    zoom - NumberThe current zoom level of the map
    noUpdate - BooleanWhether layers should update their contents due to this event
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    type - StringThe event type (e.g. 'click').
    target - ObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTarget - ObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFrom - ObjectFor propagated events, the last object that propagated the event to its -event parent.
    layer - ObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -

    DivOverlay

    Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    offsetPoint - Point(0, 7)The offset of the popup position. Useful to control the anchor -of the popup when opening it on some overlays.
    classNameString - ''A custom CSS class name to assign to the popup.
    paneString - 'popupPane'Map pane where the popup will be added.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionString - nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    add - EventFired after the layer is added to a map
    remove - EventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopen - PopupEventFired when a popup bound to this layer is opened
    popupclose - PopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopen - TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose - TooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Global Switches

    Global switches are created for rare cases and generally make -Leaflet to not detect a particular browser feature even if it's -there. You need to set the switch as a global variable to true -before including Leaflet on the page, like this:

    -
    <script>L_NO_TOUCH = true;</script>
    -<script src="leaflet.js"></script>
    -
    - - - - - - - - - - - - - - - - - -
    SwitchDescription
    L_NO_TOUCHForces Leaflet to not use touch events even if it detects them.
    L_DISABLE_3DForces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.
    - -

    noConflict

    This method restores the L global variable to the original value -it had before Leaflet inclusion, and returns the real Leaflet -namespace so you can put it elsewhere, like this:

    -
    <script src='libs/l.js'>
    -<!-- L points to some other library -->
    -<script src='leaflet.js'>
    -<!-- you include Leaflet, it replaces the L variable to Leaflet namespace -->
    -<script>
    -var Leaflet = L.noConflict();
    -// now L points to that other library again, and you can use Leaflet.Map etc.
    -</script>
    -
    - -

    version

    A constant that represents the Leaflet version in use.

    -
    L.version; // contains "1.0.0" (or whatever version is currently in use)
    -
    diff --git a/docs/reference-versions.html b/docs/reference-versions.html index 79b2031f373..25c8d41e16f 100644 --- a/docs/reference-versions.html +++ b/docs/reference-versions.html @@ -10,15 +10,11 @@

    Available API References

    From 77b756f07c39f7c26ba75027be2b04da6abb4ddb Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 20 Mar 2020 12:11:39 +0200 Subject: [PATCH 051/306] subtly improve website contrast, close #6921 --- docs/docs/css/main.css | 20 ++++++++++---------- docs/docs/css/reference.css | 15 +-------------- 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/docs/docs/css/main.css b/docs/docs/css/main.css index 21f4431026e..9338f9ca2c5 100644 --- a/docs/docs/css/main.css +++ b/docs/docs/css/main.css @@ -11,7 +11,7 @@ html, body, input, select, button, textarea, table { body { line-height: 1.5; - color: #333; + color: black; background-color: white; } @@ -20,7 +20,7 @@ p { } a, a span.hljs-string { - color: #1EB300; + color: #199900; } a:hover, a:focus { @@ -28,8 +28,8 @@ a:hover, a:focus { } hr { - background: #ddd; - color: #ddd; + background: #ccc; + color: #ccc; height: 1px; margin: 0 0 1.4em; border: none; @@ -180,7 +180,7 @@ h3.tagline { font-size: 1.5em; margin-top: -.75em; padding: 0; - color: #777; + color: #333; text-align: center; margin-bottom: 30px; } @@ -192,7 +192,7 @@ h3.tagline { text-align: center; font-size: 1.25em; margin-bottom: 40px; - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #ccc; padding-bottom: 40px; } @@ -215,7 +215,7 @@ h3.tagline { .ext-link { display: block; - opacity: 0.5; + opacity: 0.7; -webkit-animation: fadein 1s; animation: fadein 1s; } @@ -224,11 +224,11 @@ h3.tagline { } @-webkit-keyframes fadein { from { opacity: 0; } - to { opacity: 0.5; } + to { opacity: 0.7; } } @keyframes fadein { from { opacity: 0; } - to { opacity: 0.5; } + to { opacity: 0.7; } } @@ -257,7 +257,7 @@ h3.tagline { } .quiet { - color: #999; + color: #888; } diff --git a/docs/docs/css/reference.css b/docs/docs/css/reference.css index 982b2306d8b..dbbbb97a369 100644 --- a/docs/docs/css/reference.css +++ b/docs/docs/css/reference.css @@ -90,22 +90,9 @@ section.collapsable > div.section-comments > p { } div.section-comments { - margin-bottom: 0.25em; + margin-bottom: 0.5em; } -/* section.collapsable div.section-comments { - margin: 1em; - font-size: 12px; -}*/ - section.collapsable pre { margin:0; } - -section { - margin-left: 0.5em; -} - -section h4, section.collapsable h4 { - margin-left: -0.5em; -} From 61219d38ed1c41f933676e12a5070fc1818c5c03 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 20 Mar 2020 12:16:27 +0200 Subject: [PATCH 052/306] adjust "trusted by the best" block --- docs/docs/css/main.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/docs/css/main.css b/docs/docs/css/main.css index 9338f9ca2c5..bb7a50e370d 100644 --- a/docs/docs/css/main.css +++ b/docs/docs/css/main.css @@ -272,20 +272,20 @@ h3.tagline { .usedby-title { text-align: center; background-color: #f5f5f5; - padding: 1.5em 1em 0.5em; + padding: 1em 1em 0.5em; margin: 0; } .usedby { margin: 0 0 3em; text-align: center; - padding: 0 3em 2em; + padding: 0 3em 0; background-color: #f5f5f5; } .logo { display: inline-block; - opacity: 0.6; + opacity: 0.8; height: 32px; overflow: hidden; text-indent: -9999px; From c2b4d7e1aa78bc98af12c8493349969dc4dccd8f Mon Sep 17 00:00:00 2001 From: johnd0e Date: Mon, 23 Mar 2020 12:00:54 +0200 Subject: [PATCH 053/306] Fix invalid condition in _addPointerStart (#7033) * Fix bug introduced in 19d2bd027ec1616f05759224f3c53081b6fad6af (brackets missing) The condition was never met: `e.pointerType !== 'mouse' && e.MSPOINTER_TYPE_MOUSE` * fixup! Fix bug introduced in 19d2bd027ec1616f05759224f3c53081b6fad6af (brackets missing) Co-Authored-By: Vladimir Agafonkin Co-authored-by: Vladimir Agafonkin --- src/dom/DomEvent.Pointer.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index 4382ba2db4c..0f6d4732e39 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -52,15 +52,14 @@ export function removePointerListener(obj, type, id) { function _addPointerStart(obj, handler, id) { var onDown = Util.bind(function (e) { - if (e.pointerType !== 'mouse' && e.MSPOINTER_TYPE_MOUSE && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) { + if (e.pointerType !== (e.MSPOINTER_TYPE_MOUSE || 'mouse')) { // In IE11, some touch events needs to fire for form controls, or // the controls will stop working. We keep a whitelist of tag names that // need these events. For other target tags, we prevent default on the event. - if (TAG_WHITE_LIST.indexOf(e.target.tagName) < 0) { - DomEvent.preventDefault(e); - } else { + if (Browser.ie && TAG_WHITE_LIST.indexOf(e.target.tagName) >= 0) { return; } + DomEvent.preventDefault(e); } _handlePointer(e, handler); @@ -108,7 +107,9 @@ function _handlePointer(e, handler) { function _addPointerMove(obj, handler, id) { var onMove = function (e) { // don't fire touch moves when mouse isn't down - if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; } + if ((e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) && e.buttons === 0) { + return; + } _handlePointer(e, handler); }; @@ -126,4 +127,3 @@ function _addPointerEnd(obj, handler, id) { obj.addEventListener(POINTER_UP, onUp, false); obj.addEventListener(POINTER_CANCEL, onUp, false); } - From d843c3b88486713827d7e860b58bdba75bfbd5a2 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Mon, 23 Mar 2020 12:02:45 +0200 Subject: [PATCH 054/306] Attach pointer tracker listeners to document (instead of documentElement) (#7041) Otherwise it's not possible to capture events in some cases. --- src/dom/DomEvent.Pointer.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index 0f6d4732e39..661a4a66488 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -70,11 +70,11 @@ function _addPointerStart(obj, handler, id) { // need to keep track of what pointers and how many are active to provide e.touches emulation if (!_pointerDocListener) { - // we listen documentElement as any drags that end by moving the touch off the screen get fired there - document.documentElement.addEventListener(POINTER_DOWN, _globalPointerDown, true); - document.documentElement.addEventListener(POINTER_MOVE, _globalPointerMove, true); - document.documentElement.addEventListener(POINTER_UP, _globalPointerUp, true); - document.documentElement.addEventListener(POINTER_CANCEL, _globalPointerUp, true); + // we listen document as any drags that end by moving the touch off the screen get fired there + document.addEventListener(POINTER_DOWN, _globalPointerDown, true); + document.addEventListener(POINTER_MOVE, _globalPointerMove, true); + document.addEventListener(POINTER_UP, _globalPointerUp, true); + document.addEventListener(POINTER_CANCEL, _globalPointerUp, true); _pointerDocListener = true; } From 167a46da269f12b1120d8eeed9e4bb72e9e9620a Mon Sep 17 00:00:00 2001 From: mondeja Date: Fri, 10 Apr 2020 09:11:22 +0200 Subject: [PATCH 055/306] Added tests for Bounds.overlaps and Bounds.intersects. (#7075) --- spec/suites/geometry/BoundsSpec.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/spec/suites/geometry/BoundsSpec.js b/spec/suites/geometry/BoundsSpec.js index 9eafba8425d..51a5183b7a5 100644 --- a/spec/suites/geometry/BoundsSpec.js +++ b/spec/suites/geometry/BoundsSpec.js @@ -74,7 +74,27 @@ describe('Bounds', function () { describe('#intersects', function () { it('returns true if bounds intersect', function () { expect(a.intersects(b)).to.be(true); - expect(a.intersects(new L.Bounds(new L.Point(100, 100), new L.Point(120, 120)))).to.eql(false); + }); + it('two bounds intersect if they have at least one point in common', function () { + expect(a.intersects(new L.Bounds(new L.Point(14, 12), new L.Point(6, 5)))).to.be(true); + }); + it('returns false if bounds not intersect', function () { + expect(a.intersects(new L.Bounds(new L.Point(100, 100), new L.Point(120, 120)))).to.eql(false); + }); + }); + + describe('#overlaps', function () { + it('returns true if bounds overlaps', function () { + expect(a.overlaps(b)).to.be(true); + }); + it('two bounds overlaps if their intersection is an area', function () { + // point in common + expect(a.overlaps(new L.Bounds(new L.Point(14, 12), new L.Point(6, 5)))).to.be(false); + // matching boundary + expect(a.overlaps(new L.Bounds(new L.Point(30, 12), new L.Point(35, 25)))).to.be(false); + }); + it('returns false if bounds not overlaps', function () { + expect(a.overlaps(new L.Bounds(new L.Point(100, 100), new L.Point(120, 120)))).to.eql(false); }); }); From 092070d64f4c32bb9637e2a68690a71b88f61666 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 10 Apr 2020 10:12:18 +0300 Subject: [PATCH 056/306] Canvas events handling: do not block events on dragging (#7068) --- src/layer/vector/Canvas.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 34186fc9805..726465f0b9d 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -348,8 +348,10 @@ export var Canvas = Renderer.extend({ for (var order = this._drawFirst; order; order = order.next) { layer = order.layer; - if (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) { - clickedLayer = layer; + if (layer.options.interactive && layer._containsPoint(point)) { + if (!(e.type === 'click' || e.type !== 'preclick') || !this._map._draggableMoved(layer)) { + clickedLayer = layer; + } } } if (clickedLayer) { From 9be733ee38073d7e66d26a606927f700a0374957 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 10 Apr 2020 10:14:49 +0300 Subject: [PATCH 057/306] DomEvent: use passive for touchmove (instead of touchend) (#7060) * DomEvent: use passive for touchmove (instead of touchend) Ref: https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners * Remove excessive brackets from condition * DomEvent: simplify more conditions Also add passive option for `wheel` event listeners (previously it was supported for `mousewheel` only) * Prefer `wheel` over `mousewheel` throughout sources --- src/dom/DomEvent.js | 32 +++++++++++--------------- src/map/handler/Map.ScrollWheelZoom.js | 6 ++--- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 081c8303fdf..a79ddffde95 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -77,6 +77,12 @@ function browserFiresNativeDblClick() { } } +var mouseSubst = { + mouseenter: 'mouseover', + mouseleave: 'mouseout', + wheel: !('onwheel' in window) && 'mousewheel' +}; + function addOne(obj, type, fn, context) { var id = type + Util.stamp(fn) + (context ? '_' + Util.stamp(context) : ''); @@ -97,20 +103,17 @@ function addOne(obj, type, fn, context) { } else if ('addEventListener' in obj) { - if (type === 'mousewheel') { - obj.addEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, Browser.passiveEvents ? {passive: false} : false); - - } else if ((type === 'touchstart') || (type === 'touchend')) { - obj.addEventListener(type, handler, Browser.passiveEvents ? {passive: false} : false); + if (type === 'touchstart' || type === 'touchmove' || type === 'wheel' || type === 'mousewheel') { + obj.addEventListener(mouseSubst[type] || type, handler, Browser.passiveEvents ? {passive: false} : false); - } else if ((type === 'mouseenter') || (type === 'mouseleave')) { + } else if (type === 'mouseenter' || type === 'mouseleave') { handler = function (e) { e = e || window.event; if (isExternalTarget(obj, e)) { originalHandler(e); } }; - obj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false); + obj.addEventListener(mouseSubst[type], handler, false); } else { obj.addEventListener(type, originalHandler, false); @@ -139,14 +142,7 @@ function removeOne(obj, type, fn, context) { } else if ('removeEventListener' in obj) { - if (type === 'mousewheel') { - obj.removeEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, Browser.passiveEvents ? {passive: false} : false); - - } else { - obj.removeEventListener( - type === 'mouseenter' ? 'mouseover' : - type === 'mouseleave' ? 'mouseout' : type, handler, false); - } + obj.removeEventListener(mouseSubst[type] || type, handler, false); } else if ('detachEvent' in obj) { obj.detachEvent('on' + type, handler); @@ -177,9 +173,9 @@ export function stopPropagation(e) { } // @function disableScrollPropagation(el: HTMLElement): this -// Adds `stopPropagation` to the element's `'mousewheel'` events (plus browser variants). +// Adds `stopPropagation` to the element's `'wheel'` events (plus browser variants). export function disableScrollPropagation(el) { - addOne(el, 'mousewheel', stopPropagation); + addOne(el, 'wheel', stopPropagation); return this; } @@ -240,7 +236,7 @@ var wheelPxFactor = Browser.gecko ? window.devicePixelRatio : 1; // @function getWheelDelta(ev: DOMEvent): Number -// Gets normalized wheel delta from a mousewheel DOM event, in vertical +// Gets normalized wheel delta from a wheel DOM event, in vertical // pixels scrolled (negative if scrolling down). // Events from pointing devices without precise scrolling are mapped to // a best guess of 60 pixels. diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js index d61d33d9763..85d9ee1323b 100644 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ b/src/map/handler/Map.ScrollWheelZoom.js @@ -10,7 +10,7 @@ import * as Util from '../../core/Util'; // @namespace Map // @section Interaction Options Map.mergeOptions({ - // @section Mousewheel options + // @section Mouse wheel options // @option scrollWheelZoom: Boolean|String = true // Whether the map can be zoomed by using the mouse wheel. If passed `'center'`, // it will zoom to the center of the view regardless of where the mouse was. @@ -30,13 +30,13 @@ Map.mergeOptions({ export var ScrollWheelZoom = Handler.extend({ addHooks: function () { - DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this); + DomEvent.on(this._map._container, 'wheel', this._onWheelScroll, this); this._delta = 0; }, removeHooks: function () { - DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll, this); + DomEvent.off(this._map._container, 'wheel', this._onWheelScroll, this); }, _onWheelScroll: function (e) { From 09da971160ac9b60396aa4e7f4e9bb5fa1288798 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 10 Apr 2020 15:49:52 +0300 Subject: [PATCH 058/306] Update mocha to ^7 (#7082) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 726c92e61fd..8aaf577bafc 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "karma-safari-launcher": "~1.0.0", "karma-sinon": "^1.0.5", "leafdoc": "^1.4.1", - "mocha": "^6.1.4", + "mocha": "^7.1.1", "phantomjs-prebuilt": "^2.1.16", "prosthetic-hand": "^1.3.1", "rollup": "0.51.8", @@ -89,7 +89,7 @@ "consistent-return": 0, "no-unused-expressions": [ "error", - { + { "allowShortCircuit": true } ] From 41706c01685320e3fd1d93d19e59b3275d3a90cb Mon Sep 17 00:00:00 2001 From: johnd0e Date: Tue, 14 Apr 2020 18:51:14 +0300 Subject: [PATCH 059/306] Popup: fix event propagation to popup._container (#7091) --- src/layer/Popup.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layer/Popup.js b/src/layer/Popup.js index caec6cec577..f74fe15f892 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -181,9 +181,9 @@ export var Popup = DivOverlay.extend({ var wrapper = this._wrapper = DomUtil.create('div', prefix + '-content-wrapper', container); this._contentNode = DomUtil.create('div', prefix + '-content', wrapper); - DomEvent.disableClickPropagation(wrapper); + DomEvent.disableClickPropagation(container); DomEvent.disableScrollPropagation(this._contentNode); - DomEvent.on(wrapper, 'contextmenu', DomEvent.stopPropagation); + DomEvent.on(container, 'contextmenu', DomEvent.stopPropagation); this._tipContainer = DomUtil.create('div', prefix + '-tip-container', container); this._tip = DomUtil.create('div', prefix + '-tip', this._tipContainer); From 0fd2f43faa290a3cf6e279893a7769c425a06a34 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Thu, 16 Apr 2020 11:15:02 +0300 Subject: [PATCH 060/306] Fix tiles flickering when maxNativeZoom === maxZoom (and same with min-) (#7094) GridLayer/_setView: check max/minZoom before clamping to max/minNativeZoom --- src/layer/tile/GridLayer.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index b5000cf76ed..5f18138c939 100755 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -544,10 +544,12 @@ export var GridLayer = Layer.extend({ }, _setView: function (center, zoom, noPrune, noUpdate) { - var tileZoom = this._clampZoom(Math.round(zoom)); + var tileZoom = Math.round(zoom); if ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) || (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) { tileZoom = undefined; + } else { + tileZoom = this._clampZoom(tileZoom); } var tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom); From 984fedda1c48d141f018ca45ae06738872d7f5dd Mon Sep 17 00:00:00 2001 From: ronikar Date: Thu, 16 Apr 2020 12:32:38 +0300 Subject: [PATCH 061/306] VideoOverlay feature: Enable to load muted video (#7071) * Enable to load muted video * Changes after CR Co-authored-by: r --- src/layer/VideoOverlay.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/layer/VideoOverlay.js b/src/layer/VideoOverlay.js index 18f02e44c7c..5dc8a885a7e 100644 --- a/src/layer/VideoOverlay.js +++ b/src/layer/VideoOverlay.js @@ -37,7 +37,11 @@ export var VideoOverlay = ImageOverlay.extend({ // @option keepAspectRatio: Boolean = true // Whether the video will save aspect ratio after the projection. // Relevant for supported browsers. Browser compatibility- https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit - keepAspectRatio: true + keepAspectRatio: true, + + // @option muted: Boolean = false + // Whether the video starts on mute when loaded. + muted: false }, _initImage: function () { @@ -71,6 +75,7 @@ export var VideoOverlay = ImageOverlay.extend({ if (!this.options.keepAspectRatio && vid.style.hasOwnProperty('objectFit')) { vid.style['objectFit'] = 'fill'; } vid.autoplay = !!this.options.autoplay; vid.loop = !!this.options.loop; + vid.muted = !!this.options.muted; for (var i = 0; i < this._url.length; i++) { var source = DomUtil.create('source'); source.src = this._url[i]; From 1ae785b73092fdb4b97e30f8789345e9f7c7c912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20N=C3=BC=C3=9Flein?= Date: Fri, 17 Apr 2020 15:54:16 +0200 Subject: [PATCH 062/306] Docs: Fix tiny typo - WMTS vs WTMS (#7098) --- docs/examples/wms/wms.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/wms/wms.md b/docs/examples/wms/wms.md index 320b9996d4a..a0d99e32a47 100644 --- a/docs/examples/wms/wms.md +++ b/docs/examples/wms/wms.md @@ -16,7 +16,7 @@ WMS, short for [*web map service*](https://en.wikipedia.org/wiki/Web_Map_Service TMS stands for [*tiled map service*](https://en.wikipedia.org/wiki/Tile_Map_Service), and is a map tiling standard more focused on web maps, very similar to the map tiles that Leaflet expects in a `L.TileLayer`. -WTMS, for [*web map tile service*](https://en.wikipedia.org/wiki/Web_Map_Tile_Service), is the standard protocol for map tiles and serves map tiles directly usable in a `L.TileLayer`. +WMTS, for [*web map tile service*](https://en.wikipedia.org/wiki/Web_Map_Tile_Service), is the standard protocol for map tiles and serves map tiles directly usable in a `L.TileLayer`. ## WMS in Leaflet From 19da01346d8f69b075d02d9b714bbf5a0f2c03e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar?= Date: Wed, 29 Apr 2020 15:40:35 +0200 Subject: [PATCH 063/306] Fix DivOverlay.getElement function documentation (#7111) --- src/layer/DivOverlay.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/DivOverlay.js b/src/layer/DivOverlay.js index 39fc5739c98..a41f6f34145 100644 --- a/src/layer/DivOverlay.js +++ b/src/layer/DivOverlay.js @@ -102,7 +102,7 @@ export var DivOverlay = Layer.extend({ }, // @method getElement: String|HTMLElement - // Alias for [getContent()](#popup-getcontent) + // Returns the HTML container of the popup. getElement: function () { return this._container; }, From e7a5c6ffbfd50ac9ee8edf54ceb00ef044f38166 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Mon, 4 May 2020 14:19:14 +0300 Subject: [PATCH 064/306] Add more browser profiles and fix some tests (#7115) * MapSpec.js: fix: mocked function must be restored Otherwise it will break crs.project test in CRSSpec.js * MapSpec.js: skip broken test crsMock.verify() call is mandatory here, but it shows that crs.project is never called, thus the test is not ever valid. * MapSpec.js: fix non-valid test Revert 50a4845a785fe738213b6f305f51a7e8023fc888 and 1b1d96a4c467119ae45ace57b7724209a1f65cc1, and refactor a bit (rather cosmetical changes) * MapSpec.js: fix more tests Refactor before/afterEach hooks for more careful setup/cleanup. Fix some non-valid tests: * #remove - "undefines container._leaflet" - "unbinds events" * #removeLayer - "when the last tile layer on a map is removed" - "when a tile layer is removed from a map and it had greater zoom level coverage than the remainding layer" - "when a tile layer is removed from a map it and it had lesser or the sa,e zoom level coverage as the remainding layer(s)" * GridLayerSpec.js: fix some tests Refactor before/afterEach hooks for more careful setup/cleanup. Fix some non-valid tests: * "when a tilelayer is added to a map that already has a tilelayer" * spec/suites/**: refactor for more careful setup/cleanup Refactor before/afterEach hooks Other minor changes * SpecHelper.js: rename skipIn(non)Phantom to skipIf(No)3d ..to make things more clear Remove unused helper functions * Update testing deps sinon.js: left on 7.5.0 (latest still working on PhantomJS) karma-rollup-preprocessor: left on 6.1.2 (latest still supporting rollup < 1.0.0) * CRSSpec.js: workaround round-off error in Chrome L.CRS.zoom(L.CRS.scale(2.5)) results 2.4999999999999996 in Chrome Note: comparing floating point numbers properly is hard, e.g. see https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ * Fix touch tests failing in Chrome * karma.conf.js: add custom Chrome config to make some tests pass npm run test-nolint -- --browsers Chrome1280x1024 * spec/.eslintrc: do not forbid no-unused-vars rule * spec/.eslintrc: do not forbid more rules no-extend-native no-irregular-whitespace no-shadow * Add karma-edge-launcher * Add karma-ie-launcher Some test fails atm, see log: > karma start ./spec/karma.conf.js "--browsers" "IE" ................................................................................ ..... WARN: 'Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.', undefined ................................................................................ ................................................................................ ............................................................... IE 11.0 (Windows 10) ImageOverlay _image when loaded should raise the load event FAILED TypeError: Argument not optional at raiseImageEvent (spec/suites/layer/ImageOverlaySpec.js:66:4) at Anonymous function (spec/suites/layer/ImageOverlaySpec.js:74:5) IE 11.0 (Windows 10) ImageOverlay _image when load fails should raise the error event FAILED TypeError: Argument not optional at raiseImageEvent (spec/suites/layer/ImageOverlaySpec.js:66:4) at Anonymous function (spec/suites/layer/ImageOverlaySpec.js:83:5) IE 11.0 (Windows 10) ImageOverlay _image when load fails should change the image to errorOverlayUrl FAILED TypeError: Argument not optional at raiseImageEvent (spec/suites/layer/ImageOverlaySpec.js:66:4) at Anonymous function (spec/suites/layer/ImageOverlaySpec.js:88:5) .. IE 11.0 (Windows 10) ImageOverlay #setZIndex should update the z-index of the image if it has allready been added to the map FAILED Error: expected 1 to equal '1' at Assertion.prototype.assert (node_modules/expect.js/index.js:102:7) at Assertion.prototype.equal (node_modules/expect.js/index.js:216:5) at Anonymous function (node_modules/expect.js/index.js:69:13) at Anonymous function (spec/suites/layer/ImageOverlaySpec.js:111:4) IE 11.0 (Windows 10) ImageOverlay #setZIndex should set the z-index of the image when it is added to the map FAILED Error: expected 10 to equal '10' at Assertion.prototype.assert (node_modules/expect.js/index.js:102:7) at Assertion.prototype.equal (node_modules/expect.js/index.js:216:5) at Anonymous function (node_modules/expect.js/index.js:69:13) at Anonymous function (spec/suites/layer/ImageOverlaySpec.js:121:4) IE 11.0 (Windows 10) ImageOverlay #setZIndex should use the z-index specified in options FAILED Error: expected 20 to equal '20' at Assertion.prototype.assert (node_modules/expect.js/index.js:102:7) at Assertion.prototype.equal (node_modules/expect.js/index.js:216:5) at Anonymous function (node_modules/expect.js/index.js:69:13) at Anonymous function (spec/suites/layer/ImageOverlaySpec.js:127:4) ........................................................................ IE 11.0 (Windows 10) Marker.Drag drag in CSS scaled container drags a marker with mouse, compensating for CSS scale FAILED expected 0 to be within -50..-30 (node_modules/expect.js/index.js:102) ................................................................................ ........................................................... WARN: 'Deprecated use of _flat, please use L.LineUtil.isFlat instead.' . WARN: 'Deprecated use of _flat, please use L.LineUtil.isFlat instead.' .......................................................................... 05 2020 15:25:48.917:WARN [web-server]: : /000 05 2020 15:25:48.938:WARN [web-server]: : /000 ...... .. IE 11.0 (Windows 10) Map #invalidateSize pans by the right amount when growing in 1px increments FAILED Error: expected 0 to equal 1 at Assertion.prototype.assert (node_modules/expect.js/index.js:102:7) at Assertion.prototype.equal (node_modules/expect.js/index.js:216:5) at Anonymous function (node_modules/expect.js/index.js:69:13) at Anonymous function (spec/suites/map/MapSpec.js:649:4) IE 11.0 (Windows 10) Map #invalidateSize pans by the right amount when shrinking in 1px increments FAILED Error: expected 0 to equal -1 at Assertion.prototype.assert (node_modules/expect.js/index.js:102:7) at Assertion.prototype.equal (node_modules/expect.js/index.js:216:5) at Anonymous function (node_modules/expect.js/index.js:69:13) at Anonymous function (spec/suites/map/MapSpec.js:667:4) .. IE 11.0 (Windows 10) Map #invalidateSize emits a move event if the size has changed FAILED Error: expected false to be truthy at Assertion.prototype.assert (node_modules/expect.js/index.js:102:7) at Assertion.prototype.ok (node_modules/expect.js/index.js:115:5) at Anonymous function (node_modules/expect.js/index.js:499:7) at Anonymous function (spec/suites/map/MapSpec.js:700:4) IE 11.0 (Windows 10) Map #invalidateSize emits a moveend event if the size has changed FAILED Error: expected false to be truthy at Assertion.prototype.assert (node_modules/expect.js/index.js:102:7) at Assertion.prototype.ok (node_modules/expect.js/index.js:115:5) at Anonymous function (node_modules/expect.js/index.js:499:7) at Anonymous function (spec/suites/map/MapSpec.js:710:4) IE 11.0 (Windows 10) Map #invalidateSize debounces the moveend event if the debounceMoveend option is given FAILED Error: expected false to be truthy at Assertion.prototype.assert (node_modules/expect.js/index.js:102:7) at Assertion.prototype.ok (node_modules/expect.js/index.js:115:5) at Anonymous function (node_modules/expect.js/index.js:499:7) at Anonymous function (spec/suites/map/MapSpec.js:724:4) IE 11.0 (Windows 10) Map #invalidateSize correctly adjusts for new container size when view is set during map initialization (#6165) FAILED Error: expected 0 to equal 100 at Assertion.prototype.assert (node_modules/expect.js/index.js:102:7) at Assertion.prototype.equal (node_modules/expect.js/index.js:216:5) at Anonymous function (spec/suites/map/MapSpec.js:745:4) ................ IE 11.0 (Windows 10) Map #fitBounds after layers set Snaps to a number after adding tile layer FAILED Error: Access is denied. at createTile (src/Leaflet.js:11698:3) at _addTile (src/Leaflet.js:11433:3) at _update (src/Leaflet.js:11330:5) at _setView (src/Leaflet.js:11191:5) at _resetView (src/Leaflet.js:11146:3) at onAdd (src/Leaflet.js:10784:3) at _layerAdd (src/Leaflet.js:6580:3) at Events.fire (src/Leaflet.js:588:6) at _resetView (src/Leaflet.js:4184:4) at setView (src/Leaflet.js:3181:3) .............................. IE 11.0 (Windows 10) Map.Drag mouse events in CSS scaled container change the center of the map, compensating for CSS scale FAILED expected 31.952162238024975 to be within 21.943..21.9431 (node_modules/expect.js/index.js:102) IE 11.0 (Windows 10) Map.Drag touch events change the center of the map FAILED Object doesn't support this action (node_modules/prosthetic-hand/dist/prosthetic-hand.js:624) IE 11.0 (Windows 10) Map.Drag touch events does not change the center of the map when finger is moved less than the drag threshold FAILED Object doesn't support this action (node_modules/prosthetic-hand/dist/prosthetic-hand.js:624) IE 11.0 (Windows 10) Map.Drag touch events reset itself after touchend FAILED Object doesn't support this action (node_modules/prosthetic-hand/dist/prosthetic-hand.js:624) ............. IE 11.0 (Windows 10) Map.TouchZoom Increases zoom when pinching out FAILED Object doesn't support this action (node_modules/prosthetic-hand/dist/prosthetic-hand.js:624) IE 11.0 (Windows 10) Map.TouchZoom Decreases zoom when pinching in FAILED Object doesn't support this action (node_modules/prosthetic-hand/dist/prosthetic-hand.js:624) IE 11.0 (Windows 10): Executed 685 of 688 (20 FAILED) (skipped 3) (25.993 secs / 22.211 secs) * karma.conf.js: additional Firefox configs - FirefoxPointer - FirefoxTouch - FirefoxPointerTouch * .travis.yml: run CI tests with different Firefox configs Use FirefoxHeadless * karma.conf.js: change reporter to default ('progress') Because 'dots' is confusing when mixed up with different warnings. But for CI script 'dots' fits better due to travis-ci log qualities. * .travis.yml: run CI tests with Chrome too --- .travis.yml | 4 +- package.json | 16 +- spec/.eslintrc | 6 +- spec/before.js | 2 + spec/index.html | 18 +- spec/karma.conf.js | 36 +- spec/suites/SpecHelper.js | 21 +- .../suites/control/Control.AttributionSpec.js | 2 - spec/suites/control/Control.LayersSpec.js | 56 ++- spec/suites/control/ControlSpec.js | 36 +- spec/suites/core/ClassSpec.js | 11 +- spec/suites/core/EventsSpec.js | 21 +- spec/suites/core/UtilSpec.js | 1 - spec/suites/dom/DomEventSpec.js | 1 + spec/suites/geo/CRSSpec.js | 4 +- spec/suites/geo/LatLngBoundsSpec.js | 9 +- spec/suites/geo/LatLngSpec.js | 6 +- spec/suites/geo/ProjectionSpec.js | 1 + spec/suites/geometry/BoundsSpec.js | 37 +- spec/suites/geometry/LineUtilSpec.js | 4 - spec/suites/geometry/PointSpec.js | 6 +- spec/suites/geometry/PolyUtilSpec.js | 1 - spec/suites/geometry/TransformationSpec.js | 3 +- spec/suites/layer/FeatureGroupSpec.js | 11 +- spec/suites/layer/GeoJSONSpec.js | 4 - spec/suites/layer/ImageOverlaySpec.js | 86 ++--- spec/suites/layer/PopupSpec.js | 142 ++++---- spec/suites/layer/TooltipSpec.js | 13 +- spec/suites/layer/marker/Icon.DefaultSpec.js | 27 +- spec/suites/layer/marker/Marker.DragSpec.js | 15 +- spec/suites/layer/marker/MarkerSpec.js | 4 +- spec/suites/layer/tile/GridLayerSpec.js | 90 ++--- spec/suites/layer/tile/TileLayerSpec.js | 35 +- spec/suites/layer/vector/CanvasSpec.js | 137 ++------ spec/suites/layer/vector/CircleMarkerSpec.js | 25 +- spec/suites/layer/vector/CircleSpec.js | 28 +- spec/suites/layer/vector/PathSpec.js | 65 +--- spec/suites/layer/vector/PolygonSpec.js | 23 +- .../layer/vector/PolylineGeometrySpec.js | 11 +- spec/suites/layer/vector/PolylineSpec.js | 19 +- spec/suites/map/MapSpec.js | 331 ++++++++---------- spec/suites/map/handler/Map.DragSpec.js | 98 +++--- spec/suites/map/handler/Map.KeyboardSpec.js | 1 - spec/suites/map/handler/Map.TouchZoomSpec.js | 12 +- 44 files changed, 577 insertions(+), 902 deletions(-) create mode 100644 spec/before.js diff --git a/.travis.yml b/.travis.yml index 105e42c4df1..fad0a2c60da 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,7 @@ addons: target_paths: - content/leaflet/${NAME} firefox: latest + chrome: stable env: global: - ARTIFACTS_BUCKET=leafletjs-cdn @@ -22,8 +23,7 @@ env: yeoH12PhCR0h39dM7mq8TYJo5DHwvbotI5nQhpMruSt8eMFbym8nGiqQh806 fSJXkxmQ4MAjUdNFDIirBHhdZme8q3PueFzJ+5odFMvPGn/aITQ= script: - - npm test - - xvfb-run --server-args="-screen 0 1280x1024x16" npm run test-nolint -- --browsers Firefox + - npm test -- -- --browsers PhantomJSCustom,Chrome1280x1024,FirefoxPointer,FirefoxTouch,FirefoxPointerTouch --reporters dots after_success: - npm run build - cd dist && zip -x .DS_Store -r leaflet.zip . && cd .. diff --git a/package.json b/package.json index 8aaf577bafc..d5e3eb37a91 100644 --- a/package.json +++ b/package.json @@ -8,23 +8,25 @@ "eslint-config-mourner": "^2.0.1", "git-rev-sync": "^1.12.0", "happen": "~0.3.2", - "karma": "^4.1.0", - "karma-chrome-launcher": "^2.2.0", + "karma": "^5.0.3", + "karma-chrome-launcher": "^3.1.0", + "karma-edge-launcher": "^0.4.2", "karma-expect": "^1.1.3", - "karma-firefox-launcher": "~1.1.0", - "karma-mocha": "^1.3.0", + "karma-firefox-launcher": "^1.3.0", + "karma-ie-launcher": "^1.0.0", + "karma-mocha": "^2.0.1", "karma-phantomjs-launcher": "^1.0.4", - "karma-rollup-preprocessor": "^5.0.1", + "karma-rollup-preprocessor": "^6.1.2", "karma-safari-launcher": "~1.0.0", "karma-sinon": "^1.0.5", "leafdoc": "^1.4.1", - "mocha": "^7.1.1", + "mocha": "^7.1.2", "phantomjs-prebuilt": "^2.1.16", "prosthetic-hand": "^1.3.1", "rollup": "0.51.8", "rollup-plugin-git-version": "0.2.1", "rollup-plugin-json": "^4.0.0", - "sinon": "^7.3.2", + "sinon": "^7.5.0", "ssri": "^6.0.1", "uglify-js": "~3.5.10" }, diff --git a/spec/.eslintrc b/spec/.eslintrc index a30f63e55a8..69ccd8d0bab 100644 --- a/spec/.eslintrc +++ b/spec/.eslintrc @@ -1,11 +1,7 @@ { "rules": { - "no-unused-vars": 0, "quotes": 0, - "no-shadow": 0, - "no-irregular-whitespace": 0, "no-console": 0, - "no-extend-native": 0 }, "env": { "mocha": true @@ -15,6 +11,6 @@ "sinon": false, "happen": false, "Hand": false, - "takeScreenshot" + "touchEventType": false /* defined in SpecHelper.js */ } } diff --git a/spec/before.js b/spec/before.js new file mode 100644 index 00000000000..33816425043 --- /dev/null +++ b/spec/before.js @@ -0,0 +1,2 @@ +// Trick Leaflet into believing we have a touchscreen (for desktop) +if (window.TouchEvent) { window.ontouchstart = function(){} }; diff --git a/spec/index.html b/spec/index.html index 5ae402a261d..ac9a0d7212a 100644 --- a/spec/index.html +++ b/spec/index.html @@ -3,8 +3,9 @@ Leaflet Spec Runner + - +
    @@ -16,18 +17,15 @@ - - @@ -98,7 +96,7 @@ - diff --git a/spec/karma.conf.js b/spec/karma.conf.js index 4ab07578139..1660583da42 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -15,6 +15,7 @@ module.exports = function (config) { // var libSources = require(__dirname + '/../build/build.js').getFiles(); var files = [ + "spec/before.js", "src/Leaflet.js", "spec/after.js", "node_modules/happen/happen.js", @@ -39,6 +40,8 @@ module.exports = function (config) { 'karma-sinon', 'karma-expect', 'karma-phantomjs-launcher', + 'karma-edge-launcher', + 'karma-ie-launcher', 'karma-chrome-launcher', 'karma-safari-launcher', 'karma-firefox-launcher'], @@ -66,7 +69,7 @@ module.exports = function (config) { // test results reporter to use // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage' - reporters: ['dots'], + // reporters: ['dots'], // web server port port: 9876, @@ -92,6 +95,33 @@ module.exports = function (config) { browsers: ['PhantomJSCustom'], customLaunchers: { + 'Chrome1280x1024': { + base: 'ChromeHeadless', + // increased viewport is required for some tests (TODO fix tests) + // https://github.com/Leaflet/Leaflet/issues/7113#issuecomment-619528577 + flags: ['--window-size=1280,1024'] + }, + 'FirefoxPointer': { + base: 'FirefoxHeadless', + prefs: { + 'dom.w3c_pointer_events.enabled': true, + 'dom.w3c_touch_events.enabled': 0 + } + }, + 'FirefoxTouch': { + base: 'FirefoxHeadless', + prefs: { + 'dom.w3c_pointer_events.enabled': false, + 'dom.w3c_touch_events.enabled': 1 + } + }, + 'FirefoxPointerTouch': { + base: 'FirefoxHeadless', + prefs: { + 'dom.w3c_pointer_events.enabled': true, + 'dom.w3c_touch_events.enabled': 1 + } + }, 'PhantomJSCustom': { base: 'PhantomJS', flags: ['--load-images=true'], @@ -105,8 +135,10 @@ module.exports = function (config) { } }, + concurrency: 1, + // If browser does not capture in given timeout [ms], kill it - captureTimeout: 5000, + captureTimeout: 10000, // Workaround for PhantomJS random DISCONNECTED error browserDisconnectTimeout: 10000, // default 2000 diff --git a/spec/suites/SpecHelper.js b/spec/suites/SpecHelper.js index 900757c061b..bcc6e27b20e 100644 --- a/spec/suites/SpecHelper.js +++ b/spec/suites/SpecHelper.js @@ -1,3 +1,4 @@ +/* eslint no-extend-native: 0 */ if (!Array.prototype.map) { Array.prototype.map = function (fun) { "use strict"; @@ -49,22 +50,22 @@ happen.at = function (what, x, y, props) { screenY: y, which: 1, button: 0 - }, props || {})); + }, props || {})); }; // We'll want to skip a couple of things when in PhantomJS, due to lack of CSS animations -it.skipInPhantom = L.Browser.any3d ? it : it.skip; +it.skipIfNo3d = L.Browser.any3d ? it : it.skip; // Viceversa: some tests we want only to run in browsers without CSS animations. -it.skipInNonPhantom = L.Browser.any3d ? it.skip : it; +it.skipIf3d = L.Browser.any3d ? it.skip : it; // A couple of tests need the browser to be touch-capable -it.skipIfNotTouch = window.TouchEvent ? it : it.skip; +it.skipIfNotTouch = (L.Browser.touch || L.Browser.pointer) ? it : it.skip; -// A couple of tests need the browser to be pointer-capable -it.skipIfNotEdge = window.PointerEvent ? it : it.skip; +// ATM Leaflet prefers pointer events even for touch (see #7077) +var touchEventType = L.Browser.pointer ? 'pointer' : 'touch'; // eslint-disable-line no-unused-vars +// Note: this override is needed to workaround prosthetic-hand fail, +// see https://github.com/Leaflet/prosthetic-hand/issues/14 - -function takeScreenshot(path) { - window.top.callPhantom({'render': path || 'screenshot.png'}); -} +console.log('L.Browser.pointer', L.Browser.pointer); +console.log('L.Browser.touch', L.Browser.touch); diff --git a/spec/suites/control/Control.AttributionSpec.js b/spec/suites/control/Control.AttributionSpec.js index c81303a165d..919354f0b16 100644 --- a/spec/suites/control/Control.AttributionSpec.js +++ b/spec/suites/control/Control.AttributionSpec.js @@ -1,5 +1,4 @@ describe("Control.Attribution", function () { - var map, control, container; beforeEach(function () { @@ -122,5 +121,4 @@ describe("Control.Attribution", function () { expect(container.innerHTML).to.eql('prefix'); }); }); - }); diff --git a/spec/suites/control/Control.LayersSpec.js b/spec/suites/control/Control.LayersSpec.js index c1653aacac4..7c6d85b0951 100644 --- a/spec/suites/control/Control.LayersSpec.js +++ b/spec/suites/control/Control.LayersSpec.js @@ -1,18 +1,19 @@ describe("Control.Layers", function () { - var map; + var div, map; beforeEach(function () { - map = L.map(document.createElement('div')); + div = document.createElement('div'); + document.body.appendChild(div); + map = L.map(div); + map.setView([0, 0], 14); }); + afterEach(function () { map.remove(); + document.body.removeChild(div); }); describe("baselayerchange event", function () { - beforeEach(function () { - map.setView([0, 0], 14); - }); - it("is fired on input that changes the base layer", function () { var baseLayers = {"Layer 1": L.tileLayer(''), "Layer 2": L.tileLayer('')}, layers = L.control.layers(baseLayers).addTo(map), @@ -62,10 +63,6 @@ describe("Control.Layers", function () { }); describe("updates", function () { - beforeEach(function () { - map.setView([0, 0], 14); - }); - it("when an included layer is added or removed from the map", function () { var baseLayer = L.tileLayer(), overlay = L.marker([0, 0]), @@ -81,10 +78,9 @@ describe("Control.Layers", function () { }); it("when an included layer is added or removed from the map, it's (un)checked", function () { - document.body.appendChild(map._container); var baseLayer = L.tileLayer(), - overlay = L.marker([0, 0]), - layers = L.control.layers({"Baselayer": baseLayer}, {"Overlay": overlay}).addTo(map); + overlay = L.marker([0, 0]); + L.control.layers({"Baselayer": baseLayer}, {"Overlay": overlay}).addTo(map); function isChecked() { return !!(map._container.querySelector('.leaflet-control-layers-overlays input').checked); @@ -111,7 +107,6 @@ describe("Control.Layers", function () { }); it("updates when an included layer is removed from the control", function () { - document.body.appendChild(map._container); var baseLayer = L.tileLayer(), overlay = L.marker([0, 0]), layers = L.control.layers({"Base": baseLayer}, {"Overlay": overlay}).addTo(map); @@ -132,7 +127,6 @@ describe("Control.Layers", function () { }); it("having repeated layers works as expected", function () { - document.body.appendChild(map._container); var layerA = L.tileLayer(''), layerB = L.tileLayer(''), baseLayers = {"Layer 1": layerA, "Layer 2": layerB, "Layer 3": layerA}, layers = L.control.layers(baseLayers).addTo(map); @@ -160,10 +154,6 @@ describe("Control.Layers", function () { }); describe("is removed cleanly", function () { - beforeEach(function () { - map.setView([0, 0], 14); - }); - it("and layers in the control can still be removed", function () { var baseLayer = L.tileLayer('').addTo(map); var layersCtrl = L.control.layers({'Base': baseLayer}).addTo(map); @@ -188,12 +178,12 @@ describe("Control.Layers", function () { describe("is created with an expand link", function () { it("when collapsed", function () { - var layersCtrl = L.control.layers(null, null, {collapsed: true}).addTo(map); + L.control.layers(null, null, {collapsed: true}).addTo(map); expect(map._container.querySelector('.leaflet-control-layers-toggle')).to.be.ok(); }); it("when not collapsed", function () { - var layersCtrl = L.control.layers(null, null, {collapsed: false}).addTo(map); + L.control.layers(null, null, {collapsed: false}).addTo(map); expect(map._container.querySelector('.leaflet-control-layers-toggle')).to.be.ok(); }); }); @@ -204,15 +194,16 @@ describe("Control.Layers", function () { happen.once(layersCtrl._container, {type:'mouseover'}); expect(map._container.querySelector('.leaflet-control-layers-expanded')).to.be.ok(); }); + it('collapses when mouse is out', function () { var layersCtrl = L.control.layers(null, null, {collapsed: true}).addTo(map); happen.once(layersCtrl._container, {type:'mouseover'}); happen.once(layersCtrl._container, {type:'mouseout'}); expect(map._container.querySelector('.leaflet-control-layers-expanded')).to.not.be.ok(); }); + it('collapses when map is clicked', function () { var layersCtrl = L.control.layers(null, null, {collapsed: true}).addTo(map); - map.setView([0, 0], 0); happen.once(layersCtrl._container, {type:'mouseover'}); expect(map._container.querySelector('.leaflet-control-layers-expanded')).to.be.ok(); happen.click(map._container); @@ -229,23 +220,22 @@ describe("Control.Layers", function () { happen.once(layersCtrl._container, {type:'mouseout'}); expect(map._container.querySelector('.leaflet-control-layers-expanded')).to.be.ok(); }); + it('does not collapse when map is clicked', function () { - var layersCtrl = L.control.layers(null, null, {collapsed: false}).addTo(map); - map.setView([0, 0], 0); + L.control.layers(null, null, {collapsed: false}).addTo(map); expect(map._container.querySelector('.leaflet-control-layers-expanded')).to.be.ok(); happen.click(map._container); expect(map._container.querySelector('.leaflet-control-layers-expanded')).to.be.ok(); }); + it('is scrollable if necessary when added on map', function () { var layersCtrl = L.control.layers(null, null, {collapsed: false}), - div = document.createElement('div'), i = 0; // Need to create a DIV with specified height and insert it into DOM, so that the browser // gives it an actual size. map.remove(); div.style.height = div.style.width = '200px'; - document.body.appendChild(div); map = L.map(div); for (; i < 20; i += 1) { @@ -259,16 +249,15 @@ describe("Control.Layers", function () { expect(div.clientHeight).to.be.greaterThan(layersCtrl._container.clientHeight); expect(layersCtrl._section.classList.contains('leaflet-control-layers-scrollbar')).to.be(true); }); + it('becomes scrollable if necessary when too many layers are added while it is already on map', function () { var layersCtrl = L.control.layers(null, null, {collapsed: false}), - div = document.createElement('div'), i = 0; // Need to create a DIV with specified height and insert it into DOM, so that the browser // gives it an actual size. map.remove(); div.style.height = div.style.width = '200px'; - document.body.appendChild(div); map = L.map(div); layersCtrl.addTo(map); @@ -285,10 +274,6 @@ describe("Control.Layers", function () { }); describe("sortLayers", function () { - beforeEach(function () { - map.setView([0, 0], 14); - }); - it("keeps original order by default", function () { var baseLayerOne = L.tileLayer('').addTo(map); var baseLayerTwo = L.tileLayer('').addTo(map); @@ -296,7 +281,7 @@ describe("Control.Layers", function () { var markerB = L.marker([0, 1]).addTo(map); var markerA = L.marker([0, 0]).addTo(map); - var layersCtrl = L.control.layers({ + L.control.layers({ 'Base One': baseLayerOne, 'Base Two': baseLayerTwo }, { @@ -320,7 +305,7 @@ describe("Control.Layers", function () { var markerB = L.marker([0, 1]).addTo(map); var markerC = L.marker([0, 2]).addTo(map); - var layersCtrl = L.control.layers({ + L.control.layers({ 'Base Two': baseLayerTwo, 'Base One': baseLayerOne }, { @@ -346,7 +331,7 @@ describe("Control.Layers", function () { var markerB = L.marker([0, 1], {customOption: 100}).addTo(map); var markerC = L.marker([0, 2], {customOption: 101}).addTo(map); - var layersCtrl = L.control.layers({ + L.control.layers({ 'Base One': baseLayerOne, 'Base Two': baseLayerTwo }, { @@ -366,5 +351,4 @@ describe("Control.Layers", function () { expect(elems[4].innerHTML.trim()).to.be.equal('Marker A'); }); }); - }); diff --git a/spec/suites/control/ControlSpec.js b/spec/suites/control/ControlSpec.js index 6d2770b8046..66deb7e0a42 100644 --- a/spec/suites/control/ControlSpec.js +++ b/spec/suites/control/ControlSpec.js @@ -1,26 +1,32 @@ describe("Control", function () { - var map; + function onAdd() { + return L.DomUtil.create('div', 'leaflet-test-control'); + } + + var map, + container, + control; beforeEach(function () { - map = L.map(document.createElement('div')); + container = document.createElement('div'); + document.body.appendChild(container); + map = L.map(container).setView([0, 0], 1); + control = new L.Control(); + control.onAdd = onAdd; + control.addTo(map); }); - function onAdd() { - return L.DomUtil.create('div', 'leaflet-test-control'); - } + afterEach(function () { + map.remove(); + document.body.removeChild(container); + }); describe("#addTo", function () { it("adds the container to the map", function () { - var control = new L.Control(); - control.onAdd = onAdd; - control.addTo(map); expect(map.getContainer().querySelector('.leaflet-test-control')).to.equal(control.getContainer()); }); it("removes the control from any existing map", function () { - var control = new L.Control(); - control.onAdd = onAdd; - control.addTo(map); control.addTo(map); expect(map.getContainer().querySelectorAll('.leaflet-test-control').length).to.equal(1); expect(map.getContainer().querySelector('.leaflet-test-control')).to.equal(control.getContainer()); @@ -29,17 +35,13 @@ describe("Control", function () { describe("#remove", function () { it("removes the container from the map", function () { - var control = new L.Control(); - control.onAdd = onAdd; - control.addTo(map).remove(); + control.remove(); expect(map.getContainer().querySelector('.leaflet-test-control')).to.equal(null); }); it("calls onRemove if defined", function () { - var control = new L.Control(); - control.onAdd = onAdd; control.onRemove = sinon.spy(); - control.addTo(map).remove(); + control.remove(); expect(control.onRemove.called).to.be(true); }); diff --git a/spec/suites/core/ClassSpec.js b/spec/suites/core/ClassSpec.js index e202a6b3764..62f45c4e28b 100644 --- a/spec/suites/core/ClassSpec.js +++ b/spec/suites/core/ClassSpec.js @@ -1,5 +1,5 @@ +/* eslint no-new: 0 */ describe("Class", function () { - describe("#extend", function () { var Klass, constructor, @@ -123,7 +123,7 @@ describe("Class", function () { Klass.addInitHook(spy1); Klass.addInitHook('bar', 1, 2, 3); - var a = new Klass(); + new Klass(); expect(spy1.called).to.be.ok(); expect(method.calledWith(1, 2, 3)); @@ -138,7 +138,7 @@ describe("Class", function () { Klass.addInitHook(spy1); Klass2.addInitHook(spy2); - var a = new Klass2(); + new Klass2(); expect(spy1.called).to.be.ok(); expect(spy2.called).to.be.ok(); @@ -153,7 +153,7 @@ describe("Class", function () { Klass.addInitHook(spy1); Klass2.addInitHook(spy2); - var a = new Klass(); + new Klass(); expect(spy1.called).to.be.ok(); expect(spy2.called).to.eql(false); @@ -165,13 +165,12 @@ describe("Class", function () { Klass.addInitHook(spy1); var Klass2 = Klass.extend({}); - var a = new Klass2(); + new Klass2(); expect(spy1.called).to.be.ok(); }); }); - describe("#include", function () { var Klass; diff --git a/spec/suites/core/EventsSpec.js b/spec/suites/core/EventsSpec.js index 5f46fa68c03..d29e560c033 100644 --- a/spec/suites/core/EventsSpec.js +++ b/spec/suites/core/EventsSpec.js @@ -1,15 +1,13 @@ describe('Events', function () { - describe('#fireEvent', function () { - it('fires all listeners added through #addEventListener', function () { var obj = new L.Evented(), spy1 = sinon.spy(), spy2 = sinon.spy(), spy3 = sinon.spy(), spy4 = sinon.spy(), - spy5 = sinon.spy(), - spy6 = sinon.spy(); + spy5 = sinon.spy(); + // spy6 = sinon.spy(); obj.addEventListener('test', spy1); obj.addEventListener('test', spy2); @@ -41,12 +39,12 @@ describe('Events', function () { ctx2 = new L.Class(), count = {one: 0, two: 0, three: 0, four: 0}; - function listener1(e) { + function listener1() { count.one++; expect(count.two).to.eql(0); } - function listener2(e) { + function listener2() { count.two++; expect(count.one).to.eql(1); expect(count.three).to.eql(0); @@ -59,7 +57,7 @@ describe('Events', function () { } } - function listener3(e) { + function listener3() { count.three++; expect(count.two).to.eql(3); expect(count.four).to.eql(0); @@ -70,7 +68,7 @@ describe('Events', function () { } } - function listener4(e) { + function listener4() { count.four++; expect(count.three).to.eql(2); } @@ -287,7 +285,6 @@ describe('Events', function () { it('correctly removes all listeners if given no fn', function () { var obj = new L.Evented(), spy = sinon.spy(), - foo = {}, foo2 = {}, foo3 = {}; @@ -315,7 +312,6 @@ describe('Events', function () { var obj = new L.Evented(), spy = sinon.spy(), spy2 = sinon.spy(), - spy3 = sinon.spy(), foo = {}; /* without context */ @@ -382,7 +378,6 @@ describe('Events', function () { }); describe('#on, #off & #fire', function () { - it('works like #addEventListener && #removeEventListener', function () { var obj = new L.Evented(), spy = sinon.spy(); @@ -600,8 +595,7 @@ describe('Events', function () { describe('#listens', function () { it('is false if there is no event handler', function () { - var obj = new L.Evented(), - spy = sinon.spy(); + var obj = new L.Evented(); expect(obj.listens('test')).to.be(false); }); @@ -650,5 +644,4 @@ describe('Events', function () { expect(spy.called).to.be(true); }); }); - }); diff --git a/spec/suites/core/UtilSpec.js b/spec/suites/core/UtilSpec.js index 065dc5b002e..92b4f36698c 100644 --- a/spec/suites/core/UtilSpec.js +++ b/spec/suites/core/UtilSpec.js @@ -1,5 +1,4 @@ describe('Util', function () { - describe('#extend', function () { var a; diff --git a/spec/suites/dom/DomEventSpec.js b/spec/suites/dom/DomEventSpec.js index 7d784e553a7..5e272b32bd2 100644 --- a/spec/suites/dom/DomEventSpec.js +++ b/spec/suites/dom/DomEventSpec.js @@ -102,6 +102,7 @@ describe('DomEvent', function () { el.removeChild(child); }); }); + describe('#preventDefault', function () { it('prevents the default action of event', function () { L.DomEvent.addListener(el, 'click', L.DomEvent.preventDefault); diff --git a/spec/suites/geo/CRSSpec.js b/spec/suites/geo/CRSSpec.js index aa5cdc05b8f..1c10083fec7 100644 --- a/spec/suites/geo/CRSSpec.js +++ b/spec/suites/geo/CRSSpec.js @@ -212,6 +212,7 @@ describe("CRS.Simple", function () { it("returns coords as is", function () { expect(crs.wrapLatLng(new L.LatLng(270, 400)).equals(new L.LatLng(270, 400))).to.be(true); }); + it("wraps coords if configured", function () { var crs = L.extend({}, L.CRS.Simple, { wrapLng: [-200, 200], @@ -230,7 +231,8 @@ describe("CRS", function () { it("convert zoom to scale and viceversa and return the same values", function () { var zoom = 2.5; var scale = crs.scale(zoom); - expect(crs.zoom(scale)).to.eql(zoom); + var zoom2 = crs.zoom(scale); + expect(L.Util.formatNum(zoom2)).to.eql(zoom); }); }); }); diff --git a/spec/suites/geo/LatLngBoundsSpec.js b/spec/suites/geo/LatLngBoundsSpec.js index c4d9686f6ad..6a24899e267 100644 --- a/spec/suites/geo/LatLngBoundsSpec.js +++ b/spec/suites/geo/LatLngBoundsSpec.js @@ -89,9 +89,11 @@ describe('LatLngBounds', function () { it('returns true if properly set up', function () { expect(a.isValid()).to.be.ok(); }); + it('returns false if is invalid', function () { expect(c.isValid()).to.not.be.ok(); }); + it('returns true if extended', function () { c.extend([0, 0]); expect(c.isValid()).to.be.ok(); @@ -108,35 +110,30 @@ describe('LatLngBounds', function () { it('returns a proper bbox south value', function () { expect(a.getSouth()).to.eql(14); }); - }); describe('#getEast', function () { it('returns a proper bbox east value', function () { expect(a.getEast()).to.eql(40); }); - }); describe('#getNorth', function () { it('returns a proper bbox north value', function () { expect(a.getNorth()).to.eql(30); }); - }); describe('#toBBoxString', function () { it('returns a proper left,bottom,right,top bbox', function () { expect(a.toBBoxString()).to.eql("12,14,40,30"); }); - }); describe('#getNorthWest', function () { it('returns a proper north-west LatLng', function () { expect(a.getNorthWest()).to.eql(new L.LatLng(a.getNorth(), a.getWest())); }); - }); describe('#getSouthEast', function () { @@ -182,9 +179,9 @@ describe('LatLngBounds', function () { it('returns true if overlaps the given bounds', function () { expect(a.overlaps([[16, 20], [50, 60]])).to.eql(true); }); + it('returns false if just touches the boundary of the given bounds', function () { expect(a.overlaps([[25, 40], [55, 50]])).to.eql(false); }); }); - }); diff --git a/spec/suites/geo/LatLngSpec.js b/spec/suites/geo/LatLngSpec.js index c0d125935b9..f3eec74963e 100644 --- a/spec/suites/geo/LatLngSpec.js +++ b/spec/suites/geo/LatLngSpec.js @@ -12,7 +12,7 @@ describe('LatLng', function () { it('throws an error if invalid lat or lng', function () { expect(function () { - var a = new L.LatLng(NaN, NaN); + L.latLng(NaN, NaN); }).to.throwError(); }); @@ -28,7 +28,6 @@ describe('LatLng', function () { var b = new L.LatLng(-25, -74, -50); expect(b.alt).to.eql(-50); }); - }); describe('#equals', function () { @@ -119,7 +118,6 @@ describe('LatLng', function () { }); describe('#clone', function () { - it('should clone attributes', function () { var a = new L.LatLng(50.5, 30.5, 100); var b = a.clone(); @@ -135,7 +133,5 @@ describe('LatLng', function () { expect(a === b).to.be(false); }); - }); - }); diff --git a/spec/suites/geo/ProjectionSpec.js b/spec/suites/geo/ProjectionSpec.js index f106562e3d6..731f53ee74f 100644 --- a/spec/suites/geo/ProjectionSpec.js +++ b/spec/suites/geo/ProjectionSpec.js @@ -46,6 +46,7 @@ describe("Projection.Mercator", function () { }); }); }); + describe("Projection.SphericalMercator", function () { var p = L.Projection.SphericalMercator; diff --git a/spec/suites/geometry/BoundsSpec.js b/spec/suites/geometry/BoundsSpec.js index 51a5183b7a5..aa925dc6b28 100644 --- a/spec/suites/geometry/BoundsSpec.js +++ b/spec/suites/geometry/BoundsSpec.js @@ -3,12 +3,12 @@ describe('Bounds', function () { beforeEach(function () { a = new L.Bounds( - new L.Point(14, 12), // left, top - new L.Point(30, 40)); // right, bottom + [14, 12], // left, top + [30, 40]); // right, bottom b = new L.Bounds([ - new L.Point(20, 12), // center, top - new L.Point(14, 20), // left, middle - new L.Point(30, 40) // right, bottom + [20, 12], // center, top + [14, 20], // left, middle + [30, 40] // right, bottom ]); c = new L.Bounds(); }); @@ -18,6 +18,7 @@ describe('Bounds', function () { expect(a.min).to.eql(new L.Point(14, 12)); expect(a.max).to.eql(new L.Point(30, 40)); }); + it('creates bounds with proper min & max on (Point[])', function () { expect(b.min).to.eql(new L.Point(14, 12)); expect(b.max).to.eql(new L.Point(30, 40)); @@ -26,11 +27,11 @@ describe('Bounds', function () { describe('#extend', function () { it('extends the bounds to contain the given point', function () { - a.extend(new L.Point(50, 20)); + a.extend([50, 20]); expect(a.min).to.eql(new L.Point(14, 12)); expect(a.max).to.eql(new L.Point(50, 40)); - b.extend(new L.Point(25, 50)); + b.extend([25, 50]); expect(b.min).to.eql(new L.Point(14, 12)); expect(b.max).to.eql(new L.Point(30, 50)); }); @@ -44,11 +45,11 @@ describe('Bounds', function () { describe('#contains', function () { it('contains other bounds or point', function () { - a.extend(new L.Point(50, 10)); + a.extend([50, 10]); expect(a.contains(b)).to.be.ok(); expect(b.contains(a)).to.not.be.ok(); - expect(a.contains(new L.Point(24, 25))).to.be.ok(); - expect(a.contains(new L.Point(54, 65))).to.not.be.ok(); + expect(a.contains([24, 25])).to.be.ok(); + expect(a.contains([54, 65])).to.not.be.ok(); }); }); @@ -56,9 +57,11 @@ describe('Bounds', function () { it('returns true if properly set up', function () { expect(a.isValid()).to.be.ok(); }); + it('returns false if is invalid', function () { expect(c.isValid()).to.not.be.ok(); }); + it('returns true if extended', function () { c.extend([0, 0]); expect(c.isValid()).to.be.ok(); @@ -75,11 +78,13 @@ describe('Bounds', function () { it('returns true if bounds intersect', function () { expect(a.intersects(b)).to.be(true); }); + it('two bounds intersect if they have at least one point in common', function () { - expect(a.intersects(new L.Bounds(new L.Point(14, 12), new L.Point(6, 5)))).to.be(true); + expect(a.intersects([[14, 12], [6, 5]])).to.be(true); }); + it('returns false if bounds not intersect', function () { - expect(a.intersects(new L.Bounds(new L.Point(100, 100), new L.Point(120, 120)))).to.eql(false); + expect(a.intersects([[100, 100], [120, 120]])).to.eql(false); }); }); @@ -87,14 +92,16 @@ describe('Bounds', function () { it('returns true if bounds overlaps', function () { expect(a.overlaps(b)).to.be(true); }); + it('two bounds overlaps if their intersection is an area', function () { // point in common - expect(a.overlaps(new L.Bounds(new L.Point(14, 12), new L.Point(6, 5)))).to.be(false); + expect(a.overlaps([[14, 12], [6, 5]])).to.be(false); // matching boundary - expect(a.overlaps(new L.Bounds(new L.Point(30, 12), new L.Point(35, 25)))).to.be(false); + expect(a.overlaps([[30, 12], [35, 25]])).to.be(false); }); + it('returns false if bounds not overlaps', function () { - expect(a.overlaps(new L.Bounds(new L.Point(100, 100), new L.Point(120, 120)))).to.eql(false); + expect(a.overlaps([[100, 100], [120, 120]])).to.eql(false); }); }); diff --git a/spec/suites/geometry/LineUtilSpec.js b/spec/suites/geometry/LineUtilSpec.js index c09ac761797..c35083f645c 100644 --- a/spec/suites/geometry/LineUtilSpec.js +++ b/spec/suites/geometry/LineUtilSpec.js @@ -1,7 +1,5 @@ describe('LineUtil', function () { - describe('#clipSegment', function () { - var bounds; beforeEach(function () { @@ -51,7 +49,6 @@ describe('LineUtil', function () { }); describe('#pointToSegmentDistance & #closestPointOnSegment', function () { - var p1 = new L.Point(0, 10); var p2 = new L.Point(10, 0); var p = new L.Point(0, 0); @@ -86,5 +83,4 @@ describe('LineUtil', function () { ]); }); }); - }); diff --git a/spec/suites/geometry/PointSpec.js b/spec/suites/geometry/PointSpec.js index ea53ad73519..12afc58c12a 100644 --- a/spec/suites/geometry/PointSpec.js +++ b/spec/suites/geometry/PointSpec.js @@ -1,7 +1,5 @@ describe("Point", function () { - describe('constructor', function () { - it("creates a point with the given x and y", function () { var p = new L.Point(1.5, 2.5); expect(p.x).to.eql(1.5); @@ -99,15 +97,19 @@ describe("Point", function () { var p = new L.Point(50, 30); expect(L.point(p)).to.be(p); }); + it('creates a point out of three arguments', function () { expect(L.point(50.1, 30.1, true)).to.eql(new L.Point(50, 30)); }); + it('creates a point from an array of coordinates', function () { expect(L.point([50, 30])).to.eql(new L.Point(50, 30)); }); + it("creates a point from an object with x and y properties", function () { expect(L.point({x: 50, y: 30})).to.eql(new L.Point(50, 30)); }); + it('does not fail on invalid arguments', function () { expect(L.point(undefined)).to.be(undefined); expect(L.point(null)).to.be(null); diff --git a/spec/suites/geometry/PolyUtilSpec.js b/spec/suites/geometry/PolyUtilSpec.js index d4bc3590797..172d58881bc 100644 --- a/spec/suites/geometry/PolyUtilSpec.js +++ b/spec/suites/geometry/PolyUtilSpec.js @@ -1,5 +1,4 @@ describe('PolyUtil', function () { - describe('#clipPolygon', function () { it('clips polygon by bounds', function () { var bounds = L.bounds([0, 0], [10, 10]); diff --git a/spec/suites/geometry/TransformationSpec.js b/spec/suites/geometry/TransformationSpec.js index 35e6e971948..b0cc76dfa20 100644 --- a/spec/suites/geometry/TransformationSpec.js +++ b/spec/suites/geometry/TransformationSpec.js @@ -11,6 +11,7 @@ describe("Transformation", function () { var p2 = t.transform(p, 2); expect(p2).to.eql(new L.Point(24, 128)); }); + it('assumes a scale of 1 if not specified', function () { var p2 = t.transform(p); expect(p2).to.eql(new L.Point(12, 64)); @@ -23,8 +24,8 @@ describe("Transformation", function () { var p3 = t.untransform(p2, 2); expect(p3).to.eql(p); }); + it('assumes a scale of 1 if not specified', function () { - var p2 = t.transform(p); expect(t.untransform(new L.Point(12, 64))).to.eql(new L.Point(10, 20)); }); }); diff --git a/spec/suites/layer/FeatureGroupSpec.js b/spec/suites/layer/FeatureGroupSpec.js index 06df8a8dade..a34851c8d73 100644 --- a/spec/suites/layer/FeatureGroupSpec.js +++ b/spec/suites/layer/FeatureGroupSpec.js @@ -1,14 +1,11 @@ describe('FeatureGroup', function () { - var map; - beforeEach(function () { - map = L.map(document.createElement('div')); - map.setView([0, 0], 1); - }); describe("#_propagateEvent", function () { var marker; + beforeEach(function () { marker = L.marker([0, 0]); }); + describe("when a Marker is added to multiple FeatureGroups ", function () { it("e.propagatedFrom should be the Marker", function () { var fg1 = L.featureGroup(), @@ -39,6 +36,7 @@ }); }); }); + describe('addLayer', function () { it('adds the layer', function () { var fg = L.featureGroup(), @@ -50,6 +48,7 @@ expect(fg.hasLayer(marker)).to.be(true); }); + it('supports non-evented layers', function () { var fg = L.featureGroup(), g = L.layerGroup(); @@ -61,6 +60,7 @@ expect(fg.hasLayer(g)).to.be(true); }); }); + describe('removeLayer', function () { it('removes the layer passed to it', function () { var fg = L.featureGroup(), @@ -72,6 +72,7 @@ fg.removeLayer(marker); expect(fg.hasLayer(marker)).to.be(false); }); + it('removes the layer passed to it by id', function () { var fg = L.featureGroup(), marker = L.marker([0, 0]); diff --git a/spec/suites/layer/GeoJSONSpec.js b/spec/suites/layer/GeoJSONSpec.js index 29b86b92397..3c81fa4e193 100644 --- a/spec/suites/layer/GeoJSONSpec.js +++ b/spec/suites/layer/GeoJSONSpec.js @@ -1,5 +1,4 @@ describe("L.GeoJSON", function () { - describe("addData", function () { var geojson = { type: 'Feature', @@ -49,7 +48,6 @@ describe("L.GeoJSON", function () { }); describe('resetStyle', function () { - it('should reset init options', function () { var feature = { type: 'Feature', @@ -97,9 +95,7 @@ describe("L.GeoJSON", function () { expect(layer2.options.weight).to.be(7); expect(layer2.options.color).to.be('chocolate'); }); - }); - }); describe("L.Marker#toGeoJSON", function () { diff --git a/spec/suites/layer/ImageOverlaySpec.js b/spec/suites/layer/ImageOverlaySpec.js index 6f1616a8e87..7f4870c100d 100644 --- a/spec/suites/layer/ImageOverlaySpec.js +++ b/spec/suites/layer/ImageOverlaySpec.js @@ -1,10 +1,29 @@ describe('ImageOverlay', function () { + var c, map; + var imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]]; + + beforeEach(function () { + c = document.createElement('div'); + c.style.width = '400px'; + c.style.height = '400px'; + document.body.appendChild(c); + map = new L.Map(c); + map.setView(new L.LatLng(55.8, 37.6), 6); // view needs to be set so when layer is added it is initilized + }); + + afterEach(function () { + map.remove(); + map = null; + document.body.removeChild(c); + }); + describe('#setStyle', function () { it('sets opacity', function () { var overlay = L.imageOverlay().setStyle({opacity: 0.5}); expect(overlay.options.opacity).to.equal(0.5); }); }); + describe('#setBounds', function () { it('sets bounds', function () { var bounds = new L.LatLngBounds( @@ -14,22 +33,17 @@ describe('ImageOverlay', function () { expect(overlay._bounds).to.equal(bounds); }); }); + describe("_image", function () { - var c, map, overlay; + var overlay; + // Url for testing errors var errorUrl = 'data:image/false;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAT1JREFUOI2dk79qwlAUxr9zcKmxbyAWh0IIDqJrcchkX6ODrn2TDAWRPEkyKKVzBxHJkKFoySP0mlLhnA5NbIgmpf6my73n+853/xFKRLY9UJEpAy6Am2x6q8xLYZ73omhVrKd88DocNpvGPBHwUDYtIiL+9X7/2EmS9GiQiUMC7urER1RfLGPGnSRJGQCyzidiy/Nged6pAdHoo9XyAIAj2x78FfscBEw3jtNnFZn+V5zDIhPOTvsiFHAZv1d1SYIuXyrOaQDYArg9t3gIw1qxML81lHlJFQZfQVBrwKoLFuZ5VUHlO8ggVZ97UbQSEf9cwSEMq7ehOrPjeE0A8N5uXxnLCkA0qs2cIcBzM03vu7vdJwNAJ0lSy5hxVZJy51wMFH5jzsZx+iwyUcBlkS7wc9qsuiBV347jdbH+G/fth7AzHdiJAAAAAElFTkSuQmCC'; var blankUrl = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; - // Create map and overlay for each test + // Create overlay for each test beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - document.body.appendChild(c); - map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); // view needs to be set so when layer is added it is initilized - - overlay = L.imageOverlay(blankUrl, [[40.712216, -74.22655], [40.773941, -74.12544]], { + overlay = L.imageOverlay(blankUrl, imageBounds, { errorOverlayUrl: errorUrl, className: 'my-custom-image-class' }); @@ -43,10 +57,8 @@ describe('ImageOverlay', function () { // Clean up after each test run afterEach(function () { - document.body.removeChild(c); map.removeLayer(overlay); overlay = null; - map = null; }); function raiseImageEvent(event) { @@ -71,6 +83,7 @@ describe('ImageOverlay', function () { raiseImageEvent('error'); expect(errorRaised.called).to.be(true); }); + it('should change the image to errorOverlayUrl', function () { raiseImageEvent('error'); expect(overlay._url).to.be(errorUrl); @@ -86,28 +99,6 @@ describe('ImageOverlay', function () { }); describe('#setZIndex', function () { - - var div, map; - var corner1 = L.latLng(40.712, -74.227), - corner2 = L.latLng(40.774, -74.125), - bounds = L.latLngBounds(corner1, corner2); - - beforeEach(function () { - div = document.createElement('div'); - div.style.width = '800px'; - div.style.height = '600px'; - div.style.visibility = 'hidden'; - - document.body.appendChild(div); - - map = L.map(div); - map.setView([0, 0], 1); // view needs to be set so when layer is added it is initilized - }); - - afterEach(function () { - document.body.removeChild(div); - }); - it('sets the z-index of the image', function () { var overlay = L.imageOverlay(); overlay.setZIndex(10); @@ -115,7 +106,7 @@ describe('ImageOverlay', function () { }); it('should update the z-index of the image if it has allready been added to the map', function () { - var overlay = L.imageOverlay('', bounds); + var overlay = L.imageOverlay('', imageBounds); overlay.addTo(map); expect(overlay._image.style.zIndex).to.be('1'); @@ -124,14 +115,14 @@ describe('ImageOverlay', function () { }); it('should set the z-index of the image when it is added to the map', function () { - var overlay = L.imageOverlay('', bounds); + var overlay = L.imageOverlay('', imageBounds); overlay.setZIndex('10'); overlay.addTo(map); expect(overlay._image.style.zIndex).to.be('10'); }); it('should use the z-index specified in options', function () { - var overlay = L.imageOverlay('', bounds, {zIndex: 20}); + var overlay = L.imageOverlay('', imageBounds, {zIndex: 20}); overlay.addTo(map); expect(overlay._image.style.zIndex).to.be('20'); }); @@ -145,25 +136,8 @@ describe('ImageOverlay', function () { // For tests that do not actually need to append the map container to the document. // This saves PhantomJS memory. describe('_image2', function () { - var c, map, overlay; + var overlay; var blankUrl = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; - var bounds = [[40.712216, -74.22655], [40.773941, -74.12544]]; - - // Create map and overlay for each test - beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); // view needs to be set so when layer is added it is initialized - }); - - // Clean up after each test run - afterEach(function () { - map.removeLayer(overlay); - overlay = null; - map = null; - }); // https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes testCrossOriginValue(undefined, null); // Falsy value (other than empty string '') => no attribute set. @@ -174,7 +148,7 @@ describe('ImageOverlay', function () { function testCrossOriginValue(crossOrigin, expectedValue) { it('uses crossOrigin option value ' + crossOrigin, function () { - overlay = L.imageOverlay(blankUrl, bounds, { + overlay = L.imageOverlay(blankUrl, imageBounds, { crossOrigin: crossOrigin }); map.addLayer(overlay); diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index a5451e296bf..552f758fd2d 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -1,25 +1,28 @@ -describe('Popup', function () { - - var c, map; - - beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - document.body.appendChild(c); - map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); - }); +var c, map, center = [55.8, 37.6]; + +function setup() { + c = document.createElement('div'); + c.style.width = '400px'; + c.style.height = '400px'; + document.body.appendChild(c); + map = new L.Map(c); + map.setView(center, 6); +} + +function cleanup() { + map.remove(); + document.body.removeChild(c); +} - afterEach(function () { - document.body.removeChild(c); - }); +describe('Popup', function () { + beforeEach(setup); + afterEach(cleanup); it("closes on map click when map has closePopupOnClick option", function () { map.options.closePopupOnClick = true; var popup = new L.Popup() - .setLatLng(new L.LatLng(55.8, 37.6)) + .setLatLng(center) .openOn(map); happen.click(c); @@ -31,7 +34,7 @@ describe('Popup', function () { map.options.closePopupOnClick = false; var popup = new L.Popup({closeOnClick: true}) - .setLatLng(new L.LatLng(55.8, 37.6)) + .setLatLng(center) .openOn(map); happen.click(c); @@ -43,7 +46,7 @@ describe('Popup', function () { map.options.closePopupOnClick = true; var popup = new L.Popup({closeOnClick: false}) - .setLatLng(new L.LatLng(55.8, 37.6)) + .setLatLng(center) .openOn(map); happen.click(c); @@ -52,7 +55,7 @@ describe('Popup', function () { }); it("toggles its visibility when marker is clicked", function () { - var marker = new L.Marker(new L.LatLng(55.8, 37.6)); + var marker = new L.Marker(center); map.addLayer(marker); marker.bindPopup('Popup1'); @@ -68,8 +71,8 @@ describe('Popup', function () { }); it("it should use a popup with a function as content with a FeatureGroup", function () { - var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); - var marker2 = new L.Marker(new L.LatLng(54.6, 38.2)); + var marker1 = new L.Marker(center); + var marker2 = new L.Marker([54.6, 38.2]); var group = new L.FeatureGroup([marker1, marker2]).addTo(map); marker1.description = "I'm marker 1."; @@ -82,7 +85,7 @@ describe('Popup', function () { // toggle popup on marker1 group.fire('click', { - latlng: new L.LatLng(55.8, 37.6), + latlng: center, layer: marker1 }); expect(map.hasLayer(group._popup)).to.be(true); @@ -90,7 +93,7 @@ describe('Popup', function () { // toggle popup on marker2 group.fire('click', { - latlng: new L.LatLng(54.6, 38.2), + latlng: [54.6, 38.2], layer: marker2 }); expect(map.hasLayer(group._popup)).to.be(true); @@ -98,8 +101,8 @@ describe('Popup', function () { }); it("it should function for popup content after bindPopup is called", function () { - var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); - var marker2 = new L.Marker(new L.LatLng(54.6, 38.2)); + var marker1 = new L.Marker(center); + var marker2 = new L.Marker([54.6, 38.2]); var group = new L.FeatureGroup([marker1]).addTo(map); marker1.description = "I'm marker 1."; @@ -114,7 +117,7 @@ describe('Popup', function () { // toggle popup on marker1 group.fire('click', { - latlng: new L.LatLng(55.8, 37.6), + latlng: center, layer: marker1 }); expect(map.hasLayer(group._popup)).to.be(true); @@ -122,7 +125,7 @@ describe('Popup', function () { // toggle popup on marker2 group.fire('click', { - latlng: new L.LatLng(54.6, 38.2), + latlng: [54.6, 38.2], layer: marker2 }); expect(map.hasLayer(group._popup)).to.be(true); @@ -130,8 +133,8 @@ describe('Popup', function () { }); it("should use a function for popup content when a source is passed to Popup", function () { - var marker = new L.Marker(new L.LatLng(55.8, 37.6)).addTo(map); - var popup = L.popup({}, marker); + var marker = new L.Marker(center).addTo(map); + L.popup({}, marker); marker.description = "I am a marker."; @@ -140,7 +143,7 @@ describe('Popup', function () { }); marker.fire('click', { - latlng: new L.LatLng(55.8, 37.6) + latlng: center }); expect(map.hasLayer(marker._popup)).to.be(true); @@ -148,8 +151,8 @@ describe('Popup', function () { }); it("triggers popupopen on marker when popup opens", function () { - var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); - var marker2 = new L.Marker(new L.LatLng(57.123076977278, 44.861962891635)); + var marker1 = new L.Marker(center); + var marker2 = new L.Marker([57.123076977278, 44.861962891635]); map.addLayer(marker1); map.addLayer(marker2); @@ -169,8 +172,8 @@ describe('Popup', function () { }); it("triggers popupclose on marker when popup closes", function () { - var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); - var marker2 = new L.Marker(new L.LatLng(57.123076977278, 44.861962891635)); + var marker1 = new L.Marker(center); + var marker2 = new L.Marker([57.123076977278, 44.861962891635]); map.addLayer(marker1); map.addLayer(marker2); @@ -195,7 +198,7 @@ describe('Popup', function () { }); describe('should take into account icon popupAnchor option on', function () { - var latlng = new L.LatLng(55.8, 37.6); + var latlng = center; var offset = new L.Point(20, 30); var autoPanBefore; var popupAnchorBefore; @@ -221,7 +224,7 @@ describe('Popup', function () { L.Icon.Default.prototype.options.popupAnchor = popupAnchorBefore; }); - it.skipInNonPhantom("non-any3d browsers", function () { + it.skipIf3d("non-any3d browsers", function () { marker1.bindPopup('Popup').addTo(map); marker1.openPopup(); var defaultLeft = parseInt(marker1._popup._container.style.left, 10); @@ -242,7 +245,7 @@ describe('Popup', function () { expect(offsetBottom + offset.y).to.eql(defaultBottom); }); - it.skipInPhantom("any3d browsers", function () { + it.skipIfNo3d("any3d browsers", function () { marker1.bindPopup('Popup').addTo(map); marker1.openPopup(); var defaultLeft = marker1._popup._container._leaflet_pos.x; @@ -265,7 +268,7 @@ describe('Popup', function () { }); it("prevents an underlying map click for Layer", function () { - var layer = new L.Polygon([[55.8, 37.6], [55.9, 37.7], [56.0, 37.8]]).addTo(map); + var layer = new L.Polygon([center, [55.9, 37.7], [56.0, 37.8]]).addTo(map); layer.bindPopup("layer popup"); var mapClicked = false; @@ -285,7 +288,7 @@ describe('Popup', function () { it("can open a popup with enter keypress when marker has focus", function () { - var layer = new L.Marker([55.8, 37.6]).addTo(map); + var layer = new L.Marker(center).addTo(map); layer.bindPopup("layer popup"); happen.keypress(layer._icon, { @@ -296,7 +299,6 @@ describe('Popup', function () { }); describe("autoPan option should pan popup into visibility", function () { - // Helper function which calculates the offset of the map-container & popup-container in pixel function getPopupOffset(map, popup) { var mapOffset = map._container.getBoundingClientRect().top; @@ -310,7 +312,7 @@ describe('Popup', function () { expect(popupTopOffset).to.be.below(0, "The upper edge of the popup should not be visible"); done(); }); - map.openPopup('
    ', L.latLng(58.4, 37.6), { + map.openPopup('
    ', [58.4, 37.6], { autoPan: false }); }); @@ -321,7 +323,7 @@ describe('Popup', function () { expect(popupTopOffset).to.be(10, "The upper edge of the popup have a padding of 10"); done(); }); - map.openPopup('
    ', L.latLng(58.4, 37.6), { + map.openPopup('
    ', [58.4, 37.6], { autoPan: true, autoPanPadding: L.point(10, 10) }); @@ -339,7 +341,7 @@ describe('Popup', function () { duration: 1 }); - map.openPopup('
    ', L.latLng(58.4, 37.6), { + map.openPopup('
    ', [58.4, 37.6], { autoPan: true, autoPanPadding: L.point(10, 10) }); @@ -348,52 +350,39 @@ describe('Popup', function () { }); describe("L.Map#openPopup", function () { - var c, map; - - beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); - }); - - afterEach(function () { - if (document.body.contains(c)) { - document.body.removeChild(c); - } - }); + beforeEach(setup); + afterEach(cleanup); it("adds the popup layer to the map", function () { var popup = new L.Popup() - .setLatLng(new L.LatLng(55.8, 37.6)); + .setLatLng(center); map.openPopup(popup); expect(map.hasLayer(popup)).to.be(true); }); it("sets popup location", function () { var popup = new L.Popup(); - map.openPopup(popup, L.latLng(55.8, 37.6)); + map.openPopup(popup, center); expect(popup.getLatLng()).to.eql(L.latLng(55.8, 37.6)); }); it("creates a popup from content", function () { - map.openPopup("

    Hello World

    ", L.latLng(55.8, 37.6)); + map.openPopup("

    Hello World

    ", center); expect(map._popup).to.be.an(L.Popup); expect(map._popup.getContent()).to.eql("

    Hello World

    "); }); it("closes existing popup", function () { - var p1 = new L.Popup().setLatLng(new L.LatLng(55.8, 37.6)); - var p2 = new L.Popup().setLatLng(new L.LatLng(55.8, 37.6)); + var p1 = new L.Popup().setLatLng(center); + var p2 = new L.Popup().setLatLng(center); map.openPopup(p1); map.openPopup(p2); expect(map.hasLayer(p1)).to.be(false); }); it("does not close existing popup with autoClose: false option", function () { - var p1 = new L.Popup({autoClose: false}).setLatLng(new L.LatLng(55.8, 37.6)); - var p2 = new L.Popup().setLatLng(new L.LatLng(55.8, 37.6)); + var p1 = new L.Popup({autoClose: false}).setLatLng(center); + var p2 = new L.Popup().setLatLng(center); map.openPopup(p1); map.openPopup(p2); expect(map.hasLayer(p1)).to.be(true); @@ -401,14 +390,14 @@ describe("L.Map#openPopup", function () { }); it('should not be closen when dragging map', function (done) { - document.body.appendChild(c); c.style.position = 'absolute'; c.style.left = 0; c.style.top = 0; c.style.zIndex = 10000; + var coords = map._container.getBoundingClientRect(); var spy = sinon.spy(); - var p = new L.Popup().setLatLng(new L.LatLng(55.8, 37.6)); + var p = new L.Popup().setLatLng(center); map.openPopup(p); expect(map.hasLayer(p)).to.be(true); map.on('drag', spy); @@ -427,23 +416,15 @@ describe("L.Map#openPopup", function () { }); describe('L.Layer#_popup', function () { - var c, map, marker; + beforeEach(setup); + afterEach(cleanup); + + var marker; beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); marker = L.marker(L.latLng(55.8, 37.6)).addTo(map); }); - afterEach(function () { - if (document.body.contains(c)) { - document.body.removeChild(c); - } - }); - it("only adds a popup to the map when opened", function () { marker.bindPopup("new layer"); expect(map.hasLayer(marker.getPopup())).to.be(false); @@ -489,8 +470,7 @@ describe('L.Layer#_popup', function () { }); it('does not throw is popup is inmediately closed', function (done) { - - map.on('popupopen', function (ev) { + map.on('popupopen', function () { marker.closePopup(); }); diff --git a/spec/suites/layer/TooltipSpec.js b/spec/suites/layer/TooltipSpec.js index be4d3447f89..ceaa032199d 100644 --- a/spec/suites/layer/TooltipSpec.js +++ b/spec/suites/layer/TooltipSpec.js @@ -1,6 +1,5 @@ describe('Tooltip', function () { - - var c, map, p2ll, + var c, map, center = [55.8, 37.6]; beforeEach(function () { @@ -14,12 +13,10 @@ describe('Tooltip', function () { document.body.appendChild(c); map = new L.Map(c); map.setView(center, 6); - p2ll = function (x, y) { - return map.layerPointToLatLng([x, y]); - }; }); afterEach(function () { + map.remove(); document.body.removeChild(c); }); @@ -168,8 +165,8 @@ describe('Tooltip', function () { }); it("it should use a tooltip with a function as content with a FeatureGroup", function () { - var marker1 = new L.Marker(new L.LatLng(55.8, 37.6), {description: "I'm marker 1."}); - var marker2 = new L.Marker(new L.LatLng(54.6, 38.2), {description: "I'm marker 2."}); + var marker1 = new L.Marker([55.8, 37.6], {description: "I'm marker 1."}); + var marker2 = new L.Marker([54.6, 38.2], {description: "I'm marker 2."}); var group = new L.FeatureGroup([marker1, marker2]).addTo(map); group.bindTooltip(function (layer) { @@ -286,6 +283,4 @@ describe('Tooltip', function () { layer.bindTooltip('Tooltip', {interactive: true}); layer.closeTooltip(); }); - }); - diff --git a/spec/suites/layer/marker/Icon.DefaultSpec.js b/spec/suites/layer/marker/Icon.DefaultSpec.js index 1c9666390c7..f29c033952e 100644 --- a/spec/suites/layer/marker/Icon.DefaultSpec.js +++ b/spec/suites/layer/marker/Icon.DefaultSpec.js @@ -1,33 +1,28 @@ describe("Icon.Default", function () { + var div, map; - it("icon measures 25x41px", function () { - var div = document.createElement('div'); + beforeEach(function () { + div = document.createElement('div'); div.style.height = '100px'; document.body.appendChild(div); + map = L.map(div).setView([0, 0], 0); + L.marker([0, 0]).addTo(map); + }); - var map = L.map(div).setView([0, 0], 0); - - var marker = new L.Marker([0, 0]).addTo(map); + afterEach(function () { + map.remove(); + document.body.removeChild(div); + }); + it("icon measures 25x41px", function () { var img = map.getPane('markerPane').querySelector('img'); expect(img.clientHeight).to.be(41); expect(img.clientWidth).to.be(25); - document.body.removeChild(div); }); it("shadow measures 41x41px", function () { - var div = document.createElement('div'); - div.style.height = '100px'; - document.body.appendChild(div); - - var map = L.map(div).setView([0, 0], 0); - - var marker = new L.Marker([0, 0]).addTo(map); - var img = map.getPane('shadowPane').querySelector('img'); expect(img.clientHeight).to.be(41); expect(img.clientWidth).to.be(41); - document.body.removeChild(div); }); - }); diff --git a/spec/suites/layer/marker/Marker.DragSpec.js b/spec/suites/layer/marker/Marker.DragSpec.js index 107f3296e48..f2035763d4b 100644 --- a/spec/suites/layer/marker/Marker.DragSpec.js +++ b/spec/suites/layer/marker/Marker.DragSpec.js @@ -13,6 +13,7 @@ describe("Marker.Drag", function () { }); afterEach(function () { + map.remove(); document.body.removeChild(div); }); @@ -20,8 +21,7 @@ describe("Marker.Drag", function () { it("drags a marker with mouse", function (done) { var marker = new L.Marker([0, 0], { draggable: true - }); - map.addLayer(marker); + }).addTo(map); var hand = new Hand({ timing: 'fastframe', @@ -55,16 +55,10 @@ describe("Marker.Drag", function () { div.style.webkitTransform = 'scale(' + scaleX + ', ' + scaleY + ')'; }); - afterEach(function () { - div.style.webkitTransformOrigin = ''; - div.style.webkitTransform = ''; - }); - it("drags a marker with mouse, compensating for CSS scale", function (done) { var marker = new L.Marker([0, 0], { draggable: true - }); - map.addLayer(marker); + }).addTo(map); var hand = new Hand({ timing: 'fastframe', @@ -94,8 +88,7 @@ describe("Marker.Drag", function () { var marker = new L.Marker([0, 0], { draggable: true, autoPan: true - }); - map.addLayer(marker); + }).addTo(map); var hand = new Hand({ timing: 'fastframe', diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js index 63b9e306634..8453c721246 100644 --- a/spec/suites/layer/marker/MarkerSpec.js +++ b/spec/suites/layer/marker/MarkerSpec.js @@ -1,6 +1,5 @@ describe("Marker", function () { var map, - spy, div, icon1, icon2; @@ -19,6 +18,7 @@ describe("Marker", function () { }); afterEach(function () { + map.remove(); document.body.removeChild(div); }); @@ -139,7 +139,6 @@ describe("Marker", function () { map.addLayer(marker); marker.setIcon(new L.DivIcon()); - var afterIcon = marker._icon; expect(marker._icon.innerHTML).to.not.contain('Inner1Text'); }); @@ -328,6 +327,5 @@ describe("Marker", function () { }); happen.mousemove(marker._icon); }); - }); }); diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index 4698a7a3b6a..2177781ab81 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -1,6 +1,4 @@ - describe('GridLayer', function () { - var div, map; beforeEach(function () { @@ -15,6 +13,7 @@ describe('GridLayer', function () { }); afterEach(function () { + map.remove(); document.body.removeChild(div); }); @@ -44,7 +43,6 @@ describe('GridLayer', function () { }); it('positions tiles correctly with wrapping and bounding', function () { - map.setView([0, 0], 1); var tiles = []; @@ -107,7 +105,7 @@ describe('GridLayer', function () { delete tiles[grid._tileCoordsToKey(e.coords)]; }); - grid.on('load', function (e) { + grid.on('load', function () { if (Object.keys(tiles).length === 1) { expect(Object.keys(tiles)).to.eql(['0:0:0']); grid.off(); @@ -129,27 +127,21 @@ describe('GridLayer', function () { div.style.width = '512px'; div.style.height = '512px'; - map.remove(); - map = L.map(div); map.setView([0, 0], 10); grid = L.gridLayer(); }); - afterEach(function () { - div.style.width = '800px'; - div.style.height = '600px'; - }); - // Passes on Firefox, but fails on phantomJS: done is never called. it('only creates tiles for visible area on zoom in', function (done) { + map._zoomAnimated = false; // fixme https://github.com/Leaflet/Leaflet/issues/7116 var count = 0, loadCount = 0; - grid.createTile = function (coords) { + grid.createTile = function () { count++; return document.createElement('div'); }; - var onLoad = function (e) { + var onLoad = function () { expect(count).to.eql(4); count = 0; loadCount++; @@ -237,13 +229,15 @@ describe('GridLayer', function () { }); describe("#getMaxZoom, #getMinZoom", function () { + beforeEach(function () { + map.setView([0, 0], 1); + }); + describe("when a tilelayer is added to a map with no other layers", function () { it("has the same zoomlevels as the tilelayer", function () { var maxZoom = 10, minZoom = 5; - map.setView([0, 0], 1); - L.gridLayer({ maxZoom: maxZoom, minZoom: minZoom @@ -256,8 +250,6 @@ describe('GridLayer', function () { describe("accessing a tilelayer's properties", function () { it('provides a container', function () { - map.setView([0, 0], 1); - var layer = L.gridLayer().addTo(map); expect(layer.getContainer()).to.be.ok(); }); @@ -265,8 +257,6 @@ describe('GridLayer', function () { describe("when a tilelayer is added to a map that already has a tilelayer", function () { it("has its zoomlevels updated to fit the new layer", function () { - map.setView([0, 0], 1); - L.gridLayer({minZoom: 10, maxZoom: 15}).addTo(map); expect(map.getMinZoom()).to.be(10); expect(map.getMaxZoom()).to.be(15); @@ -294,31 +284,28 @@ describe('GridLayer', function () { L.gridLayer({minZoom: 10, maxZoom: 20}).addTo(map), L.gridLayer({minZoom: 0, maxZoom: 25}).addTo(map) ]; - map.whenReady(function () { - expect(map.getMinZoom()).to.be(0); - expect(map.getMaxZoom()).to.be(25); + expect(map.getMinZoom()).to.be(0); + expect(map.getMaxZoom()).to.be(25); - map.removeLayer(tiles[0]); - expect(map.getMinZoom()).to.be(0); - expect(map.getMaxZoom()).to.be(25); + map.removeLayer(tiles[0]); + expect(map.getMinZoom()).to.be(0); + expect(map.getMaxZoom()).to.be(25); - map.removeLayer(tiles[3]); - expect(map.getMinZoom()).to.be(5); - expect(map.getMaxZoom()).to.be(20); + map.removeLayer(tiles[3]); + expect(map.getMinZoom()).to.be(5); + expect(map.getMaxZoom()).to.be(20); - map.removeLayer(tiles[2]); - expect(map.getMinZoom()).to.be(5); - expect(map.getMaxZoom()).to.be(10); + map.removeLayer(tiles[2]); + expect(map.getMinZoom()).to.be(5); + expect(map.getMaxZoom()).to.be(10); - map.removeLayer(tiles[1]); - expect(map.getMinZoom()).to.be(0); - expect(map.getMaxZoom()).to.be(Infinity); - }); + map.removeLayer(tiles[1]); + expect(map.getMinZoom()).to.be(0); + expect(map.getMaxZoom()).to.be(Infinity); }); }); }); - describe("min/maxNativeZoom option", function () { it("calls createTile() with maxNativeZoom when map zoom is larger", function (done) { map.setView([0, 0], 10); @@ -414,7 +401,6 @@ describe('GridLayer', function () { }); it("Loads 8 tiles zoom 1", function (done) { - grid.on('load', function () { expect(counts.tileloadstart).to.be(8); expect(counts.tileload).to.be(8); @@ -427,7 +413,6 @@ describe('GridLayer', function () { }); it("Loads 5 tiles zoom 0", function (done) { - grid.on('load', function () { expect(counts.tileloadstart).to.be(5); expect(counts.tileload).to.be(5); @@ -440,7 +425,6 @@ describe('GridLayer', function () { }); it("Loads 16 tiles zoom 10", function (done) { - grid.on('load', function () { expect(counts.tileloadstart).to.be(16); expect(counts.tileload).to.be(16); @@ -455,7 +439,6 @@ describe('GridLayer', function () { }); it("Loads 32, unloads 16 tiles zooming in 10-11", function (done) { - grid.on('load', function () { expect(counts.tileloadstart).to.be(16); expect(counts.tileload).to.be(16); @@ -479,7 +462,6 @@ describe('GridLayer', function () { }); it("Loads 32, unloads 16 tiles zooming out 11-10", function (done) { - grid.on('load', function () { expect(counts.tileloadstart).to.be(16); expect(counts.tileload).to.be(16); @@ -502,9 +484,7 @@ describe('GridLayer', function () { clock.tick(250); }); - it("Loads 32, unloads 16 tiles zooming out 18-10", function (done) { - grid.on('load', function () { expect(counts.tileloadstart).to.be(16); expect(counts.tileload).to.be(16); @@ -522,16 +502,12 @@ describe('GridLayer', function () { clock.tick(250); }); - map.addLayer(grid).setView([0, 0], 18); clock.tick(250); }); - }); - describe("number of 256px tiles loaded in synchronous animated grid @800x600px", function () { - var clock, grid, counts; beforeEach(function () { @@ -569,6 +545,7 @@ describe('GridLayer', function () { }); // Debug helper + /* function logTiles(ev) { var pending = 0; for (var key in grid._tiles) { @@ -576,7 +553,7 @@ describe('GridLayer', function () { } console.log(ev.type + ': ', ev.coords, grid._loading, counts, ' pending: ', pending); } - + */ // animationFrame helper, just runs requestAnimFrame() a given number of times function runFrames(n) { @@ -597,8 +574,7 @@ describe('GridLayer', function () { // NOTE: This test has different behaviour in PhantomJS and graphical // browsers due to CSS animations! - it.skipInPhantom("Loads 32, unloads 16 tiles zooming in 10-11", function (done) { - + it.skipIfNo3d("Loads 32, unloads 16 tiles zooming in 10-11", function (done) { // Advance the time to !== 0 otherwise `tile.loaded` timestamp will appear to be falsy. clock.tick(1); // Date.now() is 1. @@ -708,8 +684,7 @@ describe('GridLayer', function () { // NOTE: This test has different behaviour in PhantomJS and graphical // browsers due to CSS animations! - it.skipInPhantom("Loads 32, unloads 16 tiles zooming out 11-10", function (done) { - + it.skipIfNo3d("Loads 32, unloads 16 tiles zooming out 11-10", function (done) { // Advance the time to !== 0 otherwise `tile.loaded` timestamp will appear to be falsy. clock.tick(1); // Date.now() is 1. @@ -783,7 +758,6 @@ describe('GridLayer', function () { }); it("Loads 32, unloads 16 tiles zooming out 18-10", function (done) { - grid.on('load', function () { expect(counts.tileloadstart).to.be(16); expect(counts.tileload).to.be(16); @@ -812,8 +786,7 @@ describe('GridLayer', function () { // NOTE: This test has different behaviour in PhantomJS and graphical // browsers due to CSS animations! - it.skipInPhantom("Loads 290, unloads 275 tiles on MAD-TRD flyTo()", function (done) { - + it.skipIfNo3d("Loads 290, unloads 275 tiles on MAD-TRD flyTo()", function (done) { this.timeout(10000); // This test takes longer than usual due to frames var mad = [40.40, -3.7], trd = [63.41, 10.41]; @@ -896,7 +869,6 @@ describe('GridLayer', function () { // NOTE: This test has different behaviour in PhantomJS and graphical // browsers due to CSS animations! it("Loads map, moves forth by 512 px, keepBuffer = 0", function (done) { - // Advance the time to !== 0 otherwise `tile.loaded` timestamp will appear to be falsy. clock.tick(1); // Date.now() is 1. @@ -944,7 +916,6 @@ describe('GridLayer', function () { // OOOO map.panBy([512, 512], {animate: false}); // clock.tick(250); - }); }); @@ -958,7 +929,6 @@ describe('GridLayer', function () { // NOTE: This test has different behaviour in PhantomJS and graphical // browsers due to CSS animations! it("Loads map, moves forth and back by 512 px, keepBuffer = 0", function (done) { - grid.once('load', function () { expect(counts.tileloadstart).to.be(16); expect(counts.tileload).to.be(16); @@ -1003,7 +973,6 @@ describe('GridLayer', function () { }); it("Loads map, moves forth and back by 512 px, default keepBuffer", function (done) { - var spy = sinon.spy(); grid.on('load', function () { @@ -1038,7 +1007,6 @@ describe('GridLayer', function () { describe("nowrap option", function () { it("When false, uses same coords at zoom 0 for all tiles", function (done) { - var grid = L.gridLayer({ attribution: 'Grid Layer', tileSize: L.point(256, 256), @@ -1060,7 +1028,6 @@ describe('GridLayer', function () { }); it("When true, uses different coords at zoom level 0 for all tiles", function (done) { - var grid = L.gridLayer({ attribution: 'Grid Layer', tileSize: L.point(256, 256), @@ -1082,7 +1049,6 @@ describe('GridLayer', function () { }); it("When true and with bounds, loads just one tile at zoom level 0", function (done) { - var grid = L.gridLayer({ attribution: 'Grid Layer', tileSize: L.point(256, 256), diff --git a/spec/suites/layer/tile/TileLayerSpec.js b/spec/suites/layer/tile/TileLayerSpec.js index 2f1c032d408..2caed401900 100644 --- a/spec/suites/layer/tile/TileLayerSpec.js +++ b/spec/suites/layer/tile/TileLayerSpec.js @@ -1,7 +1,4 @@ - - describe('TileLayer', function () { - var div, map; // Placekitten via http://placekitten.com/attribution.html @@ -166,16 +163,13 @@ describe('TileLayer', function () { div.style.width = '800px'; div.style.height = '600px'; div.style.visibility = 'hidden'; - document.body.appendChild(div); - map = L.map(div); }); afterEach(function () { - if (div) { - document.body.removeChild(div); - } + map.remove(); + document.body.removeChild(div); }); function kittenLayerFactory(options) { @@ -192,7 +186,6 @@ describe('TileLayer', function () { } describe("number of kittens loaded", function () { - var clock, kittenLayer, counts; // animationFrame helper, just runs requestAnimFrame() a given number of times @@ -244,7 +237,6 @@ describe('TileLayer', function () { }); it("Loads 8 kittens zoom 1", function (done) { - kittenLayer.on('load', function () { expect(counts.tileloadstart).to.be(8); expect(counts.tileload).to.be(8); @@ -257,11 +249,9 @@ describe('TileLayer', function () { clock.tick(250); }); - // NOTE: This test has different behaviour in PhantomJS and graphical // browsers due to CSS animations! - it.skipInPhantom("Loads 290, unloads 275 kittens on MAD-TRD flyTo()", function (done) { - + it.skipIfNo3d("Loads 290, unloads 275 kittens on MAD-TRD flyTo()", function (done) { this.timeout(10000); // This test takes longer than usual due to frames var mad = [40.40, -3.7], trd = [63.41, 10.41]; @@ -300,14 +290,9 @@ describe('TileLayer', function () { describe('url template', function () { beforeEach(function () { - div = document.createElement('div'); div.style.width = '400px'; div.style.height = '400px'; - div.style.visibility = 'hidden'; - - document.body.appendChild(div); - - map = L.map(div).setView([0, 0], 2); + map.setView([0, 0], 2); }); it('replaces {y} with y coordinate', function () { @@ -423,18 +408,8 @@ describe('TileLayer', function () { }); describe('options', function () { - beforeEach(function () { - div = document.createElement('div'); - div.style.width = '400px'; - div.style.height = '400px'; - - map = L.map(div).setView([0, 0], 2); - }); - - afterEach(function () { - map = null; - div = null; + map.setView([0, 0], 2); }); // https://html.spec.whatwg.org/multipage/urls-and-fetching.html#cors-settings-attributes diff --git a/spec/suites/layer/vector/CanvasSpec.js b/spec/suites/layer/vector/CanvasSpec.js index 3d03491765b..296335d7d1f 100644 --- a/spec/suites/layer/vector/CanvasSpec.js +++ b/spec/suites/layer/vector/CanvasSpec.js @@ -1,8 +1,12 @@ describe('Canvas', function () { + document.body.appendChild(document.createElement('div')); + var c, map, latLngs; - var c, map, p2ll, latLngs; + function p2ll(x, y) { + return map.layerPointToLatLng([x, y]); + } - before(function () { + beforeEach(function () { c = document.createElement('div'); c.style.width = '400px'; c.style.height = '400px'; @@ -12,13 +16,13 @@ describe('Canvas', function () { document.body.appendChild(c); map = new L.Map(c, {preferCanvas: true, zoomControl: false}); map.setView([0, 0], 6); - p2ll = function (x, y) { - return map.layerPointToLatLng([x, y]); - }; latLngs = [p2ll(0, 0), p2ll(0, 100), p2ll(100, 100), p2ll(100, 0)]; }); - after(function () { + afterEach(function () { + if (map._conteiner_id) { + map.remove(); + } document.body.removeChild(c); }); @@ -29,10 +33,6 @@ describe('Canvas', function () { layer = L.polygon(latLngs).addTo(map); }); - afterEach(function () { - layer.remove(); - }); - it("should fire event when layer contains mouse", function () { var spy = sinon.spy(); layer.on('click', spy); @@ -40,7 +40,6 @@ describe('Canvas', function () { expect(spy.callCount).to.eql(1); happen.at('click', 150, 150); // Click outside layer. expect(spy.callCount).to.eql(1); - layer.off("click", spy); }); it("DOM events propagate from canvas polygon to map", function () { @@ -48,7 +47,6 @@ describe('Canvas', function () { map.on("click", spy); happen.at('click', 50, 50); expect(spy.callCount).to.eql(1); - map.off("click", spy); }); it("DOM events fired on canvas polygon can be cancelled before being caught by the map", function () { @@ -59,18 +57,14 @@ describe('Canvas', function () { happen.at('click', 50, 50); expect(layerSpy.callCount).to.eql(1); expect(mapSpy.callCount).to.eql(0); - map.off("click", mapSpy); - layer.off("click", L.DomEvent.stopPropagation).off("click", layerSpy); }); it("DOM events fired on canvas polygon are propagated only once to the map even when two layers contains the event", function () { var spy = sinon.spy(); - var layer2 = L.polygon(latLngs).addTo(map); + L.polygon(latLngs).addTo(map); // layer 2 map.on("click", spy); happen.at('click', 50, 50); expect(spy.callCount).to.eql(1); - layer2.remove(); - map.off("click", spy); }); it("should fire preclick before click", function () { @@ -78,7 +72,7 @@ describe('Canvas', function () { var preclickSpy = sinon.spy(); layer.on('click', clickSpy); layer.on('preclick', preclickSpy); - layer.once('preclick', function (e) { + layer.once('preclick', function () { expect(clickSpy.called).to.be(false); }); happen.at('click', 50, 50); // Click on the layer. @@ -87,7 +81,6 @@ describe('Canvas', function () { happen.at('click', 150, 150); // Click outside layer. expect(clickSpy.callCount).to.eql(1); expect(preclickSpy.callCount).to.eql(1); - layer.off(); }); it("should not fire click when dragging the map on top of it", function (done) { @@ -106,7 +99,6 @@ describe('Canvas', function () { expect(downSpy.called).to.be(true); expect(clickSpy.called).to.be(false); expect(preclickSpy.called).to.be(false); - layer.off(); done(); } }); @@ -121,34 +113,24 @@ describe('Canvas', function () { }); describe("#events(interactive=false)", function () { - var layer; - - beforeEach(function () { - layer = L.polygon(latLngs, {interactive: false}).addTo(map); - }); - - afterEach(function () { - layer.remove(); - }); - it("should not fire click when not interactive", function () { + var layer = L.polygon(latLngs, {interactive: false}).addTo(map); var spy = sinon.spy(); layer.on('click', spy); happen.at('click', 50, 50); // Click on the layer. expect(spy.callCount).to.eql(0); happen.at('click', 150, 150); // Click outside layer. expect(spy.callCount).to.eql(0); - layer.off("click", spy); }); - }); describe('#dashArray', function () { it('can add polyline with dashArray', function () { - var layer = L.polygon(latLngs, { + L.polygon(latLngs, { dashArray: "5,5" }).addTo(map); }); + it('can setStyle with dashArray', function () { var layer = L.polygon(latLngs).addTo(map); layer.setStyle({ @@ -190,22 +172,6 @@ describe('Canvas', function () { }); describe('#bringToBack', function () { - - var c, map; - - beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - map = new L.Map(c, {preferCanvas: true}); - map.setView(new L.LatLng(0, 0), 0); - document.body.appendChild(c); - }); - - afterEach(function () { - document.body.removeChild(c); - }); - it('is a no-op for layers not on a map', function () { var path = new L.Polyline([[1, 2], [3, 4], [5, 6]]); expect(path.bringToBack()).to.equal(path); @@ -221,23 +187,7 @@ describe('Canvas', function () { }); }); - describe('#bringToFront', function () { - - var c, map; - - beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - map = new L.Map(c, {preferCanvas: true}); - map.setView(new L.LatLng(0, 0), 0); - document.body.appendChild(c); - }); - - afterEach(function () { - document.body.removeChild(c); - }); it('is a no-op for layers not on a map', function () { var path = new L.Polyline([[1, 2], [3, 4], [5, 6]]); expect(path.bringToFront()).to.equal(path); @@ -252,50 +202,25 @@ describe('Canvas', function () { expect(path.bringToFront()).to.equal(path); }); }); -}); -describe('Canvas remove', function () { - - var c; - - before(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - c.style.position = 'absolute'; - c.style.top = '0'; - c.style.left = '0'; - document.body.appendChild(c); - }); + describe('Canvas #remove', function () { + it("can remove the map without errors", function (done) { + L.polygon(latLngs).addTo(map); + map.remove(); + L.Util.requestAnimFrame(function () { done(); }); + }); - after(function () { - document.body.removeChild(c); - }); + it("can remove renderer without errors", function (done) { + map.remove(); - function createCanvasMap(c, options) { - var map = new L.Map(c, options); - map.setView([0, 0], 6); - var p2ll = function (x, y) { - return map.layerPointToLatLng([x, y]); - }; - var latLngs = [p2ll(0, 0), p2ll(0, 100), p2ll(100, 100), p2ll(100, 0)]; - var layer = L.polygon(latLngs).addTo(map); - return map; - } + var canvas = L.canvas(); + map = L.map(c, {renderer: canvas}); + map.setView([0, 0], 6); + L.polygon(latLngs).addTo(map); - it("can remove the map without errors", function (done) { - var map1 = createCanvasMap(c, {preferCanvas: true, zoomControl: false}); - map1.remove(); - L.Util.requestAnimFrame(function () { done(); }); - }); - - it("can remove renderer without errors", function (done) { - var canvas = L.canvas(); - var map = createCanvasMap(c, {renderer: canvas, zoomControl: false}); - canvas.remove(); - map.remove(); - L.Util.requestAnimFrame(function () { done(); }); + canvas.remove(); + map.remove(); + L.Util.requestAnimFrame(function () { done(); }); + }); }); - }); - diff --git a/spec/suites/layer/vector/CircleMarkerSpec.js b/spec/suites/layer/vector/CircleMarkerSpec.js index 4a6a9768b28..2a6a85cbadd 100644 --- a/spec/suites/layer/vector/CircleMarkerSpec.js +++ b/spec/suites/layer/vector/CircleMarkerSpec.js @@ -1,10 +1,16 @@ describe('CircleMarker', function () { + var map; + + beforeEach(function () { + map = L.map(document.createElement('div')); + map.setView([0, 0], 1); + }); + + afterEach(function () { + map.remove(); + }); + describe("#_radius", function () { - var map; - beforeEach(function () { - map = L.map(document.createElement('div')); - map.setView([0, 0], 1); - }); describe("when a CircleMarker is added to the map ", function () { describe("with a radius set as an option", function () { it("takes that radius", function () { @@ -40,6 +46,7 @@ expect(marker._radius).to.be(15); }); }); + describe("and setStyle is used to change the radius before adding", function () { it("takes the given radius", function () { var marker = L.circleMarker([0, 0], {radius: 20}); @@ -52,15 +59,7 @@ }); describe("#setLatLng", function () { - var map; - - beforeEach(function () { - map = L.map(document.createElement('div')); - map.setView([0, 0], 1); - }); - it("fires a move event", function () { - var marker = new L.CircleMarker([0, 0]); map.addLayer(marker); diff --git a/spec/suites/layer/vector/CircleSpec.js b/spec/suites/layer/vector/CircleSpec.js index 65d4a349ce9..86abc669376 100644 --- a/spec/suites/layer/vector/CircleSpec.js +++ b/spec/suites/layer/vector/CircleSpec.js @@ -1,7 +1,16 @@ describe('Circle', function () { + var map, circle; - describe('#init', function () { + beforeEach(function () { + map = L.map(document.createElement('div')).setView([0, 0], 4); + circle = L.circle([50, 30], {radius: 200}).addTo(map); + }); + + afterEach(function () { + map.remove(); + }); + describe('#init', function () { it('uses default radius if not given', function () { var circle = L.circle([0, 0]); expect(circle.getRadius()).to.eql(10); @@ -16,14 +25,6 @@ describe('Circle', function () { }); describe('#getBounds', function () { - - var map, circle; - - beforeEach(function () { - map = L.map(document.createElement('div')).setView([0, 0], 4); - circle = L.circle([50, 30], {radius: 200}).addTo(map); - }); - it('returns bounds', function () { var bounds = circle.getBounds(); @@ -33,14 +34,6 @@ describe('Circle', function () { }); describe('Legacy factory', function () { - - var map, circle; - - beforeEach(function () { - map = L.map(document.createElement('div')).setView([0, 0], 4); - circle = L.circle([50, 30], 200).addTo(map); - }); - it('returns same bounds as 1.0 factory', function () { var bounds = circle.getBounds(); @@ -48,5 +41,4 @@ describe('Circle', function () { expect(bounds.getNorthEast()).nearLatLng(new L.LatLng(50.00179, 30.00279)); }); }); - }); diff --git a/spec/suites/layer/vector/PathSpec.js b/spec/suites/layer/vector/PathSpec.js index ee35c1a1a22..2a31563bd4c 100644 --- a/spec/suites/layer/vector/PathSpec.js +++ b/spec/suites/layer/vector/PathSpec.js @@ -1,23 +1,23 @@ describe('Path', function () { + var c, map; + + beforeEach(function () { + c = document.createElement('div'); + c.style.width = '400px'; + c.style.height = '400px'; + map = new L.Map(c); + map.setView(new L.LatLng(0, 0), 0); + document.body.appendChild(c); + }); + + afterEach(function () { + map.remove(); + document.body.removeChild(c); + }); // The following two tests are skipped, as the ES6-ifycation of Leaflet // means that L.Path is no longer visible. describe('#bringToBack', function () { - - var c, map; - - beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - map = new L.Map(c); - map.setView(new L.LatLng(0, 0), 0); - document.body.appendChild(c); - }); - - afterEach(function () { - document.body.removeChild(c); - }); it('is a no-op for layers not on a map', function () { var path = new L.Polyline([[1, 2], [3, 4], [5, 6]]); expect(path.bringToBack()).to.equal(path); @@ -34,21 +34,6 @@ describe('Path', function () { }); describe('#bringToFront', function () { - - var c, map; - - beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - map = new L.Map(c); - map.setView(new L.LatLng(0, 0), 0); - document.body.appendChild(c); - }); - - afterEach(function () { - document.body.removeChild(c); - }); it('is a no-op for layers not on a map', function () { var path = new L.Polyline([[1, 2], [3, 4], [5, 6]]); expect(path.bringToFront()).to.equal(path); @@ -65,22 +50,6 @@ describe('Path', function () { }); describe('#events', function () { - - var c, map; - - beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - map = new L.Map(c); - map.setView(new L.LatLng(0, 0), 0); - document.body.appendChild(c); - }); - - afterEach(function () { - document.body.removeChild(c); - }); - it('fires click event', function () { var spy = sinon.spy(); var layer = new L.Polygon([[1, 2], [3, 4], [5, 6]]).addTo(map); @@ -130,13 +99,13 @@ describe('Path', function () { it('it should return tolerance with stroke', function () { var path = new L.Polyline([[1, 2], [3, 4], [5, 6]]); - var layer = path.addTo(map); + path.addTo(map); expect(path._clickTolerance()).to.equal(path.options.weight / 2); }); it('it should return zero tolerance without stroke', function () { var path = new L.Polyline([[1, 2], [3, 4], [5, 6]]); - var layer = path.addTo(map); + path.addTo(map); path.options.stroke = false; expect(path._clickTolerance()).to.equal(0); }); diff --git a/spec/suites/layer/vector/PolygonSpec.js b/spec/suites/layer/vector/PolygonSpec.js index 05b97da9845..5be116aff1c 100644 --- a/spec/suites/layer/vector/PolygonSpec.js +++ b/spec/suites/layer/vector/PolygonSpec.js @@ -1,11 +1,4 @@ describe('Polygon', function () { - - var c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - var map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); - describe("#initialize", function () { it("should never be flat", function () { var latLngs = [[1, 2], [3, 4]]; @@ -66,8 +59,11 @@ describe('Polygon', function () { }); it("can be added to the map when empty", function () { + var map = new L.Map(document.createElement('div')); var polygon = new L.Polygon([]).addTo(map); - expect(map.hasLayer(polygon)).to.be(true); + var isAdded = map.hasLayer(polygon); + map.remove(); // clean up + expect(isAdded).to.be(true); }); }); @@ -144,6 +140,11 @@ describe('Polygon', function () { }); describe('#getCenter', function () { + var map = new L.Map(document.createElement('div'), {center: [55.8, 37.6], zoom: 6}); + + after(function () { + map.remove(); + }); it('should compute center of a big simple polygon around equator', function () { var latlngs = [ @@ -168,14 +169,13 @@ describe('Polygon', function () { [[0, 0], [10, 0], [10, 10], [0, 10]] ]; var layer = new L.Polygon(latlngs); - var center = layer.getCenter(); + layer.getCenter(); }).to.throwException('Must add layer to map before using getCenter()'); }); }); describe("#_defaultShape", function () { - it("should return latlngs on a simple polygon", function () { var latlngs = [ L.latLng([1, 2]), @@ -220,7 +220,6 @@ describe('Polygon', function () { expect(polygon._defaultShape()).to.eql(latlngs[0][0]); }); - }); describe("#addLatLng", function () { @@ -322,7 +321,5 @@ describe('Polygon', function () { expect(polygon._latlngs[1][0]).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])]); expect(polygon._latlngs[1][1]).to.eql([L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4]), L.latLng([2, 2])]); }); - }); - }); diff --git a/spec/suites/layer/vector/PolylineGeometrySpec.js b/spec/suites/layer/vector/PolylineGeometrySpec.js index 02fa07677f0..939c89c01c4 100644 --- a/spec/suites/layer/vector/PolylineGeometrySpec.js +++ b/spec/suites/layer/vector/PolylineGeometrySpec.js @@ -1,10 +1,9 @@ describe('PolylineGeometry', function () { + var map = new L.Map(document.createElement('div'), {center: [55.8, 37.6], zoom: 6}); - var c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - var map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); + after(function () { + map.remove(); + }); describe("#distanceTo", function () { it("calculates distances to points", function () { @@ -36,8 +35,6 @@ describe('PolylineGeometry', function () { describe('LineUtil', function () { describe('#isFlat', function () { - var layer = L.polyline([]); - it('should return true for an array of LatLngs', function () { expect(L.LineUtil.isFlat([L.latLng([0, 0])])).to.be(true); }); diff --git a/spec/suites/layer/vector/PolylineSpec.js b/spec/suites/layer/vector/PolylineSpec.js index a4b7ba382ef..00c9bd7b1a7 100644 --- a/spec/suites/layer/vector/PolylineSpec.js +++ b/spec/suites/layer/vector/PolylineSpec.js @@ -1,10 +1,9 @@ describe('Polyline', function () { + var map = new L.Map(document.createElement('div'), {center: [55.8, 37.6], zoom: 6}); - var c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - var map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); + after(function () { + map.remove(); + }); describe("#initialize", function () { it("doesn't overwrite the given latlng array", function () { @@ -35,7 +34,6 @@ describe('Polyline', function () { }); it("should accept an empty array", function () { - var polyline = new L.Polyline([]); expect(polyline._latlngs).to.eql([]); @@ -50,7 +48,6 @@ describe('Polyline', function () { }); describe("#isEmpty", function () { - it('should return true for a polyline with no latlngs', function () { var polyline = new L.Polyline([]); expect(polyline.isEmpty()).to.be(true); @@ -103,7 +100,6 @@ describe('Polyline', function () { }); describe('#getCenter', function () { - it('should compute center of a big flat line on equator', function () { var polyline = new L.Polyline([[0, 0], [0, 90]]).addTo(map); expect(polyline.getCenter()).to.eql(L.latLng([0, 45])); @@ -138,15 +134,13 @@ describe('Polyline', function () { it('throws error if not yet added to map', function () { expect(function () { var polyline = new L.Polyline([[0, 0], [0, 0.090]]); - var center = polyline.getCenter(); + polyline.getCenter(); }).to.throwException('Must add layer to map before using getCenter()'); }); }); - describe("#_defaultShape", function () { - it("should return latlngs when flat", function () { var latLngs = [L.latLng([1, 2]), L.latLng([3, 4])]; @@ -169,7 +163,6 @@ describe('Polyline', function () { }); describe("#addLatLng", function () { - it("should add latlng to latlngs", function () { var latLngs = [ [1, 2], @@ -218,7 +211,5 @@ describe('Polyline', function () { expect(polyline._latlngs).to.eql([L.latLng([1, 2])]); }); - }); - }); diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index fc8c76f2ac8..47eaa7db9e1 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -1,24 +1,35 @@ describe("Map", function () { - var map, - spy; + var container, + map; + beforeEach(function () { - map = L.map(document.createElement('div')); + container = document.createElement('div'); + document.body.appendChild(container); + map = L.map(container); + }); + + afterEach(function () { + if (container._leaflet_id) { + map.remove(); + } + document.body.removeChild(container); }); describe("#remove", function () { + var spy; + + beforeEach(function () { + spy = sinon.spy(); + }); + it("fires an unload event if loaded", function () { - var container = document.createElement('div'), - map = new L.Map(container).setView([0, 0], 0), - spy = sinon.spy(); + map.setView([0, 0], 0); map.on('unload', spy); map.remove(); expect(spy.called).to.be.ok(); }); it("fires no unload event if not loaded", function () { - var container = document.createElement('div'), - map = new L.Map(container), - spy = sinon.spy(); map.on('unload', spy); map.remove(); expect(spy.called).not.to.be.ok(); @@ -26,14 +37,11 @@ describe("Map", function () { describe("corner case checking", function () { it("throws an exception upon reinitialization", function () { - var container = document.createElement('div'), - map = new L.Map(container); expect(function () { L.map(container); }).to.throwException(function (e) { expect(e.message).to.eql("Map container is already initialized."); }); - map.remove(); }); it("throws an exception if a container is not found", function () { @@ -42,22 +50,24 @@ describe("Map", function () { }).to.throwException(function (e) { expect(e.message).to.eql("Map container not found."); }); - map.remove(); }); }); - it("undefines container._leaflet", function () { - var container = document.createElement('div'), - map = new L.Map(container); + it("undefines container._leaflet_id", function () { + expect(container._leaflet_id).to.be.ok(); map.remove(); - expect(container._leaflet).to.be(undefined); + expect(container._leaflet_id).to.be(undefined); }); it("unbinds events", function () { - var container = document.createElement('div'), - map = new L.Map(container).setView([0, 0], 1), - spy = sinon.spy(); + // before actual test: make sure that events are ok + map.setView([0, 0], 0); + map.on('click', spy); + happen.click(container); + expect(spy.called).to.be.ok(); + // actual test + spy = sinon.spy(); map.on('click dblclick mousedown mouseup mousemove', spy); map.remove(); @@ -71,29 +81,26 @@ describe("Map", function () { }); it("does not throw if removed during animation", function () { - var container = document.createElement('div'), - map = new L.Map(container).setView([0, 0], 1).setMaxBounds([[0, 1], [2, 3]]); + map.setView([0, 0], 1).setMaxBounds([[0, 1], [2, 3]]); // Force creation of animation proxy, // otherwise browser checks disable it map._createAnimProxy(); // #6775 Remove the map in the middle of the animation - map.on("zoom", map.remove); + map.on("zoom", map.remove.bind(map)); map.setZoom(2); }); it("throws error if container is reused by other instance", function () { - var container = document.createElement('div'), - map = L.map(container), - map2; - map.remove(); - map2 = L.map(container); + var map2 = L.map(container); expect(function () { map.remove(); }).to.throwException(); + + map2.remove(); // clean up }); }); @@ -164,15 +171,17 @@ describe("Map", function () { }); it("defaults to zoom passed as map option", function () { - map = L.map(document.createElement('div'), {zoom: 13}); - expect(map.setView([51.605, -0.11])).to.be(map); - expect(map.getZoom()).to.be(13); + var map = L.map(document.createElement('div'), {zoom: 13}); + var zoom = map.setView([51.605, -0.11]).getZoom(); + map.remove(); // clean up + expect(zoom).to.be(13); }); it("passes duration option to panBy", function () { - map = L.map(document.createElement('div'), {zoom: 13, center: [0, 0]}); + var map = L.map(document.createElement('div'), {zoom: 13, center: [0, 0]}); map.panBy = sinon.spy(); map.setView([51.605, -0.11], 13, {animate: true, duration: 13}); + map.remove(); // clean up expect(map.panBy.callCount).to.eql(1); expect(map.panBy.args[0][1].duration).to.eql(13); }); @@ -180,11 +189,12 @@ describe("Map", function () { describe("#getBounds", function () { it("is safe to call from within a moveend callback during initial load (#1027)", function () { + var map = L.map(document.createElement('div')); map.on("moveend", function () { map.getBounds(); }); - map.setView([51.505, -0.09], 13); + map.remove(); // clean up }); }); @@ -196,17 +206,12 @@ describe("Map", function () { var height = '400px'; it("returns high levels of zoom with small areas and big padding", function () { - var container = map.getContainer(); container.style.height = height; - document.body.appendChild(container); expect(map.getBoundsZoom(bounds, false, padding)).to.be.equal(19); }); - it.skipInPhantom("returns multiples of zoomSnap when zoomSnap > 0 on any3d browsers", function () { - var container = map.getContainer(); + it.skipIfNo3d("returns multiples of zoomSnap when zoomSnap > 0 on any3d browsers", function () { container.style.height = height; - document.body.appendChild(container); - // L.Browser.any3d = true; // L.Browser is frozen since ES6ication map.options.zoomSnap = 0.5; expect(map.getBoundsZoom(bounds, false, padding)).to.be.equal(19.5); map.options.zoomSnap = 0.2; @@ -216,46 +221,44 @@ describe("Map", function () { }); it("getBoundsZoom does not return Infinity when projected SE - NW has negative components", function () { - var container = map.getContainer(); container.style.height = 369; container.style.width = 1048; - document.body.appendChild(container); - var bounds = L.latLngBounds(L.latLng([62.18475569507688, 6.926335173954951]), L.latLng([62.140483526511694, 6.923933370740089])); + map.setZoom(16); + var bounds = L.latLngBounds( + [62.18475569507688, 6.926335173954951], + [62.140483526511694, 6.923933370740089]); + var padding = L.point(-50, -50); + + // control case: default crs + var boundsZoom = map.getBoundsZoom(bounds, false, padding); + expect(boundsZoom).to.eql(9); + + // test case: EPSG:25833 (mocked, for somplicity) // The following coordinates are bounds projected with proj4leaflet crs = EPSG:25833', '+proj=utm +zone=33 +ellps=GRS80 +units=m +no_defs - var projectedSE = L.point(7800503.059925064, 6440062.353052008); - var projectedNW = L.point(7801987.203481699, 6425186.447901004); var crsMock = sinon.mock(map.options.crs); - crsMock.expects("project").withArgs(bounds.getNorthWest()).returns(projectedNW); - crsMock.expects("project").withArgs(bounds.getSouthEast()).returns(projectedSE); + crsMock.expects("latLngToPoint") + .withExactArgs(bounds.getNorthWest(), 16) + .returns(L.point(7800503.059925064, 6440062.353052008)); + crsMock.expects("latLngToPoint") + .withExactArgs(bounds.getSouthEast(), 16) + .returns(L.point(7801987.203481699, 6425186.447901004)); + boundsZoom = map.getBoundsZoom(bounds, false, padding); + crsMock.restore(); - var padding = L.point(-50, -50); - map.setZoom(16); - expect(map.getBoundsZoom(bounds, false, padding)).to.eql(9); + crsMock.verify(); // ensure that latLngToPoint was called with expected args + expect(boundsZoom).to.eql(7); // result expected for EPSG:25833 }); it("respects the 'inside' parameter", function () { - var container = map.getContainer(); container.style.height = height; container.style.width = '1024px'; // Make sure the width is defined for browsers other than PhantomJS (in particular Firefox). - document.body.appendChild(container); expect(map.getBoundsZoom(wideBounds, false, padding)).to.be.equal(17); expect(map.getBoundsZoom(wideBounds, true, padding)).to.be.equal(20); }); }); describe('#setMaxBounds', function () { - var container; - - beforeEach(function () { - container = map.getContainer(); - document.body.appendChild(container); - }); - - afterEach(function () { - // document.body.removeChild(container); - }); - it("aligns pixel-wise map view center with maxBounds center if it cannot move view bounds inside maxBounds (#1908)", function () { // large view, cannot fit within maxBounds container.style.width = container.style.height = "1000px"; @@ -301,20 +304,24 @@ describe("Map", function () { }); map.setView(center, 18, {animate: false}); }); - }); describe("#getMinZoom and #getMaxZoom", function () { + var map; + + afterEach(function () { + map.remove(); // clean up + }); + describe('#getMinZoom', function () { it('returns 0 if not set by Map options or TileLayer options', function () { - var map = L.map(document.createElement('div')); + map = L.map(document.createElement('div')); expect(map.getMinZoom()).to.be(0); }); }); it("minZoom and maxZoom options overrides any minZoom and maxZoom set on layers", function () { - - var map = L.map(document.createElement('div'), {minZoom: 2, maxZoom: 20}); + map = L.map(document.createElement('div'), {minZoom: 2, maxZoom: 20}); L.tileLayer("{z}{x}{y}", {minZoom: 4, maxZoom: 10}).addTo(map); L.tileLayer("{z}{x}{y}", {minZoom: 6, maxZoom: 17}).addTo(map); @@ -325,28 +332,28 @@ describe("Map", function () { }); it("layer minZoom overrides map zoom if map has no minZoom set and layer minZoom is bigger than map zoom", function () { - var map = L.map(document.createElement("div"), {zoom: 10}); + map = L.map(document.createElement("div"), {zoom: 10}); L.tileLayer("{z}{x}{y}", {minZoom: 15}).addTo(map); expect(map.getMinZoom()).to.be(15); }); it("layer maxZoom overrides map zoom if map has no maxZoom set and layer maxZoom is smaller than map zoom", function () { - var map = L.map(document.createElement("div"), {zoom: 20}); + map = L.map(document.createElement("div"), {zoom: 20}); L.tileLayer("{z}{x}{y}", {maxZoom: 15}).addTo(map); expect(map.getMaxZoom()).to.be(15); }); it("map's zoom is adjusted to layer's minZoom even if initialized with smaller value", function () { - var map = L.map(document.createElement("div"), {zoom: 10}); + map = L.map(document.createElement("div"), {zoom: 10}); L.tileLayer("{z}{x}{y}", {minZoom: 15}).addTo(map); expect(map.getZoom()).to.be(15); }); it("map's zoom is adjusted to layer's maxZoom even if initialized with larger value", function () { - var map = L.map(document.createElement("div"), {zoom: 20}); + map = L.map(document.createElement("div"), {zoom: 20}); L.tileLayer("{z}{x}{y}", {maxZoom: 15}).addTo(map); expect(map.getZoom()).to.be(15); @@ -356,6 +363,7 @@ describe("Map", function () { describe("#hasLayer", function () { it("returns false when passed undefined, null, or false", function () { var map = L.map(document.createElement('div')); + map.remove(); // clean up expect(map.hasLayer(undefined)).to.equal(false); expect(map.hasLayer(null)).to.equal(false); expect(map.hasLayer(false)).to.equal(false); @@ -370,7 +378,6 @@ describe("Map", function () { } describe("#addLayer", function () { - it("calls layer.onAdd immediately if the map is ready", function () { var layer = layerSpy(); map.setView([0, 0], 0); @@ -423,11 +430,10 @@ describe("Map", function () { expect(spy.called).not.to.be.ok(); }); - it("adds the layer before firing layeradd", function (done) { + it("adds the layer before firing layeradd", function () { var layer = layerSpy(); map.on('layeradd', function () { expect(map.hasLayer(layer)).to.be.ok(); - done(); }); map.setView([0, 0], 0); map.addLayer(layer); @@ -526,11 +532,10 @@ describe("Map", function () { expect(spy.called).not.to.be.ok(); }); - it("removes the layer before firing layerremove", function (done) { + it("removes the layer before firing layerremove", function () { var layer = layerSpy(); map.on('layerremove', function () { expect(map.hasLayer(layer)).not.to.be.ok(); - done(); }); map.setView([0, 0], 0); map.addLayer(layer); @@ -552,54 +557,53 @@ describe("Map", function () { describe("when the last tile layer on a map is removed", function () { it("fires a zoomlevelschange event", function () { - map.whenReady(function () { - var spy = sinon.spy(); - var tl = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map); - - map.on("zoomlevelschange", spy); - expect(spy.called).not.to.be.ok(); - map.removeLayer(tl); - expect(spy.called).to.be.ok(); - }); + map.setView([0, 0], 0); + var spy = sinon.spy(); + var tl = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map); + + map.on("zoomlevelschange", spy); + expect(spy.called).not.to.be.ok(); + map.removeLayer(tl); + expect(spy.called).to.be.ok(); }); }); describe("when a tile layer is removed from a map and it had greater zoom level coverage than the remainding layer", function () { it("fires a zoomlevelschange event", function () { - map.whenReady(function () { - var spy = sinon.spy(), - tl = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map), - t2 = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 15}).addTo(map); - - map.on("zoomlevelschange", spy); - expect(spy.called).to.not.be.ok(); - map.removeLayer(t2); - expect(spy.called).to.be.ok(); - }); + map.setView([0, 0], 0); + L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map); + var spy = sinon.spy(), + t2 = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 15}).addTo(map); + + map.on("zoomlevelschange", spy); + expect(spy.called).to.not.be.ok(); + map.removeLayer(t2); + expect(spy.called).to.be.ok(); }); }); - describe("when a tile layer is removed from a map it and it had lesser or the sa,e zoom level coverage as the remainding layer(s)", function () { + describe("when a tile layer is removed from a map it and it had lesser or the same zoom level coverage as the remainding layer(s)", function () { it("fires no zoomlevelschange event", function () { - map.whenReady(function () { - var tl = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map), - t2 = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map), - t3 = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 5}).addTo(map); - - map.on("zoomlevelschange", spy); - expect(spy).not.toHaveBeenCalled(); - map.removeLayer(t2); - expect(spy).not.toHaveBeenCalled(); - map.removeLayer(t3); - expect(spy).not.toHaveBeenCalled(); - }); + map.setView([0, 0], 0); + var spy = sinon.spy(), + t1 = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map), + t2 = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map), + t3 = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 5}).addTo(map); + + map.on("zoomlevelschange", spy); + map.removeLayer(t2); + expect(spy.called).to.not.be.ok(); + map.removeLayer(t3); + expect(spy.called).to.not.be.ok(); + map.removeLayer(t1); + expect(spy.called).to.be.ok(); }); }); }); describe("#eachLayer", function () { it("returns self", function () { - expect(map.eachLayer(function () {})).to.be(map); + expect(map.eachLayer(L.Util.falseFn)).to.be(map); }); it("calls the provided function for each layer", function () { @@ -615,8 +619,8 @@ describe("Map", function () { }); it("calls the provided function with the provided context", function () { - var t1 = L.tileLayer("{z}{x}{y}").addTo(map), - spy = sinon.spy(); + var spy = sinon.spy(); + L.tileLayer("{z}{x}{y}").addTo(map); map.eachLayer(spy, map); @@ -625,21 +629,17 @@ describe("Map", function () { }); describe("#invalidateSize", function () { - var container, - origWidth = 100, + var origWidth = 100, clock; beforeEach(function () { - container = map.getContainer(); container.style.width = origWidth + "px"; - document.body.appendChild(container); map.setView([0, 0], 0); map.invalidateSize({pan: false}); clock = sinon.useFakeTimers(); }); afterEach(function () { - document.body.removeChild(container); clock.restore(); }); @@ -755,34 +755,20 @@ describe("Map", function () { }); describe('#flyTo', function () { - var div; - beforeEach(function () { - div = document.createElement('div'); - div.style.width = '800px'; - div.style.height = '600px'; - div.style.visibility = 'hidden'; - - document.body.appendChild(div); - - map = L.map(div); - }); - - afterEach(function () { - document.body.removeChild(div); + container.style.width = '800px'; + container.style.height = '600px'; + container.style.visibility = 'hidden'; }); it('move to requested center and zoom, and call zoomend once', function (done) { this.timeout(10000); // This test takes longer than usual due to frames - var spy = sinon.spy(), - newCenter = new L.LatLng(10, 11), + var newCenter = new L.LatLng(10, 11), newZoom = 12; var callback = function () { expect(map.getCenter()).to.eql(newCenter); expect(map.getZoom()).to.eql(newZoom); - spy(); - expect(spy.calledOnce).to.be.ok(); done(); }; map.setView([0, 0], 0); @@ -829,8 +815,7 @@ describe("Map", function () { map.zoomOut(null, {animate: false}); }); - it.skipInNonPhantom('zoomIn ignores the zoomDelta option on non-any3d browsers', function (done) { - L.Browser.any3d = false; + it.skipIf3d('zoomIn ignores the zoomDelta option on non-any3d browsers', function (done) { map.options.zoomSnap = 0.25; map.options.zoomDelta = 0.25; map.once('zoomend', function () { @@ -841,8 +826,7 @@ describe("Map", function () { map.zoomIn(null, {animate: false}); }); - it.skipInPhantom('zoomIn respects the zoomDelta option on any3d browsers', function (done) { - L.Browser.any3d = true; + it.skipIfNo3d('zoomIn respects the zoomDelta option on any3d browsers', function (done) { map.options.zoomSnap = 0.25; map.options.zoomDelta = 0.25; map.setView(center, 10); @@ -854,8 +838,7 @@ describe("Map", function () { map.zoomIn(null, {animate: false}); }); - it.skipInPhantom('zoomOut respects the zoomDelta option on any3d browsers', function (done) { - L.Browser.any3d = true; + it.skipIfNo3d('zoomOut respects the zoomDelta option on any3d browsers', function (done) { map.options.zoomSnap = 0.25; map.options.zoomDelta = 0.25; map.setView(center, 10); @@ -867,7 +850,7 @@ describe("Map", function () { map.zoomOut(null, {animate: false}); }); - it.skipInPhantom('zoomIn snaps to zoomSnap on any3d browsers', function (done) { + it.skipIfNo3d('zoomIn snaps to zoomSnap on any3d browsers', function (done) { map.options.zoomSnap = 0.25; map.setView(center, 10); map.once('zoomend', function () { @@ -875,11 +858,10 @@ describe("Map", function () { expect(map.getCenter()).to.eql(center); done(); }); - L.Browser.any3d = true; map.zoomIn(0.22, {animate: false}); }); - it.skipInPhantom('zoomOut snaps to zoomSnap on any3d browsers', function (done) { + it.skipIfNo3d('zoomOut snaps to zoomSnap on any3d browsers', function (done) { map.options.zoomSnap = 0.25; map.setView(center, 10); map.once('zoomend', function () { @@ -887,7 +869,6 @@ describe("Map", function () { expect(map.getCenter()).to.eql(center); done(); }); - L.Browser.any3d = true; map.zoomOut(0.22, {animate: false}); }); }); @@ -910,16 +891,10 @@ describe("Map", function () { beforeEach(function () { // fitBounds needs a map container with non-null area - var container = map.getContainer(); container.style.width = container.style.height = "100px"; - document.body.appendChild(container); map.setView(center, 15); }); - afterEach(function () { - document.body.removeChild(map.getContainer()); - }); - it('Snaps zoom level to integer by default', function (done) { map.once('zoomend', function () { expect(map.getZoom()).to.eql(2); @@ -929,9 +904,8 @@ describe("Map", function () { map.fitBounds(bounds, {animate: false}); }); - it.skipInPhantom('Snaps zoom to zoomSnap on any3d browsers', function (done) { + it.skipIfNo3d('Snaps zoom to zoomSnap on any3d browsers', function (done) { map.options.zoomSnap = 0.25; - L.Browser.any3d = true; map.once('zoomend', function () { expect(map.getZoom()).to.eql(2.75); expect(map.getCenter().equals(boundsCenter, 0.05)).to.eql(true); @@ -940,9 +914,8 @@ describe("Map", function () { map.fitBounds(bounds, {animate: false}); }); - it.skipInNonPhantom('Ignores zoomSnap on non-any3d browsers', function (done) { + it.skipIf3d('Ignores zoomSnap on non-any3d browsers', function (done) { map.options.zoomSnap = 0.25; - L.Browser.any3d = false; map.once('zoomend', function () { expect(map.getZoom()).to.eql(2); expect(map.getCenter().equals(boundsCenter, 0.05)).to.eql(true); @@ -1011,63 +984,46 @@ describe("Map", function () { }); }); - describe('#fitBounds after layers set', function () { var center = L.latLng(22, 33), - bounds = L.latLngBounds(L.latLng(1, 102), L.latLng(11, 122)), - boundsCenter = bounds.getCenter(); + bounds = L.latLngBounds(L.latLng(1, 102), L.latLng(11, 122)); beforeEach(function () { // fitBounds needs a map container with non-null area - var container = map.getContainer(); container.style.width = container.style.height = "100px"; - document.body.appendChild(container); - }); - - afterEach(function () { - document.body.removeChild(map.getContainer()); }); - it('Snaps to a number after adding tile layer', function (done) { - L.Browser.any3d = true; + it('Snaps to a number after adding tile layer', function () { + // expect(L.Browser.any3d).to.be.ok(); // precondition map.addLayer(L.tileLayer('file:///dev/null')); expect(map.getZoom()).to.be(undefined); map.fitBounds(bounds); expect(map.getZoom()).to.be(2); - done(); }); - it('Snaps to a number after adding marker', function (done) { - L.Browser.any3d = true; + it('Snaps to a number after adding marker', function () { + // expect(L.Browser.any3d).to.be.ok(); // precondition map.addLayer(L.marker(center)); expect(map.getZoom()).to.be(undefined); map.fitBounds(bounds); expect(map.getZoom()).to.be(2); - done(); }); }); - describe("#panInside", function () { var center, tl, tlPix; beforeEach(function () { - var container = map.getContainer(); container.style.height = container.style.width = "500px"; - document.body.appendChild(container); map.setView(L.latLng([53.0, 0.15]), 12, {animate: false}); center = map.getCenter(); tl = map.getBounds().getNorthWest(); tlPix = map.getPixelBounds().min; }); - afterEach(function () { - document.body.removeChild(map.getContainer()); - }); - it("does not pan the map when the target is within bounds", function () { map.panInside(tl, {animate:false}); expect(center).to.equal(map.getCenter()); @@ -1102,7 +1058,6 @@ describe("Map", function () { it("supports different padding values for each border", function () { var p = tlPix.add([40, 0]), // Top-Left - distanceMoved, opts = {paddingTL: [60, 20], paddingBR: [10, 10]}; map.panInside(map.unproject(p), opts); expect(center).to.equal(map.getCenter()); @@ -1139,22 +1094,11 @@ describe("Map", function () { }); }); - describe('#DOM events', function () { - - var c, map; - beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - map = new L.Map(c); - map.setView(new L.LatLng(0, 0), 0); - document.body.appendChild(c); - }); - - afterEach(function () { - document.body.removeChild(c); + container.style.width = '400px'; + container.style.height = '400px'; + map.setView([0, 0], 0); }); it("DOM events propagate from polygon to map", function () { @@ -1204,7 +1148,7 @@ describe("Map", function () { map.on("mouseout", mapSpy); layer.on("mouseout", layerSpy); other.on("mouseout", otherSpy); - happen.mouseout(layer._path, {relatedTarget: map._container}); + happen.mouseout(layer._path, {relatedTarget: container}); expect(mapSpy.called).not.to.be.ok(); expect(otherSpy.called).not.to.be.ok(); expect(layerSpy.calledOnce).to.be.ok(); @@ -1220,7 +1164,7 @@ describe("Map", function () { layer = L.marker([1, 2], {icon: icon}).addTo(map); map.on("mouseout", mapSpy); layer.on("mouseout", layerSpy); - happen.mouseout(layer._icon, {relatedTarget: map._container}); + happen.mouseout(layer._icon, {relatedTarget: container}); expect(mapSpy.called).not.to.be.ok(); expect(layerSpy.calledOnce).to.be.ok(); }); @@ -1266,7 +1210,7 @@ describe("Map", function () { map.on("mouseout", mapSpy); layer.on("mouseout", layerSpy); other.on("mouseout", otherSpy); - happen.mouseout(map._container); + happen.mouseout(container); expect(otherSpy.called).not.to.be.ok(); expect(layerSpy.called).not.to.be.ok(); expect(mapSpy.calledOnce).to.be.ok(); @@ -1293,7 +1237,6 @@ describe("Map", function () { }); happen.click(layer._icon); }); - }); describe('#getScaleZoom && #getZoomScale', function () { diff --git a/spec/suites/map/handler/Map.DragSpec.js b/spec/suites/map/handler/Map.DragSpec.js index 3a66daaa29e..9f6953ba910 100644 --- a/spec/suites/map/handler/Map.DragSpec.js +++ b/spec/suites/map/handler/Map.DragSpec.js @@ -1,8 +1,17 @@ describe("Map.Drag", function () { describe("#addHook", function () { + var container, map; + + before(function () { + container = document.createElement('div'); + }); + + afterEach(function () { + map.remove(); + }); + it("calls the map with dragging enabled", function () { - var container = document.createElement('div'); - var map = new L.Map(container, { + map = new L.Map(container, { dragging: true }); @@ -10,9 +19,9 @@ describe("Map.Drag", function () { map.setView([0, 0], 0); expect(map.dragging.enabled()).to.be(true); }); + it("calls the map with dragging and worldCopyJump enabled", function () { - var container = document.createElement('div'); - var map = new L.Map(container, { + map = new L.Map(container, { dragging: true, worldCopyJump: true }); @@ -21,10 +30,10 @@ describe("Map.Drag", function () { map.setView([0, 0], 0); expect(map.dragging.enabled()).to.be(true); }); + it("calls the map with dragging disabled and worldCopyJump enabled; " + "enables dragging after setting center and zoom", function () { - var container = document.createElement('div'); - var map = new L.Map(container, { + map = new L.Map(container, { dragging: false, worldCopyJump: true }); @@ -36,9 +45,8 @@ describe("Map.Drag", function () { }); }); - describe("mouse events", function () { - var container; + var container, map; beforeEach(function () { container = document.createElement('div'); @@ -49,11 +57,12 @@ describe("Map.Drag", function () { }); afterEach(function () { + map.remove(); document.body.removeChild(container); }); it("change the center of the map", function (done) { - var map = new L.Map(container, { + map = new L.Map(container, { dragging: true, inertia: false }); @@ -88,13 +97,8 @@ describe("Map.Drag", function () { container.style.webkitTransform = 'scale(' + scaleX + ', ' + scaleY + ')'; }); - afterEach(function () { - container.style.webkitTransformOrigin = ''; - container.style.webkitTransform = ''; - }); - it("change the center of the map, compensating for CSS scale", function (done) { - var map = new L.Map(container, { + map = new L.Map(container, { dragging: true, inertia: false }); @@ -122,7 +126,7 @@ describe("Map.Drag", function () { }); it("does not change the center of the map when mouse is moved less than the drag threshold", function (done) { - var map = new L.Map(container, { + map = new L.Map(container, { dragging: true, inertia: false }); @@ -154,7 +158,7 @@ describe("Map.Drag", function () { }); it("does not trigger preclick nor click", function (done) { - var map = new L.Map(container, { + map = new L.Map(container, { dragging: true, inertia: false }); @@ -187,7 +191,7 @@ describe("Map.Drag", function () { }); it("does not trigger preclick nor click when dragging on top of a static marker", function (done) { - var map = new L.Map(container, { + map = new L.Map(container, { dragging: true, inertia: false }); @@ -226,7 +230,7 @@ describe("Map.Drag", function () { }); it("does not trigger preclick nor click when dragging a marker", function (done) { - var map = new L.Map(container, { + map = new L.Map(container, { dragging: true, inertia: false }); @@ -265,14 +269,7 @@ describe("Map.Drag", function () { }); it("does not change the center of the map when drag is disabled on click", function (done) { - var container = document.createElement('div'); - container.style.width = container.style.height = '600px'; - container.style.top = container.style.left = 0; - container.style.position = 'absolute'; - - document.body.appendChild(container); - - var map = new L.Map(container, { + map = new L.Map(container, { dragging: true, inertia: false }); @@ -290,7 +287,6 @@ describe("Map.Drag", function () { onStop: function () { var center = map.getCenter(); var zoom = map.getZoom(); - document.body.removeChild(container); expect(center).to.be(originalCenter); // Expect center point to be the same as before the click expect(spy.callCount).to.eql(0); // No drag event should have been fired. expect(zoom).to.be(1); @@ -309,16 +305,25 @@ describe("Map.Drag", function () { }); describe("touch events", function () { - it.skipIfNotTouch("change the center of the map", function (done) { - var container = document.createElement('div'); + var container, map; + + beforeEach(function () { + container = document.createElement('div'); container.style.width = container.style.height = '600px'; container.style.top = container.style.left = 0; container.style.position = 'absolute'; // container.style.background = '#808080'; document.body.appendChild(container); + }); + + afterEach(function () { + map.remove(); + document.body.removeChild(container); + }); - var map = new L.Map(container, { + it.skipIfNotTouch("change the center of the map", function (done) { + map = new L.Map(container, { dragging: true, inertia: false }); @@ -329,7 +334,6 @@ describe("Map.Drag", function () { onStop: function () { var center = map.getCenter(); var zoom = map.getZoom(); - document.body.removeChild(container); expect(center.lat).to.be.within(21.9430, 21.9431); expect(center.lng).to.be(-180); expect(zoom).to.be(1); @@ -337,7 +341,7 @@ describe("Map.Drag", function () { done(); } }); - var toucher = hand.growFinger('touch'); + var toucher = hand.growFinger(touchEventType); // We move 5 pixels first to overcome the 3-pixel threshold of // L.Draggable. @@ -346,14 +350,7 @@ describe("Map.Drag", function () { }); it.skipIfNotTouch("does not change the center of the map when finger is moved less than the drag threshold", function (done) { - var container = document.createElement('div'); - container.style.width = container.style.height = '600px'; - container.style.top = container.style.left = 0; - container.style.position = 'absolute'; - - document.body.appendChild(container); - - var map = new L.Map(container, { + map = new L.Map(container, { dragging: true, inertia: false }); @@ -369,7 +366,6 @@ describe("Map.Drag", function () { onStop: function () { var center = map.getCenter(); var zoom = map.getZoom(); - document.body.removeChild(container); expect(center).to.be(originalCenter); // Expect center point to be the same as before the click expect(spy.callCount).to.eql(0); // No drag event should have been fired. expect(zoom).to.be(1); @@ -378,7 +374,7 @@ describe("Map.Drag", function () { } }); - var toucher = hand.growFinger('touch'); + var toucher = hand.growFinger(touchEventType); // We move 2 pixels to stay below the default 3-pixel threshold of // L.Draggable. This should result in a click and not a drag. @@ -387,13 +383,7 @@ describe("Map.Drag", function () { }); it.skipIfNotTouch('reset itself after touchend', function (done) { - - var container = document.createElement('div'); - container.style.width = container.style.height = '600px'; - container.style.top = container.style.left = 0; - container.style.position = 'absolute'; - document.body.appendChild(container); - var map = new L.Map(container, { + map = new L.Map(container, { dragging: true, inertia: false, zoomAnimation: false // If true, the test has to wait extra 250msec @@ -412,7 +402,6 @@ describe("Map.Drag", function () { var mouseHand = new Hand({ timing: 'fastframe', onStop: function () { - document.body.removeChild(container); expect(map.getCenter()).to.eql(center); expect(map.getZoom()).to.eql(zoom); @@ -431,8 +420,8 @@ describe("Map.Drag", function () { } }); - var f1 = hand.growFinger('touch'); - var f2 = hand.growFinger('touch'); + var f1 = hand.growFinger(touchEventType); + var f2 = hand.growFinger(touchEventType); hand.sync(5); f1.wait(100).moveTo(275, 300, 0) @@ -440,9 +429,6 @@ describe("Map.Drag", function () { // This finger should touch me map after the other one. f2.wait(110).moveTo(325, 300, 0) .down().moveBy(210, 0, 1000).up(200); - }); - }); - }); diff --git a/spec/suites/map/handler/Map.KeyboardSpec.js b/spec/suites/map/handler/Map.KeyboardSpec.js index 4c0c43df40e..c8988956b6e 100644 --- a/spec/suites/map/handler/Map.KeyboardSpec.js +++ b/spec/suites/map/handler/Map.KeyboardSpec.js @@ -1,5 +1,4 @@ describe("Map.Keyboard", function () { - const KEYCODE_LOWERCASE_A = 65; const KEYCODE_ARROW_LEFT = 37; const KEYCODE_ARROW_UP = 38; diff --git a/spec/suites/map/handler/Map.TouchZoomSpec.js b/spec/suites/map/handler/Map.TouchZoomSpec.js index 553417f113b..559033cca92 100644 --- a/spec/suites/map/handler/Map.TouchZoomSpec.js +++ b/spec/suites/map/handler/Map.TouchZoomSpec.js @@ -30,8 +30,8 @@ describe("Map.TouchZoom", function () { }); } }); - var f1 = hand.growFinger('touch'); - var f2 = hand.growFinger('touch'); + var f1 = hand.growFinger(touchEventType); + var f2 = hand.growFinger(touchEventType); hand.sync(5); f1.wait(100).moveTo(275, 300, 0) @@ -40,7 +40,6 @@ describe("Map.TouchZoom", function () { .down().moveBy(200, 0, 500).up(100); }); - it.skipIfNotTouch("Decreases zoom when pinching in", function (done) { var container = document.createElement('div'); container.style.width = container.style.height = '600px'; @@ -72,8 +71,8 @@ describe("Map.TouchZoom", function () { }); } }); - var f1 = hand.growFinger('touch'); - var f2 = hand.growFinger('touch'); + var f1 = hand.growFinger(touchEventType); + var f2 = hand.growFinger(touchEventType); hand.sync(5); f1.wait(100).moveTo(75, 300, 0) @@ -81,7 +80,4 @@ describe("Map.TouchZoom", function () { f2.wait(100).moveTo(525, 300, 0) .down().moveBy(-200, 0, 500).up(100); }); - - - }); From ec35ab52f66c191f7c855583354722c40dcdf239 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Mon, 4 May 2020 14:24:08 +0300 Subject: [PATCH 065/306] GridLayer: fix _updateLevels and _removeTilesAtZoom (#7123) Because of particular quality of `for ... in` loop, type of `z` is 'string'. Thus condition `z === zoom` never met in _updateLevels. Considering wrong arg type, _removeTilesAtZoom also never had any action. Cleaner solution would be to iterate `Object.keys()` instead, but it is available only since IE 9. --- src/layer/tile/GridLayer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 5f18138c939..1d95091c6d8 100755 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -365,6 +365,7 @@ export var GridLayer = Layer.extend({ if (zoom === undefined) { return undefined; } for (var z in this._levels) { + z = Number(z); if (this._levels[z].el.children.length || z === zoom) { this._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z); this._onUpdateLevel(z); @@ -461,7 +462,7 @@ export var GridLayer = Layer.extend({ _invalidateAll: function () { for (var z in this._levels) { DomUtil.remove(this._levels[z].el); - this._onRemoveLevel(z); + this._onRemoveLevel(Number(z)); delete this._levels[z]; } this._removeAllTiles(); From 9b0d7c2a7023e6a83222d96febaee74880601ad8 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Tue, 19 May 2020 00:25:15 +0300 Subject: [PATCH 066/306] Update dev dependencies, fix most of vulnerabilities (#7133) * Update rollup-plugin-git-version to ^0.3.1 * Update uglify-js to ^3.9.2 * Update git-rev-sync to ^2.0.0 * Update ssri to ^8.0.0 * Update rollup to ^0.59.4 (latests version with support of IE 8) Remove Object.freeze hack, use rollup's `output.freeze` option instead * Update eslint to ^5.16.0 And fix a couple of warnings. Ref: https://eslint.org/docs/user-guide/migrating-to-5.0.0#eslint-recommended-changes https://eslint.org/docs/user-guide/migrating-to-5.0.0#deprecated-globals * Update eslint to ^6.8.0 Ref: https://eslint.org/docs/user-guide/migrating-to-6.0.0#eslint-recommended-changes --- build/rollup-config.js | 8 +++++--- build/rollup-watch-config.js | 5 +++-- package.json | 12 ++++++------ spec/karma.conf.js | 10 +++++++--- spec/suites/layer/vector/CanvasSpec.js | 10 +++++----- src/Leaflet.js | 3 --- src/core/Browser.js | 2 +- src/core/Class.js | 2 +- src/core/Util.js | 5 +---- src/dom/Draggable.js | 2 +- src/layer/VideoOverlay.js | 4 +++- src/layer/vector/Path.js | 2 +- 12 files changed, 34 insertions(+), 31 deletions(-) diff --git a/build/rollup-config.js b/build/rollup-config.js index 2e2db54663d..2937b5e2184 100644 --- a/build/rollup-config.js +++ b/build/rollup-config.js @@ -42,16 +42,18 @@ export default { name: 'L', banner: banner, outro: outro, - sourcemap: true + sourcemap: true, + legacy: true, // Needed to create files loadable by IE8 + freeze: false }, { file: 'dist/leaflet-src.esm.js', format: 'es', banner: banner, - sourcemap: true + sourcemap: true, + freeze: false } ], - legacy: true, // Needed to create files loadable by IE8 plugins: [ release ? json() : rollupGitVersion() ] diff --git a/build/rollup-watch-config.js b/build/rollup-watch-config.js index 1c604047229..c6f207703f4 100644 --- a/build/rollup-watch-config.js +++ b/build/rollup-watch-config.js @@ -20,9 +20,10 @@ export default { format: 'umd', name: 'L', banner: banner, - sourcemap: true + sourcemap: true, + legacy: true, // Needed to create files loadable by IE8 + freeze: false, }, - legacy: true, // Needed to create files loadable by IE8 plugins: [ rollupGitVersion() ] diff --git a/package.json b/package.json index d5e3eb37a91..64bc8861343 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,9 @@ "homepage": "https://leafletjs.com/", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { - "eslint": "^4.19.1", + "eslint": "^6.8.0", "eslint-config-mourner": "^2.0.1", - "git-rev-sync": "^1.12.0", + "git-rev-sync": "^2.0.0", "happen": "~0.3.2", "karma": "^5.0.3", "karma-chrome-launcher": "^3.1.0", @@ -23,12 +23,12 @@ "mocha": "^7.1.2", "phantomjs-prebuilt": "^2.1.16", "prosthetic-hand": "^1.3.1", - "rollup": "0.51.8", - "rollup-plugin-git-version": "0.2.1", + "rollup": "^0.59.4", + "rollup-plugin-git-version": "^0.3.1", "rollup-plugin-json": "^4.0.0", "sinon": "^7.5.0", - "ssri": "^6.0.1", - "uglify-js": "~3.5.10" + "ssri": "^8.0.0", + "uglify-js": "^3.9.2" }, "main": "dist/leaflet-src.js", "style": "dist/leaflet.css", diff --git a/spec/karma.conf.js b/spec/karma.conf.js index 1660583da42..a093f6f2589 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -62,9 +62,13 @@ module.exports = function (config) { plugins: [ json() ], - format: 'umd', - name: 'L', - outro: outro + output: { + format: 'umd', + name: 'L', + outro: outro, + legacy: true, // Needed to create files loadable by IE8 + freeze: false, + }, }, // test results reporter to use diff --git a/spec/suites/layer/vector/CanvasSpec.js b/spec/suites/layer/vector/CanvasSpec.js index 296335d7d1f..375bc014128 100644 --- a/spec/suites/layer/vector/CanvasSpec.js +++ b/spec/suites/layer/vector/CanvasSpec.js @@ -144,12 +144,12 @@ describe('Canvas', function () { layerId = L.stamp(layer), canvas = map.getRenderer(layer); - expect(canvas._layers.hasOwnProperty(layerId)).to.be(true); + expect(canvas._layers).to.have.property(layerId); map.removeLayer(layer); // Defer check due to how Canvas renderer manages layer removal. L.Util.requestAnimFrame(function () { - expect(canvas._layers.hasOwnProperty(layerId)).to.be(false); + expect(canvas._layers).to.not.have.property(layerId); done(); }, this); }); @@ -159,14 +159,14 @@ describe('Canvas', function () { layerId = L.stamp(layer), canvas = map.getRenderer(layer); - expect(canvas._layers.hasOwnProperty(layerId)).to.be(true); + expect(canvas._layers).to.have.property(layerId); map.removeLayer(layer); map.addLayer(layer); - expect(canvas._layers.hasOwnProperty(layerId)).to.be(true); + expect(canvas._layers).to.have.property(layerId); // Re-perform a deferred check due to how Canvas renderer manages layer removal. L.Util.requestAnimFrame(function () { - expect(canvas._layers.hasOwnProperty(layerId)).to.be(true); + expect(canvas._layers).to.have.property(layerId); done(); }, this); }); diff --git a/src/Leaflet.js b/src/Leaflet.js index 2b18450274a..f4339b9b812 100644 --- a/src/Leaflet.js +++ b/src/Leaflet.js @@ -22,6 +22,3 @@ export * from './layer/index'; // map export * from './map/index'; - -import {freeze} from './core/Util'; -Object.freeze = freeze; diff --git a/src/core/Browser.js b/src/core/Browser.js index 13c50ae1c5f..ee2583e0fa3 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -120,7 +120,7 @@ export var passiveEvents = (function () { var supportsPassiveOption = false; try { var opts = Object.defineProperty({}, 'passive', { - get: function () { + get: function () { // eslint-disable-line getter-return supportsPassiveOption = true; } }); diff --git a/src/core/Class.js b/src/core/Class.js index df367b61772..f60bda9e13e 100644 --- a/src/core/Class.js +++ b/src/core/Class.js @@ -35,7 +35,7 @@ Class.extend = function (props) { // inherit parent's statics for (var i in this) { - if (this.hasOwnProperty(i) && i !== 'prototype' && i !== '__super__') { + if (Object.prototype.hasOwnProperty.call(this, i) && i !== 'prototype' && i !== '__super__') { NewClass[i] = this[i]; } } diff --git a/src/core/Util.js b/src/core/Util.js index f3d22ece0c5..da678e3b10a 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -4,9 +4,6 @@ * Various utility functions, used by Leaflet internally. */ -export var freeze = Object.freeze; -Object.freeze = function (obj) { return obj; }; - // @function extend(dest: Object, src?: Object): Object // Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut. export function extend(dest) { @@ -133,7 +130,7 @@ export function splitWords(str) { // @function setOptions(obj: Object, options: Object): Object // Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut. export function setOptions(obj, options) { - if (!obj.hasOwnProperty('options')) { + if (!Object.prototype.hasOwnProperty.call(obj, 'options')) { obj.options = obj.options ? create(obj.options) : {}; } for (var i in options) { diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 52b875bc6c7..8a4a456cb7f 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -164,7 +164,7 @@ export var Draggable = Evented.extend({ this._lastTarget = e.target || e.srcElement; // IE and Edge do not give the element, so fetch it // if necessary - if ((window.SVGElementInstance) && (this._lastTarget instanceof SVGElementInstance)) { + if (window.SVGElementInstance && this._lastTarget instanceof window.SVGElementInstance) { this._lastTarget = this._lastTarget.correspondingUseElement; } DomUtil.addClass(this._lastTarget, 'leaflet-drag-target'); diff --git a/src/layer/VideoOverlay.js b/src/layer/VideoOverlay.js index 5dc8a885a7e..b2c705edba9 100644 --- a/src/layer/VideoOverlay.js +++ b/src/layer/VideoOverlay.js @@ -72,7 +72,9 @@ export var VideoOverlay = ImageOverlay.extend({ if (!Util.isArray(this._url)) { this._url = [this._url]; } - if (!this.options.keepAspectRatio && vid.style.hasOwnProperty('objectFit')) { vid.style['objectFit'] = 'fill'; } + if (!this.options.keepAspectRatio && Object.prototype.hasOwnProperty.call(vid.style, 'objectFit')) { + vid.style['objectFit'] = 'fill'; + } vid.autoplay = !!this.options.autoplay; vid.loop = !!this.options.loop; vid.muted = !!this.options.muted; diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index e8f939f9e28..9d80273ea74 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -105,7 +105,7 @@ export var Path = Layer.extend({ Util.setOptions(this, style); if (this._renderer) { this._renderer._updateStyle(this); - if (this.options.stroke && style && style.hasOwnProperty('weight')) { + if (this.options.stroke && style && Object.prototype.hasOwnProperty.call(style, 'weight')) { this._updateBounds(); } } From 838587dff062af1af89c2ae7ca60e451e0e4de26 Mon Sep 17 00:00:00 2001 From: mi-v <36908543+mi-v@users.noreply.github.com> Date: Tue, 19 May 2020 13:57:48 +0700 Subject: [PATCH 067/306] L.Marker shadowPane doc fix (#7135) --- src/layer/marker/Marker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index da38058d004..077b0f15eac 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -64,7 +64,7 @@ export var Marker = Layer.extend({ // `Map pane` where the markers icon will be added. pane: 'markerPane', - // @option pane: String = 'shadowPane' + // @option shadowPane: String = 'shadowPane' // `Map pane` where the markers shadow will be added. shadowPane: 'shadowPane', From 5b30f7d34461a5bca7927ff368547abe516a8de8 Mon Sep 17 00:00:00 2001 From: "Robin C. Ladiges" Date: Sun, 24 May 2020 17:30:37 +0200 Subject: [PATCH 068/306] fix tooltipAnchor behavior for different directions (#7155) This commit fixes issue #6764, see the discussion examples there. It's an alternative implementation for pull request #6116. It makes `tooltipAnchor` behave the same like `popupAnchor` regardless of the tooltip's direction. With one exception: the `auto` direction flips the `x` axis of `tooltipAnchor` and the tooltip's `offset` when it switches to `left` depending on the position on the screen. `auto` therefore assumes that the icon is somewhat symmetrical to the left and the right of the y axis, which is the case for the default icon. --- src/layer/Tooltip.js | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/layer/Tooltip.js b/src/layer/Tooltip.js index de85348cd37..172430af922 100644 --- a/src/layer/Tooltip.js +++ b/src/layer/Tooltip.js @@ -131,7 +131,8 @@ export var Tooltip = DivOverlay.extend({ _adjustPan: function () {}, _setPosition: function (pos) { - var map = this._map, + var subX, subY, + map = this._map, container = this._container, centerPoint = map.latLngToContainerPoint(map.getCenter()), tooltipPoint = map.layerPointToContainerPoint(pos), @@ -142,19 +143,32 @@ export var Tooltip = DivOverlay.extend({ anchor = this._getAnchor(); if (direction === 'top') { - pos = pos.add(toPoint(-tooltipWidth / 2 + offset.x, -tooltipHeight + offset.y + anchor.y, true)); + subX = tooltipWidth / 2; + subY = tooltipHeight; } else if (direction === 'bottom') { - pos = pos.subtract(toPoint(tooltipWidth / 2 - offset.x, -offset.y, true)); + subX = tooltipWidth / 2; + subY = 0; } else if (direction === 'center') { - pos = pos.subtract(toPoint(tooltipWidth / 2 + offset.x, tooltipHeight / 2 - anchor.y + offset.y, true)); - } else if (direction === 'right' || direction === 'auto' && tooltipPoint.x < centerPoint.x) { + subX = tooltipWidth / 2; + subY = tooltipHeight / 2; + } else if (direction === 'right') { + subX = 0; + subY = tooltipHeight / 2; + } else if (direction === 'left') { + subX = tooltipWidth; + subY = tooltipHeight / 2; + } else if (tooltipPoint.x < centerPoint.x) { direction = 'right'; - pos = pos.add(toPoint(offset.x + anchor.x, anchor.y - tooltipHeight / 2 + offset.y, true)); + subX = 0; + subY = tooltipHeight / 2; } else { direction = 'left'; - pos = pos.subtract(toPoint(tooltipWidth + anchor.x - offset.x, tooltipHeight / 2 - anchor.y - offset.y, true)); + subX = tooltipWidth + (offset.x + anchor.x) * 2; + subY = tooltipHeight / 2; } + pos = pos.subtract(toPoint(subX, subY, true)).add(offset).add(anchor); + DomUtil.removeClass(container, 'leaflet-tooltip-right'); DomUtil.removeClass(container, 'leaflet-tooltip-left'); DomUtil.removeClass(container, 'leaflet-tooltip-top'); From 1d09819922f592cd0fcdf37eb1fc263544a8bab6 Mon Sep 17 00:00:00 2001 From: Yuzo Matsuzawa Date: Mon, 25 May 2020 14:36:33 +0900 Subject: [PATCH 069/306] Update FeatureGroup's factory method (#7160) Fixes #7159 --- src/layer/FeatureGroup.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/layer/FeatureGroup.js b/src/layer/FeatureGroup.js index 5913ff95ff5..81b475b4f78 100644 --- a/src/layer/FeatureGroup.js +++ b/src/layer/FeatureGroup.js @@ -87,8 +87,8 @@ export var FeatureGroup = LayerGroup.extend({ } }); -// @factory L.featureGroup(layers: Layer[]) -// Create a feature group, optionally given an initial set of layers. -export var featureGroup = function (layers) { - return new FeatureGroup(layers); +// @factory L.featureGroup(layers?: Layer[], options?: Object) +// Create a feature group, optionally given an initial set of layers and an `options` object. +export var featureGroup = function (layers, options) { + return new FeatureGroup(layers, options); }; From 25f7bbb93d73ecbca7ae47de5e86009e7568576e Mon Sep 17 00:00:00 2001 From: Tek Bahadur Kshetri <39838116+iamtekson@users.noreply.github.com> Date: Fri, 29 May 2020 01:50:16 +0700 Subject: [PATCH 070/306] docs: update URL about NPM in plugin developer guide (#7161) --- PLUGIN-GUIDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PLUGIN-GUIDE.md b/PLUGIN-GUIDE.md index d337ac0d7b4..09e1cc97089 100644 --- a/PLUGIN-GUIDE.md +++ b/PLUGIN-GUIDE.md @@ -134,7 +134,7 @@ And most importantly, keep it simple. Leaflet is all about *simplicity*. NPM (Node Packaged Modules) is a package manager and code repository for JavaScript. Publishing your module on NPM allows other developers to quickly find and install your plugin as well as any other plugins it depends on. -NPM has an excellent [developers guide](https://www.npmjs.org/doc/misc/npm-developers.html) to help you through the process. +NPM has an excellent [developers guide](https://docs.npmjs.com/using-npm/developers.html) to help you through the process. When you publish your plugin you should add a dependency on `leaflet` to your `package.json` file. This will automatically install Leaflet when your package is installed. From e8c28b996179373447dde1df479898576a508579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 11 Jun 2020 11:07:29 +0200 Subject: [PATCH 071/306] docstrings: Layer's removeFrom works on LayerGroups too --- src/layer/Layer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 72e4add9e33..c6285a9c057 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -61,6 +61,10 @@ export var Layer = Evented.extend({ // @method removeFrom(map: Map): this // Removes the layer from the given map + // + // @alternative + // @method removeFrom(group: LayerGroup): this + // Removes the layer from the given `LayerGroup` removeFrom: function (obj) { if (obj) { obj.removeLayer(this); From 14b1985ca446e59bb59679a4e283ce6d0aaa31e1 Mon Sep 17 00:00:00 2001 From: DerZade Date: Thu, 2 Jul 2020 12:20:15 +0200 Subject: [PATCH 072/306] docstrings: fix parameters for LatLngBounds.overlaps (#7194) --- src/geo/LatLngBounds.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/geo/LatLngBounds.js b/src/geo/LatLngBounds.js index 7d8b8cadf42..62e085caf74 100644 --- a/src/geo/LatLngBounds.js +++ b/src/geo/LatLngBounds.js @@ -195,7 +195,7 @@ LatLngBounds.prototype = { return latIntersects && lngIntersects; }, - // @method overlaps(otherBounds: Bounds): Boolean + // @method overlaps(otherBounds: LatLngBounds): Boolean // Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area. overlaps: function (bounds) { bounds = toLatLngBounds(bounds); From 9644fcfcfc6993060d3468292f6ca84ee378b2c0 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Mon, 6 Jul 2020 16:52:40 +0300 Subject: [PATCH 073/306] Get rid of some legacy IE-related pointer quirks. (#7195) That code was initially intended to support mspointer-touch, but currently same code paths are used in any PointerEvent-enabled browser, and may cause real issues (e.g. that broke Leaflet.draw). Note: It's known that preventDefault is needed for correct processing of touch in IE10. But I haven't found any evidence that it is required for IE11, so I've removed some excessive code. It's blind shot as I have no IE10-11 devices to test, but it will be easy to fix on request. --- src/dom/DomEvent.Pointer.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index 661a4a66488..8aac40edb9d 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -11,7 +11,6 @@ var POINTER_DOWN = Browser.msPointer ? 'MSPointerDown' : 'pointerdown'; var POINTER_MOVE = Browser.msPointer ? 'MSPointerMove' : 'pointermove'; var POINTER_UP = Browser.msPointer ? 'MSPointerUp' : 'pointerup'; var POINTER_CANCEL = Browser.msPointer ? 'MSPointerCancel' : 'pointercancel'; -var TAG_WHITE_LIST = ['INPUT', 'SELECT', 'OPTION']; var _pointers = {}; var _pointerDocListener = false; @@ -52,13 +51,8 @@ export function removePointerListener(obj, type, id) { function _addPointerStart(obj, handler, id) { var onDown = Util.bind(function (e) { - if (e.pointerType !== (e.MSPOINTER_TYPE_MOUSE || 'mouse')) { - // In IE11, some touch events needs to fire for form controls, or - // the controls will stop working. We keep a whitelist of tag names that - // need these events. For other target tags, we prevent default on the event. - if (Browser.ie && TAG_WHITE_LIST.indexOf(e.target.tagName) >= 0) { - return; - } + // IE10 specific: MsTouch needs preventDefault. See #2000 + if (e.MSPOINTER_TYPE_TOUCH && e.pointerType === e.MSPOINTER_TYPE_TOUCH) { DomEvent.preventDefault(e); } From 71f73785c91f50821cee4f590c41b14eeddf394c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 14 Jul 2020 07:37:21 +0200 Subject: [PATCH 074/306] =?UTF-8?q?plugins=20list:=20rm=20=E2=AD=90=20from?= =?UTF-8?q?=20geoman=20description?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removed emoji for consistency. I'm not aware we wanted to highlight any plugin over the rest with little stars. --- docs/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins.md b/docs/plugins.md index 776847f1b38..b876ed1de70 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2309,7 +2309,7 @@ Allows users to create, draw, edit and/or delete points, lines and polygons. Leaflet-Geoman - ⭐ Geometry Management for Leaflet 1.0 and higher. Draw, Edit, Cut, Drag and Snap Layers like Markers, Circles, Rectangles, Polylines, Polygons, LayerGroups, geoJSON, MultiPolygons, MultiLineStrings. Supports holes in polygons, snapping, canvas mode and more. (Demo) + Geometry Management for Leaflet 1.0 and higher. Draw, Edit, Cut, Drag and Snap Layers like Markers, Circles, Rectangles, Polylines, Polygons, LayerGroups, geoJSON, MultiPolygons, MultiLineStrings. Supports holes in polygons, snapping, canvas mode and more. (Demo) Sumit Kumar From dd832105697c98c1fca5475616377cda66f876be Mon Sep 17 00:00:00 2001 From: Oswald <38556518+pasichnykvasyl@users.noreply.github.com> Date: Mon, 20 Jul 2020 23:38:28 +0300 Subject: [PATCH 075/306] plugins: Add Leaflet.BigImage (#7214) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add Leaflet.BigImage * plugins: Tweak text for Leaflet.BigImage Co-authored-by: Iván Sánchez Ortega --- docs/plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index b876ed1de70..e58f13702b5 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -4041,6 +4041,15 @@ Print or export your map. Igor Vladyka + + + Leaflet.BigImage + + Allows users to download an image with a scaled-up version of the visible map. + + Vasyl Pasichnyk (Oswald) + + From 26410f609b4d26f5b9e5bead4aa5863174200bcd Mon Sep 17 00:00:00 2001 From: Muhammad Arslan Sajid Date: Mon, 31 Aug 2020 21:43:49 +0200 Subject: [PATCH 076/306] updated Leaflet.BeautifyMarkers plugin github url (#7247) Co-authored-by: m.sajid --- docs/plugins.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/plugins.md b/docs/plugins.md index e58f13702b5..5d3caf91b80 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1315,11 +1315,11 @@ These plugins provide new markers or news ways of converting abstract data into - Leaflet.BeautifyMarkers + Leaflet.BeautifyMarkers Lightweight plugin that adds colorful iconic markers without image and gives full control of style to end user (i.e. Unlimited colors and CSS styling). - Muhammad Arslan Sajid + Muhammad Arslan Sajid From 81133a49e85bc4461f84fa6662c6144bee852fc0 Mon Sep 17 00:00:00 2001 From: "R.A. Porter" Date: Thu, 3 Sep 2020 03:05:14 -0700 Subject: [PATCH 077/306] New plugin: Leaflet.ArrowCircle (#7249) This [plugin](https://github.com/coyotesqrl/Leaflet.ArrowCircle) allows for the creation of circle markers with directional arrows. --- docs/plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 5d3caf91b80..e4d1df64f4b 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1845,6 +1845,17 @@ These plugins provide new markers or news ways of converting abstract data into Derek Li + + + Leaflet.ArrowCircle + + + A Marker extension to display circles with directional arrows. + + + R.A. Porter + + From 4f32a5e83525a3a42980c974e48712b058510eb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 4 Sep 2020 10:10:43 +0200 Subject: [PATCH 078/306] Release 1.7.1 (#7252) * Changelog and blog post for 1.7.0 * Tweak test for finger drag Apparently, some of the changes related to pointer events have made that touch-dragging less than the threshold now force a recalculation of the map center - the value is the same, so is == equal to the previous center but not === the same LatLng instance. * Bump to v1.7.1; fix uglifyjs script; update integrity hashes * Website stuff updated for 1.7.1 * Update CHANGELOG.md Co-authored-by: Vladimir Agafonkin * Update docs/_posts/2020-09-03-leaflet-1.7.1.md Co-authored-by: Vladimir Agafonkin * docs: 1.7.1 release announcement tweaks; delay dates by one day Co-authored-by: Vladimir Agafonkin --- CHANGELOG.md | 58 +- docs/_config.yml | 10 +- docs/_posts/2020-09-04-leaflet-1.7.1.md | 20 + docs/download.md | 6 +- docs/index.html | 4 +- docs/reference-1.7.1.html | 25068 ++++++++++++++++++++++ docs/reference-versions.html | 1 + docs/reference.html | 4 +- package.json | 10 +- spec/suites/map/handler/Map.DragSpec.js | 2 +- 10 files changed, 25164 insertions(+), 19 deletions(-) create mode 100644 docs/_posts/2020-09-04-leaflet-1.7.1.md create mode 100644 docs/reference-1.7.1.html diff --git a/CHANGELOG.md b/CHANGELOG.md index f9308f698f1..8b3541d57d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,63 @@ Leaflet Changelog (all changes without author notice are by [@mourner](https://github.com/mourner)) -## 1.6.0 +## 1.7.1 (2020-09-04) + +### Bug fixes + +* Fix build toolchain to reflect uglifyjs upgrade from v2 to v3 (by [@ivansanchez](https://github.com/ivansanchez)) + +## 1.7.0 (2020-09-03) + +### API changes + +* `VideoOverlay` now can take a `muted` option ([#7071](https://github.com/Leaflet/Leaflet/pull/7071) by [@ronikar](https://github.com/ronikar)) +* The `featureGroup` factory method now takes `options`, as the `FeatureGroup` constructor ([#7160](https://github.com/Leaflet/Leaflet/pull/7160) by [@frogcat](https://github.com/frogcat)) + +### Improvements + +* Use passive event listeners for `touchstart`/`touchend` events ([#7008](https://github.com/Leaflet/Leaflet/pull/7008) by [@yneet](https://github.com/yneet)) +* Better detection of `PointerEvents`-capable browsers in `L.Browser`, and related changes to `Tap`, `Drag`, and `TouchZoom` handlers ([#7010](https://github.com/Leaflet/Leaflet/pull/7010), ([#7033](https://github.com/Leaflet/Leaflet/pull/7041), ([#7036](https://github.com/Leaflet/Leaflet/pull/7036), ([#7068](https://github.com/Leaflet/Leaflet/pull/7068), ([#7195](https://github.com/Leaflet/Leaflet/pull/7195) by [@johnd0e](https://github.com/johnd0e)) +* Add more browser profiles for the automated tests ([#7115](https://github.com/Leaflet/Leaflet/pull/7115) by [@johnd0e](https://github.com/johnd0e)) + +### Bug fixes + +* Fix canvas renderer not clearing the canvas on some zoom transformations, was affecting opacity of items ([#6915](https://github.com/Leaflet/Leaflet/pull/6915) by [@chipta](https://github.com/chipta)) +* Fix detection of passive events in `L.Browser` ([#6930](https://github.com/Leaflet/Leaflet/pull/6930) by [@Ivan-Perez](https://github.com/Ivan-Perez)) +* Prefix MS-specific CSS style to prevent warnings (by [@ivansanchez](https://github.com/ivansanchez), kudos to [@zachricha](https://github.com/zachricha) for [#6960](https://github.com/Leaflet/Leaflet/pull/6960)) +* Clean up `moveend` listener from `map.setMaxBounds` ([#6958](https://github.com/Leaflet/Leaflet/pull/6958) by [@simon04](https://github.com/simon04)) +* Fix wrong scope of `bind` call in ESM environments ([#6970](https://github.com/Leaflet/Leaflet/pull/6970) by [@shintonik](https://github.com/shintonik)) +* Check that `closePopup` exists before calling it automatically ([#6962](https://github.com/Leaflet/Leaflet/pull/6962) by [@pke](https://github.com/pke)) +* Fix exception when calling `layerGroup.hasLayer()` with wrong `layerId` ([#6998](https://github.com/Leaflet/Leaflet/pull/6998) by [@johnd0e](https://github.com/johnd0e)) +* Remove `click` filter targeting Android 4.x browsers ([#7013](https://github.com/Leaflet/Leaflet/pull/7013) by [@johnd0e](https://github.com/johnd0e)) +* Fix touch zoom handler context ([#7036](https://github.com/Leaflet/Leaflet/pull/7036) by [@johnd0e](https://github.com/johnd0e)) +* Tests for `Bounds.overlaps()` and `Bounds.intersects()` ([#7075](https://github.com/Leaflet/Leaflet/pull/7075) by [@mondeja](https://github.com/mondeja)) +* Fix event propagation in a popup's container ([#7091](https://github.com/Leaflet/Leaflet/pull/7091) by [@johnd0e](https://github.com/johnd0e)) +* Fix tile flickering when `maxNativeZoom === maxZoom` ([#7094](https://github.com/Leaflet/Leaflet/pull/7094) by [@johnd0e](https://github.com/johnd0e)) +* Fix `GridLayer`'s zoom-level loading algorithm ([#7123](https://github.com/Leaflet/Leaflet/pull/7123) by [@johnd0e](https://github.com/johnd0e)) +* Fix `tooltipAnchor` behavior for different tooltip directions ([#7155](https://github.com/Leaflet/Leaflet/pull/7155) by [@Istador](https://github.com/Istador)) + +### Docs & Web Site + +* Updated examples to use non-legacy Mapbox tiles, and related changes ([#6905](https://github.com/Leaflet/Leaflet/pull/6905) by [@riastrad](https://github.com/riastrad)) ([#6922](https://github.com/Leaflet/Leaflet/pull/6922) by [@danswick](https://github.com/danswick)) ([#6995](https://github.com/Leaflet/Leaflet/pull/6995) by [@riastrad](https://github.com/riastrad)) +* Fix documentation for `Polyline.addLatLng()` ([#6924](https://github.com/Leaflet/Leaflet/pull/6924) by [@life777](https://github.com/life777)) +* CRS tutorial: change link for UQM tool to an archived version (by [@ivansanchez](https://github.com/ivansanchez)) +* Fixed minor spelling errors in documentation ([#6850](https://github.com/Leaflet/Leaflet/pull/6850) by [@flopp](https://github.com/flopp)) ([#6944](https://github.com/Leaflet/Leaflet/pull/6944) by [@jieter](https://github.com/jieter)) +* Fixed typo in panes documentation (by [#6939](https://github.com/Leaflet/Leaflet/pull/6939) by [@R4M80MrX](https://github.com/R4M80MrX)) +* Fixed broken URL in quick-start example ([#6982](https://github.com/Leaflet/Leaflet/pull/6982) by [@ekbarber](https://github.com/ekbarber)) +* Fix documentation for `map.setMaxBounds()` ([#7001](https://github.com/Leaflet/Leaflet/pull/7001) by [@johnd0e](https://github.com/johnd0e)) +* Fix tilt code in handler tutorial ([#7014](https://github.com/Leaflet/Leaflet/pull/7014) by [@vncntcltt](https://github.com/vncntcltt)) +* Fix instructions for using `jekyll` when building docs ([#7014](https://github.com/Leaflet/Leaflet/pull/7014) by [@vncntcltt](https://github.com/vncntcltt)) +* Update WMS servers in WMS tutorial ([#7014](https://github.com/Leaflet/Leaflet/pull/7014) by [@vncntcltt](https://github.com/vncntcltt)) +* Website constrast changes and minor cleanup (by [@mourner](https://github.com/mourner)) +* Fixed typo in WMS example ([#7098](https://github.com/Leaflet/Leaflet/pull/7098) by [@andreasnuesslein](https://github.com/andreasnuesslein)) +* Fix documentation for `divOverlay.getElement()` ([#7111](https://github.com/Leaflet/Leaflet/pull/7111) by [@mondeja](https://github.com/mondeja)) +* Fix documentation for `Marker.shadowPane` ([#7135](https://github.com/Leaflet/Leaflet/pull/7135) by [@mi-v](https://github.com/mi-v)) +* Update URL about NPM in developer docs ([#7161](https://github.com/Leaflet/Leaflet/pull/7161) by [@iamtekson](https://github.com/iamtekson)) +* Fix documentation for `Layer.removeFrom()` regarding `LayerGroup`s (by [@ivansanchez](https://github.com/ivansanchez)) +* Fix documentation for `LatLngBounds.overlaps()` [#7194](https://github.com/Leaflet/Leaflet/pull/7194) by [@DerZade](https://github.com/DerZade)) + +## 1.6.0 (2019-11-17) ### API changes diff --git a/docs/_config.yml b/docs/_config.yml index e2bda19c19d..ab028944851 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -5,12 +5,12 @@ markdown: kramdown kramdown: entity_output: as_input -latest_leaflet_version: 1.6.0 -latest_leaflet_reference: 1.6.0 +latest_leaflet_version: 1.7.1 +latest_leaflet_reference: 1.7.1 # Integrity hashes for both leaflet.js and leaflet-src.js # These will be shown in the downloads page # See https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity -integrity_hash_css: "sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" -integrity_hash_source: "sha512-6axRrTaCntT2gUQQnqcwJCDOQck4lTwHtKTriihNct1L7Ri2J1q0XFYgKJYldo0BTkijrR5X6r41l4OKCCLu/A==" -integrity_hash_uglified: "sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew==" +integrity_hash_css: "sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A==" +integrity_hash_source: "sha512-I5Hd7FcJ9rZkH7uD01G3AjsuzFy3gqz7HIJvzFZGFt2mrCS4Piw9bYZvCgUE0aiJuiZFYIJIwpbNnDIM6ohTrg==" +integrity_hash_uglified: "sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA==" diff --git a/docs/_posts/2020-09-04-leaflet-1.7.1.md b/docs/_posts/2020-09-04-leaflet-1.7.1.md new file mode 100644 index 00000000000..ec48bf15891 --- /dev/null +++ b/docs/_posts/2020-09-04-leaflet-1.7.1.md @@ -0,0 +1,20 @@ +--- +layout: post +title: Leaflet 1.7 released +description: Leaflet 1.7.1 now available +author: Iván Sánchez Ortega +authorsite: https://ivan.sanchezortega.es +--- + +During the last year or so, mainstream web browsers have subtly changed the way touchscreens work; unfortunately, Leaflet 1.6.0 and previous versions now exhibit some quirks on touchscreens. + +Leaflet 1.7.1 fixes that by bringing several changes to how `PointerEvent`s are detected and handled, and using passive touch event listeners when available. + +The release was supposed to be numbered as 1.7.0, but a problem with the NPM dependencies appeared at the last minute, generating a bad build. Version 1.7.0 has been marked as deprecated in NPM, and shouldn't be used - use 1.7.1 instead. + +Besides that, there's a bunch of small bug and documentation fixes, detailed in [the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md). Thanks to everyone who sent a fix, no matter how small! + +To get the new release, update your dependencies in your favorite package manager, or check the [downloads page](https://leafletjs.com/download.html). + +Cheers,
    +The Leaflet team. diff --git a/docs/download.md b/docs/download.md index bef0b7e20e0..cf547f524df 100644 --- a/docs/download.md +++ b/docs/download.md @@ -12,11 +12,11 @@ bodyclass: download-page Description - Leaflet 1.6.0 - Stable version, released on November 17, 2019. + Leaflet 1.7.1 + Stable version, released on September 3, 2020. - Leaflet 1.7-dev + Leaflet 1.8-dev In-progress version, developed on the master branch. diff --git a/docs/index.html b/docs/index.html index cfb0091cdb6..b527efa9b7b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,10 +2,10 @@ layout: v2 --- -
    Nov 17, 2019 — Leaflet 1.6.0 has been released!
    +
    Sep 4, 2020 — Leaflet 1.7.1 has been released!

    Leaflet is the leading open-source JavaScript library for mobile-friendly interactive maps. -Weighing just about 38 KB of JS, +Weighing just about 39 KB of JS, it has all the mapping features most developers ever need.

    Leaflet is designed with simplicity, performance and usability in mind. diff --git a/docs/reference-1.7.1.html b/docs/reference-1.7.1.html new file mode 100644 index 00000000000..42132e36e5c --- /dev/null +++ b/docs/reference-1.7.1.html @@ -0,0 +1,25068 @@ +--- +layout: v2 +title: Documentation +bodyclass: api-page +--- + +

    This reference reflects Leaflet 1.7.1. Check this list if you are using a different version of Leaflet.

    + +

    Leaflet API reference

    +
    + +
    +

    UI Layers

    + +

    Raster Layers

    + +

    Vector Layers

    + +
    +
    +

    Other Layers

    + +

    Basic Types

    + +

    Controls

    + +
    +
    + + + + + + +

    Utility

    + +

    DOM Utility

    + +
    +
    +

    Base Classes

    + + +

    Misc

    + +
    +
    + +

    Map

    The central class of the API — it is used to create a map on a page and manipulate it.

    + +
    +

    Usage example

    + +
    + + + + + +
    // initialize the map on the "map" div with a given center and zoom
    +var map = L.map('map', {
    +	center: [51.505, -0.09],
    +	zoom: 13
    +});
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.map(<String> id, <Map options> options?)Instantiates a map object given the DOM ID of a <div> element +and optionally an object literal with Map options.
    L.map(<HTMLElement> el, <Map options> options?)Instantiates a map object given an instance of a <div> HTML element +and optionally an object literal with Map options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    preferCanvasBooleanfalseWhether Paths should be rendered on a Canvas renderer. +By default, all Paths are rendered in a SVG renderer.
    + +
    + +

    Control options

    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionControlBooleantrueWhether a attribution control is added to the map by default.
    zoomControlBooleantrueWhether a zoom control is added to the map by default.
    + +
    + +

    Interaction Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    closePopupOnClickBooleantrueSet it to false if you don't want popups to close when user clicks the map.
    zoomSnapNumber1Forces the map's zoom level to always be a multiple of this, particularly +right after a fitBounds() or a pinch-zoom. +By default, the zoom level snaps to the nearest integer; lower values +(e.g. 0.5 or 0.1) allow for greater granularity. A value of 0 +means the zoom level will not be snapped after fitBounds or a pinch-zoom.
    zoomDeltaNumber1Controls how much the map's zoom level will change after a +zoomIn(), zoomOut(), pressing + +or - on the keyboard, or using the zoom controls. +Values smaller than 1 (e.g. 0.5) allow for greater granularity.
    trackResizeBooleantrueWhether the map automatically handles browser window resize to update itself.
    boxZoomBooleantrueWhether the map can be zoomed to a rectangular area specified by +dragging the mouse while pressing the shift key.
    doubleClickZoomBoolean|StringtrueWhether the map can be zoomed in by double clicking on it and +zoomed out by double clicking while holding shift. If passed +'center', double-click zoom will zoom to the center of the +view regardless of where the mouse was.
    draggingBooleantrueWhether the map be draggable with mouse/touch or not.
    + +
    + +

    Map State Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    crsCRSL.CRS.EPSG3857The Coordinate Reference System to use. Don't change this if you're not +sure what it means.
    centerLatLngundefinedInitial geographic center of the map
    zoomNumberundefinedInitial map zoom level
    minZoomNumber*Minimum zoom level of the map. +If not specified and at least one GridLayer or TileLayer is in the map, +the lowest of their minZoom options will be used instead.
    maxZoomNumber*Maximum zoom level of the map. +If not specified and at least one GridLayer or TileLayer is in the map, +the highest of their maxZoom options will be used instead.
    layersLayer[][]Array of layers that will be added to the map initially
    maxBoundsLatLngBoundsnullWhen this option is set, the map restricts the view to the given +geographical bounds, bouncing the user back if the user tries to pan +outside the view. To set the restriction dynamically, use +setMaxBounds method.
    rendererRenderer*The default method for drawing vector layers on the map. L.SVG +or L.Canvas by default depending on browser support.
    + +
    + +

    Animation Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    zoomAnimationBooleantrueWhether the map zoom animation is enabled. By default it's enabled +in all browsers that support CSS3 Transitions except Android.
    zoomAnimationThresholdNumber4Won't animate zoom if the zoom difference exceeds this value.
    fadeAnimationBooleantrueWhether the tile fade animation is enabled. By default it's enabled +in all browsers that support CSS3 Transitions except Android.
    markerZoomAnimationBooleantrueWhether markers animate their zoom with the zoom animation, if disabled +they will disappear for the length of the animation. By default it's +enabled in all browsers that support CSS3 Transitions except Android.
    transform3DLimitNumber2^23Defines the maximum size of a CSS translation transform. The default +value should not be changed unless a web browser positions layers in +the wrong place after doing a large panBy.
    + +
    + +

    Panning Inertia Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    inertiaBoolean*If enabled, panning of the map will have an inertia effect where +the map builds momentum while dragging and continues moving in +the same direction for some time. Feels especially nice on touch +devices. Enabled by default unless running on old Android devices.
    inertiaDecelerationNumber3000The rate with which the inertial movement slows down, in pixels/second².
    inertiaMaxSpeedNumberInfinityMax speed of the inertial movement, in pixels/second.
    easeLinearityNumber0.2
    worldCopyJumpBooleanfalseWith this option enabled, the map tracks when you pan to another "copy" +of the world and seamlessly jumps to the original one so that all overlays +like markers and vector layers are still visible.
    maxBoundsViscosityNumber0.0If maxBounds is set, this option will control how solid the bounds +are when dragging the map around. The default value of 0.0 allows the +user to drag outside the bounds at normal speed, higher values will +slow down map dragging outside bounds, and 1.0 makes the bounds fully +solid, preventing the user from dragging outside the bounds.
    + +
    + +

    Keyboard Navigation Options

    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    keyboardBooleantrueMakes the map focusable and allows users to navigate the map with keyboard +arrows and +/- keys.
    keyboardPanDeltaNumber80Amount of pixels to pan when pressing an arrow key.
    + +
    + +

    Mouse wheel options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    scrollWheelZoomBoolean|StringtrueWhether the map can be zoomed by using the mouse wheel. If passed 'center', +it will zoom to the center of the view regardless of where the mouse was.
    wheelDebounceTimeNumber40Limits the rate at which a wheel can fire (in milliseconds). By default +user can't zoom via wheel more often than once per 40 ms.
    wheelPxPerZoomLevelNumber60How many scroll pixels (as reported by L.DomEvent.getWheelDelta) +mean a change of one full zoom level. Smaller values will make wheel-zooming +faster (and vice versa).
    + +
    + +

    Touch interaction options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tapBooleantrueEnables mobile hacks for supporting instant taps (fixing 200ms click +delay on iOS/Android) and touch holds (fired as contextmenu events).
    tapToleranceNumber15The max number of pixels a user can shift his finger during touch +for it to be considered a valid tap.
    touchZoomBoolean|String*Whether the map can be zoomed by touch-dragging with two fingers. If +passed 'center', it will zoom to the center of the view regardless of +where the touch events (fingers) were. Enabled for touch-capable web +browsers except for old Androids.
    bounceAtZoomLimitsBooleantrueSet it to false if you don't want the map to zoom beyond min/max zoom +and then bounce back when pinch-zooming.
    + +
    + + +
    +

    Events

    + +
    + +

    Layer events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    baselayerchangeLayersControlEventFired when the base layer is changed through the layers control.
    overlayaddLayersControlEventFired when an overlay is selected through the layers control.
    overlayremoveLayersControlEventFired when an overlay is deselected through the layers control.
    layeraddLayerEventFired when a new layer is added to the map.
    layerremoveLayerEventFired when some layer is removed from the map
    + +
    + +

    Map state change events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    zoomlevelschangeEventFired when the number of zoomlevels on the map is changed due +to adding or removing a layer.
    resizeResizeEventFired when the map is resized.
    unloadEventFired when the map is destroyed with remove method.
    viewresetEventFired when the map needs to redraw its content (this usually happens +on map zoom or load). Very useful for creating custom overlays.
    loadEventFired when the map is initialized (when its center and zoom are set +for the first time).
    zoomstartEventFired when the map zoom is about to change (e.g. before zoom animation).
    movestartEventFired when the view of the map starts changing (e.g. user starts dragging the map).
    zoomEventFired repeatedly during any change in zoom level, including zoom +and fly animations.
    moveEventFired repeatedly during any movement of the map, including pan and +fly animations.
    zoomendEventFired when the map has changed, after any animations.
    moveendEventFired when the center of the map stops changing (e.g. user stopped +dragging the map).
    + +
    + +

    Popup events

    + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup is opened in the map
    popupclosePopupEventFired when a popup in the map is closed
    autopanstartEventFired when the map starts autopanning when opening a popup.
    + +
    + +

    Tooltip events

    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip is opened in the map.
    tooltipcloseTooltipEventFired when a tooltip in the map is closed.
    + +
    + +

    Location events

    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    locationerrorErrorEventFired when geolocation (using the locate method) failed.
    locationfoundLocationEventFired when geolocation (using the locate method) +went successfully.
    + +
    + +

    Interaction events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the map.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the map.
    mousedownMouseEventFired when the user pushes the mouse button on the map.
    mouseupMouseEventFired when the user releases the mouse button on the map.
    mouseoverMouseEventFired when the mouse enters the map.
    mouseoutMouseEventFired when the mouse leaves the map.
    mousemoveMouseEventFired while the mouse moves over the map.
    contextmenuMouseEventFired when the user pushes the right mouse button on the map, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    keypressKeyboardEventFired when the user presses a key from the keyboard that produces a character value while the map is focused.
    keydownKeyboardEventFired when the user presses a key from the keyboard while the map is focused. Unlike the keypress event, +the keydown event is fired for keys that produce a character value and for keys +that do not produce a character value.
    keyupKeyboardEventFired when the user releases a key from the keyboard while the map is focused.
    preclickMouseEventFired before mouse click on the map (sometimes useful when you +want something to happen on click before any existing click +handlers start running).
    + +
    + +

    Other Events

    + + + + + + + + + + + + + + +
    EventDataDescription
    zoomanimZoomAnimEventFired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getRenderer(<Path> layer)Renderer

    Returns the instance of Renderer that should be used to render the given +Path. It will ensure that the renderer options of the map and paths +are respected, and that the renderers do exist on the map.

    +
    + +
    + +

    Methods for Layers and Controls

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addControl(<Control> control)this

    Adds the given control to the map

    +
    removeControl(<Control> control)this

    Removes the given control from the map

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the map

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the map.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the map

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the map, optionally specifying context of the iterator function.

    +
    map.eachLayer(function(layer){
    +    layer.bindPopup('Hello');
    +});
    +
    +
    openPopup(<Popup> popup)this

    Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).

    +
    openPopup(<String|HTMLElement> content, <LatLng> latlng, <Popup options> options?)this

    Creates a popup with the specified content and options and opens it in the given point on a map.

    +
    closePopup(<Popup> popup?)this

    Closes the popup previously opened with openPopup (or the given one).

    +
    openTooltip(<Tooltip> tooltip)this

    Opens the specified tooltip.

    +
    openTooltip(<String|HTMLElement> content, <LatLng> latlng, <Tooltip options> options?)this

    Creates a tooltip with the specified content and options and open it.

    +
    closeTooltip(<Tooltip> tooltip?)this

    Closes the tooltip given as parameter.

    +
    + +
    + +

    Methods for modifying map state

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setView(<LatLng> center, <Number> zoom, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) with the given +animation options.

    +
    setZoom(<Number> zoom, <Zoom/pan options> options?)this

    Sets the zoom of the map.

    +
    zoomIn(<Number> delta?, <Zoom options> options?)this

    Increases the zoom of the map by delta (zoomDelta by default).

    +
    zoomOut(<Number> delta?, <Zoom options> options?)this

    Decreases the zoom of the map by delta (zoomDelta by default).

    +
    setZoomAround(<LatLng> latlng, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified geographical point on the map +stationary (e.g. used internally for scroll zoom and double-click zoom).

    +
    setZoomAround(<Point> offset, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.

    +
    fitBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets a map view that contains the given geographical bounds with the +maximum zoom level possible.

    +
    fitWorld(<fitBounds options> options?)this

    Sets a map view that mostly contains the whole world with the maximum +zoom level possible.

    +
    panTo(<LatLng> latlng, <Pan options> options?)this

    Pans the map to a given center.

    +
    panBy(<Point> offset, <Pan options> options?)this

    Pans the map by a given number of pixels (animated).

    +
    flyTo(<LatLng> latlng, <Number> zoom?, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) performing a smooth +pan-zoom animation.

    +
    flyToBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets the view of the map with a smooth animation like flyTo, +but takes a bounds parameter like fitBounds.

    +
    setMaxBounds(<LatLngBounds> bounds)this

    Restricts the map view to the given bounds (see the maxBounds option).

    +
    setMinZoom(<Number> zoom)this

    Sets the lower limit for the available zoom levels (see the minZoom option).

    +
    setMaxZoom(<Number> zoom)this

    Sets the upper limit for the available zoom levels (see the maxZoom option).

    +
    panInsideBounds(<LatLngBounds> bounds, <Pan options> options?)this

    Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.

    +
    panInside(<LatLng> latlng, <options> options?)this

    Pans the map the minimum amount to make the latlng visible. Use +padding, paddingTopLeft and paddingTopRight options to fit +the display to more restricted bounds, like fitBounds. +If latlng is already within the (optionally padded) display bounds, +the map will not be panned.

    +
    invalidateSize(<Zoom/pan options> options)this

    Checks if the map container size changed and updates the map if so — +call it after you've changed the map size dynamically, also animating +pan by default. If options.pan is false, panning will not occur. +If options.debounceMoveend is true, it will delay moveend event so +that it doesn't happen often even if the method is called many +times in a row.

    +
    invalidateSize(<Boolean> animate)this

    Checks if the map container size changed and updates the map if so — +call it after you've changed the map size dynamically, also animating +pan by default.

    +
    stop()this

    Stops the currently running panTo or flyTo animation, if any.

    +
    + +
    + +

    Geolocation methods

    + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    locate(<Locate options> options?)this

    Tries to locate the user using the Geolocation API, firing a locationfound +event with location data on success or a locationerror event on failure, +and optionally sets the map view to the user's location with respect to +detection accuracy (or to the world view if geolocation failed). +Note that, if your page doesn't use HTTPS, this method will fail in +modern browsers (Chrome 50 and newer) +See Locate options for more details.

    +
    stopLocate()this

    Stops watching location previously initiated by map.locate({watch: true}) +and aborts resetting the map view if map.locate was called with +{setView: true}.

    +
    + +
    + +

    Other Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addHandler(<String> name, <Function> HandlerClass)this

    Adds a new Handler to the map, given its name and constructor function.

    +
    remove()this

    Destroys the map and clears all related event listeners.

    +
    createPane(<String> name, <HTMLElement> container?)HTMLElement

    Creates a new map pane with the given name if it doesn't exist already, +then returns it. The pane is created as a child of container, or +as a child of the main map pane if not set.

    +
    getPane(<String|HTMLElement> pane)HTMLElement

    Returns a map pane, given its name or its HTML element (its identity).

    +
    getPanes()Object

    Returns a plain object containing the names of all panes as keys and +the panes as values.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the map.

    +
    whenReady(<Function> fn, <Object> context?)this

    Runs the given function fn when the map gets initialized with +a view (center and zoom) and at least one layer, or immediately +if it's already initialized, optionally passing a function context.

    +
    + +
    + +

    Methods for Getting Map State

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getCenter()LatLng

    Returns the geographical center of the map view

    +
    getZoom()Number

    Returns the current zoom level of the map view

    +
    getBounds()LatLngBounds

    Returns the geographical bounds visible in the current map view

    +
    getMinZoom()Number

    Returns the minimum zoom level of the map (if set in the minZoom option of the map or of any layers), or 0 by default.

    +
    getMaxZoom()Number

    Returns the maximum zoom level of the map (if set in the maxZoom option of the map or of any layers).

    +
    getBoundsZoom(<LatLngBounds> bounds, <Boolean> inside?, <Point> padding?)Number

    Returns the maximum zoom level on which the given bounds fit to the map +view in its entirety. If inside (optional) is set to true, the method +instead returns the minimum zoom level on which the map view fits into +the given bounds in its entirety.

    +
    getSize()Point

    Returns the current size of the map container (in pixels).

    +
    getPixelBounds()Bounds

    Returns the bounds of the current map view in projected pixel +coordinates (sometimes useful in layer and overlay implementations).

    +
    getPixelOrigin()Point

    Returns the projected pixel coordinates of the top left point of +the map layer (useful in custom layer and overlay implementations).

    +
    getPixelWorldBounds(<Number> zoom?)Bounds

    Returns the world's bounds in pixel coordinates for zoom level zoom. +If zoom is omitted, the map's current zoom level is used.

    +
    + +
    + +

    Conversion Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getZoomScale(<Number> toZoom, <Number> fromZoom)Number

    Returns the scale factor to be applied to a map transition from zoom level +fromZoom to toZoom. Used internally to help with zoom animations.

    +
    getScaleZoom(<Number> scale, <Number> fromZoom)Number

    Returns the zoom level that the map would end up at, if it is at fromZoom +level and everything is scaled by a factor of scale. Inverse of +getZoomScale.

    +
    project(<LatLng> latlng, <Number> zoom)Point

    Projects a geographical coordinate LatLng according to the projection +of the map's CRS, then scales it according to zoom and the CRS's +Transformation. The result is pixel coordinate relative to +the CRS origin.

    +
    unproject(<Point> point, <Number> zoom)LatLng

    Inverse of project.

    +
    layerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the origin pixel, +returns the corresponding geographical coordinate (for the current zoom level).

    +
    latLngToLayerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate +relative to the origin pixel.

    +
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the +map's CRS's wrapLat and wrapLng properties, if they are outside the +CRS's bounds. +By default this means longitude is wrapped around the dateline so its +value is between -180 and +180 degrees.

    +
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring that +its center is within the CRS's bounds. +By default this means the center longitude is wrapped around the dateline so its +value is between -180 and +180 degrees, and the majority of the bounds +overlaps the CRS's bounds.

    +
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates according to +the map's CRS. By default this measures distance in meters.

    +
    containerPointToLayerPoint(<Point> point)Point

    Given a pixel coordinate relative to the map container, returns the corresponding +pixel coordinate relative to the origin pixel.

    +
    layerPointToContainerPoint(<Point> point)Point

    Given a pixel coordinate relative to the origin pixel, +returns the corresponding pixel coordinate relative to the map container.

    +
    containerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the map container, returns +the corresponding geographical coordinate (for the current zoom level).

    +
    latLngToContainerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate +relative to the map container.

    +
    mouseEventToContainerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to the +map container where the event took place.

    +
    mouseEventToLayerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to +the origin pixel where the event took place.

    +
    mouseEventToLatLng(<MouseEvent> ev)LatLng

    Given a MouseEvent object, returns geographical coordinate where the +event took place.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Properties

    + +
    + +

    Controls

    + + + + + + + + + + + + + + +
    PropertyTypeDescription
    zoomControlControl.ZoomThe default zoom control (only available if the +zoomControl option was true when creating the map).
    + +
    + +

    Handlers

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    boxZoomHandlerBox (shift-drag with mouse) zoom handler.
    doubleClickZoomHandlerDouble click zoom handler.
    draggingHandlerMap dragging handler (by both mouse and touch).
    keyboardHandlerKeyboard navigation handler.
    scrollWheelZoomHandlerScroll wheel zoom handler.
    tapHandlerMobile touch hacks (quick tap and touch hold) handler.
    touchZoomHandlerTouch zoom handler.
    + +
    + + +
    +

    Map panes

    + +
    + + + +
    Panes are DOM elements used to control the ordering of layers on the map. You +can access panes with map.getPane or +map.getPanes methods. New panes can be created with the +map.createPane method. +

    Every map has the following default panes that differ only in zIndex.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PaneTypeZ-indexDescription
    mapPaneHTMLElement'auto'Pane that contains all other map panes
    tilePaneHTMLElement200Pane for GridLayers and TileLayers
    overlayPaneHTMLElement400Pane for overlay shadows (e.g. Marker shadows)
    shadowPaneHTMLElement500Pane for vectors (Paths, like Polylines and Polygons), ImageOverlays and VideoOverlays
    markerPaneHTMLElement600Pane for Icons of Markers
    tooltipPaneHTMLElement650Pane for Tooltips.
    popupPaneHTMLElement700Pane for Popups.
    + +
    + + +
    + +
    +

    Locate options

    + +
    + + + +
    Some of the geolocation methods for Map take in an options parameter. This +is a plain javascript object with the following optional components:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    watchBooleanfalseIf true, starts continuous watching of location changes (instead of detecting it +once) using W3C watchPosition method. You can later stop watching using +map.stopLocate() method.
    setViewBooleanfalseIf true, automatically sets the map view to the user location with respect to +detection accuracy, or to world view if geolocation failed.
    maxZoomNumberInfinityThe maximum zoom for automatic view setting when using setView option.
    timeoutNumber10000Number of milliseconds to wait for a response from geolocation before firing a +locationerror event.
    maximumAgeNumber0Maximum age of detected location. If less than this amount of milliseconds +passed since last geolocation response, locate will return a cached location.
    enableHighAccuracyBooleanfalseEnables high accuracy, see description in the W3C spec.
    + +
    + + +
    + +
    +

    Zoom options

    + +
    + + + +
    Some of the Map methods which modify the zoom level take in an options +parameter. This is a plain javascript object with the following optional +components:
    + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
    + +
    + + +
    + +
    +

    Pan options

    + +
    + + + +
    Some of the Map methods which modify the center of the map take in an options +parameter. This is a plain javascript object with the following optional +components:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBooleanIf true, panning will always be animated if possible. If false, it will +not animate panning, either resetting the map view if panning more than a +screen away, or just setting a new offset for the map pane (except for panBy +which always does the latter).
    durationNumber0.25Duration of animated panning, in seconds.
    easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
    noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
    + +
    + + +
    + +
    +

    Zoom/pan options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    durationNumber0.25Duration of animated panning, in seconds.
    easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
    noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
    + +
    +
    +
    + +
    + +
    +

    FitBounds options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingTopLeftPoint[0, 0]Sets the amount of padding in the top left corner of a map container that +shouldn't be accounted for when setting the view to fit bounds. Useful if you +have some control overlays on the map like a sidebar and you don't want them +to obscure objects you're zooming to.
    paddingBottomRightPoint[0, 0]The same for the bottom right corner of the map.
    paddingPoint[0, 0]Equivalent of setting both top left and bottom right padding to the same value.
    maxZoomNumbernullThe maximum possible zoom to use.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    durationNumber0.25Duration of animated panning, in seconds.
    easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
    noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
    + +
    +
    +
    + +

    Marker

    L.Marker is used to display clickable/draggable icons on the map. Extends Layer.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.marker([50.5, 30.5]).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.marker(<LatLng> latlng, <Marker options> options?)Instantiates a Marker object given a geographical point and optionally an options object.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    iconIcon*Icon instance to use for rendering the marker. +See Icon documentation for details on how to customize the marker icon. +If not specified, a common instance of L.Icon.Default is used.
    keyboardBooleantrueWhether the marker can be tabbed to with a keyboard and clicked by pressing enter.
    titleString''Text for the browser tooltip that appear on marker hover (no tooltip by default).
    altString''Text for the alt attribute of the icon image (useful for accessibility).
    zIndexOffsetNumber0By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
    opacityNumber1.0The opacity of the marker.
    riseOnHoverBooleanfalseIf true, the marker will get on top of others when you hover the mouse over it.
    riseOffsetNumber250The z-index offset used for the riseOnHover feature.
    paneString'markerPane'Map pane where the markers icon will be added.
    shadowPaneString'shadowPane'Map pane where the markers shadow will be added.
    bubblingMouseEventsBooleanfalseWhen true, a mouse event on this marker will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    + +

    Draggable marker options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    draggableBooleanfalseWhether the marker is draggable with mouse/touch or not.
    autoPanBooleanfalseWhether to pan the map when dragging this marker near its edge or not.
    autoPanPaddingPointPoint(50, 50)Distance (in pixels to the left/right and to the top/bottom) of the +map edge to start panning the map.
    autoPanSpeedNumber10Number of pixels the map should pan by.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    moveEventFired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    + +
    + +

    Dragging events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    dragstartEventFired when the user starts dragging the marker.
    movestartEventFired when the marker starts moving (because of dragging).
    dragEventFired repeatedly while the user drags the marker.
    dragendDragEndEventFired when the user stops dragging the marker.
    moveendEventFired when the marker stops moving (because of dragging).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + +
    In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getLatLng()LatLng

    Returns the current geographical position of the marker.

    +
    setLatLng(<LatLng> latlng)this

    Changes the marker position to the given point.

    +
    setZIndexOffset(<Number> offset)this

    Changes the zIndex offset of the marker.

    +
    getIcon()Icon

    Returns the current icon used by the marker

    +
    setIcon(<Icon> icon)this

    Changes the marker icon.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the marker.

    +
    + +
    + +

    Other methods

    + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON Point Feature).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Properties

    + +
    + +

    Interaction handlers

    + +
    Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see Handler methods). Example: +
    marker.dragging.disable();
    +
    + + + + + + + + + + + + + +
    PropertyTypeDescription
    draggingHandlerMarker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set marker.options.draggable).
    + +
    + + +

    Used to open popups in certain places of the map. Use Map.openPopup to +open popups while making sure that only one popup is open at one time +(recommended for usability), or use Map.addLayer to open as many as you want.

    + +
    + + +
    + + + + + +

    If you want to just bind a popup to marker click and then open it, it's really easy:

    +
    marker.bindPopup(popupContent).openPopup();
    +
    +

    Path overlays like polylines also have a bindPopup method. +Here's a more complicated way to open a popup on a map:

    +
    var popup = L.popup()
    +	.setLatLng(latlng)
    +	.setContent('<p>Hello world!<br />This is a nice popup.</p>')
    +	.openOn(map);
    +
    + + + +
    + + +
    + + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    + +
    +
    +
    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +

    Tooltip

    Used to display small texts on top of map layers.

    + +
    +

    Usage example

    + +
    + + + + + +
    marker.bindTooltip("my tooltip text").openTooltip();
    +
    +

    Note about tooltip offset. Leaflet takes two options in consideration +for computing tooltip offsetting:

    +
      +
    • the offset Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. +Add a positive x offset to move the tooltip to the right, and a positive y offset to +move it to the bottom. Negatives will move to the left and top.
    • +
    • the tooltipAnchor Icon option: this will only be considered for Marker. You +should adapt this value if you use a custom icon.
    • +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.tooltip(<Tooltip options> options?, <Layer> source?)Instantiates a Tooltip object given an optional options object that describes its appearance and location and an optional source object that is used to tag the tooltip with a reference to the Layer to which it refers.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'tooltipPane'Map pane where the tooltip will be added.
    offsetPointPoint(0, 0)Optional offset of the tooltip position.
    directionString'auto'Direction where to open the tooltip. Possible values are: right, left, +top, bottom, center, auto. +auto will dynamically switch between right and left according to the tooltip +position on the map.
    permanentBooleanfalseWhether to open the tooltip permanently or only on mouseover.
    stickyBooleanfalseIf true, the tooltip will follow the mouse instead of being fixed at the feature center.
    interactiveBooleanfalseIf true, the tooltip will listen to the feature events.
    opacityNumber0.9Tooltip container opacity.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    classNameString''A custom CSS class name to assign to the popup.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    TileLayer

    Used to load and display tile layers on the map. Note that most tile servers require attribution, which you can set under Layer. Extends GridLayer.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar', attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'}).addTo(map);
    +
    + + + +
    + +

    URL template

    + + + +

    A string of the following form:

    +
    'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
    +
    +

    {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates. {r} can be used to add "@2x" to the URL to load retina tiles.

    +

    You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

    +
    L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
    +
    + + + +
    + + +
    +

    Creation

    + +
    + +

    Extension methods

    + + + + + + + + + + + + +
    FactoryDescription
    L.tilelayer(<String> urlTemplate, <TileLayer options> options?)Instantiates a tile layer object given a URL template and optionally an options object.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[]'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber0The zoom number used in tile URLs will be offset with this value.
    tmsBooleanfalseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBooleanfalseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBooleanfalseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the tiles. +If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. +Refer to CORS Settings for valid String values.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean(depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
    updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber1The explicit zIndex of the tile layer.
    boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
    minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
    noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with [bounds](#gridlayer-bounds) to prevent requesting +tiles outside the CRS limits.
    paneString'tilePane'Map pane where the grid layer will be added.
    classNameString''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadingEventFired when the grid layer starts loading tiles.
    tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstartTileEventFired when a tile is requested and starts loading.
    tileerrorTileErrorEventFired when there is an error loading a tile.
    tileloadTileEventFired when a tile loads.
    loadEventFired when the grid layer loaded all visible tiles.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true). +If the URL does not change, the layer will not be redrawn unless +the noRedraw parameter is set to false.

    +
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() +to return an <img> HTML element with the appropriate image URL given coords. The done +callback is called when the tile has been loaded.

    +
    + +
    + +

    Extension methods

    + +
    Layers extending TileLayer might reimplement the following method.
    + + + + + + + + + + + + + +
    MethodReturnsDescription
    getTileUrl(<Object> coords)String

    Called only internally, returns the URL for a tile given its coordinates. +Classes extending TileLayer can override this function to provide custom tile URL naming schemes.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    +
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    +
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    +
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    +
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    +
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    TileLayer.WMS

    Used to display WMS services as tile layers on the map. Extends TileLayer.

    + +
    +

    Usage example

    + +
    + + + + + +
    var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
    +	layers: 'nexrad-n0r-900913',
    +	format: 'image/png',
    +	transparent: true,
    +	attribution: "Weather data © 2012 IEM Nexrad"
    +});
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.tileLayer.wms(<String> baseUrl, <TileLayer.WMS options> options)Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
    + +
    + + +
    +

    Options

    + +
    + + + +
    If any custom options not documented here are used, they will be sent to the +WMS server as extra parameters in each request URL. This can be useful for +non-standard vendor WMS parameters.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    layersString''(required) Comma-separated list of WMS layers to show.
    stylesString''Comma-separated list of WMS styles.
    formatString'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
    transparentBooleanfalseIf true, the WMS service will return images with transparency.
    versionString'1.1.1'Version of the WMS service to use
    crsCRSnullCoordinate Reference System to use for the WMS requests, defaults to +map CRS. Don't change this if you're not sure what it means.
    uppercaseBooleanfalseIf true, WMS request parameter keys will be uppercase.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[]'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber0The zoom number used in tile URLs will be offset with this value.
    tmsBooleanfalseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBooleanfalseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBooleanfalseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the tiles. +If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. +Refer to CORS Settings for valid String values.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean(depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
    updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber1The explicit zIndex of the tile layer.
    boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
    minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
    noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with [bounds](#gridlayer-bounds) to prevent requesting +tiles outside the CRS limits.
    paneString'tilePane'Map pane where the grid layer will be added.
    classNameString''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadingEventFired when the grid layer starts loading tiles.
    tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstartTileEventFired when a tile is requested and starts loading.
    tileerrorTileErrorEventFired when there is an error loading a tile.
    tileloadTileEventFired when a tile loads.
    loadEventFired when the grid layer loaded all visible tiles.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setParams(<Object> params, <Boolean> noRedraw?)this

    Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true). +If the URL does not change, the layer will not be redrawn unless +the noRedraw parameter is set to false.

    +
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() +to return an <img> HTML element with the appropriate image URL given coords. The done +callback is called when the tile has been loaded.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    +
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    +
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    +
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    +
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    +
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    ImageOverlay

    Used to load and display a single image over specific bounds of the map. Extends Layer.

    + +
    +

    Usage example

    + +
    + + + + + +
    var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
    +	imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
    +L.imageOverlay(imageUrl, imageBounds).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.imageOverlay(<String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options?)Instantiates an image overlay object given the URL of the image and the +geographical bounds it is tied to.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    opacityNumber1.0The opacity of the image overlay.
    altString''Text for the alt attribute of the image (useful for accessibility).
    interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
    errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber1The explicit zIndex of the overlay layer.
    classNameString''A custom class name to assign to the image. Empty by default.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadEventFired when the ImageOverlay layer has loaded its image
    errorEventFired when the ImageOverlay layer fails to load its image
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    +
    bringToFront()this

    Brings the layer to the top of all overlays.

    +
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    +
    setUrl(<String> url)this

    Changes the URL of the image.

    +
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    +
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    +
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    +
    getElement()HTMLElement

    Returns the instance of HTMLImageElement +used by this overlay.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    VideoOverlay

    Used to load and display a video player over specific bounds of the map. Extends ImageOverlay.

    +

    A video overlay uses the <video> +HTML5 element.

    + +
    +

    Usage example

    + +
    + + + + + +
    var videoUrl = 'https://www.mapbox.com/bites/00188/patricia_nasa.webm',
    +	videoBounds = [[ 32, -130], [ 13, -100]];
    +L.videoOverlay(videoUrl, videoBounds ).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.videoOverlay(<String|Array|HTMLVideoElement> video, <LatLngBounds> bounds, <VideoOverlay options> options?)Instantiates an image overlay object given the URL of the video (or array of URLs, or even a video element) and the +geographical bounds it is tied to.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    autoplayBooleantrueWhether the video starts playing automatically when loaded.
    loopBooleantrueWhether the video will loop back to the beginning when played.
    keepAspectRatioBooleantrueWhether the video will save aspect ratio after the projection. +Relevant for supported browsers. Browser compatibility- https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit
    mutedBooleanfalseWhether the video starts on mute when loaded.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    opacityNumber1.0The opacity of the image overlay.
    altString''Text for the alt attribute of the image (useful for accessibility).
    interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
    errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber1The explicit zIndex of the overlay layer.
    classNameString''A custom class name to assign to the image. Empty by default.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadEventFired when the video has finished loading the first frame
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    errorEventFired when the ImageOverlay layer fails to load its image
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getElement()HTMLVideoElement

    Returns the instance of HTMLVideoElement +used by this overlay.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    +
    bringToFront()this

    Brings the layer to the top of all overlays.

    +
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    +
    setUrl(<String> url)this

    Changes the URL of the image.

    +
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    +
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    +
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    SVGOverlay

    Used to load, display and provide DOM access to an SVG file over specific bounds of the map. Extends ImageOverlay.

    +

    An SVG overlay uses the <svg> element.

    + +
    +

    Usage example

    + +
    + + + + + +
    var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
    +svgElement.setAttribute('xmlns', "http://www.w3.org/2000/svg");
    +svgElement.setAttribute('viewBox', "0 0 200 200");
    +svgElement.innerHTML = '<rect width="200" height="200"/><rect x="75" y="23" width="50" height="50" style="fill:red"/><rect x="75" y="123" width="50" height="50" style="fill:#0013ff"/>';
    +var svgElementBounds = [ [ 32, -130 ], [ 13, -100 ] ];
    +L.svgOverlay(svgElement, svgElementBounds).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.svgOverlay(<String|SVGElement> svg, <LatLngBounds> bounds, <SVGOverlay options> options?)Instantiates an image overlay object given an SVG element and the geographical bounds it is tied to. +A viewBox attribute is required on the SVG element to zoom in and out properly.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    opacityNumber1.0The opacity of the image overlay.
    altString''Text for the alt attribute of the image (useful for accessibility).
    interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
    errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber1The explicit zIndex of the overlay layer.
    classNameString''A custom class name to assign to the image. Empty by default.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadEventFired when the ImageOverlay layer has loaded its image
    errorEventFired when the ImageOverlay layer fails to load its image
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getElement()SVGElement

    Returns the instance of SVGElement +used by this overlay.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    +
    bringToFront()this

    Brings the layer to the top of all overlays.

    +
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    +
    setUrl(<String> url)this

    Changes the URL of the image.

    +
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    +
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    +
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Path

    An abstract class that contains options and constants shared between vector +overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Polyline

    A class for drawing polyline overlays on a map. Extends Path.

    + +
    +

    Usage example

    + +
    + + + + + +
    // create a red polyline from an array of LatLng points
    +var latlngs = [
    +	[45.51, -122.68],
    +	[37.77, -122.43],
    +	[34.04, -118.2]
    +];
    +
    +var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
    +
    +// zoom the map to the polyline
    +map.fitBounds(polyline.getBounds());
    +
    +

    You can also pass a multi-dimensional array to represent a MultiPolyline shape:

    +
    // create a red polyline from an array of arrays of LatLng points
    +var latlngs = [
    +	[[45.51, -122.68],
    +	 [37.77, -122.43],
    +	 [34.04, -118.2]],
    +	[[40.78, -73.91],
    +	 [41.83, -87.62],
    +	 [32.76, -96.72]]
    +];
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.polyline(<LatLng[]> latlngs, <Polyline options> options?)Instantiates a polyline object given an array of geographical points and +optionally an options object. You can create a Polyline object with +multiple separate lines (MultiPolyline) by passing an array of arrays +of geographic points.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
    noClipBooleanfalseDisable polyline clipping.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

    +
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    +
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    +
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    +
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    +
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    addLatLng(<LatLng> latlng, <LatLng[]> latlngs?)this

    Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Polygon

    A class for drawing polygon overlays on a map. Extends Polyline.

    +

    Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

    + +
    +

    Usage example

    + +
    + + + + + +
    // create a red polygon from an array of LatLng points
    +var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
    +
    +var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
    +
    +// zoom the map to the polygon
    +map.fitBounds(polygon.getBounds());
    +
    +

    You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

    +
    var latlngs = [
    +  [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    +  [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    +];
    +
    +

    Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

    +
    var latlngs = [
    +  [ // first polygon
    +    [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    +    [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    +  ],
    +  [ // second polygon
    +    [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
    +  ]
    +];
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.polygon(<LatLng[]> latlngs, <Polyline options> options?)
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
    noClipBooleanfalseDisable polyline clipping.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    +
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    +
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    +
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    +
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    addLatLng(<LatLng> latlng, <LatLng[]> latlngs?)this

    Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Rectangle

    A class for drawing rectangle overlays on a map. Extends Polygon.

    + +
    +

    Usage example

    + +
    + + + + + +
    // define rectangle geographical bounds
    +var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
    +
    +// create an orange rectangle
    +L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
    +
    +// zoom the map to the rectangle bounds
    +map.fitBounds(bounds);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.rectangle(<LatLngBounds> latLngBounds, <Polyline options> options?)
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
    noClipBooleanfalseDisable polyline clipping.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setBounds(<LatLngBounds> latLngBounds)this

    Redraws the rectangle with the passed bounds.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    +
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    +
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    +
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    +
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    addLatLng(<LatLng> latlng, <LatLng[]> latlngs?)this

    Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Circle

    A class for drawing circle overlays on a map. Extends CircleMarker.

    +

    It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).

    + +
    +

    Usage example

    + +
    + + + + + +
    L.circle([50.5, 30.5], {radius: 200}).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.circle(<LatLng> latlng, <Circle options> options?)Instantiates a circle object given a geographical point, and an options object +which contains the circle radius.
    L.circle(<LatLng> latlng, <Number> radius, <Circle options> options?)Obsolete way of instantiating a circle, for compatibility with 0.7.x code. +Do not use in new applications or plugins.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    radiusNumberRadius of the circle, in meters.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    moveEventFired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setRadius(<Number> radius)this

    Sets the radius of a circle. Units are in meters.

    +
    getRadius()Number

    Returns the current radius of a circle. Units are in meters.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON Point Feature).

    +
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    +
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    CircleMarker

    A circle of a fixed size with radius specified in pixels. Extends Path.

    + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.circleMarker(<LatLng> latlng, <CircleMarker options> options?)Instantiates a circle marker object given a geographical point, and an optional options object.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    radiusNumber10Radius of the circle marker, in pixels
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    moveEventFired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON Point Feature).

    +
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    +
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    +
    setRadius(<Number> radius)this

    Sets the radius of a circle marker. Units are in pixels.

    +
    getRadius()Number

    Returns the current radius of the circle

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    SVG

    VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility +with old versions of Internet Explorer.

    +

    Allows vector layers to be displayed with SVG. +Inherits Renderer.

    +

    Due to technical limitations, SVG is not +available in all web browsers, notably Android 2.x and 3.x.

    +

    Although SVG is not available on IE7 and IE8, these browsers support +VML +(a now deprecated technology), and the SVG renderer will fall back to VML in +this case.

    + +
    +

    Usage example

    + +
    + + + + + +

    Use SVG by default for all paths in the map:

    +
    var map = L.map('map', {
    +	renderer: L.svg()
    +});
    +
    +

    Use a SVG renderer with extra padding for specific vector geometries:

    +
    var map = L.map('map');
    +var myRenderer = L.svg({ padding: 0.5 });
    +var line = L.polyline( coordinates, { renderer: myRenderer } );
    +var circle = L.circle( center, { renderer: myRenderer } );
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.svg(<Renderer options> options?)Creates a SVG renderer with the given options.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingNumber0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber0How much to extend click tolerance round a path/object on the map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    updateEventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Functions

    + +
    + + + +
    There are several static functions which can be called without instantiating L.SVG:
    + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    create(<String> name)SVGElementReturns a instance of SVGElement, +corresponding to the class name passed. For example, using 'line' will return +an instance of SVGLineElement.
    pointsToPath(<Point[]> rings, <Boolean> closed)StringGenerates a SVG path string for multiple rings, with each ring turning +into "M..L..L.." instructions
    + +
    + + +

    Canvas

    Allows vector layers to be displayed with <canvas>. +Inherits Renderer.

    +

    Due to technical limitations, Canvas is not +available in all web browsers, notably IE8, and overlapping geometries might +not display properly in some edge cases.

    + +
    +

    Usage example

    + +
    + + + + + +

    Use Canvas by default for all paths in the map:

    +
    var map = L.map('map', {
    +	renderer: L.canvas()
    +});
    +
    +

    Use a Canvas renderer with extra padding for specific vector geometries:

    +
    var map = L.map('map');
    +var myRenderer = L.canvas({ padding: 0.5 });
    +var line = L.polyline( coordinates, { renderer: myRenderer } );
    +var circle = L.circle( center, { renderer: myRenderer } );
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.canvas(<Renderer options> options?)Creates a Canvas renderer with the given options.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingNumber0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber0How much to extend click tolerance round a path/object on the map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    updateEventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    LayerGroup

    Used to group several layers and handle them as one. If you add it to the map, +any layers added or removed from the group will be added/removed on the map as +well. Extends Layer.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.layerGroup([marker1, marker2])
    +	.addLayer(polyline)
    +	.addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.layerGroup(<Layer[]> layers?, <Object> options?)Create a layer group, optionally given an initial set of layers and an options object.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    +
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    +
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    +
    clearLayers()this

    Removes all the layers from the group.

    +
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    +
    group.eachLayer(function (layer) {
    +	layer.bindPopup('Hello');
    +});
    +
    +
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    +
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    +
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    +
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    FeatureGroup

    Extended LayerGroup that makes it easier to do the same thing to all its member layers:

    +
      +
    • bindPopup binds a popup to all of the layers at once (likewise with bindTooltip)
    • +
    • Events are propagated to the FeatureGroup, so if the group has an event +handler, it will handle events from any of the layers. This includes mouse events +and custom events.
    • +
    • Has layeradd and layerremove events
    • +
    + +
    +

    Usage example

    + +
    + + + + + +
    L.featureGroup([marker1, marker2, polyline])
    +	.bindPopup('Hello world!')
    +	.on('click', function() { alert('Clicked on a member of the group!'); })
    +	.addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.featureGroup(<Layer[]> layers?, <Object> options?)Create a feature group, optionally given an initial set of layers and an options object.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    layeraddLayerEventFired when a layer is added to this FeatureGroup
    layerremoveLayerEventFired when a layer is removed from this FeatureGroup
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setStyle(<Path options> style)this

    Sets the given path options to each layer of the group that has a setStyle method.

    +
    bringToFront()this

    Brings the layer group to the top of all other layers

    +
    bringToBack()this

    Brings the layer group to the back of all other layers

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    +
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    +
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    +
    clearLayers()this

    Removes all the layers from the group.

    +
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    +
    group.eachLayer(function (layer) {
    +	layer.bindPopup('Hello');
    +});
    +
    +
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    +
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    +
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    +
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    GeoJSON

    Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse +GeoJSON data and display it on the map. Extends FeatureGroup.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.geoJSON(data, {
    +	style: function (feature) {
    +		return {color: feature.properties.color};
    +	}
    +}).bindPopup(function (layer) {
    +	return layer.feature.properties.description;
    +}).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.geoJSON(<Object> geojson?, <GeoJSON options> options?)Creates a GeoJSON layer. Optionally accepts an object in +GeoJSON format to display on the map +(you can alternatively add it later with addData method) and an options object.
    + +
    + + +
    +

    Options

    + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    pointToLayerFunction*A Function defining how GeoJSON points spawn Leaflet layers. It is internally +called when data is added, passing the GeoJSON point feature and its LatLng. +The default is to spawn a default Marker: +
    function(geoJsonPoint, latlng) {
    +	return L.marker(latlng);
    +}
    +
    styleFunction*A Function defining the Path options for styling GeoJSON lines and polygons, +called internally when data is added. +The default value is to not override any defaults: +
    function (geoJsonFeature) {
    +	return {}
    +}
    +
    onEachFeatureFunction*A Function that will be called once for each created Feature, after it has +been created and styled. Useful for attaching events and popups to features. +The default is to do nothing with the newly created layers: +
    function (feature, layer) {}
    +
    filterFunction*A Function that will be used to decide whether to include a feature or not. +The default is to include all features: +
    function (geoJsonFeature) {
    +	return true;
    +}
    +
    +

    Note: dynamically changing the filter option will have effect only on newly +added data. It will not re-evaluate already included features.

    coordsToLatLngFunction*A Function that will be used for converting GeoJSON coordinates to LatLngs. +The default is the coordsToLatLng static method.
    markersInheritOptionsBooleanfalseWhether default Markers for "Point" type Features inherit from group options.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    layeraddLayerEventFired when a layer is added to this FeatureGroup
    layerremoveLayerEventFired when a layer is removed from this FeatureGroup
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addData(data)this

    Adds a GeoJSON object to the layer.

    +
    resetStyle(layer?)this

    Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. +If layer is omitted, the style of all features in the current layer is reset.

    +
    setStyle(style)this

    Changes styles of GeoJSON vector layers with the given style function.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the layer group to the top of all other layers

    +
    bringToBack()this

    Brings the layer group to the back of all other layers

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    +
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    +
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    +
    clearLayers()this

    Removes all the layers from the group.

    +
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    +
    group.eachLayer(function (layer) {
    +	layer.bindPopup('Hello');
    +});
    +
    +
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    +
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    +
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    +
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Functions

    + +
    + + + +
    There are several static functions which can be called without instantiating L.GeoJSON:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    geometryToLayer(<Object> featureData, <GeoJSON options> options?)LayerCreates a Layer from a given GeoJSON feature. Can use a custom +pointToLayer and/or coordsToLatLng +functions if provided as options.
    coordsToLatLng(<Array> coords)LatLngCreates a LatLng object from an array of 2 numbers (longitude, latitude) +or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
    coordsToLatLngs(<Array> coords, <Number> levelsDeep?, <Function> coordsToLatLng?)ArrayCreates a multidimensional array of LatLngs from a GeoJSON coordinates array. +levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). +Can use a custom coordsToLatLng function.
    latLngToCoords(<LatLng> latlng, <Number> precision?)ArrayReverse of coordsToLatLng
    latLngsToCoords(<Array> latlngs, <Number> levelsDeep?, <Boolean> closed?)ArrayReverse of coordsToLatLngs +closed determines whether the first point should be appended to the end of the array to close the feature, only used when levelsDeep is 0. False by default.
    asFeature(<Object> geojson)ObjectNormalize GeoJSON geometries/features into GeoJSON features.
    + +
    + + +

    GridLayer

    Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas. +GridLayer can be extended to create a tiled grid of HTML elements like <canvas>, <img> or <div>. GridLayer will handle creating and animating these DOM elements for you.

    + +
    +

    Usage example

    + +
    + +

    Synchronous usage

    + + + +

    To create a custom layer, extend GridLayer and implement the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

    +
    var CanvasLayer = L.GridLayer.extend({
    +    createTile: function(coords){
    +        // create a <canvas> element for drawing
    +        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    +
    +        // setup tile width and height according to the options
    +        var size = this.getTileSize();
    +        tile.width = size.x;
    +        tile.height = size.y;
    +
    +        // get a canvas context and draw something on it using coords.x, coords.y and coords.z
    +        var ctx = tile.getContext('2d');
    +
    +        // return the tile so it can be rendered on screen
    +        return tile;
    +    }
    +});
    +
    + + + +
    + +

    Asynchronous usage

    + + + +

    Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the done() callback.

    +
    var CanvasLayer = L.GridLayer.extend({
    +    createTile: function(coords, done){
    +        var error;
    +
    +        // create a <canvas> element for drawing
    +        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    +
    +        // setup tile width and height according to the options
    +        var size = this.getTileSize();
    +        tile.width = size.x;
    +        tile.height = size.y;
    +
    +        // draw something asynchronously and pass the tile to the done() callback
    +        setTimeout(function() {
    +            done(error, tile);
    +        }, 1000);
    +
    +        return tile;
    +    }
    +});
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean(depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
    updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber1The explicit zIndex of the tile layer.
    boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumberundefinedThe maximum zoom level up to which this layer will be displayed (inclusive).
    maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
    minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
    noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with [bounds](#gridlayer-bounds) to prevent requesting +tiles outside the CRS limits.
    paneString'tilePane'Map pane where the grid layer will be added.
    classNameString''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadingEventFired when the grid layer starts loading tiles.
    tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstartTileEventFired when a tile is requested and starts loading.
    tileerrorTileErrorEventFired when there is an error loading a tile.
    tileloadTileEventFired when a tile loads.
    loadEventFired when the grid layer loaded all visible tiles.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    +
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    +
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    +
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    +
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    +
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    +
    + +
    + +

    Extension methods

    + +
    Layers extending GridLayer shall reimplement the following method.
    + + + + + + + + + + + + + +
    MethodReturnsDescription
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, must be overridden by classes extending GridLayer. +Returns the HTMLElement corresponding to the given coords. If the done callback +is specified, it must be called when the tile has finished loading and drawing.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    LatLng

    Represents a geographical point with a certain latitude and longitude.

    + +
    +

    Usage example

    + +
    + + + + + +
    var latlng = L.latLng(50.5, 30.5);
    +
    +

    All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

    +
    map.panTo([50, 30]);
    +map.panTo({lon: 30, lat: 50});
    +map.panTo({lat: 50, lng: 30});
    +map.panTo(L.latLng(50, 30));
    +
    +

    Note that LatLng does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.latLng(<Number> latitude, <Number> longitude, <Number> altitude?)Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
    L.latLng(<Array> coords)Expects an array of the form [Number, Number] or [Number, Number, Number] instead.
    L.latLng(<Object> coords)Expects an plain object of the form {lat: Number, lng: Number} or {lat: Number, lng: Number, alt: Number} instead.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    equals(<LatLng> otherLatLng, <Number> maxMargin?)Boolean

    Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

    +
    toString()String

    Returns a string representation of the point (for debugging purposes).

    +
    distanceTo(<LatLng> otherLatLng)Number

    Returns the distance (in meters) to the given LatLng calculated using the Spherical Law of Cosines.

    +
    wrap()LatLng

    Returns a new LatLng object with the longitude wrapped so it's always between -180 and +180 degrees.

    +
    toBounds(<Number> sizeInMeters)LatLngBounds

    Returns a new LatLngBounds object in which each boundary is sizeInMeters/2 meters apart from the LatLng.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    latNumberLatitude in degrees
    lngNumberLongitude in degrees
    altNumberAltitude in meters (optional)
    + +
    + + +

    LatLngBounds

    Represents a rectangular geographical area on a map.

    + +
    +

    Usage example

    + +
    + + + + + +
    var corner1 = L.latLng(40.712, -74.227),
    +corner2 = L.latLng(40.774, -74.125),
    +bounds = L.latLngBounds(corner1, corner2);
    +
    +

    All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    +
    map.fitBounds([
    +	[40.712, -74.227],
    +	[40.774, -74.125]
    +]);
    +
    +

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range.

    +

    Note that LatLngBounds does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.latLngBounds(<LatLng> corner1, <LatLng> corner2)Creates a LatLngBounds object by defining two diagonally opposite corners of the rectangle.
    L.latLngBounds(<LatLng[]> latlngs)Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    extend(<LatLng> latlng)this

    Extend the bounds to contain the given point

    +
    extend(<LatLngBounds> otherBounds)this

    Extend the bounds to contain the given bounds

    +
    pad(<Number> bufferRatio)LatLngBounds

    Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. +For example, a ratio of 0.5 extends the bounds by 50% in each direction. +Negative values will retract the bounds.

    +
    getCenter()LatLng

    Returns the center point of the bounds.

    +
    getSouthWest()LatLng

    Returns the south-west point of the bounds.

    +
    getNorthEast()LatLng

    Returns the north-east point of the bounds.

    +
    getNorthWest()LatLng

    Returns the north-west point of the bounds.

    +
    getSouthEast()LatLng

    Returns the south-east point of the bounds.

    +
    getWest()Number

    Returns the west longitude of the bounds

    +
    getSouth()Number

    Returns the south latitude of the bounds

    +
    getEast()Number

    Returns the east longitude of the bounds

    +
    getNorth()Number

    Returns the north latitude of the bounds

    +
    contains(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    +
    contains(<LatLng> latlng)Boolean

    Returns true if the rectangle contains the given point.

    +
    intersects(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.

    +
    overlaps(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.

    +
    toBBoxString()String

    Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.

    +
    equals(<LatLngBounds> otherBounds, <Number> maxMargin?)Boolean

    Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting maxMargin to a small number.

    +
    isValid()Boolean

    Returns true if the bounds are properly initialized.

    +
    + +
    + + +

    Point

    Represents a point with x and y coordinates in pixels.

    + +
    +

    Usage example

    + +
    + + + + + +
    var point = L.point(200, 300);
    +
    +

    All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

    +
    map.panBy([200, 300]);
    +map.panBy(L.point(200, 300));
    +
    +

    Note that Point does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.point(<Number> x, <Number> y, <Boolean> round?)Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
    L.point(<Number[]> coords)Expects an array of the form [x, y] instead.
    L.point(<Object> coords)Expects a plain object of the form {x: Number, y: Number} instead.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    clone()Point

    Returns a copy of the current point.

    +
    add(<Point> otherPoint)Point

    Returns the result of addition of the current and the given points.

    +
    subtract(<Point> otherPoint)Point

    Returns the result of subtraction of the given point from the current.

    +
    divideBy(<Number> num)Point

    Returns the result of division of the current point by the given number.

    +
    multiplyBy(<Number> num)Point

    Returns the result of multiplication of the current point by the given number.

    +
    scaleBy(<Point> scale)Point

    Multiply each coordinate of the current point by each coordinate of +scale. In linear algebra terms, multiply the point by the +scaling matrix +defined by scale.

    +
    unscaleBy(<Point> scale)Point

    Inverse of scaleBy. Divide each coordinate of the current point by +each coordinate of scale.

    +
    round()Point

    Returns a copy of the current point with rounded coordinates.

    +
    floor()Point

    Returns a copy of the current point with floored coordinates (rounded down).

    +
    ceil()Point

    Returns a copy of the current point with ceiled coordinates (rounded up).

    +
    trunc()Point

    Returns a copy of the current point with truncated coordinates (rounded towards zero).

    +
    distanceTo(<Point> otherPoint)Number

    Returns the cartesian distance between the current and the given points.

    +
    equals(<Point> otherPoint)Boolean

    Returns true if the given point has the same coordinates.

    +
    contains(<Point> otherPoint)Boolean

    Returns true if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).

    +
    toString()String

    Returns a string representation of the point for debugging purposes.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    xNumberThe x coordinate of the point
    yNumberThe y coordinate of the point
    + +
    + + +

    Bounds

    Represents a rectangular area in pixel coordinates.

    + +
    +

    Usage example

    + +
    + + + + + +
    var p1 = L.point(10, 10),
    +p2 = L.point(40, 60),
    +bounds = L.bounds(p1, p2);
    +
    +

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    +
    otherBounds.intersects([[10, 10], [40, 60]]);
    +
    +

    Note that Bounds does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.bounds(<Point> corner1, <Point> corner2)Creates a Bounds object from two corners coordinate pairs.
    L.bounds(<Point[]> points)Creates a Bounds object from the given array of points.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    extend(<Point> point)this

    Extends the bounds to contain the given point.

    +
    getCenter(<Boolean> round?)Point

    Returns the center point of the bounds.

    +
    getBottomLeft()Point

    Returns the bottom-left point of the bounds.

    +
    getTopRight()Point

    Returns the top-right point of the bounds.

    +
    getTopLeft()Point

    Returns the top-left point of the bounds (i.e. this.min).

    +
    getBottomRight()Point

    Returns the bottom-right point of the bounds (i.e. this.max).

    +
    getSize()Point

    Returns the size of the given bounds

    +
    contains(<Bounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    +
    contains(<Point> point)Boolean

    Returns true if the rectangle contains the given point.

    +
    intersects(<Bounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds +intersect if they have at least one point in common.

    +
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds +overlap if their intersection is an area.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    minPointThe top left corner of the rectangle.
    maxPointThe bottom right corner of the rectangle.
    + +
    + + +

    Icon

    Represents an icon to provide when creating a marker.

    + +
    +

    Usage example

    + +
    + + + + + +
    var myIcon = L.icon({
    +    iconUrl: 'my-icon.png',
    +    iconSize: [38, 95],
    +    iconAnchor: [22, 94],
    +    popupAnchor: [-3, -76],
    +    shadowUrl: 'my-icon-shadow.png',
    +    shadowSize: [68, 95],
    +    shadowAnchor: [22, 94]
    +});
    +
    +L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    +
    +

    L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.icon(<Icon options> options)Creates an icon instance with the given options.
    + +
    + + +
    +

    Options

    + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    iconUrlStringnull(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlStringnullThe URL to a retina sized version of the icon image (absolute or relative to your +script path). Used for Retina screen devices.
    iconSizePointnullSize of the icon image in pixels.
    iconAnchorPointnullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon +will be aligned so that this point is at the marker's geographical location. Centered +by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint[0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint[0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlStringnullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlStringnull
    shadowSizePointnullSize of the shadow image in pixels.
    shadowAnchorPointnullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same +as iconAnchor if not specified).
    classNameString''A custom class name to assign to both icon and shadow images. Empty by default.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element +styled according to the options.

    +
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    +
    + +
    + + +
    + +
    +

    Icon.Default

    + +
    + + + +
    A trivial subclass of Icon, represents the icon to use in Markers when +no icon is specified. Points to the blue marker image distributed with Leaflet +releases. +

    In order to customize the default icon, just change the properties of L.Icon.Default.prototype.options +(which is a set of Icon options).

    +

    If you want to completely replace the default icon, override the +L.Marker.prototype.options.icon with your own icon instead.

    + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    imagePathStringIcon.Default will try to auto-detect the location of the +blue icon images. If you are placing these images in a non-standard +way, set this option to point to the right path.
    + +
    + + +

    DivIcon

    Represents a lightweight icon for markers that uses a simple <div> +element instead of an image. Inherits from Icon but ignores the iconUrl and shadow options.

    + +
    +

    Usage example

    + +
    + + + + + +
    var myIcon = L.divIcon({className: 'my-div-icon'});
    +// you can set .my-div-icon styles in CSS
    +
    +L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    +
    +

    By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.divIcon(<DivIcon options> options)Creates a DivIcon instance with the given options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    htmlString|HTMLElement''Custom HTML code to put inside the div element, empty by default. Alternatively, +an instance of HTMLElement.
    bgPosPoint[0, 0]Optional relative position of the background, in pixels
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    iconUrlStringnull(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlStringnullThe URL to a retina sized version of the icon image (absolute or relative to your +script path). Used for Retina screen devices.
    iconSizePointnullSize of the icon image in pixels.
    iconAnchorPointnullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon +will be aligned so that this point is at the marker's geographical location. Centered +by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint[0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint[0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlStringnullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlStringnull
    shadowSizePointnullSize of the shadow image in pixels.
    shadowAnchorPointnullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same +as iconAnchor if not specified).
    classNameString''A custom class name to assign to both icon and shadow images. Empty by default.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element +styled according to the options.

    +
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    +
    + +
    +
    +
    + +

    Control.Zoom

    A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

    + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.zoom(<Control.Zoom options> options)Creates a zoom control
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    zoomInTextString'+'The text set on the 'zoom in' button.
    zoomInTitleString'Zoom in'The title set on the 'zoom in' button.
    zoomOutTextString'&#x2212' +The text set on the 'zoom out' button.
    zoomOutTitleString'Zoom out'The title set on the 'zoom out' button.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Control.Attribution

    The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with the getAttribution method automatically. Extends Control.

    + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.attribution(<Control.Attribution options> options)Creates an attribution control.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    prefixString'Leaflet'The HTML text shown before the attributions. Pass false to disable.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setPrefix(<String> prefix)this

    Sets the text before the attributions.

    +
    addAttribution(<String> text)this

    Adds an attribution text (e.g. 'Vector data &copy; Mapbox').

    +
    removeAttribution(<String> text)this

    Removes an attribution text.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Control.Layers

    The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

    + +
    +

    Usage example

    + +
    + + + + + +
    var baseLayers = {
    +	"Mapbox": mapbox,
    +	"OpenStreetMap": osm
    +};
    +
    +var overlays = {
    +	"Marker": marker,
    +	"Roads": roadsLayer
    +};
    +
    +L.control.layers(baseLayers, overlays).addTo(map);
    +
    +

    The baseLayers and overlays parameters are object literals with layer names as keys and Layer objects as values:

    +
    {
    +    "<someName1>": layer1,
    +    "<someName2>": layer2
    +}
    +
    +

    The layer names can contain HTML, which allows you to add additional styling to the items:

    +
    {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.layers(<Object> baselayers?, <Object> overlays?, <Control.Layers options> options?)Creates a layers control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    collapsedBooleantrueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
    autoZIndexBooleantrueIf true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
    hideSingleBaseBooleanfalseIf true, the base layers in the control will be hidden when there is only one.
    sortLayersBooleanfalseWhether to sort the layers. When false, layers will keep the order +in which they were added to the control.
    sortFunctionFunction*A compare function +that will be used for sorting the layers, when sortLayers is true. +The function receives both the L.Layer instances and their names, as in +sortFunction(layerA, layerB, nameA, nameB). +By default, it sorts layers alphabetically by their name.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addBaseLayer(<Layer> layer, <String> name)this

    Adds a base layer (radio button entry) with the given name to the control.

    +
    addOverlay(<Layer> layer, <String> name)this

    Adds an overlay (checkbox entry) with the given name to the control.

    +
    removeLayer(<Layer> layer)this

    Remove the given layer from the control.

    +
    expand()this

    Expand the control container if collapsed.

    +
    collapse()this

    Collapse the control container if expanded.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Control.Scale

    A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends Control.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.control.scale().addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.scale(<Control.Scale options> options?)Creates an scale control with the given options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    maxWidthNumber100Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
    metricBooleanTrueWhether to show the metric scale line (m/km).
    imperialBooleanTrueWhether to show the imperial scale line (mi/ft).
    updateWhenIdleBooleanfalseIf true, the control is updated on moveend, otherwise it's always up-to-date (updated on move).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Browser

    A namespace with static properties for browser/feature detection used by Leaflet internally.

    + +
    +

    Usage example

    + +
    + + + + + +
    if (L.Browser.ielt9) {
    +  alert('Upgrade your browser, dude!');
    +}
    +
    + + + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    ieBooleantrue for all Internet Explorer versions (not Edge).
    ielt9Booleantrue for Internet Explorer versions less than 9.
    edgeBooleantrue for the Edge web browser.
    webkitBooleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
    androidBooleantrue for any browser running on an Android platform.
    android23Booleantrue for browsers running on Android 2 or Android 3.
    androidStockBooleantrue for the Android stock browser (i.e. not Chrome)
    operaBooleantrue for the Opera browser
    chromeBooleantrue for the Chrome browser.
    geckoBooleantrue for gecko-based browsers like Firefox.
    safariBooleantrue for the Safari browser.
    opera12Booleantrue for the Opera browser supporting CSS transforms (version 12 or later).
    winBooleantrue when the browser is running in a Windows platform
    ie3dBooleantrue for all Internet Explorer versions supporting CSS transforms.
    webkit3dBooleantrue for webkit-based browsers supporting CSS transforms.
    gecko3dBooleantrue for gecko-based browsers supporting CSS transforms.
    any3dBooleantrue for all browsers supporting CSS transforms.
    mobileBooleantrue for all browsers running in a mobile device.
    mobileWebkitBooleantrue for all webkit-based browsers in a mobile device.
    mobileWebkit3dBooleantrue for all webkit-based browsers in a mobile device supporting CSS transforms.
    msPointerBooleantrue for browsers implementing the Microsoft touch events model (notably IE10).
    pointerBooleantrue for all browsers supporting pointer events.
    touchBooleantrue for all browsers supporting touch events. +This does not necessarily mean that the browser is running in a computer with +a touchscreen, it only means that the browser is capable of understanding +touch events.
    mobileOperaBooleantrue for the Opera browser in a mobile device.
    mobileGeckoBooleantrue for gecko-based browsers running in a mobile device.
    retinaBooleantrue for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%.
    passiveEventsBooleantrue for browsers that support passive events.
    canvasBooleantrue when the browser supports <canvas>.
    svgBooleantrue when the browser supports SVG.
    vmlBooleantrue if the browser supports VML.
    + +
    + + +

    Util

    Various utility functions, used by Leaflet internally.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    extend(<Object> dest, <Object> src?)ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
    create(<Object> proto, <Object> properties?)ObjectCompatibility polyfill for Object.create
    bind(<Function> fn, )FunctionReturns a new function bound to the arguments passed, like Function.prototype.bind. +Has a L.bind() shortcut.
    stamp(<Object> obj)NumberReturns the unique ID of an object, assigning it one if it doesn't have it.
    throttle(<Function> fn, <Number> time, <Object> context)FunctionReturns a function which executes function fn with the given scope context +(so that the this keyword refers to context inside fn's code). The function +fn will be called no more than one time per given amount of time. The arguments +received by the bound function will be any arguments passed when binding the +function, followed by any arguments passed when invoking the bound function. +Has an L.throttle shortcut.
    wrapNum(<Number> num, <Number[]> range, <Boolean> includeMax?)NumberReturns the number num modulo range in such a way so it lies within +range[0] and range[1]. The returned value will be always smaller than +range[1] unless includeMax is set to true.
    falseFn()FunctionReturns a function which always returns false.
    formatNum(<Number> num, <Number> digits?)NumberReturns the number num rounded to digits decimals, or to 6 decimals by default.
    trim(<String> str)StringCompatibility polyfill for String.prototype.trim
    splitWords(<String> str)String[]Trims and splits the string on whitespace and returns the array of parts.
    setOptions(<Object> obj, <Object> options)ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.
    getParamString(<Object> obj, <String> existingUrl?, <Boolean> uppercase?)StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} +translates to '?a=foo&b=bar'. If existingUrl is set, the parameters will +be appended at the end. If uppercase is true, the parameter names will +be uppercased (e.g. '?A=foo&B=bar')
    template(<String> str, <Object> data)StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' +and a data object like {a: 'foo', b: 'bar'}, returns evaluated string +('Hello foo, bar'). You can also specify functions instead of strings for +data values — they will be evaluated passing data as an argument.
    isArray(obj)BooleanCompatibility polyfill for Array.isArray
    indexOf(<Array> array, <Object> el)NumberCompatibility polyfill for Array.prototype.indexOf
    requestAnimFrame(<Function> fn, <Object> context?, <Boolean> immediate?)NumberSchedules fn to be executed when the browser repaints. fn is bound to +context if given. When immediate is set, fn is called immediately if +the browser doesn't have native support for +window.requestAnimationFrame, +otherwise it's delayed. Returns a request ID that can be used to cancel the request.
    cancelAnimFrame(<Number> id)undefinedCancels a previous requestAnimFrame. See also window.cancelAnimationFrame.
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    lastIdNumberLast unique ID used by stamp()
    emptyImageUrlStringData URI string containing a base64-encoded empty GIF image. +Used as a hack to free memory from unused images on WebKit-powered +mobile devices (by setting image src to this string).
    + +
    + + +

    Transformation

    Represents an affine transformation: a set of coefficients a, b, c, d +for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing +the reverse. Used by Leaflet in its projections code.

    + +
    +

    Usage example

    + +
    + + + + + +
    var transformation = L.transformation(2, 5, -1, 10),
    +	p = L.point(1, 2),
    +	p2 = transformation.transform(p), //  L.point(7, 8)
    +	p3 = transformation.untransform(p2); //  L.point(1, 2)
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.transformation(<Number> a, <Number> b, <Number> c, <Number> d)Instantiates a Transformation object with the given coefficients.
    L.transformation(<Array> coefficients)Expects an coefficients array of the form +[a: Number, b: Number, c: Number, d: Number].
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    transform(<Point> point, <Number> scale?)Point

    Returns a transformed point, optionally multiplied by the given scale. +Only accepts actual L.Point instances, not arrays.

    +
    untransform(<Point> point, <Number> scale?)Point

    Returns the reverse transformation of the given point, optionally divided +by the given scale. Only accepts actual L.Point instances, not arrays.

    +
    + +
    + + +

    LineUtil

    Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    simplify(<Point[]> points, <Number> tolerance)Point[]Dramatically reduces the number of points in a polyline while retaining +its shape and returns a new array of simplified points, using the +Douglas-Peucker algorithm. +Used for a huge performance boost when processing/displaying Leaflet polylines for +each zoom level and also reducing visual noise. tolerance affects the amount of +simplification (lesser value means higher quality but slower and with more points). +Also released as a separated micro-library Simplify.js.
    pointToSegmentDistance(<Point> p, <Point> p1, <Point> p2)NumberReturns the distance between point p and segment p1 to p2.
    closestPointOnSegment(<Point> p, <Point> p1, <Point> p2)NumberReturns the closest point from a point p on a segment p1 to p2.
    clipSegment(<Point> a, <Point> b, <Bounds> bounds, <Boolean> useLastCode?, <Boolean> round?)Point[]|BooleanClips the segment a to b by rectangular bounds with the +Cohen-Sutherland algorithm +(modifying the segment points directly!). Used by Leaflet to only show polyline +points that are on the screen or near, increasing performance.
    isFlat(<LatLng[]> latlngs)BooleanReturns true if latlngs is a flat array, false is nested.
    + +
    + + +

    PolyUtil

    Various utility functions for polygon geometries.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    clipPolygon(<Point[]> points, <Bounds> bounds, <Boolean> round?)Point[]Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgman algorithm). +Used by Leaflet to only show polygon points that are on the screen or near, increasing +performance. Note that polygon points needs different algorithm for clipping +than polyline, so there's a separate method for it.
    + +
    + + +

    DomEvent

    Utility functions to work with the DOM events, used by Leaflet internally.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    on(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisAdds a listener function (fn) to a particular DOM event type of the +element el. You can optionally specify the context of the listener +(object the this keyword will point to). You can also pass several +space-separated types (e.g. 'click dblclick').
    on(<HTMLElement> el, <Object> eventMap, <Object> context?)thisAdds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    off(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisRemoves a previously added listener function. +Note that if you passed a custom context to on, you must pass the same +context to off in order to remove the listener.
    off(<HTMLElement> el, <Object> eventMap, <Object> context?)thisRemoves a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    stopPropagation(<DOMEvent> ev)thisStop the given event from propagation to parent elements. Used inside the listener functions: +
    L.DomEvent.on(div, 'click', function (ev) {
    +	L.DomEvent.stopPropagation(ev);
    +});
    +
    disableScrollPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'wheel' events (plus browser variants).
    disableClickPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'click', 'doubleclick', +'mousedown' and 'touchstart' events (plus browser variants).
    preventDefault(<DOMEvent> ev)thisPrevents the default action of the DOM Event ev from happening (such as +following a link in the href of the a element, or doing a POST request +with page reload when a <form> is submitted). +Use it inside listener functions.
    stop(<DOMEvent> ev)thisDoes stopPropagation and preventDefault at the same time.
    getMousePosition(<DOMEvent> ev, <HTMLElement> container?)PointGets normalized mouse position from a DOM event relative to the +container (border excluded) or to the whole page if not specified.
    getWheelDelta(<DOMEvent> ev)NumberGets normalized wheel delta from a wheel DOM event, in vertical +pixels scrolled (negative if scrolling down). +Events from pointing devices without precise scrolling are mapped to +a best guess of 60 pixels.
    addListener()thisAlias to L.DomEvent.on
    removeListener()thisAlias to L.DomEvent.off
    + +
    + + +

    DomUtil

    Utility functions to work with the DOM +tree, used by Leaflet internally.

    +

    Most functions expecting or returning a HTMLElement also work for +SVG elements. The only difference is that classes refer to CSS classes +in HTML and SVG classes in SVG.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    get(<String|HTMLElement> id)HTMLElementReturns an element given its DOM id, or returns the element itself +if it was passed directly.
    getStyle(<HTMLElement> el, <String> styleAttrib)StringReturns the value for a certain style attribute on an element, +including computed values or values set through CSS.
    create(<String> tagName, <String> className?, <HTMLElement> container?)HTMLElementCreates an HTML element with tagName, sets its class to className, and optionally appends it to container element.
    remove(<HTMLElement> el)Removes el from its parent element
    empty(<HTMLElement> el)Removes all of el's children elements from el
    toFront(<HTMLElement> el)Makes el the last child of its parent, so it renders in front of the other children.
    toBack(<HTMLElement> el)Makes el the first child of its parent, so it renders behind the other children.
    hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element's class attribute contains name.
    addClass(<HTMLElement> el, <String> name)Adds name to the element's class attribute.
    removeClass(<HTMLElement> el, <String> name)Removes name from the element's class attribute.
    setClass(<HTMLElement> el, <String> name)Sets the element's class.
    getClass(<HTMLElement> el)StringReturns the element's class.
    setOpacity(<HTMLElement> el, <Number> opacity)Set the opacity of an element (including old IE support). +opacity must be a number from 0 to 1.
    testProp(<String[]> props)String|falseGoes through the array of style names and returns the first name +that is a valid style name for an element. If no such name is found, +it returns false. Useful for vendor-prefixed styles like transform.
    setTransform(<HTMLElement> el, <Point> offset, <Number> scale?)Resets the 3D CSS transform of el so it is translated by offset pixels +and optionally scaled by scale. Does not have an effect if the +browser doesn't support 3D CSS transforms.
    setPosition(<HTMLElement> el, <Point> position)Sets the position of el to coordinates specified by position, +using CSS translate or top/left positioning depending on the browser +(used by Leaflet internally to position its layers).
    getPosition(<HTMLElement> el)PointReturns the coordinates of an element previously positioned with setPosition.
    disableTextSelection()Prevents the user from generating selectstart DOM events, usually generated +when the user drags the mouse through a page with text. Used internally +by Leaflet to override the behaviour of any click-and-drag interaction on +the map. Affects drag interactions on the whole document.
    enableTextSelection()Cancels the effects of a previous L.DomUtil.disableTextSelection.
    disableImageDrag()As L.DomUtil.disableTextSelection, but +for dragstart DOM events, usually generated when the user drags an image.
    enableImageDrag()Cancels the effects of a previous L.DomUtil.disableImageDrag.
    preventOutline(<HTMLElement> el)Makes the outline +of the element el invisible. Used internally by Leaflet to prevent +focusable elements from displaying an outline when the user performs a +drag interaction on them.
    restoreOutline()Cancels the effects of a previous L.DomUtil.preventOutline.
    getSizedParentNode(<HTMLElement> el)HTMLElementFinds the closest parent node which size (width and height) is not null.
    getScale(<HTMLElement> el)ObjectComputes the CSS scale currently applied on the element. +Returns an object with x and y members as horizontal and vertical scales respectively, +and boundingClientRect as the result of getBoundingClientRect().
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    TRANSFORMStringVendor-prefixed transform style name (e.g. 'webkitTransform' for WebKit).
    TRANSITIONStringVendor-prefixed transition style name.
    TRANSITION_ENDStringVendor-prefixed transitionend event name.
    + +
    + + +

    PosAnimation

    Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

    + +
    +

    Usage example

    + +
    + + + + + +
    var fx = new L.PosAnimation();
    +fx.run(el, [300, 500], 0.5);
    +
    + + + +
    + + +
    +

    Constructor

    + +
    + + + + + + + + + + + + + + +
    ConstructorDescription
    L.PosAnimation()Creates a PosAnimation object.
    + + +
    + + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    startEventFired when the animation starts
    stepEventFired continuously during the animation.
    endEventFired when the animation ends.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    run(<HTMLElement> el, <Point> newPos, <Number> duration?, <Number> easeLinearity?)

    Run an animation of a given element to a new position, optionally setting +duration in seconds (0.25 by default) and easing linearity factor (3rd +argument of the cubic bezier curve, +0.5 by default).

    +
    stop()

    Stops the animation (if currently running).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Draggable

    A class for making DOM elements draggable (including touch support). +Used internally for map and marker dragging. Only works for elements +that were positioned with L.DomUtil.setPosition.

    + +
    +

    Usage example

    + +
    + + + + + +
    var draggable = new L.Draggable(elementToDrag);
    +draggable.enable();
    +
    + + + +
    + + +
    +

    Constructor

    + +
    + + + + + + + + + + + + + + +
    ConstructorDescription
    L.Draggable(<HTMLElement> el, <HTMLElement> dragHandle?, <Boolean> preventOutline?, <Draggable options> options?)Creates a Draggable object for moving el when you start dragging the dragHandle element (equals el itself by default).
    + + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    clickToleranceNumber3The max number of pixels a user can shift the mouse pointer during a click +for it to be considered a valid click (as opposed to a mouse drag).
    + +
    + + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    downEventFired when a drag is about to start.
    dragstartEventFired when a drag starts
    predragEventFired continuously during dragging before each corresponding +update of the element's position.
    dragEventFired continuously during dragging.
    dragendDragEndEventFired when the drag ends.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    enable()

    Enables the dragging ability

    +
    disable()

    Disables the dragging ability

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Class

    L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

    +

    In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

    + +
    +

    Usage example

    + +
    + + + + + +
    var MyClass = L.Class.extend({
    +initialize: function (greeter) {
    +	this.greeter = greeter;
    +	// class constructor
    +},
    +
    +greet: function (name) {
    +	alert(this.greeter + ', ' + name)
    +	}
    +});
    +
    +// create instance of MyClass, passing "Hello" to the constructor
    +var a = new MyClass("Hello");
    +
    +// call greet method, alerting "Hello, World"
    +a.greet("World");
    +
    + + + +
    + +

    Class Factories

    + + + +

    You may have noticed that Leaflet objects are created without using +the new keyword. This is achieved by complementing each class with a +lowercase factory method:

    +
    new L.Map('map'); // becomes:
    +L.map('map');
    +
    +

    The factories are implemented very easily, and you can do this for your own classes:

    +
    L.map = function (id, options) {
    +    return new L.Map(id, options);
    +};
    +
    + + + +
    + +

    Inheritance

    + + + +

    You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

    +
    var MyChildClass = MyClass.extend({
    +    // ... new properties and methods
    +});
    +
    +

    This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

    +
    var a = new MyChildClass();
    +a instanceof MyChildClass; // true
    +a instanceof MyClass; // true
    +
    +

    You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

    +
    var MyChildClass = MyClass.extend({
    +    initialize: function () {
    +        MyClass.prototype.initialize.call(this, "Yo");
    +    },
    +
    +    greet: function (name) {
    +        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
    +    }
    +});
    +
    +var a = new MyChildClass();
    +a.greet('Jason'); // alerts "Yo, bro Jason!"
    +
    + + + +
    + +

    Options

    + + + +

    options is a special property that unlike other objects that you pass +to extend will be merged with the parent one instead of overriding it +completely, which makes managing configuration of objects and default +values convenient:

    +
    var MyClass = L.Class.extend({
    +    options: {
    +        myOption1: 'foo',
    +        myOption2: 'bar'
    +    }
    +});
    +
    +var MyChildClass = MyClass.extend({
    +    options: {
    +        myOption1: 'baz',
    +        myOption3: 5
    +    }
    +});
    +
    +var a = new MyChildClass();
    +a.options.myOption1; // 'baz'
    +a.options.myOption2; // 'bar'
    +a.options.myOption3; // 5
    +
    +

    There's also L.Util.setOptions, a method for +conveniently merging options passed to constructor with the defaults +defines in the class:

    +
    var MyClass = L.Class.extend({
    +    options: {
    +        foo: 'bar',
    +        bla: 5
    +    },
    +
    +    initialize: function (options) {
    +        L.Util.setOptions(this, options);
    +        ...
    +    }
    +});
    +
    +var a = new MyClass({bla: 10});
    +a.options; // {foo: 'bar', bla: 10}
    +
    +

    Note that the options object allows any keys, not just +the options defined by the class and its base classes. +This means you can use the options object to store +application specific information, as long as you avoid +keys that are already used by the class in question.

    + + + +
    + +

    Includes

    + + + +

    includes is a special class property that merges all specified objects into the class (such objects are called mixins).

    +
     var MyMixin = {
    +    foo: function () { ... },
    +    bar: 5
    +};
    +
    +var MyClass = L.Class.extend({
    +    includes: MyMixin
    +});
    +
    +var a = new MyClass();
    +a.foo();
    +
    +

    You can also do such includes in runtime with the include method:

    +
    MyClass.include(MyMixin);
    +
    +

    statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

    +
    var MyClass = L.Class.extend({
    +    statics: {
    +        FOO: 'bar',
    +        BLA: 5
    +    }
    +});
    +
    +MyClass.FOO; // 'bar'
    +
    + + + +
    + +

    Constructor hooks

    + + + +

    If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

    +
    MyClass.addInitHook(function () {
    +    // ... do something in constructor additionally
    +    // e.g. add event listeners, set custom properties etc.
    +});
    +
    +

    You can also use the following shortcut when you just need to make one additional method call:

    +
    MyClass.addInitHook('methodName', arg1, arg2, …);
    +
    + + + +
    + + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    extend(<Object> props)FunctionExtends the current class given the properties to be included. +Returns a Javascript function that is a class constructor (to be called with new).
    include(<Object> properties)thisIncludes a mixin into the current class.
    mergeOptions(<Object> options)thisMerges options into the defaults of the class.
    addInitHook(<Function> fn)thisAdds a constructor hook to the class.
    + +
    + + +

    Evented

    A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

    + +
    +

    Usage example

    + +
    + + + + + +
    map.on('click', function(e) {
    +	alert(e.latlng);
    +} );
    +
    +

    Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

    +
    function onClick(e) { ... }
    +
    +map.on('click', onClick);
    +map.off('click', onClick);
    +
    + + + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    + + +

    Layer

    A set of methods from the Layer base class that all Leaflet layers use. +Inherits all methods, options and events from L.Evented.

    + +
    +

    Usage example

    + +
    + + + + + +
    var layer = L.marker(latlng).addTo(map);
    +layer.addTo(map);
    +layer.remove();
    +
    + + + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    + + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    + +

    Popup events

    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    + +

    Tooltip events

    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    + + +
    +

    Methods

    + +
    + + + +
    Classes extending L.Layer will inherit the following methods:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    + +

    Extension methods

    + +
    Every layer should extend from L.Layer and (re-)implement the following methods.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    onAdd(<Map> map)this

    Should contain code that creates DOM elements for the layer, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).

    +
    onRemove(<Map> map)this

    Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).

    +
    getEvents()Object

    This optional method should return an object like { viewreset: this._reset } for addEventListener. The event handlers in this object will be automatically added and removed from the map with your layer.

    +
    getAttribution()String

    This optional method should return a string containing HTML to be shown on the Attribution control whenever the layer is visible.

    +
    beforeAdd(<Map> map)this

    Optional method. Called on map.addLayer(layer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.

    +
    + +
    + +

    Popup methods

    + +
    All layers share a set of methods convenient for binding popups to it. +
    var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
    +layer.openPopup();
    +layer.closePopup();
    +
    +

    Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    + +

    Tooltip methods

    + +
    All layers share a set of methods convenient for binding tooltips to it. +
    var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
    +layer.openTooltip();
    +layer.closeTooltip();
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Interactive layer

    Some Layers can be made interactive - when the user interacts +with such a layer, mouse events like click and mouseover can be handled. +Use the event handling methods to handle these events.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + +

    Mouse events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Control

    L.Control is a base class for implementing map controls. Handles positioning. +All other controls extend from this class.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    + + +
    +

    Methods

    + +
    + + + +
    Classes extending L.Control will inherit the following methods:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    + +

    Extension methods

    + +
    Every control should extend from L.Control and (re-)implement the following methods.
    + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    onAdd(<Map> map)HTMLElement

    Should return the container DOM element for the control and add listeners on relevant map events. Called on control.addTo(map).

    +
    onRemove(<Map> map)

    Optional method. Should contain all clean up code that removes the listeners previously added in onAdd. Called on control.remove().

    +
    + +
    + + +

    Handler

    Abstract class for map interaction handlers

    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    enable()this

    Enables the handler

    +
    disable()this

    Disables the handler

    +
    enabled()Boolean

    Returns true if the handler is enabled

    +
    + +
    + +

    Extension methods

    + +
    Classes inheriting from Handler must implement the two following methods:
    + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addHooks()

    Called when the handler is enabled, should add event hooks.

    +
    removeHooks()

    Called when the handler is disabled, should remove the event hooks added previously.

    +
    + +
    + + +
    +

    Functions

    + +
    + +

    There is static function which can be called without instantiating L.Handler:

    + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    addTo(<Map> map, <String> name)thisAdds a new Handler to the given map with the given name.
    + +
    + + +

    Projection

    An object with methods for projecting geographical coordinates of the world onto +a flat surface (and back). See Map projection.

    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    project(<LatLng> latlng)Point

    Projects geographical coordinates into a 2D point. +Only accepts actual L.LatLng instances, not arrays.

    +
    unproject(<Point> point)LatLng

    The inverse of project. Projects a 2D point into a geographical location. +Only accepts actual L.Point instances, not arrays.

    +

    Note that the projection instances do not inherit from Leaflet's Class object, +and can't be instantiated. Also, new classes can't inherit from them, +and methods can't be added to them with the include function.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    boundsBoundsThe bounds (specified in CRS units) where the projection is valid
    + +
    + + +
    +

    Defined projections

    + +
    + + + +
    Leaflet comes with a set of already defined Projections out of the box:
    + + + + + + + + + + + + + + + + + + + +
    ProjectionDescription
    L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, +mostly used by GIS enthusiasts. Directly maps x as longitude, and y as +latitude. Also suitable for flat worlds, e.g. game maps. Used by the +EPSG:4326 and Simple CRS.
    L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS.
    L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, +used by almost all free and commercial tile providers. Assumes that Earth is +a sphere. Used by the EPSG:3857 CRS.
    + +
    + + +

    CRS

    +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    latLngToPoint(<LatLng> latlng, <Number> zoom)Point

    Projects geographical coordinates into pixel coordinates for a given zoom.

    +
    pointToLatLng(<Point> point, <Number> zoom)LatLng

    The inverse of latLngToPoint. Projects pixel coordinates on a given +zoom into geographical coordinates.

    +
    project(<LatLng> latlng)Point

    Projects geographical coordinates into coordinates in units accepted for +this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).

    +
    unproject(<Point> point)LatLng

    Given a projected coordinate returns the corresponding LatLng. +The inverse of project.

    +
    scale(<Number> zoom)Number

    Returns the scale used when transforming projected coordinates into +pixel coordinates for a particular zoom. For example, it returns +256 * 2^zoom for Mercator-based CRS.

    +
    zoom(<Number> scale)Number

    Inverse of scale(), returns the zoom level corresponding to a scale +factor of scale.

    +
    getProjectedBounds(<Number> zoom)Bounds

    Returns the projection's bounds scaled and transformed for the provided zoom.

    +
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates.

    +
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the +CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds.

    +
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring +that its center is within the CRS's bounds. +Only accepts actual L.LatLngBounds instances, not arrays.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    codeStringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857')
    wrapLngNumber[]An array of two numbers defining whether the longitude (horizontal) coordinate +axis wraps around a given range and how. Defaults to [-180, 180] in most +geographical CRSs. If undefined, the longitude axis does not wrap around.
    wrapLatNumber[]Like wrapLng, but for the latitude (vertical) axis.
    infiniteBooleanIf true, the coordinate space will be unbounded (infinite in both axes)
    + +
    + + +
    +

    Defined CRSs

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CRSDescription
    L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
    L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial +tile providers. Uses Spherical Mercator projection. Set in by default in +Map's crs option.
    L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. +

    Leaflet 1.0.x complies with the TMS coordinate scheme for EPSG:4326, +which is a breaking change from 0.7.x behaviour. If you are using a TileLayer +with this CRS, ensure that there are two 256x256 pixel tiles covering the +whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), +or (-180,-90) for TileLayers with the tms option set.

    L.CRS.EarthServes as the base for CRS that are global such that they cover the earth. +Can only be used as the base for other CRS and cannot be used directly, +since it does not have a code, projection or transformation. distance() returns +meters.
    L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. +May be used for maps of flat surfaces (e.g. game maps). Note that the y +axis should still be inverted (going from bottom to top). distance() returns +simple euclidean distance.
    L.CRS.BaseObject that defines coordinate reference systems for projecting +geographical points into pixel (screen) coordinates and back (and to +coordinates in other units for WMS services). See +spatial reference system. +

    Leaflet defines the most usual CRSs by default. If you want to use a +CRS not defined by default, take a look at the +Proj4Leaflet plugin.

    +

    Note that the CRS instances do not inherit from Leaflet's Class object, +and can't be instantiated. Also, new classes can't inherit from them, +and methods can't be added to them with the include function.

    + +
    + + +

    Renderer

    Base class for vector renderer implementations (SVG, Canvas). Handles the +DOM container of the renderer, its bounds, and its zoom animation.

    +

    A Renderer works as an implicit layer group for all Paths - the renderer +itself can be added or removed to the map. All paths use a renderer, which can +be implicit (the map will decide the type of renderer and use it automatically) +or explicit (using the [renderer](#path-renderer) option of the path).

    +

    Do not use this class directly, use SVG and Canvas instead.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingNumber0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber0How much to extend click tolerance round a path/object on the map
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    updateEventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Event objects

    Whenever a class inheriting from Evented fires an event, a listener function +will be called with an event argument, which is a plain object containing +information about the event. For example:

    +
    map.on('click', function(ev) {
    +    alert(ev.latlng); // ev is an event object (MouseEvent in this case)
    +});
    +
    +

    The information available depends on the event type:

    + + + +
    +

    Event

    + +
    + + + +
    The base event object. All other event objects contain these properties too.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    + + +
    + +
    +

    KeyboardEvent

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    originalEventDOMEventThe original [DOM KeyboardEvent](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent) that triggered this Leaflet event.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    MouseEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    latlngLatLngThe geographical point where the mouse event occurred.
    layerPointPointPixel coordinates of the point where the mouse event occurred relative to the map layer.
    containerPointPointPixel coordinates of the point where the mouse event occurred relative to the map сontainer.
    originalEventDOMEventThe original [DOM MouseEvent](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent) or DOM TouchEvent that triggered this Leaflet event.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    LocationEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    latlngLatLngDetected geographical location of the user.
    boundsLatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
    accuracyNumberAccuracy of location in meters.
    altitudeNumberHeight of the position above the WGS84 ellipsoid in meters.
    altitudeAccuracyNumberAccuracy of altitude in meters.
    headingNumberThe direction of travel in degrees counting clockwise from true North.
    speedNumberCurrent velocity in meters per second.
    timestampNumberThe time when the position was acquired.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    ErrorEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    messageStringError message.
    codeNumberError code (if applicable).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    LayerEvent

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    layerLayerThe layer that was added or removed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    + +
    +
    +
    + +
    + +
    +

    LayersControlEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    layerLayerThe layer that was added or removed.
    nameStringThe name of the layer that was added or removed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    + +
    +
    +
    + +
    + +
    +

    TileEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    tileHTMLElementThe tile element (image).
    coordsPointPoint object with the tile's x, y, and z (zoom level) coordinates.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    TileErrorEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    tileHTMLElementThe tile element (image).
    coordsPointPoint object with the tile's x, y, and z (zoom level) coordinates.
    error*Error passed to the tile's done() callback.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    ResizeEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    oldSizePointThe old size before resize event.
    newSizePointThe new size after the resize event.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    GeoJSONEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    layerLayerThe layer for the GeoJSON feature that is being added to the map.
    propertiesObjectGeoJSON properties of the feature.
    geometryTypeStringGeoJSON geometry type of the feature.
    idStringGeoJSON ID of the feature (if present).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    + +
    +
    +
    + +
    + +
    +

    PopupEvent

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    popupPopupThe popup that was opened or closed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    TooltipEvent

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    tooltipTooltipThe tooltip that was opened or closed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    DragEndEvent

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    distanceNumberThe distance in pixels the draggable element was moved by.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    ZoomAnimEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    centerLatLngThe current center of the map
    zoomNumberThe current zoom level of the map
    noUpdateBooleanWhether layers should update their contents due to this event
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +

    DivOverlay

    Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    offsetPointPoint(0, 7)The offset of the popup position. Useful to control the anchor +of the popup when opening it on some overlays.
    classNameString''A custom CSS class name to assign to the popup.
    paneString'popupPane'Map pane where the popup will be added.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Global Switches

    Global switches are created for rare cases and generally make +Leaflet to not detect a particular browser feature even if it's +there. You need to set the switch as a global variable to true +before including Leaflet on the page, like this:

    +
    <script>L_NO_TOUCH = true;</script>
    +<script src="leaflet.js"></script>
    +
    + + + + + + + + + + + + + + + + + +
    SwitchDescription
    L_NO_TOUCHForces Leaflet to not use touch events even if it detects them.
    L_DISABLE_3DForces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.
    + +

    noConflict

    This method restores the L global variable to the original value +it had before Leaflet inclusion, and returns the real Leaflet +namespace so you can put it elsewhere, like this:

    +
    <script src='libs/l.js'>
    +<!-- L points to some other library -->
    +
    +<script src='leaflet.js'>
    +<!-- you include Leaflet, it replaces the L variable to Leaflet namespace -->
    +
    +<script>
    +var Leaflet = L.noConflict();
    +// now L points to that other library again, and you can use Leaflet.Map etc.
    +</script>
    +
    + +

    version

    A constant that represents the Leaflet version in use.

    +
    L.version; // contains "1.0.0" (or whatever version is currently in use)
    +
    diff --git a/docs/reference-versions.html b/docs/reference-versions.html index 25c8d41e16f..84046c56544 100644 --- a/docs/reference-versions.html +++ b/docs/reference-versions.html @@ -17,4 +17,5 @@

    Available API References

  • API reference for 1.4.0
  • API reference for 1.5.1
  • API reference for 1.6.0 +
  • API reference for 1.7.1

    diff --git a/docs/reference.html b/docs/reference.html index 590cbadaf47..24751ea59b2 100644 --- a/docs/reference.html +++ b/docs/reference.html @@ -1,4 +1,4 @@ --- layout: redirected -redirect_to: reference-1.6.0.html ---- \ No newline at end of file +redirect_to: reference-1.7.1.html +--- diff --git a/package.json b/package.json index 64bc8861343..7fb2ca2caa5 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "leaflet", - "version": "1.6.0", + "version": "1.7.1", "homepage": "https://leafletjs.com/", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { "eslint": "^6.8.0", "eslint-config-mourner": "^2.0.1", - "git-rev-sync": "^2.0.0", + "git-rev-sync": "^2.1.0", "happen": "~0.3.2", - "karma": "^5.0.3", + "karma": "^5.2.1", "karma-chrome-launcher": "^3.1.0", "karma-edge-launcher": "^0.4.2", "karma-expect": "^1.1.3", @@ -28,7 +28,7 @@ "rollup-plugin-json": "^4.0.0", "sinon": "^7.5.0", "ssri": "^8.0.0", - "uglify-js": "^3.9.2" + "uglify-js": "^3.10.3" }, "main": "dist/leaflet-src.js", "style": "dist/leaflet.css", @@ -48,7 +48,7 @@ "lintfix": "npm run lint -- --fix", "rollup": "rollup -c build/rollup-config.js", "watch": "rollup -w -c build/rollup-watch-config.js", - "uglify": "uglifyjs dist/leaflet-src.js -c -m -o dist/leaflet.js --source-map filename=dist/leaflet.js.map --in-source-map dist/leaflet-src.js.map --source-map-url leaflet.js.map --comments", + "uglify": "uglifyjs dist/leaflet-src.js -c -m -o dist/leaflet.js --source-map filename=dist/leaflet.js.map --source-map content=dist/leaflet-src.js.map --source-map url=leaflet.js.map --comments", "integrity": "node ./build/integrity.js" }, "eslintConfig": { diff --git a/spec/suites/map/handler/Map.DragSpec.js b/spec/suites/map/handler/Map.DragSpec.js index 9f6953ba910..0b7cbf53abd 100644 --- a/spec/suites/map/handler/Map.DragSpec.js +++ b/spec/suites/map/handler/Map.DragSpec.js @@ -366,7 +366,7 @@ describe("Map.Drag", function () { onStop: function () { var center = map.getCenter(); var zoom = map.getZoom(); - expect(center).to.be(originalCenter); // Expect center point to be the same as before the click + expect(center.equals(originalCenter)).to.be(true); // Expect center point to be the same as before the click expect(spy.callCount).to.eql(0); // No drag event should have been fired. expect(zoom).to.be(1); From 33d011c1f449023fb12dc2b15ec390943bfcba40 Mon Sep 17 00:00:00 2001 From: JJ Jin Date: Mon, 7 Sep 2020 17:07:01 +0800 Subject: [PATCH 079/306] Plugins: Add Leaflet.Legend (#7257) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 金建强 --- docs/plugins.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index e4d1df64f4b..05cacc75b4c 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -4002,6 +4002,18 @@ Buttons, sliders, toolbars, sidebars, and panels. Public Lab + + + Leaflet.Legend + + + + Display legend symbols and toggle overlays(Demo). + + + JJ Jin + + From 68ef9eafd33c08e54af5f190cedabb950ec67266 Mon Sep 17 00:00:00 2001 From: Jason Finch Date: Tue, 8 Sep 2020 17:06:36 +1000 Subject: [PATCH 080/306] fix (Keyboard): Allow WCAG21 focus visible criteria for keyboard navigation by not stripping outline on focus for keyboard events. (#7259) Co-authored-by: Jason Finch --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index 31146152e8a..ee8760257ed 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -1389,7 +1389,7 @@ export var Map = Evented.extend({ var type = e.type; - if (type === 'mousedown' || type === 'keypress' || type === 'keyup' || type === 'keydown') { + if (type === 'mousedown') { // prevents outline when clicking on keyboard-focusable element DomUtil.preventOutline(e.target || e.srcElement); } From 6b90df75719e1ebd359ee3dfe86f9bc13732ebbe Mon Sep 17 00:00:00 2001 From: johnd0e Date: Tue, 8 Sep 2020 16:43:00 +0300 Subject: [PATCH 081/306] Fix excessive click in desktop Safari (#7260) Tap handler is useful only in iOS --- src/map/handler/Map.Tap.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/map/handler/Map.Tap.js b/src/map/handler/Map.Tap.js index cfc3df69e2d..4210cc376c6 100644 --- a/src/map/handler/Map.Tap.js +++ b/src/map/handler/Map.Tap.js @@ -131,6 +131,7 @@ export var Tap = Handler.extend({ // @section Handlers // @property tap: Handler // Mobile touch hacks (quick tap and touch hold) handler. -if (Browser.touch && (!Browser.pointer || Browser.safari)) { +var iOS = Browser.safari && Browser.mobile; +if (Browser.touch && (!Browser.pointer || iOS)) { Map.addInitHook('addHandler', 'tap', Tap); } From dda26ba96d7dc79213818d1bcc0565b6ac3c69c4 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 11 Sep 2020 12:36:24 +0300 Subject: [PATCH 082/306] Disable tap handler by default, except in mobile Safari (#7267) Atm it is still needed to simulate taphold in iOS --- src/map/handler/Map.Tap.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/map/handler/Map.Tap.js b/src/map/handler/Map.Tap.js index 4210cc376c6..99712e327f8 100644 --- a/src/map/handler/Map.Tap.js +++ b/src/map/handler/Map.Tap.js @@ -15,10 +15,12 @@ import * as Browser from '../../core/Browser'; // @section Interaction Options Map.mergeOptions({ // @section Touch interaction options - // @option tap: Boolean = true + // @option tap: Boolean // Enables mobile hacks for supporting instant taps (fixing 200ms click // delay on iOS/Android) and touch holds (fired as `contextmenu` events). - tap: true, + // This is legacy option, by default enabled in mobile Safari only + // (because we still need `contextmenu` simulation for iOS). + tap: Browser.safari && Browser.mobile, // @option tapTolerance: Number = 15 // The max number of pixels a user can shift his finger during touch @@ -131,7 +133,4 @@ export var Tap = Handler.extend({ // @section Handlers // @property tap: Handler // Mobile touch hacks (quick tap and touch hold) handler. -var iOS = Browser.safari && Browser.mobile; -if (Browser.touch && (!Browser.pointer || iOS)) { - Map.addInitHook('addHandler', 'tap', Tap); -} +Map.addInitHook('addHandler', 'tap', Tap); From 1b9b8e1159d2bc9e5321fbaee5008ef14b8a2b18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20=C5=BD=C3=A1k?= Date: Tue, 15 Sep 2020 12:35:12 +0200 Subject: [PATCH 083/306] Plugins: Update leaflet-lasso description (#7276) Remove exaggeration --- docs/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins.md b/docs/plugins.md index 05cacc75b4c..d5f7096cdcf 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2820,7 +2820,7 @@ These plugins help users select either overlays or areas in the map. leaflet-lasso - True lasso selection plugin (Demo) + Lasso selection plugin (Demo) Jan Zak From 7ddf222a08f069034201ea20749ea2ace1ebf191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 15 Sep 2020 18:29:27 +0200 Subject: [PATCH 084/306] Upgrade Leafdoc to 2.2.1; redo docs for 1.7.1 (#7263) Fixes #7261 --- docs/reference-1.7.1.html | 154 +++++++++++++++++++------------------- package.json | 2 +- src/layer/VideoOverlay.js | 2 +- 3 files changed, 79 insertions(+), 79 deletions(-) diff --git a/docs/reference-1.7.1.html b/docs/reference-1.7.1.html index 42132e36e5c..72eb293ab6f 100644 --- a/docs/reference-1.7.1.html +++ b/docs/reference-1.7.1.html @@ -203,7 +203,7 @@

    Options

    Boolean false Whether Paths should be rendered on a Canvas renderer. -By default, all Paths are rendered in a SVG renderer. +By default, all Paths are rendered in a SVG renderer. @@ -916,7 +916,7 @@

    Methods

    getRenderer(<Path> layer) Renderer

    Returns the instance of Renderer that should be used to render the given -Path. It will ensure that the renderer options of the map and paths +Path. It will ensure that the renderer options of the map and paths are respected, and that the renderers do exist on the map.

    @@ -1129,7 +1129,7 @@

    Methods for modifying map state

    panInside(<LatLng> latlng, <options> options?) this -

    Pans the map the minimum amount to make the latlng visible. Use +

    Pans the map the minimum amount to make the latlng visible. Use padding, paddingTopLeft and paddingTopRight options to fit the display to more restricted bounds, like fitBounds. If latlng is already within the (optionally padded) display bounds, @@ -2346,7 +2346,7 @@

    Events

    move Event - Fired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng. + Fired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng. @@ -2615,7 +2615,7 @@

    Other methods

    Object

    precision is the number of decimal places for coordinates. The default value is 6 places. -Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON Point Feature).

    +Returns a GeoJSON representation of the marker (as a GeoJSON Point Feature).

    @@ -2712,7 +2712,7 @@

    Other methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -2783,7 +2783,7 @@

    Other methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -3459,7 +3459,7 @@ openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -3530,7 +3530,7 @@ openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -4055,7 +4055,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -4126,7 +4126,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -4503,7 +4503,7 @@

    Options

    Whether the layer is wrapped around the antimeridian. If true, the GridLayer will only be displayed once at low zoom levels. Has no effect when the map CRS doesn't wrap around. Can be used -in combination with [bounds](#gridlayer-bounds) to prevent requesting +in combination with bounds to prevent requesting tiles outside the CRS limits. @@ -4924,7 +4924,7 @@

    Extension methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -4995,7 +4995,7 @@

    Extension methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -5429,7 +5429,7 @@

    Options

    Whether the layer is wrapped around the antimeridian. If true, the GridLayer will only be displayed once at low zoom levels. Has no effect when the map CRS doesn't wrap around. Can be used -in combination with [bounds](#gridlayer-bounds) to prevent requesting +in combination with bounds to prevent requesting tiles outside the CRS limits. @@ -5855,7 +5855,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -5926,7 +5926,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -6597,7 +6597,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -6668,7 +6668,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -6906,7 +6906,7 @@

    Options

    Boolean true Whether the video will save aspect ratio after the projection. -Relevant for supported browsers. Browser compatibility- https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit +Relevant for supported browsers. See browser compatibility muted @@ -7430,7 +7430,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -7501,7 +7501,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -8211,7 +8211,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -8282,7 +8282,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -8909,7 +8909,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -8980,7 +8980,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -9592,7 +9592,7 @@

    Methods

    Object

    precision is the number of decimal places for coordinates. The default value is 6 places. -Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

    +Returns a GeoJSON representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

    @@ -9778,7 +9778,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -9849,7 +9849,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -10468,7 +10468,7 @@

    Methods

    Object

    precision is the number of decimal places for coordinates. The default value is 6 places. -Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    +Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    @@ -10675,7 +10675,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -10746,7 +10746,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -11374,7 +11374,7 @@

    Methods

    Object

    precision is the number of decimal places for coordinates. The default value is 6 places. -Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    +Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    @@ -11582,7 +11582,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -11653,7 +11653,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -12087,7 +12087,7 @@

    Events

    move Event - Fired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng. + Fired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng. @@ -12305,7 +12305,7 @@

    Methods

    Object

    precision is the number of decimal places for coordinates. The default value is 6 places. -Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON Point Feature).

    +Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    @@ -12460,7 +12460,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -12531,7 +12531,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -12935,7 +12935,7 @@

    Events

    move Event - Fired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng. + Fired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng. @@ -13114,7 +13114,7 @@

    Methods

    Object

    precision is the number of decimal places for coordinates. The default value is 6 places. -Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON Point Feature).

    +Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    @@ -13280,7 +13280,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -13351,7 +13351,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -13865,7 +13865,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -13936,7 +13936,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -14479,7 +14479,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -14550,7 +14550,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -14913,7 +14913,7 @@

    Methods

    Object

    precision is the number of decimal places for coordinates. The default value is 6 places. -Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    @@ -15088,7 +15088,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -15159,7 +15159,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -15596,7 +15596,7 @@

    Methods

    Object

    precision is the number of decimal places for coordinates. The default value is 6 places. -Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    @@ -15772,7 +15772,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -15843,7 +15843,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -16323,7 +16323,7 @@

    Methods

    resetStyle(layer?) this

    Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. -If layer is omitted, the style of all features in the current layer is reset.

    +If layer is omitted, the style of all features in the current layer is reset.

    @@ -16396,7 +16396,7 @@

    Methods

    Object

    precision is the number of decimal places for coordinates. The default value is 6 places. -Returns a [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    @@ -16572,7 +16572,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -16643,7 +16643,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -17045,7 +17045,7 @@

    Options

    Whether the layer is wrapped around the antimeridian. If true, the GridLayer will only be displayed once at low zoom levels. Has no effect when the map CRS doesn't wrap around. Can be used -in combination with [bounds](#gridlayer-bounds) to prevent requesting +in combination with bounds to prevent requesting tiles outside the CRS limits. @@ -17422,7 +17422,7 @@

    Extension methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -17493,7 +17493,7 @@

    Extension methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -18006,7 +18006,7 @@

    Usage example

    map.panBy([200, 300]);
     map.panBy(L.point(200, 300));
     
    -

    Note that Point does not inherit from Leaflet's Class object, +

    Note that Point does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -18208,7 +18208,7 @@

    Usage example

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    otherBounds.intersects([[10, 10], [40, 60]]);
     
    -

    Note that Bounds does not inherit from Leaflet's Class object, +

    Note that Bounds does not inherit from Leaflet's Class object, which means new classes can't inherit from it, and new methods can't be added to it with the include function.

    @@ -21522,7 +21522,7 @@

    Popup methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -21591,7 +21591,7 @@

    Tooltip methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -22067,7 +22067,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -22138,7 +22138,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -22753,7 +22753,7 @@

    Defined CRSs

    L.CRS.EPSG3857 The most common CRS for online maps, used by almost all free and commercial tile providers. Uses Spherical Mercator projection. Set in by default in -Map's crs option. +Map's crs option. L.CRS.EPSG4326 @@ -22762,13 +22762,13 @@

    Defined CRSs

    which is a breaking change from 0.7.x behaviour. If you are using a TileLayer with this CRS, ensure that there are two 256x256 pixel tiles covering the whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), -or (-180,-90) for TileLayers with the tms option set.

    +or (-180,-90) for TileLayers with the tms option set.

    L.CRS.Earth Serves as the base for CRS that are global such that they cover the earth. Can only be used as the base for other CRS and cannot be used directly, -since it does not have a code, projection or transformation. distance() returns +since it does not have a code, projection or transformation. distance() returns meters. @@ -22801,8 +22801,8 @@

    Defined CRSs

    A Renderer works as an implicit layer group for all Paths - the renderer itself can be added or removed to the map. All paths use a renderer, which can be implicit (the map will decide the type of renderer and use it automatically) -or explicit (using the [renderer](#path-renderer) option of the path).

    -

    Do not use this class directly, use SVG and Canvas instead.

    +or explicit (using the renderer option of the path).

    +

    Do not use this class directly, use SVG and Canvas instead.

    Options

    @@ -23086,7 +23086,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -23157,7 +23157,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    @@ -23395,7 +23395,7 @@

    KeyboardEvent

    originalEvent DOMEvent - The original [DOM KeyboardEvent](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent) that triggered this Leaflet event. + The original DOM KeyboardEvent that triggered this Leaflet event. @@ -23486,7 +23486,7 @@

    MouseEvent

    originalEvent DOMEvent - The original [DOM MouseEvent](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent) or DOM TouchEvent that triggered this Leaflet event. + The original DOM MouseEvent or DOM TouchEvent that triggered this Leaflet event. @@ -24793,7 +24793,7 @@

    Methods

    openPopup(<LatLng> latlng?) this -

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    @@ -24864,7 +24864,7 @@

    Methods

    openTooltip(<LatLng> latlng?) this -

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    diff --git a/package.json b/package.json index 7fb2ca2caa5..0a2a02c4570 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "karma-rollup-preprocessor": "^6.1.2", "karma-safari-launcher": "~1.0.0", "karma-sinon": "^1.0.5", - "leafdoc": "^1.4.1", + "leafdoc": "^2.2.1", "mocha": "^7.1.2", "phantomjs-prebuilt": "^2.1.16", "prosthetic-hand": "^1.3.1", diff --git a/src/layer/VideoOverlay.js b/src/layer/VideoOverlay.js index b2c705edba9..a58273c6c89 100644 --- a/src/layer/VideoOverlay.js +++ b/src/layer/VideoOverlay.js @@ -36,7 +36,7 @@ export var VideoOverlay = ImageOverlay.extend({ // @option keepAspectRatio: Boolean = true // Whether the video will save aspect ratio after the projection. - // Relevant for supported browsers. Browser compatibility- https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit + // Relevant for supported browsers. See [browser compatibility](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) keepAspectRatio: true, // @option muted: Boolean = false From 575e551d1a0427462b2dd34f913d07355e5104b5 Mon Sep 17 00:00:00 2001 From: Darcy Parker Date: Thu, 17 Sep 2020 04:23:06 -0400 Subject: [PATCH 085/306] Refactor vmlCreate() so that it does not expose closure to `TypeError` (#7279) when `document.namespaces.add()` throws `TypeError: Cannot read property 'add' of undefined`. * I am not sure why Google Chrome does not garbage collect this TypeError because clearly it is not used in the returned fn. But if you look at memory Heap snapshot, you can see it persists after garbage collection. * Try it with any leaflet map such as https://leafletjs.com/ and search heap snapshot for 'TypeError' * With this change, the `TypeError` is garbage collected and not in memory heap snapshot. --- src/layer/vector/SVG.VML.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/layer/vector/SVG.VML.js b/src/layer/vector/SVG.VML.js index 467e187540a..209f14b98f1 100644 --- a/src/layer/vector/SVG.VML.js +++ b/src/layer/vector/SVG.VML.js @@ -14,10 +14,12 @@ export var vmlCreate = (function () { return document.createElement(''); }; } catch (e) { - return function (name) { - return document.createElement('<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">'); - }; + // Do not return fn from catch block so `e` can be garbage collected + // See https://github.com/Leaflet/Leaflet/pull/7279 } + return function (name) { + return document.createElement('<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">'); + }; })(); From 38e04e390085157657c19bfec6bd40b2af2367de Mon Sep 17 00:00:00 2001 From: Tim Gates Date: Tue, 22 Sep 2020 02:42:54 +1000 Subject: [PATCH 086/306] docs: Fix simple typo, somplicity -> simplicity (#7284) There is a small typo in spec/suites/map/MapSpec.js. Should read `simplicity` rather than `somplicity`. --- spec/suites/map/MapSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 47eaa7db9e1..bd0600de704 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -234,7 +234,7 @@ describe("Map", function () { var boundsZoom = map.getBoundsZoom(bounds, false, padding); expect(boundsZoom).to.eql(9); - // test case: EPSG:25833 (mocked, for somplicity) + // test case: EPSG:25833 (mocked, for simplicity) // The following coordinates are bounds projected with proj4leaflet crs = EPSG:25833', '+proj=utm +zone=33 +ellps=GRS80 +units=m +no_defs var crsMock = sinon.mock(map.options.crs); crsMock.expects("latLngToPoint") From 835440cb8c4b60ad4bbe2b8d51d3b0858a4ac8da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Horgen?= <35254400+thor85@users.noreply.github.com> Date: Thu, 24 Sep 2020 14:09:40 +0200 Subject: [PATCH 087/306] Plugins: Add Leaflet.TileLayer.GLOperations (#7291) --- docs/plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index d5f7096cdcf..d03dc37e89d 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -627,6 +627,17 @@ The following plugins change the way that tile or image layers are displayed in Public Lab + + + Leaflet.TileLayer.GLOperations + + WebGL TileLayer: Colorize floating-point pixels, mouse event handlers for pixel values, hillshading, contours, + transitions, filter and do calculations on multiple layers. + (Demo). + + Thorbjørn Horgen + + From 1aed2e6b0e1375a65dcc57503e4f750e76f50dc0 Mon Sep 17 00:00:00 2001 From: Dan Wild Date: Fri, 25 Sep 2020 09:13:24 +1000 Subject: [PATCH 088/306] Plugins: add leaflet-point-animator, leaflet-temporal-geojson (#7292) --- docs/plugins.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/plugins.md b/docs/plugins.md index d03dc37e89d..262f00f171d 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1992,7 +1992,29 @@ These plugins animate markers or some geometries. See also [geometries with time Grigory Golikov - + + + leaflet-point-animator + + + Animate a large number of GeoJSON points. (demo) + + + danwild, onaci + + + + + leaflet-temporal-geojson + + + Flexible animation of GeoJSON features. (demo) + + + danwild, onaci + + + From bdd7ebf836201550f6d173943b728098b83f40d5 Mon Sep 17 00:00:00 2001 From: Akshata Jahagirdar <70721946+AkshataJ96@users.noreply.github.com> Date: Fri, 25 Sep 2020 19:29:32 +0530 Subject: [PATCH 089/306] Introduced accessibility in zoom and Layer control (#7280) * Added accessiblity to zoom and Layers control * Added semicolon to layer control * Reverted changes from Layer Control Co-authored-by: x5agmr --- src/control/Control.Zoom.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/control/Control.Zoom.js b/src/control/Control.Zoom.js index 07525863c26..3c8055003ae 100644 --- a/src/control/Control.Zoom.js +++ b/src/control/Control.Zoom.js @@ -105,12 +105,16 @@ export var Zoom = Control.extend({ DomUtil.removeClass(this._zoomInButton, className); DomUtil.removeClass(this._zoomOutButton, className); + this._zoomInButton.setAttribute('aria-disabled', 'false'); + this._zoomOutButton.setAttribute('aria-disabled', 'false'); if (this._disabled || map._zoom === map.getMinZoom()) { DomUtil.addClass(this._zoomOutButton, className); + this._zoomOutButton.setAttribute('aria-disabled', 'true'); } if (this._disabled || map._zoom === map.getMaxZoom()) { DomUtil.addClass(this._zoomInButton, className); + this._zoomInButton.setAttribute('aria-disabled', 'true'); } } }); From 4ca41e72c437dc3ff9d1de87deac61cb05182e7f Mon Sep 17 00:00:00 2001 From: Michal Zimmermann <6543598+zimmicz@users.noreply.github.com> Date: Thu, 1 Oct 2020 10:06:48 +0200 Subject: [PATCH 090/306] Add Leaflet Timeline Control (#7295) --- docs/plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 262f00f171d..e115553a862 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2637,6 +2637,17 @@ Most data is two-dimensional (latitude and longitude), but some data has more di linghuam + + + Leaflet Timeline Control + + + Unopinionated timeline control that helps you display time series data. Demo. + + + Michal Zimmermann + + From e8c706da973947db552d047046924df621f935d4 Mon Sep 17 00:00:00 2001 From: Syed Muhammad Abid Date: Thu, 1 Oct 2020 19:18:28 +0500 Subject: [PATCH 091/306] feat: Image crossorigin option added in L.icon (#7298) Co-authored-by: Hussain, Syed Muhammad Abid --- src/layer/marker/Icon.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/layer/marker/Icon.js b/src/layer/marker/Icon.js index 92517937e60..489c8df1a0f 100644 --- a/src/layer/marker/Icon.js +++ b/src/layer/marker/Icon.js @@ -75,7 +75,13 @@ export var Icon = Class.extend({ options: { popupAnchor: [0, 0], - tooltipAnchor: [0, 0] + tooltipAnchor: [0, 0], + + // @option crossOrigin: Boolean|String = false + // Whether the crossOrigin attribute will be added to the tiles. + // If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. + // Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values. + crossOrigin: false }, initialize: function (options) { @@ -108,6 +114,10 @@ export var Icon = Class.extend({ var img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null); this._setIconStyles(img, name); + if (this.options.crossOrigin || this.options.crossOrigin === '') { + img.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin; + } + return img; }, From bfe7c689cd25333778a68fa46eb1e5dfad921b66 Mon Sep 17 00:00:00 2001 From: drupeshUnwired <60639709+drupeshUnwired@users.noreply.github.com> Date: Fri, 2 Oct 2020 15:46:32 +0530 Subject: [PATCH 092/306] Plugins: Added LocationIQ leaflet geocoder (#7299) * Added locationiq leaflet geocoder plugin * Updated the name of plugin --- docs/plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index e115553a862..11ad3707988 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -4458,6 +4458,17 @@ External services that transform an address or the name of a place into latitude Lou Huang + + + Leaflet LocationIQ Geocoder + + + A plugin that adds the ability to search (geocode) a Leaflet-powered map using LocationIQ. + + + LocationIQ + + From bc918d4bdc2ba189807bc207c77080fb41ecc196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 6 Oct 2020 18:41:02 +0200 Subject: [PATCH 093/306] Fix: Tooltips can rely on parent layer getBounds() too, so they work on ImageOverlays (#7306) Fixes #6780 --- src/layer/DivOverlay.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layer/DivOverlay.js b/src/layer/DivOverlay.js index a41f6f34145..7bbd37b4198 100644 --- a/src/layer/DivOverlay.js +++ b/src/layer/DivOverlay.js @@ -177,6 +177,8 @@ export var DivOverlay = Layer.extend({ latlng = layer.getCenter(); } else if (layer.getLatLng) { latlng = layer.getLatLng(); + } else if (layer.getBounds) { + latlng = layer.getBounds().getCenter(); } else { throw new Error('Unable to get source layer LatLng.'); } From 1ca9e4400c5ce9eaf9dd2a8fa064535bdd4120c0 Mon Sep 17 00:00:00 2001 From: Seth Lutske <52637023+slutske22@users.noreply.github.com> Date: Thu, 12 Nov 2020 03:31:54 -0800 Subject: [PATCH 094/306] Plugins: add leaflet-topography (#7323) Adding my new plugin [leaflet-topography](https://github.com/slutske22/leaflet-topography) to the plugins list --- docs/plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 11ad3707988..f0ff0bc7139 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2550,6 +2550,17 @@ Allows users to create, draw, edit and/or delete points, lines and polygons. Most data is two-dimensional (latitude and longitude), but some data has more dimensions (altitude and/or time). The following plugins help users navigate these extra dimensions. + + + + + + + + + + +
    PluginDescriptionMaintainer
    + Leaflet Topography + + A set of tools for calculating and visualizing topographic data (elevation, slope, aspect) at lightning speed. Based on Mapbox RGB Encoded DEM tiles. + + Seth Lutske +
    Leaflet.timelineSlider From f22422a4028dc388e5d70eba15bca8a9eb903b6e Mon Sep 17 00:00:00 2001 From: Simon Legner Date: Fri, 13 Nov 2020 11:55:55 +0100 Subject: [PATCH 095/306] Restore docs/reference-1.5.1.html (#7336) --- docs/reference-1.5.1.html | 24806 +++++++++++++++++++++++++++++++++++- 1 file changed, 24803 insertions(+), 3 deletions(-) diff --git a/docs/reference-1.5.1.html b/docs/reference-1.5.1.html index e04f2807c03..3f6657dfe55 100644 --- a/docs/reference-1.5.1.html +++ b/docs/reference-1.5.1.html @@ -1,4 +1,24804 @@ --- -layout: redirected -redirect_to: reference-1.5.0.html ---- \ No newline at end of file +layout: v2 +title: Documentation +bodyclass: api-page +--- + +

    Leaflet API reference

    + +

    This reference reflects Leaflet 1.5.0 and Leaflet 1.5.1. Check this list if you are using a different version of Leaflet.

    + +
    + +
    +

    UI Layers

    + +

    Raster Layers

    + +

    Vector Layers

    + +
    +
    +

    Other Layers

    + +

    Basic Types

    + +

    Controls

    + +
    +
    + + + + + + +

    Utility

    + +

    DOM Utility

    + +
    +
    +

    Base Classes

    + + +

    Misc

    + +
    +
    + +

    Map

    The central class of the API — it is used to create a map on a page and manipulate it.

    + +
    +

    Usage example

    + +
    + + + + + +
    // initialize the map on the "map" div with a given center and zoom
    +var map = L.map('map', {
    +    center: [51.505, -0.09],
    +    zoom: 13
    +});
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.map(<String> id, <Map options> options?)Instantiates a map object given the DOM ID of a <div> element +and optionally an object literal with Map options.
    L.map(<HTMLElement> el, <Map options> options?)Instantiates a map object given an instance of a <div> HTML element +and optionally an object literal with Map options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    preferCanvasBoolean + falseWhether Paths should be rendered on a Canvas renderer. +By default, all Paths are rendered in a SVG renderer.
    + +
    + +

    Control options

    + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionControlBoolean + trueWhether a attribution control is added to the map by default.
    zoomControlBoolean + trueWhether a zoom control is added to the map by default.
    + +
    + +

    Interaction Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    closePopupOnClickBoolean + trueSet it to false if you don't want popups to close when user clicks the map.
    zoomSnapNumber + 1Forces the map's zoom level to always be a multiple of this, particularly +right after a fitBounds() or a pinch-zoom. +By default, the zoom level snaps to the nearest integer; lower values +(e.g. 0.5 or 0.1) allow for greater granularity. A value of 0 +means the zoom level will not be snapped after fitBounds or a pinch-zoom.
    zoomDeltaNumber + 1Controls how much the map's zoom level will change after a +zoomIn(), zoomOut(), pressing + +or - on the keyboard, or using the zoom controls. +Values smaller than 1 (e.g. 0.5) allow for greater granularity.
    trackResizeBoolean + trueWhether the map automatically handles browser window resize to update itself.
    boxZoomBoolean + trueWhether the map can be zoomed to a rectangular area specified by +dragging the mouse while pressing the shift key.
    doubleClickZoomBoolean|String + trueWhether the map can be zoomed in by double clicking on it and +zoomed out by double clicking while holding shift. If passed +'center', double-click zoom will zoom to the center of the + view regardless of where the mouse was.
    draggingBoolean + trueWhether the map be draggable with mouse/touch or not.
    + +
    + +

    Map State Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    crsCRS + L.CRS.EPSG3857The Coordinate Reference System to use. Don't change this if you're not +sure what it means.
    centerLatLng + undefinedInitial geographic center of the map
    zoomNumber + undefinedInitial map zoom level
    minZoomNumber + *Minimum zoom level of the map. +If not specified and at least one GridLayer or TileLayer is in the map, +the lowest of their minZoom options will be used instead.
    maxZoomNumber + *Maximum zoom level of the map. +If not specified and at least one GridLayer or TileLayer is in the map, +the highest of their maxZoom options will be used instead.
    layersLayer[] + []Array of layers that will be added to the map initially
    maxBoundsLatLngBounds + nullWhen this option is set, the map restricts the view to the given +geographical bounds, bouncing the user back if the user tries to pan +outside the view. To set the restriction dynamically, use +setMaxBounds method.
    rendererRenderer + *The default method for drawing vector layers on the map. L.SVG +or L.Canvas by default depending on browser support.
    + +
    + +

    Animation Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    zoomAnimationBoolean + trueWhether the map zoom animation is enabled. By default it's enabled +in all browsers that support CSS3 Transitions except Android.
    zoomAnimationThresholdNumber + 4Won't animate zoom if the zoom difference exceeds this value.
    fadeAnimationBoolean + trueWhether the tile fade animation is enabled. By default it's enabled +in all browsers that support CSS3 Transitions except Android.
    markerZoomAnimationBoolean + trueWhether markers animate their zoom with the zoom animation, if disabled +they will disappear for the length of the animation. By default it's +enabled in all browsers that support CSS3 Transitions except Android.
    transform3DLimitNumber + 2^23Defines the maximum size of a CSS translation transform. The default +value should not be changed unless a web browser positions layers in +the wrong place after doing a large panBy.
    + +
    + +

    Panning Inertia Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    inertiaBoolean + *If enabled, panning of the map will have an inertia effect where +the map builds momentum while dragging and continues moving in +the same direction for some time. Feels especially nice on touch +devices. Enabled by default unless running on old Android devices.
    inertiaDecelerationNumber + 3000The rate with which the inertial movement slows down, in pixels/second².
    inertiaMaxSpeedNumber + InfinityMax speed of the inertial movement, in pixels/second.
    easeLinearityNumber + 0.2
    worldCopyJumpBoolean + falseWith this option enabled, the map tracks when you pan to another "copy" +of the world and seamlessly jumps to the original one so that all overlays +like markers and vector layers are still visible.
    maxBoundsViscosityNumber + 0.0If maxBounds is set, this option will control how solid the bounds +are when dragging the map around. The default value of 0.0 allows the +user to drag outside the bounds at normal speed, higher values will +slow down map dragging outside bounds, and 1.0 makes the bounds fully +solid, preventing the user from dragging outside the bounds.
    + +
    + +

    Keyboard Navigation Options

    + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    keyboardBoolean + trueMakes the map focusable and allows users to navigate the map with keyboard +arrows and +/- keys.
    keyboardPanDeltaNumber + 80Amount of pixels to pan when pressing an arrow key.
    + +
    + +

    Mousewheel options

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    scrollWheelZoomBoolean|String + trueWhether the map can be zoomed by using the mouse wheel. If passed 'center', +it will zoom to the center of the view regardless of where the mouse was.
    wheelDebounceTimeNumber + 40Limits the rate at which a wheel can fire (in milliseconds). By default +user can't zoom via wheel more often than once per 40 ms.
    wheelPxPerZoomLevelNumber + 60How many scroll pixels (as reported by L.DomEvent.getWheelDelta) +mean a change of one full zoom level. Smaller values will make wheel-zooming +faster (and vice versa).
    + +
    + +

    Touch interaction options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tapBoolean + trueEnables mobile hacks for supporting instant taps (fixing 200ms click +delay on iOS/Android) and touch holds (fired as contextmenu events).
    tapToleranceNumber + 15The max number of pixels a user can shift his finger during touch +for it to be considered a valid tap.
    touchZoomBoolean|String + *Whether the map can be zoomed by touch-dragging with two fingers. If +passed 'center', it will zoom to the center of the view regardless of +where the touch events (fingers) were. Enabled for touch-capable web +browsers except for old Androids.
    bounceAtZoomLimitsBoolean + trueSet it to false if you don't want the map to zoom beyond min/max zoom +and then bounce back when pinch-zooming.
    + +
    + + +
    +

    Events

    + +
    + +

    Layer events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    baselayerchange + LayersControlEventFired when the base layer is changed through the layer control.
    overlayadd + LayersControlEventFired when an overlay is selected through the layer control.
    overlayremove + LayersControlEventFired when an overlay is deselected through the layer control.
    layeradd + LayerEventFired when a new layer is added to the map.
    layerremove + LayerEventFired when some layer is removed from the map
    + +
    + +

    Map state change events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    zoomlevelschange + EventFired when the number of zoomlevels on the map is changed due +to adding or removing a layer.
    resize + ResizeEventFired when the map is resized.
    unload + EventFired when the map is destroyed with remove method.
    viewreset + EventFired when the map needs to redraw its content (this usually happens +on map zoom or load). Very useful for creating custom overlays.
    load + EventFired when the map is initialized (when its center and zoom are set +for the first time).
    zoomstart + EventFired when the map zoom is about to change (e.g. before zoom animation).
    movestart + EventFired when the view of the map starts changing (e.g. user starts dragging the map).
    zoom + EventFired repeatedly during any change in zoom level, including zoom +and fly animations.
    move + EventFired repeatedly during any movement of the map, including pan and +fly animations.
    zoomend + EventFired when the map has changed, after any animations.
    moveend + EventFired when the center of the map stops changing (e.g. user stopped +dragging the map).
    + +
    + +

    Popup events

    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup is opened in the map
    popupclose + PopupEventFired when a popup in the map is closed
    autopanstart + EventFired when the map starts autopanning when opening a popup.
    + +
    + +

    Tooltip events

    + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip is opened in the map.
    tooltipclose + TooltipEventFired when a tooltip in the map is closed.
    + +
    + +

    Location events

    + + + + + + + + + + + + + + + + + +
    EventDataDescription
    locationerror + ErrorEventFired when geolocation (using the locate method) failed.
    locationfound + LocationEventFired when geolocation (using the locate method) +went successfully.
    + +
    + +

    Interaction events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the map.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the map.
    mousedown + MouseEventFired when the user pushes the mouse button on the map.
    mouseup + MouseEventFired when the user releases the mouse button on the map.
    mouseover + MouseEventFired when the mouse enters the map.
    mouseout + MouseEventFired when the mouse leaves the map.
    mousemove + MouseEventFired while the mouse moves over the map.
    contextmenu + MouseEventFired when the user pushes the right mouse button on the map, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    keypress + KeyboardEventFired when the user presses a key from the keyboard that produces a character value while the map is focused.
    keydown + KeyboardEventFired when the user presses a key from the keyboard while the map is focused. Unlike the keypress event, +the keydown event is fired for keys that produce a character value and for keys +that do not produce a character value.
    keyup + KeyboardEventFired when the user releases a key from the keyboard while the map is focused.
    preclick + MouseEventFired before mouse click on the map (sometimes useful when you +want something to happen on click before any existing click +handlers start running).
    + +
    + +

    Other Methods

    + + + + + + + + + + + + + +
    EventDataDescription
    zoomanim + ZoomAnimEventFired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getRenderer(<Path> layer)Renderer

    Returns the instance of Renderer that should be used to render the given +Path. It will ensure that the renderer options of the map and paths +are respected, and that the renderers do exist on the map.

    +
    + +
    + +

    Methods for Layers and Controls

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addControl(<Control> control)this

    Adds the given control to the map

    +
    removeControl(<Control> control)this

    Removes the given control from the map

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the map

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the map.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the map

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the map, optionally specifying context of the iterator function.

    +
    map.eachLayer(function(layer){
    +    layer.bindPopup('Hello');
    +});
    +
    openPopup(<Popup> popup)this

    Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).

    +
    openPopup(<String|HTMLElement> content, <LatLng> latlng, <Popup options> options?)this

    Creates a popup with the specified content and options and opens it in the given point on a map.

    +
    closePopup(<Popup> popup?)this

    Closes the popup previously opened with openPopup (or the given one).

    +
    openTooltip(<Tooltip> tooltip)this

    Opens the specified tooltip.

    +
    openTooltip(<String|HTMLElement> content, <LatLng> latlng, <Tooltip options> options?)this

    Creates a tooltip with the specified content and options and open it.

    +
    closeTooltip(<Tooltip> tooltip?)this

    Closes the tooltip given as parameter.

    +
    + +
    + +

    Methods for modifying map state

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setView(<LatLng> center, <Number> zoom, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) with the given +animation options.

    +
    setZoom(<Number> zoom, <Zoom/pan options> options?)this

    Sets the zoom of the map.

    +
    zoomIn(<Number> delta?, <Zoom options> options?)this

    Increases the zoom of the map by delta (zoomDelta by default).

    +
    zoomOut(<Number> delta?, <Zoom options> options?)this

    Decreases the zoom of the map by delta (zoomDelta by default).

    +
    setZoomAround(<LatLng> latlng, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified geographical point on the map +stationary (e.g. used internally for scroll zoom and double-click zoom).

    +
    setZoomAround(<Point> offset, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.

    +
    fitBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets a map view that contains the given geographical bounds with the +maximum zoom level possible.

    +
    fitWorld(<fitBounds options> options?)this

    Sets a map view that mostly contains the whole world with the maximum +zoom level possible.

    +
    panTo(<LatLng> latlng, <Pan options> options?)this

    Pans the map to a given center.

    +
    panBy(<Point> offset, <Pan options> options?)this

    Pans the map by a given number of pixels (animated).

    +
    flyTo(<LatLng> latlng, <Number> zoom?, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) performing a smooth +pan-zoom animation.

    +
    flyToBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets the view of the map with a smooth animation like flyTo, +but takes a bounds parameter like fitBounds.

    +
    setMaxBounds(<Bounds> bounds)this

    Restricts the map view to the given bounds (see the maxBounds option).

    +
    setMinZoom(<Number> zoom)this

    Sets the lower limit for the available zoom levels (see the minZoom option).

    +
    setMaxZoom(<Number> zoom)this

    Sets the upper limit for the available zoom levels (see the maxZoom option).

    +
    panInsideBounds(<LatLngBounds> bounds, <Pan options> options?)this

    Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.

    +
    panInside(<LatLng> latlng, <options> options?)this

    Pans the map the minimum amount to make the latlng visible. Use +padding, paddingTopLeft and paddingTopRight options to fit +the display to more restricted bounds, like fitBounds. +If latlng is already within the (optionally padded) display bounds, +the map will not be panned.

    +
    invalidateSize(<Zoom/pan options> options)this

    Checks if the map container size changed and updates the map if so — +call it after you've changed the map size dynamically, also animating +pan by default. If options.pan is false, panning will not occur. +If options.debounceMoveend is true, it will delay moveend event so +that it doesn't happen often even if the method is called many +times in a row.

    +
    invalidateSize(<Boolean> animate)this

    Checks if the map container size changed and updates the map if so — +call it after you've changed the map size dynamically, also animating +pan by default.

    +
    stop()this

    Stops the currently running panTo or flyTo animation, if any.

    +
    + +
    + +

    Geolocation methods

    + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    locate(<Locate options> options?)this

    Tries to locate the user using the Geolocation API, firing a locationfound +event with location data on success or a locationerror event on failure, +and optionally sets the map view to the user's location with respect to +detection accuracy (or to the world view if geolocation failed). +Note that, if your page doesn't use HTTPS, this method will fail in +modern browsers (Chrome 50 and newer) +See Locate options for more details.

    +
    stopLocate()this

    Stops watching location previously initiated by map.locate({watch: true}) +and aborts resetting the map view if map.locate was called with +{setView: true}.

    +
    + +
    + +

    Other Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addHandler(<String> name, <Function> HandlerClass)this

    Adds a new Handler to the map, given its name and constructor function.

    +
    remove()this

    Destroys the map and clears all related event listeners.

    +
    createPane(<String> name, <HTMLElement> container?)HTMLElement

    Creates a new map pane with the given name if it doesn't exist already, +then returns it. The pane is created as a child of container, or +as a child of the main map pane if not set.

    +
    getPane(<String|HTMLElement> pane)HTMLElement

    Returns a map pane, given its name or its HTML element (its identity).

    +
    getPanes()Object

    Returns a plain object containing the names of all panes as keys and +the panes as values.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the map.

    +
    whenReady(<Function> fn, <Object> context?)this

    Runs the given function fn when the map gets initialized with +a view (center and zoom) and at least one layer, or immediately +if it's already initialized, optionally passing a function context.

    +
    + +
    + +

    Methods for Getting Map State

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getCenter()LatLng

    Returns the geographical center of the map view

    +
    getZoom()Number

    Returns the current zoom level of the map view

    +
    getBounds()LatLngBounds

    Returns the geographical bounds visible in the current map view

    +
    getMinZoom()Number

    Returns the minimum zoom level of the map (if set in the minZoom option of the map or of any layers), or 0 by default.

    +
    getMaxZoom()Number

    Returns the maximum zoom level of the map (if set in the maxZoom option of the map or of any layers).

    +
    getBoundsZoom(<LatLngBounds> bounds, <Boolean> inside?, <Point> padding?)Number

    Returns the maximum zoom level on which the given bounds fit to the map +view in its entirety. If inside (optional) is set to true, the method +instead returns the minimum zoom level on which the map view fits into +the given bounds in its entirety.

    +
    getSize()Point

    Returns the current size of the map container (in pixels).

    +
    getPixelBounds()Bounds

    Returns the bounds of the current map view in projected pixel +coordinates (sometimes useful in layer and overlay implementations).

    +
    getPixelOrigin()Point

    Returns the projected pixel coordinates of the top left point of +the map layer (useful in custom layer and overlay implementations).

    +
    getPixelWorldBounds(<Number> zoom?)Bounds

    Returns the world's bounds in pixel coordinates for zoom level zoom. +If zoom is omitted, the map's current zoom level is used.

    +
    + +
    + +

    Conversion Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getZoomScale(<Number> toZoom, <Number> fromZoom)Number

    Returns the scale factor to be applied to a map transition from zoom level +fromZoom to toZoom. Used internally to help with zoom animations.

    +
    getScaleZoom(<Number> scale, <Number> fromZoom)Number

    Returns the zoom level that the map would end up at, if it is at fromZoom +level and everything is scaled by a factor of scale. Inverse of +getZoomScale.

    +
    project(<LatLng> latlng, <Number> zoom)Point

    Projects a geographical coordinate LatLng according to the projection +of the map's CRS, then scales it according to zoom and the CRS's +Transformation. The result is pixel coordinate relative to +the CRS origin.

    +
    unproject(<Point> point, <Number> zoom)LatLng

    Inverse of project.

    +
    layerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the origin pixel, +returns the corresponding geographical coordinate (for the current zoom level).

    +
    latLngToLayerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate +relative to the origin pixel.

    +
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the +map's CRS's wrapLat and wrapLng properties, if they are outside the +CRS's bounds. +By default this means longitude is wrapped around the dateline so its +value is between -180 and +180 degrees.

    +
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring that +its center is within the CRS's bounds. +By default this means the center longitude is wrapped around the dateline so its +value is between -180 and +180 degrees, and the majority of the bounds +overlaps the CRS's bounds.

    +
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates according to +the map's CRS. By default this measures distance in meters.

    +
    containerPointToLayerPoint(<Point> point)Point

    Given a pixel coordinate relative to the map container, returns the corresponding +pixel coordinate relative to the origin pixel.

    +
    layerPointToContainerPoint(<Point> point)Point

    Given a pixel coordinate relative to the origin pixel, +returns the corresponding pixel coordinate relative to the map container.

    +
    containerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the map container, returns +the corresponding geographical coordinate (for the current zoom level).

    +
    latLngToContainerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate +relative to the map container.

    +
    mouseEventToContainerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to the +map container where the event took place.

    +
    mouseEventToLayerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to +the origin pixel where the event took place.

    +
    mouseEventToLatLng(<MouseEvent> ev)LatLng

    Given a MouseEvent object, returns geographical coordinate where the +event took place.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Properties

    + +
    + +

    Controls

    + + + + + + + + + + + + + +
    PropertyTypeDescription
    zoomControl + Control.ZoomThe default zoom control (only available if the +zoomControl option was true when creating the map).
    + +
    + +

    Handlers

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    boxZoom + HandlerBox (shift-drag with mouse) zoom handler.
    doubleClickZoom + HandlerDouble click zoom handler.
    dragging + HandlerMap dragging handler (by both mouse and touch).
    keyboard + HandlerKeyboard navigation handler.
    scrollWheelZoom + HandlerScroll wheel zoom handler.
    tap + HandlerMobile touch hacks (quick tap and touch hold) handler.
    touchZoom + HandlerTouch zoom handler.
    + +
    + + +
    +

    Map panes

    + +
    + + + +
    Panes are DOM elements used to control the ordering of layers on the map. You +can access panes with map.getPane or +map.getPanes methods. New panes can be created with the +map.createPane method. +Every map has the following default panes that differ only in zIndex.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PaneTypeZ-indexDescription
    mapPaneHTMLElement + 'auto'Pane that contains all other map panes
    tilePaneHTMLElement + 200Pane for GridLayers and TileLayers
    overlayPaneHTMLElement + 400Pane for vectors (Paths, like Polylines and Polygons), ImageOverlays and VideoOverlays
    shadowPaneHTMLElement + 500Pane for overlay shadows (e.g. Marker shadows)
    markerPaneHTMLElement + 600Pane for Icons of Markers
    tooltipPaneHTMLElement + 650Pane for Tooltips.
    popupPaneHTMLElement + 700Pane for Popups.
    + +
    + + +
    + +
    +

    Locate options

    + +
    + + + +
    Some of the geolocation methods for Map take in an options parameter. This +is a plain javascript object with the following optional components:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    watchBoolean + falseIf true, starts continuous watching of location changes (instead of detecting it +once) using W3C watchPosition method. You can later stop watching using +map.stopLocate() method.
    setViewBoolean + falseIf true, automatically sets the map view to the user location with respect to +detection accuracy, or to world view if geolocation failed.
    maxZoomNumber + InfinityThe maximum zoom for automatic view setting when using setView option.
    timeoutNumber + 10000Number of milliseconds to wait for a response from geolocation before firing a +locationerror event.
    maximumAgeNumber + 0Maximum age of detected location. If less than this amount of milliseconds +passed since last geolocation response, locate will return a cached location.
    enableHighAccuracyBoolean + falseEnables high accuracy, see description in the W3C spec.
    + +
    + + +
    + +
    +

    Zoom options

    + +
    + + + +
    Some of the Map methods which modify the zoom level take in an options +parameter. This is a plain javascript object with the following optional +components:
    + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBoolean + If not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
    + +
    + + +
    + +
    +

    Pan options

    + +
    + + + +
    Some of the Map methods which modify the center of the map take in an options +parameter. This is a plain javascript object with the following optional +components:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBoolean + If true, panning will always be animated if possible. If false, it will +not animate panning, either resetting the map view if panning more than a +screen away, or just setting a new offset for the map pane (except for panBy +which always does the latter).
    durationNumber + 0.25Duration of animated panning, in seconds.
    easeLinearityNumber + 0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
    noMoveStartBoolean + falseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
    + +
    + + +
    + +
    +

    Zoom/pan options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBoolean + If not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    durationNumber + 0.25Duration of animated panning, in seconds.
    easeLinearityNumber + 0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
    noMoveStartBoolean + falseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
    + +
    +
    +
    + +
    + +
    +

    FitBounds options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingTopLeftPoint + [0, 0]Sets the amount of padding in the top left corner of a map container that +shouldn't be accounted for when setting the view to fit bounds. Useful if you +have some control overlays on the map like a sidebar and you don't want them +to obscure objects you're zooming to.
    paddingBottomRightPoint + [0, 0]The same for the bottom right corner of the map.
    paddingPoint + [0, 0]Equivalent of setting both top left and bottom right padding to the same value.
    maxZoomNumber + nullThe maximum possible zoom to use.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBoolean + If not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    durationNumber + 0.25Duration of animated panning, in seconds.
    easeLinearityNumber + 0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
    noMoveStartBoolean + falseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
    + +
    +
    +
    + +

    Marker

    L.Marker is used to display clickable/draggable icons on the map. Extends Layer.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.marker([50.5, 30.5]).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.marker(<LatLng> latlng, <Marker options> options?)Instantiates a Marker object given a geographical point and optionally an options object.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    iconIcon + *Icon instance to use for rendering the marker. +See Icon documentation for details on how to customize the marker icon. +If not specified, a common instance of L.Icon.Default is used.
    keyboardBoolean + trueWhether the marker can be tabbed to with a keyboard and clicked by pressing enter.
    titleString + ''Text for the browser tooltip that appear on marker hover (no tooltip by default).
    altString + ''Text for the alt attribute of the icon image (useful for accessibility).
    zIndexOffsetNumber + 0By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
    opacityNumber + 1.0The opacity of the marker.
    riseOnHoverBoolean + falseIf true, the marker will get on top of others when you hover the mouse over it.
    riseOffsetNumber + 250The z-index offset used for the riseOnHover feature.
    paneString + 'markerPane'Map pane where the markers icon will be added. +Map pane where the markers shadow will be added.
    bubblingMouseEventsBoolean + falseWhen true, a mouse event on this marker will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    + +

    Draggable marker options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    draggableBoolean + falseWhether the marker is draggable with mouse/touch or not.
    autoPanBoolean + falseWhether to pan the map when dragging this marker near its edge or not.
    autoPanPaddingPoint + Point(50, 50)Distance (in pixels to the left/right and to the top/bottom) of the +map edge to start panning the map.
    autoPanSpeedNumber + 10Number of pixels the map should pan by.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBoolean + trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + +
    In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:
    + + + + + + + + + + + + +
    EventDataDescription
    move + EventFired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    + +
    + +

    Dragging events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    dragstart + EventFired when the user starts dragging the marker.
    movestart + EventFired when the marker starts moving (because of dragging).
    drag + EventFired repeatedly while the user drags the marker.
    dragend + DragEndEventFired when the user stops dragging the marker.
    moveend + EventFired when the marker stops moving (because of dragging).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the layer.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown + MouseEventFired when the user pushes the mouse button on the layer.
    mouseup + MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover + MouseEventFired when the mouse enters the layer.
    mouseout + MouseEventFired when the mouse leaves the layer.
    contextmenu + MouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the marker (as a GeoJSON Point Feature).

    +
    getLatLng()LatLng

    Returns the current geographical position of the marker.

    +
    setLatLng(<LatLng> latlng)this

    Changes the marker position to the given point.

    +
    setZIndexOffset(<Number> offset)this

    Changes the zIndex offset of the marker.

    +
    getIcon()Icon

    Returns the current icon used by the marker

    +
    setIcon(<Icon> icon)this

    Changes the marker icon.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the marker.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Properties

    + +
    + +

    Interaction handlers

    + +
    Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see Handler methods). Example: +
    marker.dragging.disable();
    +
    + + + + + + + + + + + + +
    PropertyTypeDescription
    dragging + HandlerMarker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set marker.options.draggable).
    + +
    + + +

    Used to open popups in certain places of the map. Use Map.openPopup to +open popups while making sure that only one popup is open at one time +(recommended for usability), or use Map.addLayer to open as many as you want.

    + +
    + + +
    + + + + + +

    If you want to just bind a popup to marker click and then open it, it's really easy:

    +
    marker.bindPopup(popupContent).openPopup();
    +
    +

    Path overlays like polylines also have a bindPopup method. +Here's a more complicated way to open a popup on a map:

    +
    var popup = L.popup()
    +    .setLatLng(latlng)
    +    .setContent('<p>Hello world!<br />This is a nice popup.</p>')
    +    .openOn(map);
    +
    + + + +
    + + +
    + + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    + +
    +
    +
    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +

    Tooltip

    Used to display small texts on top of map layers.

    + +
    +

    Usage example

    + +
    + + + + + +
    marker.bindTooltip("my tooltip text").openTooltip();
    +
    +

    Note about tooltip offset. Leaflet takes two options in consideration +for computing tooltip offsetting:

    +
      +
    • the offset Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. +Add a positive x offset to move the tooltip to the right, and a positive y offset to +move it to the bottom. Negatives will move to the left and top.
    • +
    • the tooltipAnchor Icon option: this will only be considered for Marker. You +should adapt this value if you use a custom icon.
    • +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.tooltip(<Tooltip options> options?, <Layer> source?)Instantiates a Tooltip object given an optional options object that describes its appearance and location and an optional source object that is used to tag the tooltip with a reference to the Layer to which it refers.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'tooltipPane'Map pane where the tooltip will be added.
    offsetPoint + Point(0, 0)Optional offset of the tooltip position.
    directionString + 'auto'Direction where to open the tooltip. Possible values are: right, left, +top, bottom, center, auto. +auto will dynamically switch between right and left according to the tooltip +position on the map.
    permanentBoolean + falseWhether to open the tooltip permanently or only on mouseover.
    stickyBoolean + falseIf true, the tooltip will follow the mouse instead of being fixed at the feature center.
    interactiveBoolean + falseIf true, the tooltip will listen to the feature events.
    opacityNumber + 0.9Tooltip container opacity.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    classNameString + ''A custom CSS class name to assign to the popup.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    TileLayer

    Used to load and display tile layers on the map. Note that most tile servers require attribution, which you can set under Layer. Extends GridLayer.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar', attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'}).addTo(map);
    +
    + + + +
    + +

    URL template

    + + + +

    A string of the following form:

    +
    'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
    +

    {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates. {r} can be used to add "@2x" to the URL to load retina tiles. +You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

    +
    L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
    +
    + + +
    + + +
    +

    Creation

    + +
    + +

    Extension methods

    + + + + + + + + + + + + +
    FactoryDescription
    L.tilelayer(<String> urlTemplate, <TileLayer options> options?)Instantiates a tile layer object given a URL template and optionally an options object.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    minZoomNumber + 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber + 18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[] + 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString + ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber + 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean + falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean + falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean + falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|String + falseWhether the crossOrigin attribute will be added to the tiles. +If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. +Refer to CORS Settings for valid String values.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tileSizeNumber|Point + 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber + 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean + (depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean + trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber + 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber + 1The explicit zIndex of the tile layer.
    boundsLatLngBounds + undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumber + undefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber + undefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
    noWrapBoolean + falseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with bounds to prevent requesting +tiles outside the CRS limits.
    paneString + 'tilePane'Map pane where the grid layer will be added.
    classNameString + ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber + 2When panning the map, keep this many rows and columns of tiles before unloading them.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loading + EventFired when the grid layer starts loading tiles.
    tileunload + TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart + TileEventFired when a tile is requested and starts loading.
    tileerror + TileErrorEventFired when there is an error loading a tile.
    tileload + TileEventFired when a tile loads.
    load + EventFired when the grid layer loaded all visible tiles.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true). +If the URL does not change, the layer will not be redrawn unless +the noRedraw parameter is set to false.

    +
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() +to return an <img> HTML element with the appropriate image URL given coords. The done +callback is called when the tile has been loaded.

    +
    + +
    + +

    Extension methods

    + +
    Layers extending TileLayer might reimplement the following method.
    + + + + + + + + + + + + + +
    MethodReturnsDescription
    getTileUrl(<Object> coords)String

    Called only internally, returns the URL for a tile given its coordinates. +Classes extending TileLayer can override this function to provide custom tile URL naming schemes.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    +
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    +
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    +
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    +
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    +
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    TileLayer.WMS

    Used to display WMS services as tile layers on the map. Extends TileLayer.

    + +
    +

    Usage example

    + +
    + + + + + +
    var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
    +    layers: 'nexrad-n0r-900913',
    +    format: 'image/png',
    +    transparent: true,
    +    attribution: "Weather data © 2012 IEM Nexrad"
    +});
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.tileLayer.wms(<String> baseUrl, <TileLayer.WMS options> options)Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
    + +
    + + +
    +

    Options

    + +
    + + + +
    If any custom options not documented here are used, they will be sent to the +WMS server as extra parameters in each request URL. This can be useful for +non-standard vendor WMS parameters.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    layersString + ''(required) Comma-separated list of WMS layers to show.
    stylesString + ''Comma-separated list of WMS styles.
    formatString + 'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
    transparentBoolean + falseIf true, the WMS service will return images with transparency.
    versionString + '1.1.1'Version of the WMS service to use
    crsCRS + nullCoordinate Reference System to use for the WMS requests, defaults to +map CRS. Don't change this if you're not sure what it means.
    uppercaseBoolean + falseIf true, WMS request parameter keys will be uppercase.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    minZoomNumber + 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber + 18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[] + 'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString + ''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber + 0The zoom number used in tile URLs will be offset with this value.
    tmsBoolean + falseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBoolean + falseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBoolean + falseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|String + falseWhether the crossOrigin attribute will be added to the tiles. +If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. +Refer to CORS Settings for valid String values.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tileSizeNumber|Point + 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber + 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean + (depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean + trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber + 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber + 1The explicit zIndex of the tile layer.
    boundsLatLngBounds + undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumber + undefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber + undefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
    noWrapBoolean + falseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with bounds to prevent requesting +tiles outside the CRS limits.
    paneString + 'tilePane'Map pane where the grid layer will be added.
    classNameString + ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber + 2When panning the map, keep this many rows and columns of tiles before unloading them.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loading + EventFired when the grid layer starts loading tiles.
    tileunload + TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart + TileEventFired when a tile is requested and starts loading.
    tileerror + TileErrorEventFired when there is an error loading a tile.
    tileload + TileEventFired when a tile loads.
    load + EventFired when the grid layer loaded all visible tiles.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setParams(<Object> params, <Boolean> noRedraw?)this

    Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true). +If the URL does not change, the layer will not be redrawn unless +the noRedraw parameter is set to false.

    +
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() +to return an <img> HTML element with the appropriate image URL given coords. The done +callback is called when the tile has been loaded.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    +
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    +
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    +
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    +
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    +
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    ImageOverlay

    Used to load and display a single image over specific bounds of the map. Extends Layer.

    + +
    +

    Usage example

    + +
    + + + + + +
    var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
    +    imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
    +L.imageOverlay(imageUrl, imageBounds).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.imageOverlay(<String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options?)Instantiates an image overlay object given the URL of the image and the +geographical bounds it is tied to.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    opacityNumber + 1.0The opacity of the image overlay.
    altString + ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean + falseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|String + falseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
    errorOverlayUrlString + ''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber + 1The explicit zIndex of the overlay layer.
    classNameString + ''A custom class name to assign to the image. Empty by default.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    bubblingMouseEventsBoolean + trueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    load + EventFired when the ImageOverlay layer has loaded its image
    error + EventFired when the ImageOverlay layer fails to load its image
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the layer.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown + MouseEventFired when the user pushes the mouse button on the layer.
    mouseup + MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover + MouseEventFired when the mouse enters the layer.
    mouseout + MouseEventFired when the mouse leaves the layer.
    contextmenu + MouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    +
    bringToFront()this

    Brings the layer to the top of all overlays.

    +
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    +
    setUrl(<String> url)this

    Changes the URL of the image.

    +
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    +
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    +
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    +
    getElement()HTMLElement

    Returns the instance of HTMLImageElement +used by this overlay.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    VideoOverlay

    Used to load and display a video player over specific bounds of the map. Extends ImageOverlay. +A video overlay uses the <video> +HTML5 element.

    + +
    +

    Usage example

    + +
    + + + + + +
    var videoUrl = 'https://www.mapbox.com/bites/00188/patricia_nasa.webm',
    +    videoBounds = [[ 32, -130], [ 13, -100]];
    +L.videoOverlay(videoUrl, videoBounds ).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.videoOverlay(<String|Array|HTMLVideoElement> video, <LatLngBounds> bounds, <VideoOverlay options> options?)Instantiates an image overlay object given the URL of the video (or array of URLs, or even a video element) and the +geographical bounds it is tied to.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    autoplayBoolean + trueWhether the video starts playing automatically when loaded.
    loopBoolean + trueWhether the video will loop back to the beginning when played.
    keepAspectRatioBoolean + trueWhether the video will save aspect ratio after the projection. +Relevant for supported browsers. Browser compatibility- https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    opacityNumber + 1.0The opacity of the image overlay.
    altString + ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean + falseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|String + falseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
    errorOverlayUrlString + ''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber + 1The explicit zIndex of the overlay layer.
    classNameString + ''A custom class name to assign to the image. Empty by default.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    bubblingMouseEventsBoolean + trueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + +
    EventDataDescription
    load + EventFired when the video has finished loading the first frame
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + +
    EventDataDescription
    error + EventFired when the ImageOverlay layer fails to load its image
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the layer.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown + MouseEventFired when the user pushes the mouse button on the layer.
    mouseup + MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover + MouseEventFired when the mouse enters the layer.
    mouseout + MouseEventFired when the mouse leaves the layer.
    contextmenu + MouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getElement()HTMLVideoElement

    Returns the instance of HTMLVideoElement +used by this overlay.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    +
    bringToFront()this

    Brings the layer to the top of all overlays.

    +
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    +
    setUrl(<String> url)this

    Changes the URL of the image.

    +
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    +
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    +
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    SVGOverlay

    Used to load, display and provide DOM access to an SVG file over specific bounds of the map. Extends ImageOverlay. +An SVG overlay uses the <svg> element.

    + +
    +

    Usage example

    + +
    + + + + + +
    var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
    +svgElement.setAttribute('xmlns', "http://www.w3.org/2000/svg");
    +svgElement.setAttribute('viewBox', "0 0 200 200");
    +svgElement.innerHTML = '<rect width="200" height="200"/><rect x="75" y="23" width="50" height="50" style="fill:red"/><rect x="75" y="123" width="50" height="50" style="fill:#0013ff"/>';
    +var svgElementBounds = [ [ 32, -130 ], [ 13, -100 ] ];
    +L.svgOverlay(svgElement, svgElementBounds).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.svgOverlay(<String|SVGElement> svg, <LatLngBounds> bounds, <SVGOverlay options> options?)Instantiates an image overlay object given an SVG element and the geographical bounds it is tied to. +A viewBox attribute is required on the SVG element to zoom in and out properly.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    opacityNumber + 1.0The opacity of the image overlay.
    altString + ''Text for the alt attribute of the image (useful for accessibility).
    interactiveBoolean + falseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|String + falseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
    errorOverlayUrlString + ''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber + 1The explicit zIndex of the overlay layer.
    classNameString + ''A custom class name to assign to the image. Empty by default.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    bubblingMouseEventsBoolean + trueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    load + EventFired when the ImageOverlay layer has loaded its image
    error + EventFired when the ImageOverlay layer fails to load its image
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the layer.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown + MouseEventFired when the user pushes the mouse button on the layer.
    mouseup + MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover + MouseEventFired when the mouse enters the layer.
    mouseout + MouseEventFired when the mouse leaves the layer.
    contextmenu + MouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getElement()SVGElement

    Returns the instance of SVGElement +used by this overlay.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    +
    bringToFront()this

    Brings the layer to the top of all overlays.

    +
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    +
    setUrl(<String> url)this

    Changes the URL of the image.

    +
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    +
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    +
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Path

    An abstract class that contains options and constants shared between vector +overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBoolean + trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString + '#3388ff'Stroke color
    weightNumber + 3Stroke width in pixels
    opacityNumber + 1.0Stroke opacity
    lineCapString + 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString + 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString + nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString + nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean + dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString + *Fill color. Defaults to the value of the color option
    fillOpacityNumber + 0.2Fill opacity.
    fillRuleString + 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean + trueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRenderer + Use this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameString + nullCustom class name set on an element. Only for SVG renderer.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBoolean + trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the layer.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown + MouseEventFired when the user pushes the mouse button on the layer.
    mouseup + MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover + MouseEventFired when the mouse enters the layer.
    mouseout + MouseEventFired when the mouse leaves the layer.
    contextmenu + MouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Polyline

    A class for drawing polyline overlays on a map. Extends Path.

    + +
    +

    Usage example

    + +
    + + + + + +
    // create a red polyline from an array of LatLng points
    +var latlngs = [
    +    [45.51, -122.68],
    +    [37.77, -122.43],
    +    [34.04, -118.2]
    +];
    +var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
    +// zoom the map to the polyline
    +map.fitBounds(polyline.getBounds());
    +
    +

    You can also pass a multi-dimensional array to represent a MultiPolyline shape:

    +
    // create a red polyline from an array of arrays of LatLng points
    +var latlngs = [
    +    [[45.51, -122.68],
    +     [37.77, -122.43],
    +     [34.04, -118.2]],
    +    [[40.78, -73.91],
    +     [41.83, -87.62],
    +     [32.76, -96.72]]
    +];
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.polyline(<LatLng[]> latlngs, <Polyline options> options?)Instantiates a polyline object given an array of geographical points and +optionally an options object. You can create a Polyline object with +multiple separate lines (MultiPolyline) by passing an array of arrays +of geographic points.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    smoothFactorNumber + 1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
    noClipBoolean + falseDisable polyline clipping.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBoolean + trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString + '#3388ff'Stroke color
    weightNumber + 3Stroke width in pixels
    opacityNumber + 1.0Stroke opacity
    lineCapString + 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString + 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString + nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString + nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean + dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString + *Fill color. Defaults to the value of the color option
    fillOpacityNumber + 0.2Fill opacity.
    fillRuleString + 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean + trueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRenderer + Use this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameString + nullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBoolean + trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the layer.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown + MouseEventFired when the user pushes the mouse button on the layer.
    mouseup + MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover + MouseEventFired when the mouse enters the layer.
    mouseout + MouseEventFired when the mouse leaves the layer.
    contextmenu + MouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

    +
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    +
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    +
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    +
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    +
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Polygon

    A class for drawing polygon overlays on a map. Extends Polyline. +Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

    + +
    +

    Usage example

    + +
    + + + + + +
    // create a red polygon from an array of LatLng points
    +var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
    +var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
    +// zoom the map to the polygon
    +map.fitBounds(polygon.getBounds());
    +
    +

    You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

    +
    var latlngs = [
    +  [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    +  [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    +];
    +
    +

    Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

    +
    var latlngs = [
    +  [ // first polygon
    +    [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    +    [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    +  ],
    +  [ // second polygon
    +    [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
    +  ]
    +];
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.polygon(<LatLng[]> latlngs, <Polyline options> options?)
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    smoothFactorNumber + 1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
    noClipBoolean + falseDisable polyline clipping.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBoolean + trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString + '#3388ff'Stroke color
    weightNumber + 3Stroke width in pixels
    opacityNumber + 1.0Stroke opacity
    lineCapString + 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString + 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString + nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString + nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean + dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString + *Fill color. Defaults to the value of the color option
    fillOpacityNumber + 0.2Fill opacity.
    fillRuleString + 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean + trueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRenderer + Use this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameString + nullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBoolean + trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the layer.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown + MouseEventFired when the user pushes the mouse button on the layer.
    mouseup + MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover + MouseEventFired when the mouse enters the layer.
    mouseout + MouseEventFired when the mouse leaves the layer.
    contextmenu + MouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    +
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    +
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    +
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    +
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Rectangle

    A class for drawing rectangle overlays on a map. Extends Polygon.

    + +
    +

    Usage example

    + +
    + + + + + +
    // define rectangle geographical bounds
    +var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
    +// create an orange rectangle
    +L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
    +// zoom the map to the rectangle bounds
    +map.fitBounds(bounds);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.rectangle(<LatLngBounds> latLngBounds, <Polyline options> options?)
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    smoothFactorNumber + 1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
    noClipBoolean + falseDisable polyline clipping.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBoolean + trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString + '#3388ff'Stroke color
    weightNumber + 3Stroke width in pixels
    opacityNumber + 1.0Stroke opacity
    lineCapString + 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString + 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString + nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString + nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean + dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString + *Fill color. Defaults to the value of the color option
    fillOpacityNumber + 0.2Fill opacity.
    fillRuleString + 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean + trueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRenderer + Use this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameString + nullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBoolean + trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the layer.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown + MouseEventFired when the user pushes the mouse button on the layer.
    mouseup + MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover + MouseEventFired when the mouse enters the layer.
    mouseout + MouseEventFired when the mouse leaves the layer.
    contextmenu + MouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setBounds(<LatLngBounds> latLngBounds)this

    Redraws the rectangle with the passed bounds.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    +
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    +
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    +
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    +
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    addLatLng(<LatLng> latlng)this

    Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Circle

    A class for drawing circle overlays on a map. Extends CircleMarker. +It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).

    + +
    +

    Usage example

    + +
    + + + + + +
    L.circle([50.5, 30.5], {radius: 200}).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.circle(<LatLng> latlng, <Circle options> options?)Instantiates a circle object given a geographical point, and an options object +which contains the circle radius.
    L.circle(<LatLng> latlng, <Number> radius, <Circle options> options?)Obsolete way of instantiating a circle, for compatibility with 0.7.x code. +Do not use in new applications or plugins.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    radiusNumber + Radius of the circle, in meters.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBoolean + trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString + '#3388ff'Stroke color
    weightNumber + 3Stroke width in pixels
    opacityNumber + 1.0Stroke opacity
    lineCapString + 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString + 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString + nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString + nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean + dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString + *Fill color. Defaults to the value of the color option
    fillOpacityNumber + 0.2Fill opacity.
    fillRuleString + 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean + trueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRenderer + Use this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameString + nullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBoolean + trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the layer.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown + MouseEventFired when the user pushes the mouse button on the layer.
    mouseup + MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover + MouseEventFired when the mouse enters the layer.
    mouseout + MouseEventFired when the mouse leaves the layer.
    contextmenu + MouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setRadius(<Number> radius)this

    Sets the radius of a circle. Units are in meters.

    +
    getRadius()Number

    Returns the current radius of a circle. Units are in meters.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    +
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    +
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    CircleMarker

    A circle of a fixed size with radius specified in pixels. Extends Path.

    + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.circleMarker(<LatLng> latlng, <CircleMarker options> options?)Instantiates a circle marker object given a geographical point, and an optional options object.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    radiusNumber + 10Radius of the circle marker, in pixels
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBoolean + trueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString + '#3388ff'Stroke color
    weightNumber + 3Stroke width in pixels
    opacityNumber + 1.0Stroke opacity
    lineCapString + 'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString + 'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayString + nullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetString + nullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBoolean + dependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString + *Fill color. Defaults to the value of the color option
    fillOpacityNumber + 0.2Fill opacity.
    fillRuleString + 'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBoolean + trueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRenderer + Use this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameString + nullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBoolean + trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the layer.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown + MouseEventFired when the user pushes the mouse button on the layer.
    mouseup + MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover + MouseEventFired when the mouse enters the layer.
    mouseout + MouseEventFired when the mouse leaves the layer.
    contextmenu + MouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    +
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    +
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    +
    setRadius(<Number> radius)this

    Sets the radius of a circle marker. Units are in pixels.

    +
    getRadius()Number

    Returns the current radius of the circle

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    SVG

    VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility +with old versions of Internet Explorer.

    +

    Allows vector layers to be displayed with SVG. +Inherits Renderer. +Due to technical limitations, SVG is not +available in all web browsers, notably Android 2.x and 3.x. +Although SVG is not available on IE7 and IE8, these browsers support +VML +(a now deprecated technology), and the SVG renderer will fall back to VML in +this case.

    + +
    +

    Usage example

    + +
    + + + + + +

    Use SVG by default for all paths in the map:

    +
    var map = L.map('map', {
    +    renderer: L.svg()
    +});
    +
    +

    Use a SVG renderer with extra padding for specific vector geometries:

    +
    var map = L.map('map');
    +var myRenderer = L.svg({ padding: 0.5 });
    +var line = L.polyline( coordinates, { renderer: myRenderer } );
    +var circle = L.circle( center, { renderer: myRenderer } );
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.svg(<Renderer options> options?)Creates a SVG renderer with the given options.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingNumber + 0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber + 0How much to extend click tolerance round a path/object on the map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + +
    EventDataDescription
    update + EventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Functions

    + +
    + + + +
    There are several static functions which can be called without instantiating L.SVG:
    + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    create(<String> name)SVGElementReturns a instance of SVGElement, +corresponding to the class name passed. For example, using 'line' will return +an instance of SVGLineElement.
    pointsToPath(<Point[]> rings, <Boolean> closed)StringGenerates a SVG path string for multiple rings, with each ring turning +into "M..L..L.." instructions
    + +
    + + +

    Canvas

    Allows vector layers to be displayed with <canvas>. +Inherits Renderer. +Due to technical limitations, Canvas is not +available in all web browsers, notably IE8, and overlapping geometries might +not display properly in some edge cases.

    + +
    +

    Usage example

    + +
    + + + + + +

    Use Canvas by default for all paths in the map:

    +
    var map = L.map('map', {
    +    renderer: L.canvas()
    +});
    +
    +

    Use a Canvas renderer with extra padding for specific vector geometries:

    +
    var map = L.map('map');
    +var myRenderer = L.canvas({ padding: 0.5 });
    +var line = L.polyline( coordinates, { renderer: myRenderer } );
    +var circle = L.circle( center, { renderer: myRenderer } );
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.canvas(<Renderer options> options?)Creates a Canvas renderer with the given options.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingNumber + 0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber + 0How much to extend click tolerance round a path/object on the map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + +
    EventDataDescription
    update + EventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    LayerGroup

    Used to group several layers and handle them as one. If you add it to the map, +any layers added or removed from the group will be added/removed on the map as +well. Extends Layer.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.layerGroup([marker1, marker2])
    +    .addLayer(polyline)
    +    .addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.layerGroup(<Layer[]> layers?, <Object> options?)Create a layer group, optionally given an initial set of layers and an options object.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    +
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    +
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    +
    clearLayers()this

    Removes all the layers from the group.

    +
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    +
    group.eachLayer(function (layer) {
    +    layer.bindPopup('Hello');
    +});
    +
    +
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    +
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    +
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    +
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    FeatureGroup

    Extended LayerGroup that makes it easier to do the same thing to all its member layers:

    +
      +
    • bindPopup binds a popup to all of the layers at once (likewise with bindTooltip)
    • +
    • Events are propagated to the FeatureGroup, so if the group has an event +handler, it will handle events from any of the layers. This includes mouse events +and custom events.
    • +
    • Has layeradd and layerremove events
    • +
    + +
    +

    Usage example

    + +
    + + + + + +
    L.featureGroup([marker1, marker2, polyline])
    +    .bindPopup('Hello world!')
    +    .on('click', function() { alert('Clicked on a member of the group!'); })
    +    .addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.featureGroup(<Layer[]> layers)Create a feature group, optionally given an initial set of layers.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    layeradd + LayerEventFired when a layer is added to this FeatureGroup
    layerremove + LayerEventFired when a layer is removed from this FeatureGroup
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setStyle(<Path options> style)this

    Sets the given path options to each layer of the group that has a setStyle method.

    +
    bringToFront()this

    Brings the layer group to the top of all other layers

    +
    bringToBack()this

    Brings the layer group to the back of all other layers

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    +
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    +
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    +
    clearLayers()this

    Removes all the layers from the group.

    +
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    +
    group.eachLayer(function (layer) {
    +    layer.bindPopup('Hello');
    +});
    +
    +
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    +
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    +
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    +
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    GeoJSON

    Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse +GeoJSON data and display it on the map. Extends FeatureGroup.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.geoJSON(data, {
    +    style: function (feature) {
    +        return {color: feature.properties.color};
    +    }
    +}).bindPopup(function (layer) {
    +    return layer.feature.properties.description;
    +}).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.geoJSON(<Object> geojson?, <GeoJSON options> options?)Creates a GeoJSON layer. Optionally accepts an object in +GeoJSON format to display on the map +(you can alternatively add it later with addData method) and an options object.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    pointToLayerFunction + *A Function defining how GeoJSON points spawn Leaflet layers. It is internally +called when data is added, passing the GeoJSON point feature and its LatLng. +The default is to spawn a default Marker: +
    function(geoJsonPoint, latlng) {
    +    return L.marker(latlng);
    +}
    +
    styleFunction + *A Function defining the Path options for styling GeoJSON lines and polygons, +called internally when data is added. +The default value is to not override any defaults: +
    function (geoJsonFeature) {
    +    return {}
    +}
    +
    onEachFeatureFunction + *A Function that will be called once for each created Feature, after it has +been created and styled. Useful for attaching events and popups to features. +The default is to do nothing with the newly created layers: +
    function (feature, layer) {}
    +
    filterFunction + *A Function that will be used to decide whether to include a feature or not. +The default is to include all features: +
    function (geoJsonFeature) {
    +    return true;
    +}
    +
    +

    Note: dynamically changing the filter option will have effect only on newly +added data. It will not re-evaluate already included features.

    coordsToLatLngFunction + *A Function that will be used for converting GeoJSON coordinates to LatLngs. +The default is the coordsToLatLng static method.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    layeradd + LayerEventFired when a layer is added to this FeatureGroup
    layerremove + LayerEventFired when a layer is removed from this FeatureGroup
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addData(data)this

    Adds a GeoJSON object to the layer.

    +
    resetStyle(layer)this

    Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.

    +
    setStyle(style)this

    Changes styles of GeoJSON vector layers with the given style function.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the layer group to the top of all other layers

    +
    bringToBack()this

    Brings the layer group to the back of all other layers

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    +
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    +
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    +
    clearLayers()this

    Removes all the layers from the group.

    +
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    +
    group.eachLayer(function (layer) {
    +    layer.bindPopup('Hello');
    +});
    +
    +
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    +
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    +
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    +
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Functions

    + +
    + + + +
    There are several static functions which can be called without instantiating L.GeoJSON:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    geometryToLayer(<Object> featureData, <GeoJSON options> options?)LayerCreates a Layer from a given GeoJSON feature. Can use a custom +pointToLayer and/or coordsToLatLng +functions if provided as options.
    coordsToLatLng(<Array> coords)LatLngCreates a LatLng object from an array of 2 numbers (longitude, latitude) +or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
    coordsToLatLngs(<Array> coords, <Number> levelsDeep?, <Function> coordsToLatLng?)ArrayCreates a multidimensional array of LatLngs from a GeoJSON coordinates array. +levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). +Can use a custom coordsToLatLng function.
    latLngToCoords(<LatLng> latlng, <Number> precision?)ArrayReverse of coordsToLatLng
    latLngsToCoords(<Array> latlngs, <Number> levelsDeep?, <Boolean> closed?)ArrayReverse of coordsToLatLngs +closed determines whether the first point should be appended to the end of the array to close the feature, only used when levelsDeep is 0. False by default.
    asFeature(<Object> geojson)ObjectNormalize GeoJSON geometries/features into GeoJSON features.
    + +
    + + +

    GridLayer

    Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas. +GridLayer can be extended to create a tiled grid of HTML elements like <canvas>, <img> or <div>. GridLayer will handle creating and animating these DOM elements for you.

    + +
    +

    Usage example

    + +
    + +

    Synchronous usage

    + + + +

    To create a custom layer, extend GridLayer and implement the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

    +
    var CanvasLayer = L.GridLayer.extend({
    +    createTile: function(coords){
    +        // create a <canvas> element for drawing
    +        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    +        // setup tile width and height according to the options
    +        var size = this.getTileSize();
    +        tile.width = size.x;
    +        tile.height = size.y;
    +        // get a canvas context and draw something on it using coords.x, coords.y and coords.z
    +        var ctx = tile.getContext('2d');
    +        // return the tile so it can be rendered on screen
    +        return tile;
    +    }
    +});
    +
    + + + +
    + +

    Asynchronous usage

    + + + +

    Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the done() callback.

    +
    var CanvasLayer = L.GridLayer.extend({
    +    createTile: function(coords, done){
    +        var error;
    +        // create a <canvas> element for drawing
    +        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    +        // setup tile width and height according to the options
    +        var size = this.getTileSize();
    +        tile.width = size.x;
    +        tile.height = size.y;
    +        // draw something asynchronously and pass the tile to the done() callback
    +        setTimeout(function() {
    +            done(error, tile);
    +        }, 1000);
    +        return tile;
    +    }
    +});
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
    + +
    + + +
    +

    Options

    + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tileSizeNumber|Point + 256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber + 1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean + (depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
    updateWhenZoomingBoolean + trueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber + 200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber + 1The explicit zIndex of the tile layer.
    boundsLatLngBounds + undefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    minZoomNumber + 0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber + undefinedThe maximum zoom level up to which this layer will be displayed (inclusive).
    maxNativeZoomNumber + undefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
    minNativeZoomNumber + undefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
    noWrapBoolean + falseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with bounds to prevent requesting +tiles outside the CRS limits.
    paneString + 'tilePane'Map pane where the grid layer will be added.
    classNameString + ''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber + 2When panning the map, keep this many rows and columns of tiles before unloading them.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loading + EventFired when the grid layer starts loading tiles.
    tileunload + TileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstart + TileEventFired when a tile is requested and starts loading.
    tileerror + TileErrorEventFired when there is an error loading a tile.
    tileload + TileEventFired when a tile loads.
    load + EventFired when the grid layer loaded all visible tiles.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    +
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    +
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    +
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    +
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    +
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    +
    + +
    + +

    Extension methods

    + +
    Layers extending GridLayer shall reimplement the following method.
    + + + + + + + + + + + + + +
    MethodReturnsDescription
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, must be overridden by classes extending GridLayer. +Returns the HTMLElement corresponding to the given coords. If the done callback +is specified, it must be called when the tile has finished loading and drawing.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    LatLng

    Represents a geographical point with a certain latitude and longitude.

    + +
    +

    Usage example

    + +
    + + + + + +
    var latlng = L.latLng(50.5, 30.5);
    +

    All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

    +
    map.panTo([50, 30]);
    +map.panTo({lon: 30, lat: 50});
    +map.panTo({lat: 50, lng: 30});
    +map.panTo(L.latLng(50, 30));
    +

    Note that LatLng does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.latLng(<Number> latitude, <Number> longitude, <Number> altitude?)Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
    L.latLng(<Array> coords)Expects an array of the form [Number, Number] or [Number, Number, Number] instead.
    L.latLng(<Object> coords)Expects an plain object of the form {lat: Number, lng: Number} or {lat: Number, lng: Number, alt: Number} instead.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    equals(<LatLng> otherLatLng, <Number> maxMargin?)Boolean

    Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

    +
    toString()String

    Returns a string representation of the point (for debugging purposes).

    +
    distanceTo(<LatLng> otherLatLng)Number

    Returns the distance (in meters) to the given LatLng calculated using the Spherical Law of Cosines.

    +
    wrap()LatLng

    Returns a new LatLng object with the longitude wrapped so it's always between -180 and +180 degrees.

    +
    toBounds(<Number> sizeInMeters)LatLngBounds

    Returns a new LatLngBounds object in which each boundary is sizeInMeters/2 meters apart from the LatLng.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    lat + NumberLatitude in degrees
    lng + NumberLongitude in degrees
    alt + NumberAltitude in meters (optional)
    + +
    + + +

    LatLngBounds

    Represents a rectangular geographical area on a map.

    + +
    +

    Usage example

    + +
    + + + + + +
    var corner1 = L.latLng(40.712, -74.227),
    +corner2 = L.latLng(40.774, -74.125),
    +bounds = L.latLngBounds(corner1, corner2);
    +
    +

    All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    +
    map.fitBounds([
    +    [40.712, -74.227],
    +    [40.774, -74.125]
    +]);
    +
    +

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range. +Note that LatLngBounds does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.latLngBounds(<LatLng> corner1, <LatLng> corner2)Creates a LatLngBounds object by defining two diagonally opposite corners of the rectangle.
    L.latLngBounds(<LatLng[]> latlngs)Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    extend(<LatLng> latlng)this

    Extend the bounds to contain the given point

    +
    extend(<LatLngBounds> otherBounds)this

    Extend the bounds to contain the given bounds

    +
    pad(<Number> bufferRatio)LatLngBounds

    Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. +For example, a ratio of 0.5 extends the bounds by 50% in each direction. +Negative values will retract the bounds.

    +
    getCenter()LatLng

    Returns the center point of the bounds.

    +
    getSouthWest()LatLng

    Returns the south-west point of the bounds.

    +
    getNorthEast()LatLng

    Returns the north-east point of the bounds.

    +
    getNorthWest()LatLng

    Returns the north-west point of the bounds.

    +
    getSouthEast()LatLng

    Returns the south-east point of the bounds.

    +
    getWest()Number

    Returns the west longitude of the bounds

    +
    getSouth()Number

    Returns the south latitude of the bounds

    +
    getEast()Number

    Returns the east longitude of the bounds

    +
    getNorth()Number

    Returns the north latitude of the bounds

    +
    contains(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    +
    contains(<LatLng> latlng)Boolean

    Returns true if the rectangle contains the given point.

    +
    intersects(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.

    +
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.

    +
    toBBoxString()String

    Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.

    +
    equals(<LatLngBounds> otherBounds, <Number> maxMargin?)Boolean

    Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting maxMargin to a small number.

    +
    isValid()Boolean

    Returns true if the bounds are properly initialized.

    +
    + +
    + + +

    Point

    Represents a point with x and y coordinates in pixels.

    + +
    +

    Usage example

    + +
    + + + + + +
    var point = L.point(200, 300);
    +
    +

    All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

    +
    map.panBy([200, 300]);
    +map.panBy(L.point(200, 300));
    +
    +

    Note that Point does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.point(<Number> x, <Number> y, <Boolean> round?)Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
    L.point(<Number[]> coords)Expects an array of the form [x, y] instead.
    L.point(<Object> coords)Expects a plain object of the form {x: Number, y: Number} instead.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    clone()Point

    Returns a copy of the current point.

    +
    add(<Point> otherPoint)Point

    Returns the result of addition of the current and the given points.

    +
    subtract(<Point> otherPoint)Point

    Returns the result of subtraction of the given point from the current.

    +
    divideBy(<Number> num)Point

    Returns the result of division of the current point by the given number.

    +
    multiplyBy(<Number> num)Point

    Returns the result of multiplication of the current point by the given number.

    +
    scaleBy(<Point> scale)Point

    Multiply each coordinate of the current point by each coordinate of +scale. In linear algebra terms, multiply the point by the +scaling matrix +defined by scale.

    +
    unscaleBy(<Point> scale)Point

    Inverse of scaleBy. Divide each coordinate of the current point by +each coordinate of scale.

    +
    round()Point

    Returns a copy of the current point with rounded coordinates.

    +
    floor()Point

    Returns a copy of the current point with floored coordinates (rounded down).

    +
    ceil()Point

    Returns a copy of the current point with ceiled coordinates (rounded up).

    +
    trunc()Point

    Returns a copy of the current point with truncated coordinates (rounded towards zero).

    +
    distanceTo(<Point> otherPoint)Number

    Returns the cartesian distance between the current and the given points.

    +
    equals(<Point> otherPoint)Boolean

    Returns true if the given point has the same coordinates.

    +
    contains(<Point> otherPoint)Boolean

    Returns true if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).

    +
    toString()String

    Returns a string representation of the point for debugging purposes.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    x + NumberThe x coordinate of the point
    y + NumberThe y coordinate of the point
    + +
    + + +

    Bounds

    Represents a rectangular area in pixel coordinates.

    + +
    +

    Usage example

    + +
    + + + + + +
    var p1 = L.point(10, 10),
    +p2 = L.point(40, 60),
    +bounds = L.bounds(p1, p2);
    +
    +

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    +
    otherBounds.intersects([[10, 10], [40, 60]]);
    +
    +

    Note that Bounds does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.bounds(<Point> corner1, <Point> corner2)Creates a Bounds object from two corners coordinate pairs.
    L.bounds(<Point[]> points)Creates a Bounds object from the given array of points.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    extend(<Point> point)this

    Extends the bounds to contain the given point.

    +
    getCenter(<Boolean> round?)Point

    Returns the center point of the bounds.

    +
    getBottomLeft()Point

    Returns the bottom-left point of the bounds.

    +
    getTopRight()Point

    Returns the top-right point of the bounds.

    +
    getTopLeft()Point

    Returns the top-left point of the bounds (i.e. this.min).

    +
    getBottomRight()Point

    Returns the bottom-right point of the bounds (i.e. this.max).

    +
    getSize()Point

    Returns the size of the given bounds

    +
    contains(<Bounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    +
    contains(<Point> point)Boolean

    Returns true if the rectangle contains the given point.

    +
    intersects(<Bounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds +intersect if they have at least one point in common.

    +
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds +overlap if their intersection is an area.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    min + PointThe top left corner of the rectangle.
    max + PointThe bottom right corner of the rectangle.
    + +
    + + +

    Icon

    Represents an icon to provide when creating a marker.

    + +
    +

    Usage example

    + +
    + + + + + +
    var myIcon = L.icon({
    +    iconUrl: 'my-icon.png',
    +    iconSize: [38, 95],
    +    iconAnchor: [22, 94],
    +    popupAnchor: [-3, -76],
    +    shadowUrl: 'my-icon-shadow.png',
    +    shadowSize: [68, 95],
    +    shadowAnchor: [22, 94]
    +});
    +L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    +
    +

    L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.icon(<Icon options> options)Creates an icon instance with the given options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    iconUrlString + null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString + nullThe URL to a retina sized version of the icon image (absolute or relative to your +script path). Used for Retina screen devices.
    iconSizePoint + nullSize of the icon image in pixels.
    iconAnchorPoint + nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon +will be aligned so that this point is at the marker's geographical location. Centered +by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint + [0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint + [0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlString + nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString + null
    shadowSizePoint + nullSize of the shadow image in pixels.
    shadowAnchorPoint + nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same +as iconAnchor if not specified).
    classNameString + ''A custom class name to assign to both icon and shadow images. Empty by default.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element +styled according to the options.

    +
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    +
    + +
    + + +
    + +
    +

    Icon.Default

    + +
    + + + +
    A trivial subclass of Icon, represents the icon to use in Markers when +no icon is specified. Points to the blue marker image distributed with Leaflet +releases. +In order to customize the default icon, just change the properties of L.Icon.Default.prototype.options +(which is a set of Icon options). +If you want to completely replace the default icon, override the +L.Marker.prototype.options.icon with your own icon instead.
    + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    imagePathString + Icon.Default will try to auto-detect the location of the +blue icon images. If you are placing these images in a non-standard +way, set this option to point to the right path.
    + +
    + + +

    DivIcon

    Represents a lightweight icon for markers that uses a simple <div> +element instead of an image. Inherits from Icon but ignores the iconUrl and shadow options.

    + +
    +

    Usage example

    + +
    + + + + + +
    var myIcon = L.divIcon({className: 'my-div-icon'});
    +// you can set .my-div-icon styles in CSS
    +L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    +
    +

    By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.divIcon(<DivIcon options> options)Creates a DivIcon instance with the given options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    htmlString|HTMLElement + ''Custom HTML code to put inside the div element, empty by default. Alternatively, +an instance of HTMLElement.
    bgPosPoint + [0, 0]Optional relative position of the background, in pixels
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    iconUrlString + null(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlString + nullThe URL to a retina sized version of the icon image (absolute or relative to your +script path). Used for Retina screen devices.
    iconSizePoint + nullSize of the icon image in pixels.
    iconAnchorPoint + nullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon +will be aligned so that this point is at the marker's geographical location. Centered +by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint + [0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint + [0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlString + nullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlString + null
    shadowSizePoint + nullSize of the shadow image in pixels.
    shadowAnchorPoint + nullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same +as iconAnchor if not specified).
    classNameString + ''A custom class name to assign to both icon and shadow images. Empty by default.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element +styled according to the options.

    +
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    +
    + +
    +
    +
    + +

    Control.Zoom

    A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

    + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.zoom(<Control.Zoom options> options)Creates a zoom control
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    zoomInTextString + '+'The text set on the 'zoom in' button.
    zoomInTitleString + 'Zoom in'The title set on the 'zoom in' button.
    zoomOutTextString + '&#x2212' +The text set on the 'zoom out' button.
    zoomOutTitleString + 'Zoom out'The title set on the 'zoom out' button.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString + 'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Control.Attribution

    The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with the getAttribution method automatically. Extends Control.

    + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.attribution(<Control.Attribution options> options)Creates an attribution control.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    prefixString + 'Leaflet'The HTML text shown before the attributions. Pass false to disable.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString + 'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setPrefix(<String> prefix)this

    Sets the text before the attributions.

    +
    addAttribution(<String> text)this

    Adds an attribution text (e.g. 'Vector data &copy; Mapbox').

    +
    removeAttribution(<String> text)this

    Removes an attribution text.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Control.Layers

    The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

    + +
    +

    Usage example

    + +
    + + + + + +
    var baseLayers = {
    +    "Mapbox": mapbox,
    +    "OpenStreetMap": osm
    +};
    +var overlays = {
    +    "Marker": marker,
    +    "Roads": roadsLayer
    +};
    +L.control.layers(baseLayers, overlays).addTo(map);
    +
    +

    The baseLayers and overlays parameters are object literals with layer names as keys and Layer objects as values:

    +
    {
    +    "<someName1>": layer1,
    +    "<someName2>": layer2
    +}
    +
    +

    The layer names can contain HTML, which allows you to add additional styling to the items:

    +
    {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.layers(<Object> baselayers?, <Object> overlays?, <Control.Layers options> options?)Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    collapsedBoolean + trueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
    autoZIndexBoolean + trueIf true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
    hideSingleBaseBoolean + falseIf true, the base layers in the control will be hidden when there is only one.
    sortLayersBoolean + falseWhether to sort the layers. When false, layers will keep the order +in which they were added to the control.
    sortFunctionFunction + *A compare function +that will be used for sorting the layers, when sortLayers is true. +The function receives both the L.Layer instances and their names, as in +sortFunction(layerA, layerB, nameA, nameB). +By default, it sorts layers alphabetically by their name.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString + 'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addBaseLayer(<Layer> layer, <String> name)this

    Adds a base layer (radio button entry) with the given name to the control.

    +
    addOverlay(<Layer> layer, <String> name)this

    Adds an overlay (checkbox entry) with the given name to the control.

    +
    removeLayer(<Layer> layer)this

    Remove the given layer from the control.

    +
    expand()this

    Expand the control container if collapsed.

    +
    collapse()this

    Collapse the control container if expanded.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Control.Scale

    A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends Control.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.control.scale().addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.scale(<Control.Scale options> options?)Creates an scale control with the given options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    maxWidthNumber + 100Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
    metricBoolean + TrueWhether to show the metric scale line (m/km).
    imperialBoolean + TrueWhether to show the imperial scale line (mi/ft).
    updateWhenIdleBoolean + falseIf true, the control is updated on moveend, otherwise it's always up-to-date (updated on move).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString + 'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Browser

    A namespace with static properties for browser/feature detection used by Leaflet internally.

    + +
    +

    Usage example

    + +
    + + + + + +
    if (L.Browser.ielt9) {
    +  alert('Upgrade your browser, dude!');
    +}
    +
    + + + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    ie + Booleantrue for all Internet Explorer versions (not Edge).
    ielt9 + Booleantrue for Internet Explorer versions less than 9.
    edge + Booleantrue for the Edge web browser.
    webkit + Booleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
    android + Booleantrue for any browser running on an Android platform.
    android23 + Booleantrue for browsers running on Android 2 or Android 3.
    androidStock + Booleantrue for the Android stock browser (i.e. not Chrome)
    opera + Booleantrue for the Opera browser
    chrome + Booleantrue for the Chrome browser.
    gecko + Booleantrue for gecko-based browsers like Firefox.
    safari + Booleantrue for the Safari browser.
    opera12 + Booleantrue for the Opera browser supporting CSS transforms (version 12 or later).
    win + Booleantrue when the browser is running in a Windows platform
    ie3d + Booleantrue for all Internet Explorer versions supporting CSS transforms.
    webkit3d + Booleantrue for webkit-based browsers supporting CSS transforms.
    gecko3d + Booleantrue for gecko-based browsers supporting CSS transforms.
    any3d + Booleantrue for all browsers supporting CSS transforms.
    mobile + Booleantrue for all browsers running in a mobile device.
    mobileWebkit + Booleantrue for all webkit-based browsers in a mobile device.
    mobileWebkit3d + Booleantrue for all webkit-based browsers in a mobile device supporting CSS transforms.
    msPointer + Booleantrue for browsers implementing the Microsoft touch events model (notably IE10).
    pointer + Booleantrue for all browsers supporting pointer events.
    touch + Booleantrue for all browsers supporting touch events. +This does not necessarily mean that the browser is running in a computer with +a touchscreen, it only means that the browser is capable of understanding +touch events.
    mobileOpera + Booleantrue for the Opera browser in a mobile device.
    mobileGecko + Booleantrue for gecko-based browsers running in a mobile device.
    retina + Booleantrue for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%.
    canvas + Booleantrue when the browser supports <canvas>.
    svg + Booleantrue when the browser supports SVG.
    vml + Booleantrue if the browser supports VML.
    + +
    + + +

    Util

    Various utility functions, used by Leaflet internally.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    extend(<Object> dest, <Object> src?)ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
    create(<Object> proto, <Object> properties?)ObjectCompatibility polyfill for Object.create
    bind(<Function> fn, )FunctionReturns a new function bound to the arguments passed, like Function.prototype.bind. +Has a L.bind() shortcut.
    stamp(<Object> obj)NumberReturns the unique ID of an object, assigning it one if it doesn't have it.
    throttle(<Function> fn, <Number> time, <Object> context)FunctionReturns a function which executes function fn with the given scope context +(so that the this keyword refers to context inside fn's code). The function +fn will be called no more than one time per given amount of time. The arguments +received by the bound function will be any arguments passed when binding the +function, followed by any arguments passed when invoking the bound function. +Has an L.throttle shortcut.
    wrapNum(<Number> num, <Number[]> range, <Boolean> includeMax?)NumberReturns the number num modulo range in such a way so it lies within +range[0] and range[1]. The returned value will be always smaller than +range[1] unless includeMax is set to true.
    falseFn()FunctionReturns a function which always returns false.
    formatNum(<Number> num, <Number> digits?)NumberReturns the number num rounded to digits decimals, or to 6 decimals by default.
    trim(<String> str)StringCompatibility polyfill for String.prototype.trim
    splitWords(<String> str)String[]Trims and splits the string on whitespace and returns the array of parts.
    setOptions(<Object> obj, <Object> options)ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.
    getParamString(<Object> obj, <String> existingUrl?, <Boolean> uppercase?)StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} +translates to '?a=foo&b=bar'. If existingUrl is set, the parameters will +be appended at the end. If uppercase is true, the parameter names will +be uppercased (e.g. '?A=foo&B=bar')
    template(<String> str, <Object> data)StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' +and a data object like {a: 'foo', b: 'bar'}, returns evaluated string +('Hello foo, bar'). You can also specify functions instead of strings for +data values — they will be evaluated passing data as an argument.
    isArray(obj)BooleanCompatibility polyfill for Array.isArray
    indexOf(<Array> array, <Object> el)NumberCompatibility polyfill for Array.prototype.indexOf
    requestAnimFrame(<Function> fn, <Object> context?, <Boolean> immediate?)NumberSchedules fn to be executed when the browser repaints. fn is bound to +context if given. When immediate is set, fn is called immediately if +the browser doesn't have native support for +window.requestAnimationFrame, +otherwise it's delayed. Returns a request ID that can be used to cancel the request.
    cancelAnimFrame(<Number> id)undefinedCancels a previous requestAnimFrame. See also window.cancelAnimationFrame.
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    lastId + NumberLast unique ID used by stamp()
    emptyImageUrl + StringData URI string containing a base64-encoded empty GIF image. +Used as a hack to free memory from unused images on WebKit-powered +mobile devices (by setting image src to this string).
    + +
    + + +

    Transformation

    Represents an affine transformation: a set of coefficients a, b, c, d +for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing +the reverse. Used by Leaflet in its projections code.

    + +
    +

    Usage example

    + +
    + + + + + +
    var transformation = L.transformation(2, 5, -1, 10),
    +    p = L.point(1, 2),
    +    p2 = transformation.transform(p), //  L.point(7, 8)
    +    p3 = transformation.untransform(p2); //  L.point(1, 2)
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.transformation(<Number> a, <Number> b, <Number> c, <Number> d)Instantiates a Transformation object with the given coefficients.
    L.transformation(<Array> coefficients)Expects an coefficients array of the form +[a: Number, b: Number, c: Number, d: Number].
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    transform(<Point> point, <Number> scale?)Point

    Returns a transformed point, optionally multiplied by the given scale. +Only accepts actual L.Point instances, not arrays.

    +
    untransform(<Point> point, <Number> scale?)Point

    Returns the reverse transformation of the given point, optionally divided +by the given scale. Only accepts actual L.Point instances, not arrays.

    +
    + +
    + + +

    LineUtil

    Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    simplify(<Point[]> points, <Number> tolerance)Point[]Dramatically reduces the number of points in a polyline while retaining +its shape and returns a new array of simplified points, using the +Douglas-Peucker algorithm. +Used for a huge performance boost when processing/displaying Leaflet polylines for +each zoom level and also reducing visual noise. tolerance affects the amount of +simplification (lesser value means higher quality but slower and with more points). +Also released as a separated micro-library Simplify.js.
    pointToSegmentDistance(<Point> p, <Point> p1, <Point> p2)NumberReturns the distance between point p and segment p1 to p2.
    closestPointOnSegment(<Point> p, <Point> p1, <Point> p2)NumberReturns the closest point from a point p on a segment p1 to p2.
    clipSegment(<Point> a, <Point> b, <Bounds> bounds, <Boolean> useLastCode?, <Boolean> round?)Point[]|BooleanClips the segment a to b by rectangular bounds with the +Cohen-Sutherland algorithm +(modifying the segment points directly!). Used by Leaflet to only show polyline +points that are on the screen or near, increasing performance.
    isFlat(<LatLng[]> latlngs)BooleanReturns true if latlngs is a flat array, false is nested.
    + +
    + + +

    PolyUtil

    Various utility functions for polygon geometries.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    clipPolygon(<Point[]> points, <Bounds> bounds, <Boolean> round?)Point[]Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgman algorithm). +Used by Leaflet to only show polygon points that are on the screen or near, increasing +performance. Note that polygon points needs different algorithm for clipping +than polyline, so there's a separate method for it.
    + +
    + + +

    DomEvent

    Utility functions to work with the DOM events, used by Leaflet internally.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    on(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisAdds a listener function (fn) to a particular DOM event type of the +element el. You can optionally specify the context of the listener +(object the this keyword will point to). You can also pass several +space-separated types (e.g. 'click dblclick').
    on(<HTMLElement> el, <Object> eventMap, <Object> context?)thisAdds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    off(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisRemoves a previously added listener function. +Note that if you passed a custom context to on, you must pass the same +context to off in order to remove the listener.
    off(<HTMLElement> el, <Object> eventMap, <Object> context?)thisRemoves a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    stopPropagation(<DOMEvent> ev)thisStop the given event from propagation to parent elements. Used inside the listener functions: +
    L.DomEvent.on(div, 'click', function (ev) {
    +    L.DomEvent.stopPropagation(ev);
    +});
    +
    disableScrollPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'mousewheel' events (plus browser variants).
    disableClickPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'click', 'doubleclick', +'mousedown' and 'touchstart' events (plus browser variants).
    preventDefault(<DOMEvent> ev)thisPrevents the default action of the DOM Event ev from happening (such as +following a link in the href of the a element, or doing a POST request +with page reload when a <form> is submitted). +Use it inside listener functions.
    stop(<DOMEvent> ev)thisDoes stopPropagation and preventDefault at the same time.
    getMousePosition(<DOMEvent> ev, <HTMLElement> container?)PointGets normalized mouse position from a DOM event relative to the +container (border excluded) or to the whole page if not specified.
    getWheelDelta(<DOMEvent> ev)NumberGets normalized wheel delta from a mousewheel DOM event, in vertical +pixels scrolled (negative if scrolling down). +Events from pointing devices without precise scrolling are mapped to +a best guess of 60 pixels.
    addListener()thisAlias to L.DomEvent.on
    removeListener()thisAlias to L.DomEvent.off
    + +
    + + +

    DomUtil

    Utility functions to work with the DOM +tree, used by Leaflet internally. +Most functions expecting or returning a HTMLElement also work for +SVG elements. The only difference is that classes refer to CSS classes +in HTML and SVG classes in SVG.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    get(<String|HTMLElement> id)HTMLElementReturns an element given its DOM id, or returns the element itself +if it was passed directly.
    getStyle(<HTMLElement> el, <String> styleAttrib)StringReturns the value for a certain style attribute on an element, +including computed values or values set through CSS.
    create(<String> tagName, <String> className?, <HTMLElement> container?)HTMLElementCreates an HTML element with tagName, sets its class to className, and optionally appends it to container element.
    remove(<HTMLElement> el)Removes el from its parent element
    empty(<HTMLElement> el)Removes all of el's children elements from el
    toFront(<HTMLElement> el)Makes el the last child of its parent, so it renders in front of the other children.
    toBack(<HTMLElement> el)Makes el the first child of its parent, so it renders behind the other children.
    hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element's class attribute contains name.
    addClass(<HTMLElement> el, <String> name)Adds name to the element's class attribute.
    removeClass(<HTMLElement> el, <String> name)Removes name from the element's class attribute.
    setClass(<HTMLElement> el, <String> name)Sets the element's class.
    getClass(<HTMLElement> el)StringReturns the element's class.
    setOpacity(<HTMLElement> el, <Number> opacity)Set the opacity of an element (including old IE support). +opacity must be a number from 0 to 1.
    testProp(<String[]> props)String|falseGoes through the array of style names and returns the first name +that is a valid style name for an element. If no such name is found, +it returns false. Useful for vendor-prefixed styles like transform.
    setTransform(<HTMLElement> el, <Point> offset, <Number> scale?)Resets the 3D CSS transform of el so it is translated by offset pixels +and optionally scaled by scale. Does not have an effect if the +browser doesn't support 3D CSS transforms.
    setPosition(<HTMLElement> el, <Point> position)Sets the position of el to coordinates specified by position, +using CSS translate or top/left positioning depending on the browser +(used by Leaflet internally to position its layers).
    getPosition(<HTMLElement> el)PointReturns the coordinates of an element previously positioned with setPosition.
    disableTextSelection()Prevents the user from generating selectstart DOM events, usually generated +when the user drags the mouse through a page with text. Used internally +by Leaflet to override the behaviour of any click-and-drag interaction on +the map. Affects drag interactions on the whole document.
    enableTextSelection()Cancels the effects of a previous L.DomUtil.disableTextSelection.
    disableImageDrag()As L.DomUtil.disableTextSelection, but +for dragstart DOM events, usually generated when the user drags an image.
    enableImageDrag()Cancels the effects of a previous L.DomUtil.disableImageDrag.
    preventOutline(<HTMLElement> el)Makes the outline +of the element el invisible. Used internally by Leaflet to prevent +focusable elements from displaying an outline when the user performs a +drag interaction on them.
    restoreOutline()Cancels the effects of a previous L.DomUtil.preventOutline.
    getSizedParentNode(<HTMLElement> el)HTMLElementFinds the closest parent node which size (width and height) is not null.
    getScale(<HTMLElement> el)ObjectComputes the CSS scale currently applied on the element. +Returns an object with x and y members as horizontal and vertical scales respectively, +and boundingClientRect as the result of getBoundingClientRect().
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    TRANSFORM + StringVendor-prefixed transform style name (e.g. 'webkitTransform' for WebKit).
    TRANSITION + StringVendor-prefixed transition style name.
    TRANSITION_END + StringVendor-prefixed transitionend event name.
    + +
    + + +

    PosAnimation

    Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

    + +
    +

    Usage example

    + +
    + + + + + +
    var fx = new L.PosAnimation();
    +fx.run(el, [300, 500], 0.5);
    +
    + + + +
    + + +
    +

    Constructor

    + +
    + + + + + + + + + + + + + + +
    ConstructorDescription
    L.PosAnimation()Creates a PosAnimation object.
    + + +
    + + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    start + EventFired when the animation starts
    step + EventFired continuously during the animation.
    end + EventFired when the animation ends.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    run(<HTMLElement> el, <Point> newPos, <Number> duration?, <Number> easeLinearity?)

    Run an animation of a given element to a new position, optionally setting +duration in seconds (0.25 by default) and easing linearity factor (3rd +argument of the cubic bezier curve, +0.5 by default).

    +
    stop()

    Stops the animation (if currently running).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Draggable

    A class for making DOM elements draggable (including touch support). +Used internally for map and marker dragging. Only works for elements +that were positioned with L.DomUtil.setPosition.

    + +
    +

    Usage example

    + +
    + + + + + +
    var draggable = new L.Draggable(elementToDrag);
    +draggable.enable();
    +
    + + + +
    + + +
    +

    Constructor

    + +
    + + + + + + + + + + + + + + +
    ConstructorDescription
    L.Draggable(<HTMLElement> el, <HTMLElement> dragHandle?, <Boolean> preventOutline?, <Draggable options> options?)Creates a Draggable object for moving el when you start dragging the dragHandle element (equals el itself by default).
    + + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    clickToleranceNumber + 3The max number of pixels a user can shift the mouse pointer during a click +for it to be considered a valid click (as opposed to a mouse drag).
    + +
    + + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    down + EventFired when a drag is about to start.
    dragstart + EventFired when a drag starts
    predrag + EventFired continuously during dragging before each corresponding +update of the element's position.
    drag + EventFired continuously during dragging.
    dragend + DragEndEventFired when the drag ends.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    enable()

    Enables the dragging ability

    +
    disable()

    Disables the dragging ability

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Class

    L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here. +In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

    + +
    +

    Usage example

    + +
    + + + + + +
    var MyClass = L.Class.extend({
    +initialize: function (greeter) {
    +    this.greeter = greeter;
    +    // class constructor
    +},
    +greet: function (name) {
    +    alert(this.greeter + ', ' + name)
    +    }
    +});
    +// create instance of MyClass, passing "Hello" to the constructor
    +var a = new MyClass("Hello");
    +// call greet method, alerting "Hello, World"
    +a.greet("World");
    +
    + + + +
    + +

    Class Factories

    + + + +

    You may have noticed that Leaflet objects are created without using +the new keyword. This is achieved by complementing each class with a +lowercase factory method:

    +
    new L.Map('map'); // becomes:
    +L.map('map');
    +
    +

    The factories are implemented very easily, and you can do this for your own classes:

    +
    L.map = function (id, options) {
    +    return new L.Map(id, options);
    +};
    +
    + + + +
    + +

    Inheritance

    + + + +

    You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

    +
    var MyChildClass = MyClass.extend({
    +    // ... new properties and methods
    +});
    +
    +

    This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

    +
    var a = new MyChildClass();
    +a instanceof MyChildClass; // true
    +a instanceof MyClass; // true
    +
    +

    You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

    +
    var MyChildClass = MyClass.extend({
    +    initialize: function () {
    +        MyClass.prototype.initialize.call(this, "Yo");
    +    },
    +    greet: function (name) {
    +        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
    +    }
    +});
    +var a = new MyChildClass();
    +a.greet('Jason'); // alerts "Yo, bro Jason!"
    +
    + + +
    + +

    Options

    + + + +

    options is a special property that unlike other objects that you pass +to extend will be merged with the parent one instead of overriding it +completely, which makes managing configuration of objects and default +values convenient:

    +
    var MyClass = L.Class.extend({
    +    options: {
    +        myOption1: 'foo',
    +        myOption2: 'bar'
    +    }
    +});
    +var MyChildClass = MyClass.extend({
    +    options: {
    +        myOption1: 'baz',
    +        myOption3: 5
    +    }
    +});
    +var a = new MyChildClass();
    +a.options.myOption1; // 'baz'
    +a.options.myOption2; // 'bar'
    +a.options.myOption3; // 5
    +
    +

    There's also L.Util.setOptions, a method for +conveniently merging options passed to constructor with the defaults +defines in the class:

    +
    var MyClass = L.Class.extend({
    +    options: {
    +        foo: 'bar',
    +        bla: 5
    +    },
    +    initialize: function (options) {
    +        L.Util.setOptions(this, options);
    +        ...
    +    }
    +});
    +var a = new MyClass({bla: 10});
    +a.options; // {foo: 'bar', bla: 10}
    +
    +

    Note that the options object allows any keys, not just +the options defined by the class and its base classes. +This means you can use the options object to store +application specific information, as long as you avoid +keys that are already used by the class in question.

    + + + +
    + +

    Includes

    + + + +

    includes is a special class property that merges all specified objects into the class (such objects are called mixins).

    +
     var MyMixin = {
    +    foo: function () { ... },
    +    bar: 5
    +};
    +var MyClass = L.Class.extend({
    +    includes: MyMixin
    +});
    +var a = new MyClass();
    +a.foo();
    +
    +

    You can also do such includes in runtime with the include method:

    +
    MyClass.include(MyMixin);
    +
    +

    statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

    +
    var MyClass = L.Class.extend({
    +    statics: {
    +        FOO: 'bar',
    +        BLA: 5
    +    }
    +});
    +MyClass.FOO; // 'bar'
    +
    + + + +
    + +

    Constructor hooks

    + + + +

    If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

    +
    MyClass.addInitHook(function () {
    +    // ... do something in constructor additionally
    +    // e.g. add event listeners, set custom properties etc.
    +});
    +
    +

    You can also use the following shortcut when you just need to make one additional method call:

    +
    MyClass.addInitHook('methodName', arg1, arg2, …);
    +
    + + + +
    + + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    extend(<Object> props)FunctionExtends the current class given the properties to be included. +Returns a Javascript function that is a class constructor (to be called with new).
    include(<Object> properties)thisIncludes a mixin into the current class.
    mergeOptions(<Object> options)thisMerges options into the defaults of the class.
    addInitHook(<Function> fn)thisAdds a constructor hook to the class.
    + +
    + + +

    Evented

    A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

    + +
    +

    Usage example

    + +
    + + + + + +
    map.on('click', function(e) {
    +    alert(e.latlng);
    +} );
    +
    +

    Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

    +
    function onClick(e) { ... }
    +map.on('click', onClick);
    +map.off('click', onClick);
    +
    + + + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    + + +

    Layer

    A set of methods from the Layer base class that all Leaflet layers use. +Inherits all methods, options and events from L.Evented.

    + +
    +

    Usage example

    + +
    + + + + + +
    var layer = L.marker(latlng).addTo(map);
    +layer.addTo(map);
    +layer.remove();
    +
    + + + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    + + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    + +

    Popup events

    + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    + +

    Tooltip events

    + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    + + +
    +

    Methods

    + +
    + + + +
    Classes extending L.Layer will inherit the following methods:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    + +

    Extension methods

    + +
    Every layer should extend from L.Layer and (re-)implement the following methods.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    onAdd(<Map> map)this

    Should contain code that creates DOM elements for the layer, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).

    +
    onRemove(<Map> map)this

    Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).

    +
    getEvents()Object

    This optional method should return an object like { viewreset: this._reset } for addEventListener. The event handlers in this object will be automatically added and removed from the map with your layer.

    +
    getAttribution()String

    This optional method should return a string containing HTML to be shown on the Attribution control whenever the layer is visible.

    +
    beforeAdd(<Map> map)this

    Optional method. Called on map.addLayer(layer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.

    +
    + +
    + +

    Popup methods

    + +
    All layers share a set of methods convenient for binding popups to it. +
    var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
    +layer.openPopup();
    +layer.closePopup();
    +
    +

    Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    + +

    Tooltip methods

    + +
    All layers share a set of methods convenient for binding tooltips to it. +
    var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
    +layer.openTooltip();
    +layer.closeTooltip();
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Interactive layer

    Some Layers can be made interactive - when the user interacts +with such a layer, mouse events like click and mouseover can be handled. +Use the event handling methods to handle these events.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBoolean + trueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    bubblingMouseEventsBoolean + trueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + +

    Mouse events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    click + MouseEventFired when the user clicks (or taps) the layer.
    dblclick + MouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedown + MouseEventFired when the user pushes the mouse button on the layer.
    mouseup + MouseEventFired when the user releases the mouse button pushed on the layer.
    mouseover + MouseEventFired when the mouse enters the layer.
    mouseout + MouseEventFired when the mouse leaves the layer.
    contextmenu + MouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Control

    L.Control is a base class for implementing map controls. Handles positioning. +All other controls extend from this class.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString + 'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    + + +
    +

    Methods

    + +
    + + + +
    Classes extending L.Control will inherit the following methods:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    + +

    Extension methods

    + +
    Every control should extend from L.Control and (re-)implement the following methods.
    + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    onAdd(<Map> map)HTMLElement

    Should return the container DOM element for the control and add listeners on relevant map events. Called on control.addTo(map).

    +
    onRemove(<Map> map)

    Optional method. Should contain all clean up code that removes the listeners previously added in onAdd. Called on control.remove().

    +
    + +
    + + +

    Handler

    Abstract class for map interaction handlers

    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    enable()this

    Enables the handler

    +
    disable()this

    Disables the handler

    +
    enabled()Boolean

    Returns true if the handler is enabled

    +
    + +
    + +

    Extension methods

    + +
    Classes inheriting from Handler must implement the two following methods:
    + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addHooks()

    Called when the handler is enabled, should add event hooks.

    +
    removeHooks()

    Called when the handler is disabled, should remove the event hooks added previously.

    +
    + +
    + + +
    +

    Functions

    + +
    + +

    There is static function which can be called without instantiating L.Handler:

    + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    addTo(<Map> map, <String> name)thisAdds a new Handler to the given map with the given name.
    + +
    + + +

    Projection

    An object with methods for projecting geographical coordinates of the world onto +a flat surface (and back). See Map projection.

    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    project(<LatLng> latlng)Point

    Projects geographical coordinates into a 2D point. +Only accepts actual L.LatLng instances, not arrays.

    +
    unproject(<Point> point)LatLng

    The inverse of project. Projects a 2D point into a geographical location. +Only accepts actual L.Point instances, not arrays. +Note that the projection instances do not inherit from Leaflet's Class object, +and can't be instantiated. Also, new classes can't inherit from them, +and methods can't be added to them with the include function.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    bounds + BoundsThe bounds (specified in CRS units) where the projection is valid
    + +
    + + +
    +

    Defined projections

    + +
    + + + +
    Leaflet comes with a set of already defined Projections out of the box:
    + + + + + + + + + + + + + + + + + + + +
    ProjectionDescription
    L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, +mostly used by GIS enthusiasts. Directly maps x as longitude, and y as +latitude. Also suitable for flat worlds, e.g. game maps. Used by the +EPSG:4326 and Simple CRS.
    L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS.
    L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, +used by almost all free and commercial tile providers. Assumes that Earth is +a sphere. Used by the EPSG:3857 CRS.
    + +
    + + +

    CRS

    +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    latLngToPoint(<LatLng> latlng, <Number> zoom)Point

    Projects geographical coordinates into pixel coordinates for a given zoom.

    +
    pointToLatLng(<Point> point, <Number> zoom)LatLng

    The inverse of latLngToPoint. Projects pixel coordinates on a given +zoom into geographical coordinates.

    +
    project(<LatLng> latlng)Point

    Projects geographical coordinates into coordinates in units accepted for +this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).

    +
    unproject(<Point> point)LatLng

    Given a projected coordinate returns the corresponding LatLng. +The inverse of project.

    +
    scale(<Number> zoom)Number

    Returns the scale used when transforming projected coordinates into +pixel coordinates for a particular zoom. For example, it returns +256 * 2^zoom for Mercator-based CRS.

    +
    zoom(<Number> scale)Number

    Inverse of scale(), returns the zoom level corresponding to a scale +factor of scale.

    +
    getProjectedBounds(<Number> zoom)Bounds

    Returns the projection's bounds scaled and transformed for the provided zoom.

    +
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates.

    +
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the +CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds.

    +
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring +that its center is within the CRS's bounds. +Only accepts actual L.LatLngBounds instances, not arrays.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    code + StringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857')
    wrapLng + Number[]An array of two numbers defining whether the longitude (horizontal) coordinate +axis wraps around a given range and how. Defaults to [-180, 180] in most +geographical CRSs. If undefined, the longitude axis does not wrap around.
    wrapLat + Number[]Like wrapLng, but for the latitude (vertical) axis.
    infinite + BooleanIf true, the coordinate space will be unbounded (infinite in both axes)
    + +
    + + +
    +

    Defined CRSs

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CRSDescription
    L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
    L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial +tile providers. Uses Spherical Mercator projection. Set in by default in +Map's crs option.
    L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. +Leaflet 1.0.x complies with the TMS coordinate scheme for EPSG:4326, +which is a breaking change from 0.7.x behaviour. If you are using a TileLayer +with this CRS, ensure that there are two 256x256 pixel tiles covering the +whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), +or (-180,-90) for TileLayers with the tms option set.
    L.CRS.EarthServes as the base for CRS that are global such that they cover the earth. +Can only be used as the base for other CRS and cannot be used directly, +since it does not have a code, projection or transformation. distance() returns +meters.
    L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. +May be used for maps of flat surfaces (e.g. game maps). Note that the y +axis should still be inverted (going from bottom to top). distance() returns +simple euclidean distance.
    L.CRS.BaseObject that defines coordinate reference systems for projecting +geographical points into pixel (screen) coordinates and back (and to +coordinates in other units for WMS services). See +spatial reference system. +Leaflet defines the most usual CRSs by default. If you want to use a +CRS not defined by default, take a look at the +Proj4Leaflet plugin. +Note that the CRS instances do not inherit from Leaflet's Class object, +and can't be instantiated. Also, new classes can't inherit from them, +and methods can't be added to them with the include function.
    + +
    + + +

    Renderer

    Base class for vector renderer implementations (SVG, Canvas). Handles the +DOM container of the renderer, its bounds, and its zoom animation. +A Renderer works as an implicit layer group for all Paths - the renderer +itself can be added or removed to the map. All paths use a renderer, which can +be implicit (the map will decide the type of renderer and use it automatically) +or explicit (using the renderer option of the path). +Do not use this class directly, use SVG and Canvas instead.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingNumber + 0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber + 0How much to extend click tolerance round a path/object on the map
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString + 'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + +
    EventDataDescription
    update + EventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Event objects

    Whenever a class inheriting from Evented fires an event, a listener function +will be called with an event argument, which is a plain object containing +information about the event. For example:

    +
    map.on('click', function(ev) {
    +    alert(ev.latlng); // ev is an event object (MouseEvent in this case)
    +});
    +
    +

    The information available depends on the event type:

    + + + +
    +

    Event

    + +
    + + + +
    The base event object. All other event objects contain these properties too.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    + + +
    + +
    +

    KeyboardEvent

    + +
    + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    originalEvent + DOMEventThe original DOM KeyboardEvent that triggered this Leaflet event.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    MouseEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    latlng + LatLngThe geographical point where the mouse event occurred.
    layerPoint + PointPixel coordinates of the point where the mouse event occurred relative to the map layer.
    containerPoint + PointPixel coordinates of the point where the mouse event occurred relative to the map сontainer.
    originalEvent + DOMEventThe original DOM MouseEvent or DOM TouchEvent that triggered this Leaflet event.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    LocationEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    latlng + LatLngDetected geographical location of the user.
    bounds + LatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
    accuracy + NumberAccuracy of location in meters.
    altitude + NumberHeight of the position above the WGS84 ellipsoid in meters.
    altitudeAccuracy + NumberAccuracy of altitude in meters.
    heading + NumberThe direction of travel in degrees counting clockwise from true North.
    speed + NumberCurrent velocity in meters per second.
    timestamp + NumberThe time when the position was acquired.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    ErrorEvent

    + +
    + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    message + StringError message.
    code + NumberError code (if applicable).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    LayerEvent

    + +
    + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    layer + LayerThe layer that was added or removed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    + +
    +
    +
    + +
    + +
    +

    LayersControlEvent

    + +
    + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    layer + LayerThe layer that was added or removed.
    name + StringThe name of the layer that was added or removed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    + +
    +
    +
    + +
    + +
    +

    TileEvent

    + +
    + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    tile + HTMLElementThe tile element (image).
    coords + PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    TileErrorEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    tile + HTMLElementThe tile element (image).
    coords + PointPoint object with the tile's x, y, and z (zoom level) coordinates.
    error + *Error passed to the tile's done() callback.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    ResizeEvent

    + +
    + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    oldSize + PointThe old size before resize event.
    newSize + PointThe new size after the resize event.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    GeoJSONEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    layer + LayerThe layer for the GeoJSON feature that is being added to the map.
    properties + ObjectGeoJSON properties of the feature.
    geometryType + StringGeoJSON geometry type of the feature.
    id + StringGeoJSON ID of the feature (if present).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    + +
    +
    +
    + +
    + +
    +

    PopupEvent

    + +
    + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    popup + PopupThe popup that was opened or closed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    TooltipEvent

    + +
    + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    tooltip + TooltipThe tooltip that was opened or closed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    DragEndEvent

    + +
    + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    distance + NumberThe distance in pixels the draggable element was moved by.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    ZoomAnimEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    center + LatLngThe current center of the map
    zoom + NumberThe current zoom level of the map
    noUpdate + BooleanWhether layers should update their contents due to this event
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    type + StringThe event type (e.g. 'click').
    target + ObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTarget + ObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFrom + ObjectFor propagated events, the last object that propagated the event to its +event parent.
    layer + ObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +

    DivOverlay

    Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    offsetPoint + Point(0, 7)The offset of the popup position. Useful to control the anchor +of the popup when opening it on some overlays.
    classNameString + ''A custom CSS class name to assign to the popup.
    paneString + 'popupPane'Map pane where the popup will be added.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionString + nullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    add + EventFired after the layer is added to a map
    remove + EventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopen + PopupEventFired when a popup bound to this layer is opened
    popupclose + PopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopen + TooltipEventFired when a tooltip bound to this layer is opened.
    tooltipclose + TooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Global Switches

    Global switches are created for rare cases and generally make +Leaflet to not detect a particular browser feature even if it's +there. You need to set the switch as a global variable to true +before including Leaflet on the page, like this:

    +
    <script>L_NO_TOUCH = true;</script>
    +<script src="leaflet.js"></script>
    +
    + + + + + + + + + + + + + + + + + +
    SwitchDescription
    L_NO_TOUCHForces Leaflet to not use touch events even if it detects them.
    L_DISABLE_3DForces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.
    + +

    noConflict

    This method restores the L global variable to the original value +it had before Leaflet inclusion, and returns the real Leaflet +namespace so you can put it elsewhere, like this:

    +
    <script src='libs/l.js'>
    +<!-- L points to some other library -->
    +<script src='leaflet.js'>
    +<!-- you include Leaflet, it replaces the L variable to Leaflet namespace -->
    +<script>
    +var Leaflet = L.noConflict();
    +// now L points to that other library again, and you can use Leaflet.Map etc.
    +</script>
    +
    + +

    version

    A constant that represents the Leaflet version in use.

    +
    L.version; // contains "1.0.0" (or whatever version is currently in use)
    +
    From 92ff0a1461775111499890a18e93d5031ab39d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubom=C3=ADr=20Bucek?= Date: Wed, 18 Nov 2020 15:25:14 +0100 Subject: [PATCH 096/306] TileLayer feature: add space to character regex for template to allow Object keys with it (#7216) --- spec/suites/core/UtilSpec.js | 3 ++- src/core/Util.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/spec/suites/core/UtilSpec.js b/spec/suites/core/UtilSpec.js index 92b4f36698c..80a4063795a 100644 --- a/spec/suites/core/UtilSpec.js +++ b/spec/suites/core/UtilSpec.js @@ -229,9 +229,10 @@ describe('Util', function () { }).to.throwError(); }); - it('allows underscores and dashes in placeholders', function () { + it('allows underscores, dashes and spaces in placeholders', function () { expect(L.Util.template('{nice_stuff}', {'nice_stuff': 'foo'})).to.eql('foo'); expect(L.Util.template('{-y}', {'-y': 1})).to.eql('1'); + expect(L.Util.template('{Day Of Month}', {'Day Of Month': 30})).to.eql('30'); }); }); diff --git a/src/core/Util.js b/src/core/Util.js index da678e3b10a..fa97caf01d6 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -152,7 +152,7 @@ export function getParamString(obj, existingUrl, uppercase) { return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); } -var templateRe = /\{ *([\w_-]+) *\}/g; +var templateRe = /\{ *([\w_ -]+) *\}/g; // @function template(str: String, data: Object): String // Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'` From e66948d15df65a1014968ff9242c8bf825d16156 Mon Sep 17 00:00:00 2001 From: Viktor Osipov Date: Thu, 19 Nov 2020 14:14:15 +0200 Subject: [PATCH 097/306] docstrings: typo in Events.js (#7339) Change article `an data object` to `a data object`. --- src/core/Events.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Events.js b/src/core/Events.js index b0d0c6c7c83..d2a18bb6a93 100644 --- a/src/core/Events.js +++ b/src/core/Events.js @@ -168,7 +168,7 @@ export var Events = { }, // @method fire(type: String, data?: Object, propagate?: Boolean): this - // Fires an event of the specified type. You can optionally provide an data + // Fires an event of the specified type. You can optionally provide a data // object — the first argument of the listener function will contain its // properties. The event can optionally be propagated to event parents. fire: function (type, data, propagate) { From e76f97cba319d97482e395279000ac95de5a8d99 Mon Sep 17 00:00:00 2001 From: elfalem Date: Wed, 25 Nov 2020 00:43:44 -0500 Subject: [PATCH 098/306] docstrings: align overlay and shadow panes order (#7349) The descriptions for the two panes in the docs were switched. Also flipped the pane creation order to align with the z-index order. --- src/map/Map.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index ee8760257ed..4749fb94a1e 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -1157,11 +1157,11 @@ export var Map = Evented.extend({ // Pane for `GridLayer`s and `TileLayer`s this.createPane('tilePane'); // @pane overlayPane: HTMLElement = 400 - // Pane for overlay shadows (e.g. `Marker` shadows) - this.createPane('shadowPane'); - // @pane shadowPane: HTMLElement = 500 // Pane for vectors (`Path`s, like `Polyline`s and `Polygon`s), `ImageOverlay`s and `VideoOverlay`s this.createPane('overlayPane'); + // @pane shadowPane: HTMLElement = 500 + // Pane for overlay shadows (e.g. `Marker` shadows) + this.createPane('shadowPane'); // @pane markerPane: HTMLElement = 600 // Pane for `Icon`s of `Marker`s this.createPane('markerPane'); From a6881dca6aa01ddcbf379797e1b6a9b5946ed488 Mon Sep 17 00:00:00 2001 From: Maciej Kowalski <16465790+mmaciejkowalski@users.noreply.github.com> Date: Tue, 8 Dec 2020 13:08:04 +0100 Subject: [PATCH 099/306] Plugins: add L.Highlight (#7363) --- docs/plugins.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index f0ff0bc7139..118b6cb0fa1 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -4480,6 +4480,18 @@ External services that transform an address or the name of a place into latitude LocationIQ
    + L.Highlight + + A plugin that adds the ability to quick highlighting streets and areas using Nominatim. + + Maciej Kowalski +
    From c0bf09ba32e71fdf29f91808c8b31bbb5946cc74 Mon Sep 17 00:00:00 2001 From: Andreas Hubel Date: Tue, 8 Dec 2020 13:17:22 +0100 Subject: [PATCH 100/306] fix outdated osm attribution texts + url (#7345) --- debug/map/svgoverlay.html | 3 +-- debug/map/videooverlay.html | 3 +-- docs/_layouts/v2.html | 3 +-- docs/examples/choropleth/example-basic.md | 3 +-- docs/examples/choropleth/example-color.md | 3 +-- docs/examples/choropleth/example.md | 3 +-- docs/examples/geojson/example.md | 3 +-- docs/examples/geojson/geojson-example.html | 3 +-- docs/examples/layers-control/example.md | 3 +-- docs/examples/mobile/example.md | 3 +-- docs/examples/mobile/index.md | 2 +- docs/examples/quick-start/example-basic.md | 3 +-- docs/examples/quick-start/example-overlays.md | 3 +-- docs/examples/quick-start/example-popups.md | 3 +-- docs/examples/quick-start/example.md | 3 +-- docs/examples/quick-start/index.md | 2 +- docs/examples/video-overlay/example-bounds.md | 3 +-- docs/examples/video-overlay/example-nocontrols.md | 3 +-- docs/examples/video-overlay/example.md | 3 +-- docs/reference-1.4.0.html | 2 +- docs/reference-1.5.1.html | 2 +- docs/reference-1.6.0.html | 2 +- docs/reference-1.7.1.html | 2 +- src/layer/tile/TileLayer.js | 2 +- 24 files changed, 24 insertions(+), 41 deletions(-) diff --git a/debug/map/svgoverlay.html b/debug/map/svgoverlay.html index 9c3ed5460fc..e392669ef81 100644 --- a/debug/map/svgoverlay.html +++ b/debug/map/svgoverlay.html @@ -25,8 +25,7 @@ L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, - attribution: 'Map data © OpenStreetMap contributors, ' + - 'CC-BY-SA, ' + + attribution: 'Map data © OpenStreetMap contributors, ' + 'Imagery © Mapbox', id: 'mapbox/satellite-v9', tileSize: 512, diff --git a/debug/map/videooverlay.html b/debug/map/videooverlay.html index 50f387ecb58..b055b989cad 100644 --- a/debug/map/videooverlay.html +++ b/debug/map/videooverlay.html @@ -23,8 +23,7 @@ L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, - attribution: 'Map data © OpenStreetMap contributors, ' + - 'CC-BY-SA, ' + + attribution: 'Map data © OpenStreetMap contributors, ' + 'Imagery © Mapbox', id: 'mapbox/satellite-v9', tileSize: 512, diff --git a/docs/_layouts/v2.html b/docs/_layouts/v2.html index bb102f94b22..295abc94cbc 100644 --- a/docs/_layouts/v2.html +++ b/docs/_layouts/v2.html @@ -49,8 +49,7 @@ + diff --git a/spec/suites/dom/DomEvent.DoubleTapSpec.js b/spec/suites/dom/DomEvent.DoubleTapSpec.js new file mode 100644 index 00000000000..005fa57ad25 --- /dev/null +++ b/spec/suites/dom/DomEvent.DoubleTapSpec.js @@ -0,0 +1,116 @@ +describe('DomEvent.DoubleTapSpec.js', function () { + var el, clock, spy; + + beforeEach(function () { + el = document.createElement('div'); + document.body.appendChild(el); + + clock = sinon.useFakeTimers(); + clock.tick(1000); + spy = sinon.spy(); + L.DomEvent.on(el, 'dblclick', spy); + }); + + afterEach(function () { + clock.restore(); + document.body.removeChild(el); + }); + + it('fires synthetic dblclick after two clicks with delay<200', function () { + happen.click(el, {detail: 1}); + clock.tick(100); + happen.click(el, {detail: 1}); + + expect(spy.called).to.be.ok(); + expect(spy.calledOnce).to.be.ok(); + expect(spy.lastCall.args[0]._simulated).to.be.ok(); + }); + + it('does not fire dblclick when delay>200', function () { + happen.click(el, {detail: 1}); + clock.tick(300); + happen.click(el, {detail: 1}); + + expect(spy.notCalled).to.be.ok(); + }); + + it('does not fire dblclick when detail !== 1', function () { + happen.click(el, {detail: 0}); // like in IE + clock.tick(100); + happen.click(el, {detail: 0}); + clock.tick(100); + + expect(spy.notCalled).to.be.ok(); + }); + + it('does not fire dblclick after removeListener', function () { + L.DomEvent.off(el, 'dblclick', spy); + + happen.click(el, {detail: 1}); + clock.tick(100); + happen.click(el, {detail: 1}); + clock.tick(100); + + expect(spy.notCalled).to.be.ok(); + }); + + it('does not conflict with native dblclick', function () { + happen.click(el, {detail: 1}); + clock.tick(100); + happen.click(el, {detail: 2}); // native dblclick expected + happen.dblclick(el); + expect(spy.called).to.be.ok(); + expect(spy.calledOnce).to.be.ok(); + expect(spy.lastCall.args[0]._simulated).not.to.be.ok(); + }); + + it('synthetic dblclick event has expected properties', function () { + var click = { + detail: 1, + clientX: 2, + clientY: 3, + screenX: 4, + screenY: 5 + }; + happen.click(el, click); + clock.tick(100); + happen.click(el, click); + + var event = spy.lastCall.args[0]; + var expectedProps = L.extend(click, { + type: 'dblclick', + // bubbles: true, // not important, as we do not actually dispatch the event + // cancelable: true, // + detail: 2, + target: el + }); + for (var prop in expectedProps) { + expect(event[prop]).to.be(expectedProps[prop]); + } + expect(event.isTrusted).not.to.be.ok(); + }); + + it('respects disableClickPropagation', function () { + var spyMap = sinon.spy(); + var map = L.map(el).setView([51.505, -0.09], 13); + map.on('dblclick', spyMap); + + var spyCtrl = sinon.spy(); + var ctrl = L.DomUtil.create('div'); + L.DomEvent.disableClickPropagation(ctrl); + var MyControl = L.Control.extend({ + onAdd: function () { + return ctrl; + } + }); + map.addControl(new MyControl()); + L.DomEvent.on(ctrl, 'dblclick', spyCtrl); + + happen.click(ctrl, {detail: 1}); + clock.tick(100); + happen.click(ctrl, {detail: 1}); + + expect(spyCtrl.called).to.be.ok(); + expect(spyMap.notCalled).to.be.ok(); + }); +}); diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index a302df84bc2..1c75e96cf16 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -1,81 +1,70 @@ -import * as Browser from '../core/Browser'; - /* * Extends the event handling code with double tap support for mobile browsers. + * + * Note: currently most browsers fire native dblclick, with only a few exceptions + * (see https://github.com/Leaflet/Leaflet/issues/7012#issuecomment-595087386) */ -var _touchstart = Browser.msPointer ? 'MSPointerDown' : Browser.pointer ? 'pointerdown' : 'touchstart'; -var _touchend = Browser.msPointer ? 'MSPointerUp' : Browser.pointer ? 'pointerup' : 'touchend'; -var _pre = '_leaflet_'; - -// inspired by Zepto touch code by Thomas Fuchs -export function addDoubleTapListener(obj, handler, id) { - var last, touch, - doubleTap = false, - delay = 250; - - function onTouchStart(e) { +function makeDblclick(event) { + // in modern browsers `type` cannot be just overridden: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only + var newEvent = {}, + prop, i; + for (i in event) { + prop = event[i]; + newEvent[i] = prop && prop.bind ? prop.bind(event) : prop; + } + event = newEvent; + newEvent.type = 'dblclick'; + newEvent.detail = 2; + newEvent.isTrusted = false; + newEvent._simulated = true; // for debug purposes + return newEvent; +} - if (Browser.pointer) { - if (!e.isPrimary) { return; } - if (e.pointerType === 'mouse') { return; } // mouse fires native dblclick - } else if (e.touches.length > 1) { +var delay = 200; +export function addDoubleTapListener(obj, handler) { + // Most browsers handle double tap natively + obj.addEventListener('dblclick', handler); + + // On some platforms the browser doesn't fire native dblclicks for touch events. + // It seems that in all such cases `detail` property of `click` event is always `1`. + // So here we rely on that fact to avoid excessive 'dblclick' simulation when not needed. + var last = 0, + detail; + function simDblclick(e) { + if (e.detail !== 1) { + detail = e.detail; // keep in sync to avoid false dblclick in some cases return; } - var now = Date.now(), - delta = now - (last || now); - - touch = e.touches ? e.touches[0] : e; - doubleTap = (delta > 0 && delta <= delay); - last = now; - } + if (e.pointerType === 'mouse' || + (e.sourceCapabilities && !e.sourceCapabilities.firesTouchEvents)) { - function onTouchEnd(e) { - if (doubleTap && !touch.cancelBubble) { - if (Browser.pointer) { - if (e.pointerType === 'mouse') { return; } - // work around .type being readonly with MSPointer* events - var newTouch = {}, - prop, i; + return; + } - for (i in touch) { - prop = touch[i]; - newTouch[i] = prop && prop.bind ? prop.bind(touch) : prop; - } - touch = newTouch; + var now = Date.now(); + if (now - last <= delay) { + detail++; + if (detail === 2) { + handler(makeDblclick(e)); } - touch.type = 'dblclick'; - touch.button = 0; - handler(touch); - last = null; + } else { + detail = 1; } + last = now; } - obj[_pre + _touchstart + id] = onTouchStart; - obj[_pre + _touchend + id] = onTouchEnd; - obj[_pre + 'dblclick' + id] = handler; - - obj.addEventListener(_touchstart, onTouchStart, Browser.passiveEvents ? {passive: false} : false); - obj.addEventListener(_touchend, onTouchEnd, Browser.passiveEvents ? {passive: false} : false); + obj.addEventListener('click', simDblclick); - // On some platforms (notably, chrome<55 on win10 + touchscreen + mouse), - // the browser doesn't fire touchend/pointerup events but does fire - // native dblclicks. See #4127. - // Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180. - obj.addEventListener('dblclick', handler, false); - - return this; + return { + dblclick: handler, + simDblclick: simDblclick + }; } -export function removeDoubleTapListener(obj, id) { - var touchstart = obj[_pre + _touchstart + id], - touchend = obj[_pre + _touchend + id], - dblclick = obj[_pre + 'dblclick' + id]; - - obj.removeEventListener(_touchstart, touchstart, Browser.passiveEvents ? {passive: false} : false); - obj.removeEventListener(_touchend, touchend, Browser.passiveEvents ? {passive: false} : false); - obj.removeEventListener('dblclick', dblclick, false); - - return this; +export function removeDoubleTapListener(obj, handlers) { + obj.removeEventListener('dblclick', handlers.dblclick); + obj.removeEventListener('click', handlers.simDblclick); } diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 610f69d9d8f..0537a270510 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -70,13 +70,6 @@ export function off(obj, types, fn, context) { return this; } -function browserFiresNativeDblClick() { - // See https://github.com/w3c/pointerevents/issues/171 - if (Browser.pointer) { - return !(Browser.edge || Browser.safari); - } -} - var mouseSubst = { mouseenter: 'mouseover', mouseleave: 'mouseout', @@ -98,8 +91,8 @@ function addOne(obj, type, fn, context) { // Needs DomEvent.Pointer.js handler = addPointerListener(obj, type, handler); - } else if (Browser.touch && (type === 'dblclick') && !browserFiresNativeDblClick()) { - addDoubleTapListener(obj, handler, id); + } else if (Browser.touch && (type === 'dblclick')) { + handler = addDoubleTapListener(obj, handler); } else if ('addEventListener' in obj) { @@ -137,8 +130,8 @@ function removeOne(obj, type, fn, context) { if (!Browser.touchNative && Browser.pointer && type.indexOf('touch') === 0) { removePointerListener(obj, type, handler); - } else if (Browser.touch && (type === 'dblclick') && !browserFiresNativeDblClick()) { - removeDoubleTapListener(obj, id); + } else if (Browser.touch && (type === 'dblclick')) { + removeDoubleTapListener(obj, handler); } else if ('removeEventListener' in obj) { From 83d23b90cf44d4898edf9256effbd5b1bfc1a14f Mon Sep 17 00:00:00 2001 From: johnd0e Date: Mon, 1 Nov 2021 19:27:50 +0300 Subject: [PATCH 164/306] Add test case for #7439 (#7721) To prevent regressions like e87ed0cea0ac06199dbb9b1c56817d45901792fd --- spec/suites/layer/vector/CanvasSpec.js | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/spec/suites/layer/vector/CanvasSpec.js b/spec/suites/layer/vector/CanvasSpec.js index 375bc014128..512bdd9c03c 100644 --- a/spec/suites/layer/vector/CanvasSpec.js +++ b/spec/suites/layer/vector/CanvasSpec.js @@ -67,6 +67,33 @@ describe('Canvas', function () { expect(spy.callCount).to.eql(1); }); + it("should be transparent for DOM events going to non-canvas features", function () { + var marker = L.marker(map.layerPointToLatLng([150, 150])) + .addTo(map); + var circle = L.circle(map.layerPointToLatLng([200, 200]), { + radius: 20000, + renderer: L.svg() + }).addTo(map); + + var spyPolygon = sinon.spy(); + var spyMap = sinon.spy(); + var spyMarker = sinon.spy(); + var spyCircle = sinon.spy(); + layer.on("click", spyPolygon); + map.on("click", spyMap); + marker.on("click", spyMarker); + circle.on("click", spyCircle); + + happen.at('click', 50, 50); // polygon (canvas) + happen.at('click', 151, 151); // empty space + happen.at('click', 150, 148); // marker + happen.at('click', 200, 200); // circle (svg) + expect(spyPolygon.callCount).to.eql(1); + expect(spyMap.callCount).to.eql(3); // except marker + expect(spyMarker.callCount).to.eql(1); + expect(spyCircle.callCount).to.eql(1); + }); + it("should fire preclick before click", function () { var clickSpy = sinon.spy(); var preclickSpy = sinon.spy(); From eccbd954abd8af867e3358fd259f28a745eebe89 Mon Sep 17 00:00:00 2001 From: Terrorartist Date: Mon, 1 Nov 2021 18:04:46 +0100 Subject: [PATCH 165/306] Leaflet.Notifications plugin (#7619) --- docs/plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index efe63133d39..b08ef2fb93e 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -3926,6 +3926,17 @@ Buttons, sliders, toolbars, sidebars, and panels. Martijn Grendelman + + + Leaflet.Notifications + + + Spawn toast notifications inside your map + + + Manuel Richter + + Leaflet.TileLegend From e66f1dd6c0975694d165155cca6b8ce8aa7568e5 Mon Sep 17 00:00:00 2001 From: Candid Dauth Date: Mon, 1 Nov 2021 18:05:51 +0100 Subject: [PATCH 166/306] Add AutoGraticule and FreieTonne plugins to docs (#7423) --- docs/plugins.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index b08ef2fb93e..250d44e1be6 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1145,6 +1145,15 @@ These plugins create useful overlays from scratch, no loading required. Iván Sánchez Ortega + + + Leaflet.AutoGraticule + + Draws a grid of latitude and longitude lines, automatically adjusting the scale to the current zoom level. Demo + + Candid Dauth + + @@ -1249,6 +1258,15 @@ Load overlay data from third-party-services. See also [basemap providers](#basem Marcin Wasilewski + + + Leaflet.FreieTonne + + An overlay with nautical features from FreieTonne. (Demo) + + Candid Dauth + + From 06e075f8e09fb60415c38944ee520fa85b1104eb Mon Sep 17 00:00:00 2001 From: Peter C <63091190+petoc@users.noreply.github.com> Date: Mon, 1 Nov 2021 18:06:32 +0100 Subject: [PATCH 167/306] Added plugin for one finger zoom (#7553) --- docs/plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 250d44e1be6..80f21e8b76a 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -3232,6 +3232,17 @@ Change the way the user can interactively move around the map. Shuhua Huang + + + Leaflet.DoubleTouchDragZoom + + + Plugin for one finger zoom. Demo + + + Peter C + + From a3b9c09870ead4250d0af51ac3dbe8ea464b274c Mon Sep 17 00:00:00 2001 From: Tek Kshetri <39838116+iamtekson@users.noreply.github.com> Date: Tue, 2 Nov 2021 00:07:40 +0700 Subject: [PATCH 168/306] leaflet-geojson-vt plugin added (#7626) --- docs/plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 80f21e8b76a..fc6ce669ff3 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -801,6 +801,15 @@ Plugins to display [vector tiles](https://github.com/mapbox/vector-tile-spec). Tristan Davies + + + leaflet-geojson-vt + + Displaying the vector tiles of GeoJSON data on the fly on leaflet + + Tek Kshetri + + geojson-vt From 34dbcfb5f76310fb767282f3a9f3575e7ee3ff92 Mon Sep 17 00:00:00 2001 From: Dan Wild Date: Tue, 2 Nov 2021 04:08:39 +1100 Subject: [PATCH 169/306] new plugins: Leaflet.glify, Leaflet.glify.layer (#7534) --- docs/plugins.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index fc6ce669ff3..2978aa937b2 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2396,6 +2396,30 @@ Powerful multi-purpose libraries for data visualization. locknono + + + Leaflet.glify + + + Fast rendering for large (+100MB) GeoJSON datasets with WebGL + Demo + + + robertleeplummerjr + + + + + Leaflet.glify.layer + + + Add-on for the Leaflet.glify plugin to provide more leaflet-idiomatic bindings. Provides fast webgl rendering for GeoJSON FeatureCollections (currently limited to polygons, lines and points). + Demo + + + onaci + + From 8cfe1c3dc79720373cde27ab7d835ff6105e11b8 Mon Sep 17 00:00:00 2001 From: Jon Koops Date: Mon, 1 Nov 2021 18:46:11 +0100 Subject: [PATCH 170/306] Drop PhantomJS from test suite (#7724) --- .github/workflows/main.yml | 1 - CONTRIBUTING.md | 6 +- package-lock.json | 1259 +----------------------------------- package.json | 2 - spec/index.html | 2 +- spec/karma.conf.js | 19 +- 6 files changed, 7 insertions(+), 1282 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c8e2d571139..10084972666 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -64,7 +64,6 @@ jobs: matrix: browser: [ - PhantomJSCustom, Chrome1280x1024, FirefoxPointer, FirefoxTouch, diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index adf1fec0a0c..ad3f54a5218 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -118,15 +118,13 @@ on rebuilding the bundles whenever any source file changes. ## Running the Tests -To run the tests from the command line, -install [PhantomJS](http://phantomjs.org/) (and make sure it's in your `PATH`), -then run: +To run the tests from the command line, install [Google Chrome](https://www.google.com/chrome/) then run: ``` npm test ``` -To run all the tests in actual browsers at the same time, you can do: +To run the tests in other browsers at the same time, you can do: ``` npm test -- -- --browsers Firefox,Chrome,Safari,IE diff --git a/package-lock.json b/package-lock.json index 60c647e6ce8..5eec576aebf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,13 +21,11 @@ "karma-firefox-launcher": "^2.1.1", "karma-ie-launcher": "^1.0.0", "karma-mocha": "^2.0.1", - "karma-phantomjs-launcher": "^1.0.4", "karma-rollup-preprocessor": "^7.0.7", "karma-safari-launcher": "~1.0.0", "karma-sinon": "^1.0.5", "leafdoc": "^2.3.0", "mocha": "^9.1.3", - "phantomjs-prebuilt": "^2.1.16", "prosthetic-hand": "^1.3.1", "rollup": "^2.58.3", "rollup-plugin-git-version": "^0.3.1", @@ -320,45 +318,6 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -383,15 +342,6 @@ "node": "^4.5.0 || >= 5.9" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -465,21 +415,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -510,12 +445,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -603,18 +532,6 @@ "node": ">=0.1.90" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/comment-patterns": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/comment-patterns/-/comment-patterns-0.11.0.tgz", @@ -636,21 +553,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -710,12 +612,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -749,18 +645,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/date-format": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", @@ -811,15 +695,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -868,16 +743,6 @@ "void-elements": "^2.0.0" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/edge-launcher": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/edge-launcher/-/edge-launcher-1.2.2.tgz", @@ -962,12 +827,6 @@ "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", "dev": true }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1198,45 +1057,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/extract-zip/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1255,15 +1075,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1385,40 +1196,6 @@ } } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1460,15 +1237,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/git-rev-sync": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-3.0.1.tgz", @@ -1578,29 +1346,6 @@ "integrity": "sha512-fBouIWb3fMsRCfCySHgk6+/gTEijMAWUZM/TYKmjuui9VsdS2DGWNjcH9cN7/tPn9nSkxGSGLJU6FHh37G0WUg==", "dev": true }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1622,19 +1367,6 @@ "node": ">=8" } }, - "node_modules/hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true, - "dependencies": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -1680,21 +1412,6 @@ "node": ">=8.0.0" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1853,21 +1570,6 @@ "node": ">=8" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -1892,12 +1594,6 @@ "node": ">=8" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "node_modules/isbinaryfile": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", @@ -1916,12 +1612,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1934,18 +1624,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -1958,36 +1636,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -2107,19 +1755,6 @@ "minimist": "^1.2.3" } }, - "node_modules/karma-phantomjs-launcher": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", - "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", - "dev": true, - "dependencies": { - "lodash": "^4.0.1", - "phantomjs-prebuilt": "^2.1.7" - }, - "peerDependencies": { - "karma": ">=0.9" - } - }, "node_modules/karma-rollup-preprocessor": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/karma-rollup-preprocessor/-/karma-rollup-preprocessor-7.0.7.tgz", @@ -2164,21 +1799,6 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "node_modules/kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", - "dev": true - }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } - }, "node_modules/leafdoc": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/leafdoc/-/leafdoc-2.3.0.tgz", @@ -2410,18 +2030,6 @@ "node": ">=8" } }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/mocha": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", @@ -2588,15 +2196,6 @@ "node": ">=0.10.0" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2743,61 +2342,6 @@ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "node_modules/phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", - "deprecated": "this package is now deprecated", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" - }, - "bin": { - "phantomjs": "bin/phantomjs" - } - }, - "node_modules/phantomjs-prebuilt/node_modules/progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/phantomjs-prebuilt/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -2810,27 +2354,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2840,12 +2363,6 @@ "node": ">= 0.8.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -2861,12 +2378,6 @@ "integrity": "sha1-qhPUqZ1aOcXRaMviB7zOV26EpzI=", "dev": true }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -2933,21 +2444,6 @@ "node": ">= 0.8" } }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3008,56 +2504,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "dependencies": { - "throttleit": "^1.0.0" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3317,31 +2763,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -3415,15 +2836,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -3480,12 +2892,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "node_modules/throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -3519,37 +2925,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3596,12 +2971,6 @@ "node": ">= 0.6" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "node_modules/ua-parser-js": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", @@ -3666,12 +3035,6 @@ "punycode": "^2.1.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -3681,16 +3044,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -3706,26 +3059,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -3876,19 +3209,9 @@ "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/yocto-queue": { @@ -4140,39 +3463,6 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4191,15 +3481,6 @@ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -4266,18 +3547,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -4296,12 +3565,6 @@ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4371,15 +3634,6 @@ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "comment-patterns": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/comment-patterns/-/comment-patterns-0.11.0.tgz", @@ -4401,18 +3655,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -4460,12 +3702,6 @@ "integrity": "sha512-UEQk8AxyCYvNAs6baNoPqDADv7BX0AmBLGxVsrAifPPx/C8EAzV4Q+2ZUJqVzfI2TQQEZITnwUkWcHpgc/IubQ==", "dev": true }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -4493,15 +3729,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "date-format": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", @@ -4535,12 +3762,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4580,16 +3801,6 @@ "void-elements": "^2.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "edge-launcher": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/edge-launcher/-/edge-launcher-1.2.2.tgz", @@ -4662,12 +3873,6 @@ "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", "dev": true }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4842,41 +4047,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4895,15 +4065,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -4992,34 +4153,6 @@ "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5051,15 +4184,6 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "git-rev-sync": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-3.0.1.tgz", @@ -5142,22 +4266,6 @@ "integrity": "sha512-fBouIWb3fMsRCfCySHgk6+/gTEijMAWUZM/TYKmjuui9VsdS2DGWNjcH9cN7/tPn9nSkxGSGLJU6FHh37G0WUg==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5173,16 +4281,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -5221,17 +4319,6 @@ "requires-port": "^1.0.0" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -5342,18 +4429,6 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -5369,12 +4444,6 @@ "is-docker": "^2.0.0" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isbinaryfile": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", @@ -5387,12 +4456,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -5402,18 +4465,6 @@ "argparse": "^2.0.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -5426,33 +4477,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -5564,16 +4588,6 @@ "minimist": "^1.2.3" } }, - "karma-phantomjs-launcher": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", - "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", - "dev": true, - "requires": { - "lodash": "^4.0.1", - "phantomjs-prebuilt": "^2.1.7" - } - }, "karma-rollup-preprocessor": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/karma-rollup-preprocessor/-/karma-rollup-preprocessor-7.0.7.tgz", @@ -5598,21 +4612,6 @@ "dev": true, "requires": {} }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", - "dev": true - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, "leafdoc": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/leafdoc/-/leafdoc-2.3.0.tgz", @@ -5800,15 +4799,6 @@ "yallist": "^4.0.0" } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "mocha": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", @@ -5944,12 +4934,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6062,85 +5046,18 @@ } } }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" - }, - "dependencies": { - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -6153,12 +5070,6 @@ "integrity": "sha1-qhPUqZ1aOcXRaMviB7zOV26EpzI=", "dev": true }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -6210,21 +5121,6 @@ "unpipe": "1.0.0" } }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6270,51 +5166,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } - } - }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "requires": { - "throttleit": "^1.0.0" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6519,23 +5370,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -6596,15 +5430,6 @@ } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -6646,12 +5471,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -6676,31 +5495,6 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6732,12 +5526,6 @@ "mime-types": "~2.1.24" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "ua-parser-js": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", @@ -6777,24 +5565,12 @@ "punycode": "^2.1.0" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -6807,25 +5583,6 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - } - } - }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -6937,16 +5694,6 @@ "is-plain-obj": "^2.1.0" } }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 2c1a02aefb1..710bfd1ac8e 100644 --- a/package.json +++ b/package.json @@ -16,13 +16,11 @@ "karma-firefox-launcher": "^2.1.1", "karma-ie-launcher": "^1.0.0", "karma-mocha": "^2.0.1", - "karma-phantomjs-launcher": "^1.0.4", "karma-rollup-preprocessor": "^7.0.7", "karma-safari-launcher": "~1.0.0", "karma-sinon": "^1.0.5", "leafdoc": "^2.3.0", "mocha": "^9.1.3", - "phantomjs-prebuilt": "^2.1.16", "prosthetic-hand": "^1.3.1", "rollup": "^2.58.3", "rollup-plugin-git-version": "^0.3.1", diff --git a/spec/index.html b/spec/index.html index 34705f3f302..5c129eef4d3 100644 --- a/spec/index.html +++ b/spec/index.html @@ -98,7 +98,7 @@ diff --git a/spec/karma.conf.js b/spec/karma.conf.js index 578e2fa32f1..c469f76a75b 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -39,7 +39,6 @@ module.exports = function (config) { 'karma-mocha', 'karma-sinon', 'karma-expect', - 'karma-phantomjs-launcher', 'karma-edge-launcher', 'karma-ie-launcher', 'karma-chrome-launcher', @@ -93,9 +92,8 @@ module.exports = function (config) { // - Firefox // - Opera // - Safari (only Mac) - // - PhantomJS // - IE (only Windows) - browsers: ['PhantomJSCustom'], + browsers: ['Chrome1280x1024'], customLaunchers: { 'Chrome1280x1024': { @@ -125,17 +123,6 @@ module.exports = function (config) { 'dom.w3c_touch_events.enabled': 1 } }, - 'PhantomJSCustom': { - base: 'PhantomJS', - flags: ['--load-images=true'], - options: { - onCallback: function (data) { - if (data.render) { - page.render(data.render); - } - } - } - }, IE8: { // not working in IE 11!! base: 'IE', 'X-UA-Compatible': 'IE=EmulateIE8' @@ -155,10 +142,6 @@ module.exports = function (config) { // If browser does not capture in given timeout [ms], kill it captureTimeout: 10000, - // Workaround for PhantomJS random DISCONNECTED error - browserDisconnectTimeout: 10000, // default 2000 - browserDisconnectTolerance: 1, // default 0 - // Continuous Integration mode // if true, it capture browsers, run tests and exit singleRun: true, From 88cf6332e1a80f8a5522ad56fea574c1b1f01d22 Mon Sep 17 00:00:00 2001 From: Jon Koops Date: Mon, 1 Nov 2021 19:39:49 +0100 Subject: [PATCH 171/306] Update dependencies to latest version and add Dependabot config (#7725) --- .github/dependabot.yml | 11 + package-lock.json | 1500 +++++++++++++++++++++++++++++++++++----- package.json | 4 +- 3 files changed, 1335 insertions(+), 180 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..7956f251440 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +version: 2 +updates: + - package-ecosystem: npm + directory: / + open-pull-requests-limit: 999 + rebase-strategy: disabled + schedule: + interval: weekly + ignore: + - dependency-name: eslint-config-mourner + update-types: ["version-update:semver-major"] diff --git a/package-lock.json b/package-lock.json index 5eec576aebf..2431a1caf43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,9 +27,9 @@ "leafdoc": "^2.3.0", "mocha": "^9.1.3", "prosthetic-hand": "^1.3.1", - "rollup": "^2.58.3", + "rollup": "^2.59.0", "rollup-plugin-git-version": "^0.3.1", - "sinon": "^7.5.0", + "sinon": "^11.1.2", "ssri": "^8.0.1", "uglify-js": "^3.14.2" } @@ -147,25 +147,24 @@ "type-detect": "4.0.8" } }, - "node_modules/@sinonjs/formatio": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", - "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" + "@sinonjs/commons": "^1.7.0" } }, "node_modules/@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, "node_modules/@sinonjs/text-encoding": { @@ -312,10 +311,43 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "node_modules/balanced-match": { @@ -342,6 +374,15 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -415,6 +456,21 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -445,6 +501,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -532,6 +594,18 @@ "node": ">=0.1.90" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/comment-patterns": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/comment-patterns/-/comment-patterns-0.11.0.tgz", @@ -553,6 +627,21 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -612,6 +701,12 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -645,6 +740,18 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/date-format": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", @@ -695,6 +802,15 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -743,6 +859,16 @@ "void-elements": "^2.0.0" } }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/edge-launcher": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/edge-launcher/-/edge-launcher-1.2.2.tgz", @@ -827,6 +953,12 @@ "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", "dev": true }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1057,6 +1189,45 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1075,6 +1246,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1196,26 +1376,46 @@ } } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -1237,6 +1437,15 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/git-rev-sync": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-3.0.1.tgz", @@ -1346,6 +1555,29 @@ "integrity": "sha512-fBouIWb3fMsRCfCySHgk6+/gTEijMAWUZM/TYKmjuui9VsdS2DGWNjcH9cN7/tPn9nSkxGSGLJU6FHh37G0WUg==", "dev": true }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1367,6 +1599,19 @@ "node": ">=8" } }, + "node_modules/hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true, + "dependencies": { + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -1412,6 +1657,21 @@ "node": ">=8.0.0" } }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1570,6 +1830,21 @@ "node": ">=8" } }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -1594,6 +1869,12 @@ "node": ">=8" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "node_modules/isbinaryfile": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", @@ -1612,6 +1893,12 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1624,6 +1911,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -1636,6 +1935,36 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -1755,6 +2084,19 @@ "minimist": "^1.2.3" } }, + "node_modules/karma-phantomjs-launcher": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", + "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", + "dev": true, + "dependencies": { + "lodash": "^4.0.1", + "phantomjs-prebuilt": "^2.1.7" + }, + "peerDependencies": { + "karma": ">=0.9" + } + }, "node_modules/karma-rollup-preprocessor": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/karma-rollup-preprocessor/-/karma-rollup-preprocessor-7.0.7.tgz", @@ -1799,6 +2141,21 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, + "node_modules/kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, "node_modules/leafdoc": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/leafdoc/-/leafdoc-2.3.0.tgz", @@ -1865,6 +2222,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -1909,12 +2272,6 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, - "node_modules/lolex": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", - "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", - "dev": true - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2030,6 +2387,18 @@ "node": ">=8" } }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/mocha": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", @@ -2166,27 +2535,18 @@ "dev": true }, "node_modules/nise": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", - "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", "dev": true, "dependencies": { - "@sinonjs/formatio": "^3.2.1", + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", - "lolex": "^5.0.1", "path-to-regexp": "^1.7.0" } }, - "node_modules/nise/node_modules/lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2196,6 +2556,15 @@ "node": ">=0.10.0" } }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2342,6 +2711,61 @@ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "deprecated": "this package is now deprecated", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" + }, + "bin": { + "phantomjs": "bin/phantomjs" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -2354,15 +2778,42 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { "node": ">= 0.8.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -2378,6 +2829,12 @@ "integrity": "sha1-qhPUqZ1aOcXRaMviB7zOV26EpzI=", "dev": true }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -2444,6 +2901,21 @@ "node": ">= 0.8" } }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -2504,6 +2976,56 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2563,9 +3085,9 @@ } }, "node_modules/rollup": { - "version": "2.58.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.3.tgz", - "integrity": "sha512-ei27MSw1KhRur4p87Q0/Va2NAYqMXOX++FNEumMBcdreIRLURKy+cE2wcDJKBn0nfmhP2ZGrJkP1XPO+G8FJQw==", + "version": "2.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.59.0.tgz", + "integrity": "sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -2667,48 +3189,21 @@ } }, "node_modules/sinon": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", - "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.3", - "diff": "^3.5.0", - "lolex": "^4.2.0", - "nise": "^1.5.2", - "supports-color": "^5.5.0" - } - }, - "node_modules/sinon/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/sinon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sinon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" } }, "node_modules/socket.io": { @@ -2763,6 +3258,31 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -2836,6 +3356,15 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2892,6 +3421,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -2925,6 +3460,37 @@ "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -2971,6 +3537,12 @@ "node": ">= 0.6" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "node_modules/ua-parser-js": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", @@ -3035,6 +3607,12 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -3044,6 +3622,16 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -3059,6 +3647,26 @@ "node": ">= 0.8" } }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -3214,6 +3822,16 @@ "node": ">=10" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -3322,25 +3940,24 @@ "type-detect": "4.0.8" } }, - "@sinonjs/formatio": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", - "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", "dev": true, "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" + "@sinonjs/commons": "^1.7.0" } }, "@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", "dev": true, "requires": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, "@sinonjs/text-encoding": { @@ -3457,10 +4074,37 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "balanced-match": { @@ -3481,6 +4125,15 @@ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3547,6 +4200,18 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -3565,6 +4230,12 @@ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3634,6 +4305,15 @@ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "comment-patterns": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/comment-patterns/-/comment-patterns-0.11.0.tgz", @@ -3655,6 +4335,18 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -3702,6 +4394,12 @@ "integrity": "sha512-UEQk8AxyCYvNAs6baNoPqDADv7BX0AmBLGxVsrAifPPx/C8EAzV4Q+2ZUJqVzfI2TQQEZITnwUkWcHpgc/IubQ==", "dev": true }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -3729,6 +4427,15 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "date-format": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", @@ -3762,6 +4469,12 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -3801,6 +4514,16 @@ "void-elements": "^2.0.0" } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "edge-launcher": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/edge-launcher/-/edge-launcher-1.2.2.tgz", @@ -3873,6 +4596,12 @@ "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", "dev": true }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4047,6 +4776,41 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4065,6 +4829,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -4153,19 +4926,40 @@ "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", "dev": true }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -4184,6 +4978,15 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "git-rev-sync": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-3.0.1.tgz", @@ -4266,6 +5069,22 @@ "integrity": "sha512-fBouIWb3fMsRCfCySHgk6+/gTEijMAWUZM/TYKmjuui9VsdS2DGWNjcH9cN7/tPn9nSkxGSGLJU6FHh37G0WUg==", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4281,6 +5100,16 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true, + "requires": { + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -4319,6 +5148,17 @@ "requires-port": "^1.0.0" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4429,6 +5269,18 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -4444,6 +5296,12 @@ "is-docker": "^2.0.0" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "isbinaryfile": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", @@ -4456,6 +5314,12 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -4465,6 +5329,18 @@ "argparse": "^2.0.1" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4477,6 +5353,33 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -4588,6 +5491,15 @@ "minimist": "^1.2.3" } }, + "karma-phantomjs-launcher": { + "version": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", + "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", + "dev": true, + "requires": { + "lodash": "^4.0.1", + "phantomjs-prebuilt": "^2.1.7" + } + }, "karma-rollup-preprocessor": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/karma-rollup-preprocessor/-/karma-rollup-preprocessor-7.0.7.tgz", @@ -4612,6 +5524,21 @@ "dev": true, "requires": {} }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, "leafdoc": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/leafdoc/-/leafdoc-2.3.0.tgz", @@ -4666,6 +5593,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4703,12 +5636,6 @@ } } }, - "lolex": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", - "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", - "dev": true - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4799,6 +5726,15 @@ "yallist": "^4.0.0" } }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "mocha": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", @@ -4905,27 +5841,16 @@ "dev": true }, "nise": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", - "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", "dev": true, "requires": { - "@sinonjs/formatio": "^3.2.1", + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", - "lolex": "^5.0.1", "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - } } }, "normalize-path": { @@ -4934,6 +5859,12 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5046,18 +5977,85 @@ } } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" + }, + "dependencies": { + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -5070,6 +6068,12 @@ "integrity": "sha1-qhPUqZ1aOcXRaMviB7zOV26EpzI=", "dev": true }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -5121,6 +6125,21 @@ "unpipe": "1.0.0" } }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -5166,6 +6185,51 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5210,9 +6274,9 @@ } }, "rollup": { - "version": "2.58.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.3.tgz", - "integrity": "sha512-ei27MSw1KhRur4p87Q0/Va2NAYqMXOX++FNEumMBcdreIRLURKy+cE2wcDJKBn0nfmhP2ZGrJkP1XPO+G8FJQw==", + "version": "2.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.59.0.tgz", + "integrity": "sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -5290,41 +6354,17 @@ } }, "sinon": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", - "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", "dev": true, "requires": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.3", - "diff": "^3.5.0", - "lolex": "^4.2.0", - "nise": "^1.5.2", - "supports-color": "^5.5.0" - }, - "dependencies": { - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" } }, "socket.io": { @@ -5370,6 +6410,23 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -5430,6 +6487,15 @@ } } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -5471,6 +6537,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -5495,6 +6567,31 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -5526,6 +6623,12 @@ "mime-types": "~2.1.24" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "ua-parser-js": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", @@ -5565,12 +6668,24 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -5583,6 +6698,25 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + } + } + }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -5694,6 +6828,16 @@ "is-plain-obj": "^2.1.0" } }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 710bfd1ac8e..01bbe8f3b2c 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,9 @@ "leafdoc": "^2.3.0", "mocha": "^9.1.3", "prosthetic-hand": "^1.3.1", - "rollup": "^2.58.3", + "rollup": "^2.59.0", "rollup-plugin-git-version": "^0.3.1", - "sinon": "^7.5.0", + "sinon": "^11.1.2", "ssri": "^8.0.1", "uglify-js": "^3.14.2" }, From 5b457c20438e9778e63579938643209e7a3adf68 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 1 Nov 2021 21:36:04 +0200 Subject: [PATCH 172/306] update package lock --- package-lock.json | 1405 +++------------------------------------------ 1 file changed, 95 insertions(+), 1310 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2431a1caf43..baa2b3cc63c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,12 +35,12 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", - "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.0.tgz", + "integrity": "sha512-Oi2qwQ21X7/d9gn3WiwkDTJmq3TQtYNz89lRnoFy8VeZpWlsyXvzSwiRrRZ8cXluvSwqKxqHJ6dBd9Rv+p0ZGQ==", "dev": true, "dependencies": { - "core-js-pure": "^3.16.0", + "core-js-pure": "^3.19.0", "regenerator-runtime": "^0.13.4" }, "engines": { @@ -311,45 +311,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -374,15 +335,6 @@ "node": "^4.5.0 || >= 5.9" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -456,21 +408,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -501,12 +438,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -594,18 +525,6 @@ "node": ">=0.1.90" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/comment-patterns": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/comment-patterns/-/comment-patterns-0.11.0.tgz", @@ -627,21 +546,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -701,12 +605,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -740,18 +638,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/date-format": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", @@ -802,15 +688,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -859,16 +736,6 @@ "void-elements": "^2.0.0" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/edge-launcher": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/edge-launcher/-/edge-launcher-1.2.2.tgz", @@ -953,12 +820,6 @@ "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", "dev": true }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1189,45 +1050,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/extract-zip/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1246,15 +1068,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1357,9 +1170,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", "dev": true, "funding": [ { @@ -1376,39 +1189,25 @@ } } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">= 0.12" + "node": ">=6 <7 || >=8" } }, - "node_modules/fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } + "node_modules/fs-extra/node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -1416,6 +1215,20 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -1437,15 +1250,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/git-rev-sync": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-3.0.1.tgz", @@ -1555,29 +1359,6 @@ "integrity": "sha512-fBouIWb3fMsRCfCySHgk6+/gTEijMAWUZM/TYKmjuui9VsdS2DGWNjcH9cN7/tPn9nSkxGSGLJU6FHh37G0WUg==", "dev": true }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1599,19 +1380,6 @@ "node": ">=8" } }, - "node_modules/hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true, - "dependencies": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -1657,21 +1425,6 @@ "node": ">=8.0.0" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1830,21 +1583,6 @@ "node": ">=8" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -1870,9 +1608,9 @@ } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "node_modules/isbinaryfile": { @@ -1893,12 +1631,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1911,18 +1643,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -1935,36 +1655,15 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -2084,19 +1783,6 @@ "minimist": "^1.2.3" } }, - "node_modules/karma-phantomjs-launcher": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", - "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", - "dev": true, - "dependencies": { - "lodash": "^4.0.1", - "phantomjs-prebuilt": "^2.1.7" - }, - "peerDependencies": { - "karma": ">=0.9" - } - }, "node_modules/karma-rollup-preprocessor": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/karma-rollup-preprocessor/-/karma-rollup-preprocessor-7.0.7.tgz", @@ -2141,21 +1827,6 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "node_modules/kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", - "dev": true - }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } - }, "node_modules/leafdoc": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/leafdoc/-/leafdoc-2.3.0.tgz", @@ -2387,18 +2058,6 @@ "node": ">=8" } }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/mocha": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", @@ -2556,15 +2215,6 @@ "node": ">=0.10.0" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2705,67 +2355,6 @@ "isarray": "0.0.1" } }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "node_modules/phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", - "deprecated": "this package is now deprecated", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" - }, - "bin": { - "phantomjs": "bin/phantomjs" - } - }, - "node_modules/phantomjs-prebuilt/node_modules/progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/phantomjs-prebuilt/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -2778,27 +2367,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2808,12 +2376,6 @@ "node": ">= 0.8.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -2829,12 +2391,6 @@ "integrity": "sha1-qhPUqZ1aOcXRaMviB7zOV26EpzI=", "dev": true }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -2901,21 +2457,6 @@ "node": ">= 0.8" } }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -2976,56 +2517,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "dependencies": { - "throttleit": "^1.0.0" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3109,10 +2600,24 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -3258,31 +2763,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -3327,44 +2807,6 @@ "node": ">=4.0" } }, - "node_modules/streamroller/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/streamroller/node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "node_modules/streamroller/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -3421,12 +2863,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "node_modules/throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -3460,37 +2896,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3537,12 +2942,6 @@ "node": ">= 0.6" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "node_modules/ua-parser-js": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", @@ -3607,12 +3006,6 @@ "punycode": "^2.1.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -3622,16 +3015,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -3647,26 +3030,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -3822,16 +3185,6 @@ "node": ">=10" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -3847,12 +3200,12 @@ }, "dependencies": { "@babel/runtime-corejs3": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", - "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.0.tgz", + "integrity": "sha512-Oi2qwQ21X7/d9gn3WiwkDTJmq3TQtYNz89lRnoFy8VeZpWlsyXvzSwiRrRZ8cXluvSwqKxqHJ6dBd9Rv+p0ZGQ==", "dev": true, "requires": { - "core-js-pure": "^3.16.0", + "core-js-pure": "^3.19.0", "regenerator-runtime": "^0.13.4" } }, @@ -4074,39 +3427,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4125,15 +3445,6 @@ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -4200,18 +3511,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -4230,12 +3529,6 @@ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4305,15 +3598,6 @@ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "comment-patterns": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/comment-patterns/-/comment-patterns-0.11.0.tgz", @@ -4335,18 +3619,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -4394,12 +3666,6 @@ "integrity": "sha512-UEQk8AxyCYvNAs6baNoPqDADv7BX0AmBLGxVsrAifPPx/C8EAzV4Q+2ZUJqVzfI2TQQEZITnwUkWcHpgc/IubQ==", "dev": true }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -4427,15 +3693,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "date-format": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", @@ -4469,12 +3726,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4514,16 +3765,6 @@ "void-elements": "^2.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "edge-launcher": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/edge-launcher/-/edge-launcher-1.2.2.tgz", @@ -4596,12 +3837,6 @@ "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", "dev": true }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4776,41 +4011,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4829,15 +4029,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -4921,37 +4112,28 @@ "dev": true }, "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + } } }, "fs.realpath": { @@ -4960,6 +4142,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -4978,15 +4167,6 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "git-rev-sync": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-3.0.1.tgz", @@ -5069,22 +4249,6 @@ "integrity": "sha512-fBouIWb3fMsRCfCySHgk6+/gTEijMAWUZM/TYKmjuui9VsdS2DGWNjcH9cN7/tPn9nSkxGSGLJU6FHh37G0WUg==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5100,16 +4264,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -5148,17 +4302,6 @@ "requires-port": "^1.0.0" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -5269,18 +4412,6 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -5297,9 +4428,9 @@ } }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "isbinaryfile": { @@ -5314,12 +4445,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -5329,18 +4454,6 @@ "argparse": "^2.0.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -5353,33 +4466,15 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { "graceful-fs": "^4.1.6" } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -5491,15 +4586,6 @@ "minimist": "^1.2.3" } }, - "karma-phantomjs-launcher": { - "version": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", - "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", - "dev": true, - "requires": { - "lodash": "^4.0.1", - "phantomjs-prebuilt": "^2.1.7" - } - }, "karma-rollup-preprocessor": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/karma-rollup-preprocessor/-/karma-rollup-preprocessor-7.0.7.tgz", @@ -5524,21 +4610,6 @@ "dev": true, "requires": {} }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", - "dev": true - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, "leafdoc": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/leafdoc/-/leafdoc-2.3.0.tgz", @@ -5726,15 +4797,6 @@ "yallist": "^4.0.0" } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "mocha": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", @@ -5859,12 +4921,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5967,60 +5023,6 @@ "dev": true, "requires": { "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" - }, - "dependencies": { - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "picomatch": { @@ -6029,33 +5031,12 @@ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -6068,12 +5049,6 @@ "integrity": "sha1-qhPUqZ1aOcXRaMviB7zOV26EpzI=", "dev": true }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -6125,21 +5100,6 @@ "unpipe": "1.0.0" } }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6185,51 +5145,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } - } - }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "requires": { - "throttleit": "^1.0.0" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6292,9 +5207,9 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safer-buffer": { @@ -6410,23 +5325,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -6458,44 +5356,9 @@ "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -6537,12 +5400,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -6567,31 +5424,6 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6623,12 +5455,6 @@ "mime-types": "~2.1.24" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "ua-parser-js": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", @@ -6668,24 +5494,12 @@ "punycode": "^2.1.0" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -6698,25 +5512,6 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - } - } - }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -6828,16 +5623,6 @@ "is-plain-obj": "^2.1.0" } }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", From e3fde981e25dda3f90ab33de433a05be40f406a5 Mon Sep 17 00:00:00 2001 From: Jon Koops Date: Mon, 1 Nov 2021 21:57:01 +0100 Subject: [PATCH 173/306] Continue running tests even if one fails (#7723) * Continue running tests even if one fails * Use fail fast instead --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 10084972666..3befe2e6d11 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -61,6 +61,7 @@ jobs: needs: setup runs-on: ubuntu-latest strategy: + fail-fast: false matrix: browser: [ From 03889599d0c97edf94a69344b13e8da311059882 Mon Sep 17 00:00:00 2001 From: ToriChan <43945424+YUUKIToriyama@users.noreply.github.com> Date: Tue, 2 Nov 2021 21:24:56 +0900 Subject: [PATCH 174/306] New plugin: Leaflet.MousePosition.ts (#7623) --- docs/plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 2978aa937b2..5e4dd3f4eb4 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -3643,6 +3643,17 @@ Show the geographical coordinates under the mouse cursor in different ways. Ardhi Lukianto + + + Leaflet.MousePosition.ts + + A fully custmizable coordinate viewer written in TypeScript. + You can change how this plugin looks by creating a custom component with JSX. + (demo) + + Yuuki Toriyama + + Leaflet.Coordinates From 7bccf7e9f64a06d103dba5b21e57bcf655cbcc15 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 2 Nov 2021 17:36:57 +0200 Subject: [PATCH 175/306] simplify release process (#7727) --- RELEASE.md | 37 +++++++++++++++++-------------------- build/publish.sh | 36 ------------------------------------ package.json | 7 ++++--- 3 files changed, 21 insertions(+), 59 deletions(-) delete mode 100755 build/publish.sh diff --git a/RELEASE.md b/RELEASE.md index bd366d0271b..28f3401a24c 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,28 +1,25 @@ -Documentation for the release process of Leaflet. +## Releasing a new version of Leaflet -**Please note that you will need to have a git remote called `origin` that points to Leaflet's GitHub repo, since the publish script assumes it** -- [ ] Make a new release branch (for example named `prepare-X.Y.Z`) -- [ ] Make sure you do not have any `package.lock.json` or `yarn.lock` locally, since they can potentially make you build with the wrong package versions -- [ ] Update [the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) since last release and commit to the release branch -- [ ] Write a blog post about the new release and put in `/docs/_posts` and commit to the release branch -- [ ] Bump version number in `package.json` and commit to `master` -- [ ] Run `npm run release` +- [ ] Update [the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) since last release and commit +- [ ] Run `npm version ` +- [ ] Run `npm publish` - [ ] Verify that the release was correctly published to NPM by checking: - [ ] [Leaflet NPM package page](https://www.npmjs.com/package/leaflet) - [ ] files on [Leaflet unpkg page](https://unpkg.com/leaflet@latest/) +- [ ] Make a new release on [Leaflet's GitHub release page](https://github.com/Leaflet/Leaflet/releases/) with the most important parts of the changelog + +### Updating docs after the release + +- [ ] Make a new branch for the update +- [ ] Write a blog post about the new release and put in `/docs/_posts` - [ ] Update API docs: - [ ] run `npm run docs` - [ ] Copy the built docs from `dist/reference-X.Y.Z.html` to `docs/reference-X.Y.Z.html`, remove content before first and after second "CUT HERE" comment - [ ] Insert YAML front matter, see old `docs/reference-X.Y.Z.html` for reference - - [ ] Commit the new docs to the release branch -- [ ] Update `docs/reference.html` to redirect to the new version and commit the change to the release branch -- [ ] Update integrity hashes: - - [ ] Checkout the release tag (`git checkout vX.Y.Z`) - - [ ] Run `npm run integrity` or simply `node ./build/integrity.js` if you're not on Debian - - [ ] Copy the hashes and update `integrity_hash_css`, `integrity_hash_source` and `integrity_hash_uglified` in `docs/_config.yml`; commit changes to the release branch -- [ ] Update link to latest release in `docs/download.html`, and commit to the release branch -- [ ] Add link to new version reference in `docs/reference-versions.html`, and commit to the release branch -- [ ] Update `latest_leaflet_version` (and possibly `latest_leaflet_reference`) in `docs/_config.yml` and commit to the release branch -- [ ] Update the announcement section in `docs/index.html` and commit to the release branch -- [ ] If it looks like everything is good at this point, merge the release branch into `master` -- [ ] Make a new release on [Leaflet's GitHub release page](https://github.com/Leaflet/Leaflet/releases/) with the most important parts of the changelog +- [ ] Update `docs/reference.html` to redirect to the new version +- [ ] Run `npm run integrity` and make sure `docs/_config.yml` is updated with new hashes +- [ ] Update link to latest release in `docs/download.md` +- [ ] Add link to new version reference in `docs/reference-versions.html` +- [ ] Update `latest_leaflet_version` (and possibly `latest_leaflet_reference`) in `docs/_config.yml` +- [ ] Update the announcement section in `docs/index.html` +- [ ] Commit all the changes and submit a PR for someone to review diff --git a/build/publish.sh b/build/publish.sh deleted file mode 100755 index 31b9876c453..00000000000 --- a/build/publish.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -npm update - -VERSION=$(node --eval "console.log(require('./package.json').version);") - -npm test || exit 1 - -echo "Ready to publish Leaflet version $VERSION." -echo "Has the version number been bumped?" -read -n1 -r -p "Press Ctrl+C to cancel, or any other key to continue." key - -git checkout -b build - -export NODE_ENV=release - -npm run-script build - -echo "Creating git tag v$VERSION..." - -git add dist/leaflet-src.js dist/leaflet.js dist/leaflet-src.esm.js dist/leaflet-src.js.map dist/leaflet.js.map dist/leaflet-src.esm.js.map -f - -git commit -m "v$VERSION" - -git tag v$VERSION -f -git push --tags -f - -echo "Uploading to NPM..." - -npm publish - -git checkout master -git branch -D build - -echo "All done." -echo "Remember to run 'npm run-script integrity' and then commit the changes to the master branch, in order to update the website." diff --git a/package.json b/package.json index 01bbe8f3b2c..bd59187db5d 100644 --- a/package.json +++ b/package.json @@ -33,19 +33,20 @@ "files": [ "dist", "src", - "!dist/leaflet.zip" + "!dist/leaflet.zip", + "!*.leafdoc" ], "scripts": { "docs": "node ./build/docs.js", "test": "karma start ./spec/karma.conf.js", "build": "npm run rollup && npm run uglify", - "release": "./build/publish.sh", "lint": "eslint src spec/suites docs/docs/js build", "lintfix": "npm run lint -- --fix", "rollup": "rollup -c build/rollup-config.js", "watch": "rollup -w -c build/rollup-watch-config.js", "uglify": "uglifyjs dist/leaflet-src.js -c -m -o dist/leaflet.js --source-map filename=dist/leaflet.js.map --source-map content=dist/leaflet-src.js.map --source-map url=leaflet.js.map --comments", - "integrity": "node ./build/integrity.js" + "integrity": "node ./build/integrity.js", + "prepublishOnly": "npm ci && npm run lint && npm run test && NODE_ENV=release npm run build" }, "eslintConfig": { "root": true, From 5f24da54a1c6d577ff42ed3ed9cc2f92329adbb0 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 2 Nov 2021 17:48:21 +0200 Subject: [PATCH 176/306] fix download link, close #7667 --- docs/download.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/download.md b/docs/download.md index cf547f524df..53ae66adedf 100644 --- a/docs/download.md +++ b/docs/download.md @@ -12,17 +12,13 @@ bodyclass: download-page Description - Leaflet 1.7.1 + Leaflet 1.7.1 Stable version, released on September 3, 2020. Leaflet 1.8-dev In-progress version, developed on the master branch. - - Leaflet 0.7.7 - Legacy version, released on November 18, 2013 and last updated on October 26, 2015. - [View Changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) From bb04e9567d7afc7c9a503e7c8b21f0ea4196fca3 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 2 Nov 2021 18:00:27 +0200 Subject: [PATCH 177/306] simplify download page --- docs/download.md | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/docs/download.md b/docs/download.md index 53ae66adedf..9b1b5c5d5e3 100644 --- a/docs/download.md +++ b/docs/download.md @@ -26,28 +26,17 @@ bodyclass: download-page Note that the master version can contain incompatible changes, so please read the changelog carefully when upgrading to it. -[Get notified of new Leaflet releases](https://github.com/Leaflet/Leaflet/issues/6295) - ### Using a Hosted Version of Leaflet The latest stable Leaflet release is available on several CDN's — to start using it straight away, place this in the `head` of your HTML code: - - - -To avoid potential security problems, we recommend and encourage enabling -[subresource integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) -when using Leaflet from a CDN: + + - - +Note that the [`integrity` hashes]((https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)) are included for security when using Leaflet from CDN. -Leaflet is available on the following free CDN's: [unpkg](https://unpkg.com/leaflet/dist/), [cdnjs](https://cdnjs.com/libraries/leaflet), [jsDelivr](https://www.jsdelivr.com/package/npm/leaflet?path=dist) +Leaflet is available on the following free CDNs: [unpkg](https://unpkg.com/leaflet/dist/), [cdnjs](https://cdnjs.com/libraries/leaflet), [jsDelivr](https://www.jsdelivr.com/package/npm/leaflet?path=dist). _Disclaimer: these services are external to Leaflet; for questions or support, please contact them directly._ @@ -56,7 +45,7 @@ _Disclaimer: these services are external to Leaflet; for questions or support, p Inside the archives downloaded from the above links, you will see four things: - `leaflet.js` - This is the minified Leaflet JavaScript code. -- `leaflet-src.js` - This is the readable, unminified Leaflet JavaScript, which is sometimes helpful for debugging. (The integrity hash for this file is {{site.integrity_hash_source}}) +- `leaflet-src.js` - This is the readable, unminified Leaflet JavaScript, which is sometimes helpful for debugging. (integrity="{{site.integrity_hash_source}}") - `leaflet.css` - This is the stylesheet for Leaflet. - `images` - This is a folder that contains images referenced by `leaflet.css`. It must be in the same directory as `leaflet.css`. From 9f9c5497560374f6d0659c08add5f37b8453621f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 2 Nov 2021 23:31:33 +0200 Subject: [PATCH 178/306] simplify docs update process on release (#7730) --- RELEASE.md | 18 +- build/docs.js | 4 +- build/leafdoc-templates/html.hbs | 267 +- docs/_config.yml | 1 - docs/_layouts/v2.html | 2 +- docs/reference-1.7.1.html | 25067 ---------------------------- docs/reference-versions.html | 2 +- docs/reference.html | 25068 ++++++++++++++++++++++++++++- 8 files changed, 25197 insertions(+), 25232 deletions(-) delete mode 100644 docs/reference-1.7.1.html diff --git a/RELEASE.md b/RELEASE.md index 28f3401a24c..7b4f962a23f 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,8 +1,9 @@ ## Releasing a new version of Leaflet -- [ ] Update [the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) since last release and commit -- [ ] Run `npm version ` -- [ ] Run `npm publish` +- [ ] Update [the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) since last release and commit. +- [ ] Run `npm publish --dry-run` to run all the necessary checks without actually publishing, and make sure it runs successfully. +- [ ] Run `npm version ` (this will bump the version in `package.json` and create a new tag). +- [ ] Run `npm publish` to publish to NPM. - [ ] Verify that the release was correctly published to NPM by checking: - [ ] [Leaflet NPM package page](https://www.npmjs.com/package/leaflet) - [ ] files on [Leaflet unpkg page](https://unpkg.com/leaflet@latest/) @@ -11,15 +12,10 @@ ### Updating docs after the release - [ ] Make a new branch for the update -- [ ] Write a blog post about the new release and put in `/docs/_posts` -- [ ] Update API docs: - - [ ] run `npm run docs` - - [ ] Copy the built docs from `dist/reference-X.Y.Z.html` to `docs/reference-X.Y.Z.html`, remove content before first and after second "CUT HERE" comment - - [ ] Insert YAML front matter, see old `docs/reference-X.Y.Z.html` for reference -- [ ] Update `docs/reference.html` to redirect to the new version +- [ ] Write a blog post about the new release and put it in `/docs/_posts` +- [ ] If necessary to preserve previous version's docs, rename `dist/reference.html` to `dist/reference-X.Y.Z.html` and add it to the list in `docs/reference-versions.html` +- [ ] Run `npm run docs` to generate the new `docs/reference.html` - [ ] Run `npm run integrity` and make sure `docs/_config.yml` is updated with new hashes - [ ] Update link to latest release in `docs/download.md` -- [ ] Add link to new version reference in `docs/reference-versions.html` -- [ ] Update `latest_leaflet_version` (and possibly `latest_leaflet_reference`) in `docs/_config.yml` - [ ] Update the announcement section in `docs/index.html` - [ ] Commit all the changes and submit a PR for someone to review diff --git a/build/docs.js b/build/docs.js index 4f0599a6e7d..e90544849a4 100755 --- a/build/docs.js +++ b/build/docs.js @@ -1,5 +1,3 @@ -var packageDef = require('../package.json'); - function buildDocs() { console.log('Building Leaflet documentation with Leafdoc ...'); @@ -27,7 +25,7 @@ function buildDocs() { doc.addFile('build/docs-misc.leafdoc', false); var out = doc.outputStr(); - var path = 'dist/reference-' + packageDef.version + '.html'; + var path = 'docs/reference.html'; var fs = require('fs'); diff --git a/build/leafdoc-templates/html.hbs b/build/leafdoc-templates/html.hbs index a6f35ef65eb..74c51a7c873 100644 --- a/build/leafdoc-templates/html.hbs +++ b/build/leafdoc-templates/html.hbs @@ -1,153 +1,128 @@ - - - - {{ title }} - +--- +layout: v2 +title: Documentation +bodyclass: api-page +--- - - - - - - - - - -
    +

    Leaflet API reference

    - +

    This reference reflects Leaflet {{site.latest_leaflet_version}}. Check this list if you are using a different version of Leaflet.

    -

    Leaflet API reference

    -
    - -
    -

    UI Layers

    - -

    Raster Layers

    - -

    Vector Layers

    - -
    -
    -

    Other Layers

    - -

    Basic Types

    - -

    Controls

    - -
    -
    - - - - - - -

    Utility

    - -

    DOM Utility

    - -
    -
    -

    Base Classes

    - - -

    Misc

    - -
    +
    + - - {{{ body }}} - - - +
    +

    UI Layers

    + +

    Raster Layers

    + +

    Vector Layers

    +
    +
    +

    Other Layers

    + +

    Basic Types

    + +

    Controls

    + +
    +
    +

    Utility

    + +

    DOM Utility

    + +
    +
    +

    Base Classes

    + - - +

    Misc

    + +
    +
    - +{{{ body }}} diff --git a/docs/_config.yml b/docs/_config.yml index ab028944851..4e252bbbadb 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -6,7 +6,6 @@ kramdown: entity_output: as_input latest_leaflet_version: 1.7.1 -latest_leaflet_reference: 1.7.1 # Integrity hashes for both leaflet.js and leaflet-src.js # These will be shown in the downloads page diff --git a/docs/_layouts/v2.html b/docs/_layouts/v2.html index 989957f6d1c..a3d7692991b 100644 --- a/docs/_layouts/v2.html +++ b/docs/_layouts/v2.html @@ -80,7 +80,7 @@

    an open-source JavaScript library
    for mobile-friendly in {% if page.title == 'Documentation' %} Docs {% else %} - Docs + Docs {% endif %}

  • diff --git a/docs/reference-1.7.1.html b/docs/reference-1.7.1.html deleted file mode 100644 index 26ebd1128d1..00000000000 --- a/docs/reference-1.7.1.html +++ /dev/null @@ -1,25067 +0,0 @@ ---- -layout: v2 -title: Documentation -bodyclass: api-page ---- - -

    This reference reflects Leaflet 1.7.1. Check this list if you are using a different version of Leaflet.

    - -

    Leaflet API reference

    -
    - -
    -

    UI Layers

    - -

    Raster Layers

    - -

    Vector Layers

    - -
    -
    -

    Other Layers

    - -

    Basic Types

    - -

    Controls

    - -
    -
    - - - - - - -

    Utility

    - -

    DOM Utility

    - -
    -
    -

    Base Classes

    - - -

    Misc

    - -
    -
    - -

    Map

    The central class of the API — it is used to create a map on a page and manipulate it.

    - -
    -

    Usage example

    - -
    - - - - - -
    // initialize the map on the "map" div with a given center and zoom
    -var map = L.map('map', {
    -	center: [51.505, -0.09],
    -	zoom: 13
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.map(<String> id, <Map options> options?)Instantiates a map object given the DOM ID of a <div> element -and optionally an object literal with Map options.
    L.map(<HTMLElement> el, <Map options> options?)Instantiates a map object given an instance of a <div> HTML element -and optionally an object literal with Map options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    preferCanvasBooleanfalseWhether Paths should be rendered on a Canvas renderer. -By default, all Paths are rendered in a SVG renderer.
    - -
    - -

    Control options

    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionControlBooleantrueWhether a attribution control is added to the map by default.
    zoomControlBooleantrueWhether a zoom control is added to the map by default.
    - -
    - -

    Interaction Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    closePopupOnClickBooleantrueSet it to false if you don't want popups to close when user clicks the map.
    zoomSnapNumber1Forces the map's zoom level to always be a multiple of this, particularly -right after a fitBounds() or a pinch-zoom. -By default, the zoom level snaps to the nearest integer; lower values -(e.g. 0.5 or 0.1) allow for greater granularity. A value of 0 -means the zoom level will not be snapped after fitBounds or a pinch-zoom.
    zoomDeltaNumber1Controls how much the map's zoom level will change after a -zoomIn(), zoomOut(), pressing + -or - on the keyboard, or using the zoom controls. -Values smaller than 1 (e.g. 0.5) allow for greater granularity.
    trackResizeBooleantrueWhether the map automatically handles browser window resize to update itself.
    boxZoomBooleantrueWhether the map can be zoomed to a rectangular area specified by -dragging the mouse while pressing the shift key.
    doubleClickZoomBoolean|StringtrueWhether the map can be zoomed in by double clicking on it and -zoomed out by double clicking while holding shift. If passed -'center', double-click zoom will zoom to the center of the -view regardless of where the mouse was.
    draggingBooleantrueWhether the map be draggable with mouse/touch or not.
    - -
    - -

    Map State Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    crsCRSL.CRS.EPSG3857The Coordinate Reference System to use. Don't change this if you're not -sure what it means.
    centerLatLngundefinedInitial geographic center of the map
    zoomNumberundefinedInitial map zoom level
    minZoomNumber*Minimum zoom level of the map. -If not specified and at least one GridLayer or TileLayer is in the map, -the lowest of their minZoom options will be used instead.
    maxZoomNumber*Maximum zoom level of the map. -If not specified and at least one GridLayer or TileLayer is in the map, -the highest of their maxZoom options will be used instead.
    layersLayer[][]Array of layers that will be added to the map initially
    maxBoundsLatLngBoundsnullWhen this option is set, the map restricts the view to the given -geographical bounds, bouncing the user back if the user tries to pan -outside the view. To set the restriction dynamically, use -setMaxBounds method.
    rendererRenderer*The default method for drawing vector layers on the map. L.SVG -or L.Canvas by default depending on browser support.
    - -
    - -

    Animation Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    zoomAnimationBooleantrueWhether the map zoom animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    zoomAnimationThresholdNumber4Won't animate zoom if the zoom difference exceeds this value.
    fadeAnimationBooleantrueWhether the tile fade animation is enabled. By default it's enabled -in all browsers that support CSS3 Transitions except Android.
    markerZoomAnimationBooleantrueWhether markers animate their zoom with the zoom animation, if disabled -they will disappear for the length of the animation. By default it's -enabled in all browsers that support CSS3 Transitions except Android.
    transform3DLimitNumber2^23Defines the maximum size of a CSS translation transform. The default -value should not be changed unless a web browser positions layers in -the wrong place after doing a large panBy.
    - -
    - -

    Panning Inertia Options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    inertiaBoolean*If enabled, panning of the map will have an inertia effect where -the map builds momentum while dragging and continues moving in -the same direction for some time. Feels especially nice on touch -devices. Enabled by default unless running on old Android devices.
    inertiaDecelerationNumber3000The rate with which the inertial movement slows down, in pixels/second².
    inertiaMaxSpeedNumberInfinityMax speed of the inertial movement, in pixels/second.
    easeLinearityNumber0.2
    worldCopyJumpBooleanfalseWith this option enabled, the map tracks when you pan to another "copy" -of the world and seamlessly jumps to the original one so that all overlays -like markers and vector layers are still visible.
    maxBoundsViscosityNumber0.0If maxBounds is set, this option will control how solid the bounds -are when dragging the map around. The default value of 0.0 allows the -user to drag outside the bounds at normal speed, higher values will -slow down map dragging outside bounds, and 1.0 makes the bounds fully -solid, preventing the user from dragging outside the bounds.
    - -
    - -

    Keyboard Navigation Options

    - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    keyboardBooleantrueMakes the map focusable and allows users to navigate the map with keyboard -arrows and +/- keys.
    keyboardPanDeltaNumber80Amount of pixels to pan when pressing an arrow key.
    - -
    - -

    Mouse wheel options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    scrollWheelZoomBoolean|StringtrueWhether the map can be zoomed by using the mouse wheel. If passed 'center', -it will zoom to the center of the view regardless of where the mouse was.
    wheelDebounceTimeNumber40Limits the rate at which a wheel can fire (in milliseconds). By default -user can't zoom via wheel more often than once per 40 ms.
    wheelPxPerZoomLevelNumber60How many scroll pixels (as reported by L.DomEvent.getWheelDelta) -mean a change of one full zoom level. Smaller values will make wheel-zooming -faster (and vice versa).
    - -
    - -

    Touch interaction options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tapBooleantrueEnables mobile hacks for supporting instant taps (fixing 200ms click -delay on iOS/Android) and touch holds (fired as contextmenu events).
    tapToleranceNumber15The max number of pixels a user can shift his finger during touch -for it to be considered a valid tap.
    touchZoomBoolean|String*Whether the map can be zoomed by touch-dragging with two fingers. If -passed 'center', it will zoom to the center of the view regardless of -where the touch events (fingers) were. Enabled for touch-capable web -browsers except for old Androids.
    bounceAtZoomLimitsBooleantrueSet it to false if you don't want the map to zoom beyond min/max zoom -and then bounce back when pinch-zooming.
    - -
    - - -
    -

    Events

    - -
    - -

    Layer events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    baselayerchangeLayersControlEventFired when the base layer is changed through the layers control.
    overlayaddLayersControlEventFired when an overlay is selected through the layers control.
    overlayremoveLayersControlEventFired when an overlay is deselected through the layers control.
    layeraddLayerEventFired when a new layer is added to the map.
    layerremoveLayerEventFired when some layer is removed from the map
    - -
    - -

    Map state change events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    zoomlevelschangeEventFired when the number of zoomlevels on the map is changed due -to adding or removing a layer.
    resizeResizeEventFired when the map is resized.
    unloadEventFired when the map is destroyed with remove method.
    viewresetEventFired when the map needs to redraw its content (this usually happens -on map zoom or load). Very useful for creating custom overlays.
    loadEventFired when the map is initialized (when its center and zoom are set -for the first time).
    zoomstartEventFired when the map zoom is about to change (e.g. before zoom animation).
    movestartEventFired when the view of the map starts changing (e.g. user starts dragging the map).
    zoomEventFired repeatedly during any change in zoom level, including zoom -and fly animations.
    moveEventFired repeatedly during any movement of the map, including pan and -fly animations.
    zoomendEventFired when the map zoom has changed, after any animations.
    moveendEventFired when the center of the map stops changing (e.g. user stopped dragging the map or when a non-centered zoom ends).
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup is opened in the map
    popupclosePopupEventFired when a popup in the map is closed
    autopanstartEventFired when the map starts autopanning when opening a popup.
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip is opened in the map.
    tooltipcloseTooltipEventFired when a tooltip in the map is closed.
    - -
    - -

    Location events

    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    locationerrorErrorEventFired when geolocation (using the locate method) failed.
    locationfoundLocationEventFired when geolocation (using the locate method) -went successfully.
    - -
    - -

    Interaction events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the map.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the map.
    mousedownMouseEventFired when the user pushes the mouse button on the map.
    mouseupMouseEventFired when the user releases the mouse button on the map.
    mouseoverMouseEventFired when the mouse enters the map.
    mouseoutMouseEventFired when the mouse leaves the map.
    mousemoveMouseEventFired while the mouse moves over the map.
    contextmenuMouseEventFired when the user pushes the right mouse button on the map, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    keypressKeyboardEventFired when the user presses a key from the keyboard that produces a character value while the map is focused.
    keydownKeyboardEventFired when the user presses a key from the keyboard while the map is focused. Unlike the keypress event, -the keydown event is fired for keys that produce a character value and for keys -that do not produce a character value.
    keyupKeyboardEventFired when the user releases a key from the keyboard while the map is focused.
    preclickMouseEventFired before mouse click on the map (sometimes useful when you -want something to happen on click before any existing click -handlers start running).
    - -
    - -

    Other Events

    - - - - - - - - - - - - - - -
    EventDataDescription
    zoomanimZoomAnimEventFired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getRenderer(<Path> layer)Renderer

    Returns the instance of Renderer that should be used to render the given -Path. It will ensure that the renderer options of the map and paths -are respected, and that the renderers do exist on the map.

    -
    - -
    - -

    Methods for Layers and Controls

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addControl(<Control> control)this

    Adds the given control to the map

    -
    removeControl(<Control> control)this

    Removes the given control from the map

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the map

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the map.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the map

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the map, optionally specifying context of the iterator function.

    -
    map.eachLayer(function(layer){
    -    layer.bindPopup('Hello');
    -});
    -
    -
    openPopup(<Popup> popup)this

    Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).

    -
    openPopup(<String|HTMLElement> content, <LatLng> latlng, <Popup options> options?)this

    Creates a popup with the specified content and options and opens it in the given point on a map.

    -
    closePopup(<Popup> popup?)this

    Closes the popup previously opened with openPopup (or the given one).

    -
    openTooltip(<Tooltip> tooltip)this

    Opens the specified tooltip.

    -
    openTooltip(<String|HTMLElement> content, <LatLng> latlng, <Tooltip options> options?)this

    Creates a tooltip with the specified content and options and open it.

    -
    closeTooltip(<Tooltip> tooltip?)this

    Closes the tooltip given as parameter.

    -
    - -
    - -

    Methods for modifying map state

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setView(<LatLng> center, <Number> zoom, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) with the given -animation options.

    -
    setZoom(<Number> zoom, <Zoom/pan options> options?)this

    Sets the zoom of the map.

    -
    zoomIn(<Number> delta?, <Zoom options> options?)this

    Increases the zoom of the map by delta (zoomDelta by default).

    -
    zoomOut(<Number> delta?, <Zoom options> options?)this

    Decreases the zoom of the map by delta (zoomDelta by default).

    -
    setZoomAround(<LatLng> latlng, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified geographical point on the map -stationary (e.g. used internally for scroll zoom and double-click zoom).

    -
    setZoomAround(<Point> offset, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.

    -
    fitBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets a map view that contains the given geographical bounds with the -maximum zoom level possible.

    -
    fitWorld(<fitBounds options> options?)this

    Sets a map view that mostly contains the whole world with the maximum -zoom level possible.

    -
    panTo(<LatLng> latlng, <Pan options> options?)this

    Pans the map to a given center.

    -
    panBy(<Point> offset, <Pan options> options?)this

    Pans the map by a given number of pixels (animated).

    -
    flyTo(<LatLng> latlng, <Number> zoom?, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) performing a smooth -pan-zoom animation.

    -
    flyToBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets the view of the map with a smooth animation like flyTo, -but takes a bounds parameter like fitBounds.

    -
    setMaxBounds(<LatLngBounds> bounds)this

    Restricts the map view to the given bounds (see the maxBounds option).

    -
    setMinZoom(<Number> zoom)this

    Sets the lower limit for the available zoom levels (see the minZoom option).

    -
    setMaxZoom(<Number> zoom)this

    Sets the upper limit for the available zoom levels (see the maxZoom option).

    -
    panInsideBounds(<LatLngBounds> bounds, <Pan options> options?)this

    Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.

    -
    panInside(<LatLng> latlng, <options> options?)this

    Pans the map the minimum amount to make the latlng visible. Use -padding, paddingTopLeft and paddingTopRight options to fit -the display to more restricted bounds, like fitBounds. -If latlng is already within the (optionally padded) display bounds, -the map will not be panned.

    -
    invalidateSize(<Zoom/pan options> options)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default. If options.pan is false, panning will not occur. -If options.debounceMoveend is true, it will delay moveend event so -that it doesn't happen often even if the method is called many -times in a row.

    -
    invalidateSize(<Boolean> animate)this

    Checks if the map container size changed and updates the map if so — -call it after you've changed the map size dynamically, also animating -pan by default.

    -
    stop()this

    Stops the currently running panTo or flyTo animation, if any.

    -
    - -
    - -

    Geolocation methods

    - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    locate(<Locate options> options?)this

    Tries to locate the user using the Geolocation API, firing a locationfound -event with location data on success or a locationerror event on failure, -and optionally sets the map view to the user's location with respect to -detection accuracy (or to the world view if geolocation failed). -Note that, if your page doesn't use HTTPS, this method will fail in -modern browsers (Chrome 50 and newer) -See Locate options for more details.

    -
    stopLocate()this

    Stops watching location previously initiated by map.locate({watch: true}) -and aborts resetting the map view if map.locate was called with -{setView: true}.

    -
    - -
    - -

    Other Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHandler(<String> name, <Function> HandlerClass)this

    Adds a new Handler to the map, given its name and constructor function.

    -
    remove()this

    Destroys the map and clears all related event listeners.

    -
    createPane(<String> name, <HTMLElement> container?)HTMLElement

    Creates a new map pane with the given name if it doesn't exist already, -then returns it. The pane is created as a child of container, or -as a child of the main map pane if not set.

    -
    getPane(<String|HTMLElement> pane)HTMLElement

    Returns a map pane, given its name or its HTML element (its identity).

    -
    getPanes()Object

    Returns a plain object containing the names of all panes as keys and -the panes as values.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the map.

    -
    whenReady(<Function> fn, <Object> context?)this

    Runs the given function fn when the map gets initialized with -a view (center and zoom) and at least one layer, or immediately -if it's already initialized, optionally passing a function context.

    -
    - -
    - -

    Methods for Getting Map State

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getCenter()LatLng

    Returns the geographical center of the map view

    -
    getZoom()Number

    Returns the current zoom level of the map view

    -
    getBounds()LatLngBounds

    Returns the geographical bounds visible in the current map view

    -
    getMinZoom()Number

    Returns the minimum zoom level of the map (if set in the minZoom option of the map or of any layers), or 0 by default.

    -
    getMaxZoom()Number

    Returns the maximum zoom level of the map (if set in the maxZoom option of the map or of any layers).

    -
    getBoundsZoom(<LatLngBounds> bounds, <Boolean> inside?, <Point> padding?)Number

    Returns the maximum zoom level on which the given bounds fit to the map -view in its entirety. If inside (optional) is set to true, the method -instead returns the minimum zoom level on which the map view fits into -the given bounds in its entirety.

    -
    getSize()Point

    Returns the current size of the map container (in pixels).

    -
    getPixelBounds()Bounds

    Returns the bounds of the current map view in projected pixel -coordinates (sometimes useful in layer and overlay implementations).

    -
    getPixelOrigin()Point

    Returns the projected pixel coordinates of the top left point of -the map layer (useful in custom layer and overlay implementations).

    -
    getPixelWorldBounds(<Number> zoom?)Bounds

    Returns the world's bounds in pixel coordinates for zoom level zoom. -If zoom is omitted, the map's current zoom level is used.

    -
    - -
    - -

    Conversion Methods

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getZoomScale(<Number> toZoom, <Number> fromZoom)Number

    Returns the scale factor to be applied to a map transition from zoom level -fromZoom to toZoom. Used internally to help with zoom animations.

    -
    getScaleZoom(<Number> scale, <Number> fromZoom)Number

    Returns the zoom level that the map would end up at, if it is at fromZoom -level and everything is scaled by a factor of scale. Inverse of -getZoomScale.

    -
    project(<LatLng> latlng, <Number> zoom)Point

    Projects a geographical coordinate LatLng according to the projection -of the map's CRS, then scales it according to zoom and the CRS's -Transformation. The result is pixel coordinate relative to -the CRS origin.

    -
    unproject(<Point> point, <Number> zoom)LatLng

    Inverse of project.

    -
    layerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToLayerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the origin pixel.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -map's CRS's wrapLat and wrapLng properties, if they are outside the -CRS's bounds. -By default this means longitude is wrapped around the dateline so its -value is between -180 and +180 degrees.

    -
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring that -its center is within the CRS's bounds. -By default this means the center longitude is wrapped around the dateline so its -value is between -180 and +180 degrees, and the majority of the bounds -overlaps the CRS's bounds.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates according to -the map's CRS. By default this measures distance in meters.

    -
    containerPointToLayerPoint(<Point> point)Point

    Given a pixel coordinate relative to the map container, returns the corresponding -pixel coordinate relative to the origin pixel.

    -
    layerPointToContainerPoint(<Point> point)Point

    Given a pixel coordinate relative to the origin pixel, -returns the corresponding pixel coordinate relative to the map container.

    -
    containerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the map container, returns -the corresponding geographical coordinate (for the current zoom level).

    -
    latLngToContainerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate -relative to the map container.

    -
    mouseEventToContainerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to the -map container where the event took place.

    -
    mouseEventToLayerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to -the origin pixel where the event took place.

    -
    mouseEventToLatLng(<MouseEvent> ev)LatLng

    Given a MouseEvent object, returns geographical coordinate where the -event took place.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Controls

    - - - - - - - - - - - - - - -
    PropertyTypeDescription
    zoomControlControl.ZoomThe default zoom control (only available if the -zoomControl option was true when creating the map).
    - -
    - -

    Handlers

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    boxZoomHandlerBox (shift-drag with mouse) zoom handler.
    doubleClickZoomHandlerDouble click zoom handler.
    draggingHandlerMap dragging handler (by both mouse and touch).
    keyboardHandlerKeyboard navigation handler.
    scrollWheelZoomHandlerScroll wheel zoom handler.
    tapHandlerMobile touch hacks (quick tap and touch hold) handler.
    touchZoomHandlerTouch zoom handler.
    - -
    - - -
    -

    Map panes

    - -
    - - - -
    Panes are DOM elements used to control the ordering of layers on the map. You -can access panes with map.getPane or -map.getPanes methods. New panes can be created with the -map.createPane method. -

    Every map has the following default panes that differ only in zIndex.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PaneTypeZ-indexDescription
    mapPaneHTMLElement'auto'Pane that contains all other map panes
    tilePaneHTMLElement200Pane for GridLayers and TileLayers
    overlayPaneHTMLElement400Pane for overlay shadows (e.g. Marker shadows)
    shadowPaneHTMLElement500Pane for vectors (Paths, like Polylines and Polygons), ImageOverlays and VideoOverlays
    markerPaneHTMLElement600Pane for Icons of Markers
    tooltipPaneHTMLElement650Pane for Tooltips.
    popupPaneHTMLElement700Pane for Popups.
    - -
    - - -
    - -
    -

    Locate options

    - -
    - - - -
    Some of the geolocation methods for Map take in an options parameter. This -is a plain javascript object with the following optional components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    watchBooleanfalseIf true, starts continuous watching of location changes (instead of detecting it -once) using W3C watchPosition method. You can later stop watching using -map.stopLocate() method.
    setViewBooleanfalseIf true, automatically sets the map view to the user location with respect to -detection accuracy, or to world view if geolocation failed.
    maxZoomNumberInfinityThe maximum zoom for automatic view setting when using setView option.
    timeoutNumber10000Number of milliseconds to wait for a response from geolocation before firing a -locationerror event.
    maximumAgeNumber0Maximum age of detected location. If less than this amount of milliseconds -passed since last geolocation response, locate will return a cached location.
    enableHighAccuracyBooleanfalseEnables high accuracy, see description in the W3C spec.
    - -
    - - -
    - -
    -

    Zoom options

    - -
    - - - -
    Some of the Map methods which modify the zoom level take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    - - -
    - -
    -

    Pan options

    - -
    - - - -
    Some of the Map methods which modify the center of the map take in an options -parameter. This is a plain javascript object with the following optional -components:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBooleanIf true, panning will always be animated if possible. If false, it will -not animate panning, either resetting the map view if panning more than a -screen away, or just setting a new offset for the map pane (except for panBy -which always does the latter).
    durationNumber0.25Duration of animated panning, in seconds.
    easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    - - -
    - -
    -

    Zoom/pan options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber0.25Duration of animated panning, in seconds.
    easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -
    - -
    -

    FitBounds options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingTopLeftPoint[0, 0]Sets the amount of padding in the top left corner of a map container that -shouldn't be accounted for when setting the view to fit bounds. Useful if you -have some control overlays on the map like a sidebar and you don't want them -to obscure objects you're zooming to.
    paddingBottomRightPoint[0, 0]The same for the bottom right corner of the map.
    paddingPoint[0, 0]Equivalent of setting both top left and bottom right padding to the same value.
    maxZoomNumbernullThe maximum possible zoom to use.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the -current view. If true, the map will attempt animating zoom disregarding where -zoom origin is. Setting false will make it always reset the view completely -without animation.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    durationNumber0.25Duration of animated panning, in seconds.
    easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the -Cubic Bezier curve). 1.0 means linear animation, -and the smaller this number, the more bowed the curve.
    noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for -panning inertia).
    - -
    -
    -
    - -

    Marker

    L.Marker is used to display clickable/draggable icons on the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.marker([50.5, 30.5]).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.marker(<LatLng> latlng, <Marker options> options?)Instantiates a Marker object given a geographical point and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconIcon*Icon instance to use for rendering the marker. -See Icon documentation for details on how to customize the marker icon. -If not specified, a common instance of L.Icon.Default is used.
    keyboardBooleantrueWhether the marker can be tabbed to with a keyboard and clicked by pressing enter.
    titleString''Text for the browser tooltip that appear on marker hover (no tooltip by default).
    altString''Text for the alt attribute of the icon image (useful for accessibility).
    zIndexOffsetNumber0By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
    opacityNumber1.0The opacity of the marker.
    riseOnHoverBooleanfalseIf true, the marker will get on top of others when you hover the mouse over it.
    riseOffsetNumber250The z-index offset used for the riseOnHover feature.
    paneString'markerPane'Map pane where the markers icon will be added.
    shadowPaneString'shadowPane'Map pane where the markers shadow will be added.
    bubblingMouseEventsBooleanfalseWhen true, a mouse event on this marker will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    - -

    Draggable marker options

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    draggableBooleanfalseWhether the marker is draggable with mouse/touch or not.
    autoPanBooleanfalseWhether to pan the map when dragging this marker near its edge or not.
    autoPanPaddingPointPoint(50, 50)Distance (in pixels to the left/right and to the top/bottom) of the -map edge to start panning the map.
    autoPanSpeedNumber10Number of pixels the map should pan by.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - -
    EventDataDescription
    moveEventFired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    - -
    - -

    Dragging events

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    dragstartEventFired when the user starts dragging the marker.
    movestartEventFired when the marker starts moving (because of dragging).
    dragEventFired repeatedly while the user drags the marker.
    dragendDragEndEventFired when the user stops dragging the marker.
    moveendEventFired when the marker stops moving (because of dragging).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - -
    In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLng()LatLng

    Returns the current geographical position of the marker.

    -
    setLatLng(<LatLng> latlng)this

    Changes the marker position to the given point.

    -
    setZIndexOffset(<Number> offset)this

    Changes the zIndex offset of the marker.

    -
    getIcon()Icon

    Returns the current icon used by the marker

    -
    setIcon(<Icon> icon)this

    Changes the marker icon.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the marker.

    -
    - -
    - -

    Other methods

    - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the marker (as a GeoJSON Point Feature).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Properties

    - -
    - -

    Interaction handlers

    - -
    Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see Handler methods). Example: -
    marker.dragging.disable();
    -
    - - - - - - - - - - - - - -
    PropertyTypeDescription
    draggingHandlerMarker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set marker.options.draggable).
    - -
    - - -

    Used to open popups in certain places of the map. Use Map.openPopup to -open popups while making sure that only one popup is open at one time -(recommended for usability), or use Map.addLayer to open as many as you want.

    - -
    - - -
    - - - - - -

    If you want to just bind a popup to marker click and then open it, it's really easy:

    -
    marker.bindPopup(popupContent).openPopup();
    -
    -

    Path overlays like polylines also have a bindPopup method. -Here's a more complicated way to open a popup on a map:

    -
    var popup = L.popup()
    -	.setLatLng(latlng)
    -	.setContent('<p>Hello world!<br />This is a nice popup.</p>')
    -	.openOn(map);
    -
    - - - -
    - - -
    - - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    - -
    - - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    - -
    -
    -
    - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    - -
    -
    -
    - -

    Tooltip

    Used to display small texts on top of map layers.

    - -
    -

    Usage example

    - -
    - - - - - -
    marker.bindTooltip("my tooltip text").openTooltip();
    -
    -

    Note about tooltip offset. Leaflet takes two options in consideration -for computing tooltip offsetting:

    -
      -
    • the offset Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. -Add a positive x offset to move the tooltip to the right, and a positive y offset to -move it to the bottom. Negatives will move to the left and top.
    • -
    • the tooltipAnchor Icon option: this will only be considered for Marker. You -should adapt this value if you use a custom icon.
    • -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tooltip(<Tooltip options> options?, <Layer> source?)Instantiates a Tooltip object given an optional options object that describes its appearance and location and an optional source object that is used to tag the tooltip with a reference to the Layer to which it refers.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'tooltipPane'Map pane where the tooltip will be added.
    offsetPointPoint(0, 0)Optional offset of the tooltip position.
    directionString'auto'Direction where to open the tooltip. Possible values are: right, left, -top, bottom, center, auto. -auto will dynamically switch between right and left according to the tooltip -position on the map.
    permanentBooleanfalseWhether to open the tooltip permanently or only on mouseover.
    stickyBooleanfalseIf true, the tooltip will follow the mouse instead of being fixed at the feature center.
    interactiveBooleanfalseIf true, the tooltip will listen to the feature events.
    opacityNumber0.9Tooltip container opacity.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    classNameString''A custom CSS class name to assign to the popup.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer

    Used to load and display tile layers on the map. Note that most tile servers require attribution, which you can set under Layer. Extends GridLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar', attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}).addTo(map);
    -
    - - - -
    - -

    URL template

    - - - -

    A string of the following form:

    -
    'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
    -
    -

    {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates. {r} can be used to add "@2x" to the URL to load retina tiles.

    -

    You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

    -
    L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - -

    Extension methods

    - - - - - - - - - - - - -
    FactoryDescription
    L.tilelayer(<String> urlTemplate, <TileLayer options> options?)Instantiates a tile layer object given a URL template and optionally an options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[]'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber0The zoom number used in tile URLs will be offset with this value.
    tmsBooleanfalseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBooleanfalseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBooleanfalseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the tiles. -If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. -Refer to CORS Settings for valid String values.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean(depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber1The explicit zIndex of the tile layer.
    boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString'tilePane'Map pane where the grid layer will be added.
    classNameString''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loadingEventFired when the grid layer starts loading tiles.
    tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstartTileEventFired when a tile is requested and starts loading.
    tileerrorTileErrorEventFired when there is an error loading a tile.
    tileloadTileEventFired when a tile loads.
    loadEventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true). -If the URL does not change, the layer will not be redrawn unless -the noRedraw parameter is set to false.

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending TileLayer might reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    getTileUrl(<Object> coords)String

    Called only internally, returns the URL for a tile given its coordinates. -Classes extending TileLayer can override this function to provide custom tile URL naming schemes.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    TileLayer.WMS

    Used to display WMS services as tile layers on the map. Extends TileLayer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
    -	layers: 'nexrad-n0r-900913',
    -	format: 'image/png',
    -	transparent: true,
    -	attribution: "Weather data © 2012 IEM Nexrad"
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.tileLayer.wms(<String> baseUrl, <TileLayer.WMS options> options)Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
    - -
    - - -
    -

    Options

    - -
    - - - -
    If any custom options not documented here are used, they will be sent to the -WMS server as extra parameters in each request URL. This can be useful for -non-standard vendor WMS parameters.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    layersString''(required) Comma-separated list of WMS layers to show.
    stylesString''Comma-separated list of WMS styles.
    formatString'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
    transparentBooleanfalseIf true, the WMS service will return images with transparency.
    versionString'1.1.1'Version of the WMS service to use
    crsCRSnullCoordinate Reference System to use for the WMS requests, defaults to -map CRS. Don't change this if you're not sure what it means.
    uppercaseBooleanfalseIf true, WMS request parameter keys will be uppercase.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[]'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber0The zoom number used in tile URLs will be offset with this value.
    tmsBooleanfalseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBooleanfalseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBooleanfalseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the tiles. -If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. -Refer to CORS Settings for valid String values.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean(depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber1The explicit zIndex of the tile layer.
    boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString'tilePane'Map pane where the grid layer will be added.
    classNameString''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loadingEventFired when the grid layer starts loading tiles.
    tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstartTileEventFired when a tile is requested and starts loading.
    tileerrorTileErrorEventFired when there is an error loading a tile.
    tileloadTileEventFired when a tile loads.
    loadEventFired when the grid layer loaded all visible tiles.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setParams(<Object> params, <Boolean> noRedraw?)this

    Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true). -If the URL does not change, the layer will not be redrawn unless -the noRedraw parameter is set to false.

    -
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() -to return an <img> HTML element with the appropriate image URL given coords. The done -callback is called when the tile has been loaded.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    ImageOverlay

    Used to load and display a single image over specific bounds of the map. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
    -	imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
    -L.imageOverlay(imageUrl, imageBounds).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.imageOverlay(<String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options?)Instantiates an image overlay object given the URL of the image and the -geographical bounds it is tied to.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber1.0The opacity of the image overlay.
    altString''Text for the alt attribute of the image (useful for accessibility).
    interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. -If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. -Refer to CORS Settings for valid String values.
    errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber1The explicit zIndex of the overlay layer.
    classNameString''A custom class name to assign to the image. Empty by default.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loadEventFired when the ImageOverlay layer has loaded its image
    errorEventFired when the ImageOverlay layer fails to load its image
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    -
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    -
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    -
    getElement()HTMLElement

    Returns the instance of HTMLImageElement -used by this overlay.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    VideoOverlay

    Used to load and display a video player over specific bounds of the map. Extends ImageOverlay.

    -

    A video overlay uses the <video> -HTML5 element.

    - -
    -

    Usage example

    - -
    - - - - - -
    var videoUrl = 'https://www.mapbox.com/bites/00188/patricia_nasa.webm',
    -	videoBounds = [[ 32, -130], [ 13, -100]];
    -L.videoOverlay(videoUrl, videoBounds ).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.videoOverlay(<String|Array|HTMLVideoElement> video, <LatLngBounds> bounds, <VideoOverlay options> options?)Instantiates an image overlay object given the URL of the video (or array of URLs, or even a video element) and the -geographical bounds it is tied to.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    autoplayBooleantrueWhether the video starts playing automatically when loaded.
    loopBooleantrueWhether the video will loop back to the beginning when played.
    keepAspectRatioBooleantrueWhether the video will save aspect ratio after the projection. -Relevant for supported browsers. See browser compatibility
    mutedBooleanfalseWhether the video starts on mute when loaded.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber1.0The opacity of the image overlay.
    altString''Text for the alt attribute of the image (useful for accessibility).
    interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. -If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. -Refer to CORS Settings for valid String values.
    errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber1The explicit zIndex of the overlay layer.
    classNameString''A custom class name to assign to the image. Empty by default.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - -
    EventDataDescription
    loadEventFired when the video has finished loading the first frame
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - -
    EventDataDescription
    errorEventFired when the ImageOverlay layer fails to load its image
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getElement()HTMLVideoElement

    Returns the instance of HTMLVideoElement -used by this overlay.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    -
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    -
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    SVGOverlay

    Used to load, display and provide DOM access to an SVG file over specific bounds of the map. Extends ImageOverlay.

    -

    An SVG overlay uses the <svg> element.

    - -
    -

    Usage example

    - -
    - - - - - -
    var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
    -svgElement.setAttribute('xmlns', "http://www.w3.org/2000/svg");
    -svgElement.setAttribute('viewBox', "0 0 200 200");
    -svgElement.innerHTML = '<rect width="200" height="200"/><rect x="75" y="23" width="50" height="50" style="fill:red"/><rect x="75" y="123" width="50" height="50" style="fill:#0013ff"/>';
    -var svgElementBounds = [ [ 32, -130 ], [ 13, -100 ] ];
    -L.svgOverlay(svgElement, svgElementBounds).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.svgOverlay(<String|SVGElement> svg, <LatLngBounds> bounds, <SVGOverlay options> options?)Instantiates an image overlay object given an SVG element and the geographical bounds it is tied to. -A viewBox attribute is required on the SVG element to zoom in and out properly.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    opacityNumber1.0The opacity of the image overlay.
    altString''Text for the alt attribute of the image (useful for accessibility).
    interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. -If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. -Refer to CORS Settings for valid String values.
    errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber1The explicit zIndex of the overlay layer.
    classNameString''A custom class name to assign to the image. Empty by default.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loadEventFired when the ImageOverlay layer has loaded its image
    errorEventFired when the ImageOverlay layer fails to load its image
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getElement()SVGElement

    Returns the instance of SVGElement -used by this overlay.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    -
    bringToFront()this

    Brings the layer to the top of all overlays.

    -
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    -
    setUrl(<String> url)this

    Changes the URL of the image.

    -
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    -
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    -
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Path

    An abstract class that contains options and constants shared between vector -overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polyline

    A class for drawing polyline overlays on a map. Extends Path.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polyline from an array of LatLng points
    -var latlngs = [
    -	[45.51, -122.68],
    -	[37.77, -122.43],
    -	[34.04, -118.2]
    -];
    -
    -var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
    -
    -// zoom the map to the polyline
    -map.fitBounds(polyline.getBounds());
    -
    -

    You can also pass a multi-dimensional array to represent a MultiPolyline shape:

    -
    // create a red polyline from an array of arrays of LatLng points
    -var latlngs = [
    -	[[45.51, -122.68],
    -	 [37.77, -122.43],
    -	 [34.04, -118.2]],
    -	[[40.78, -73.91],
    -	 [41.83, -87.62],
    -	 [32.76, -96.72]]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polyline(<LatLng[]> latlngs, <Polyline options> options?)Instantiates a polyline object given an array of geographical points and -optionally an options object. You can create a Polyline object with -multiple separate lines (MultiPolyline) by passing an array of arrays -of geographic points.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBooleanfalseDisable polyline clipping.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

    -
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng, <LatLng[]> latlngs?)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Polygon

    A class for drawing polygon overlays on a map. Extends Polyline.

    -

    Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

    - -
    -

    Usage example

    - -
    - - - - - -
    // create a red polygon from an array of LatLng points
    -var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
    -
    -var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
    -
    -// zoom the map to the polygon
    -map.fitBounds(polygon.getBounds());
    -
    -

    You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

    -
    var latlngs = [
    -  [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -  [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -];
    -
    -

    Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

    -
    var latlngs = [
    -  [ // first polygon
    -    [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    -    [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    -  ],
    -  [ // second polygon
    -    [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
    -  ]
    -];
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.polygon(<LatLng[]> latlngs, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBooleanfalseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng, <LatLng[]> latlngs?)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Rectangle

    A class for drawing rectangle overlays on a map. Extends Polygon.

    - -
    -

    Usage example

    - -
    - - - - - -
    // define rectangle geographical bounds
    -var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
    -
    -// create an orange rectangle
    -L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
    -
    -// zoom the map to the rectangle bounds
    -map.fitBounds(bounds);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.rectangle(<LatLngBounds> latLngBounds, <Polyline options> options?)
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means -better performance and smoother look, and less means more accurate representation.
    noClipBooleanfalseDisable polyline clipping.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setBounds(<LatLngBounds> latLngBounds)this

    Redraws the rectangle with the passed bounds.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    -
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    -
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    -
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    -
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    addLatLng(<LatLng> latlng, <LatLng[]> latlngs?)this

    Adds a given point to the polyline. By default, adds to the first ring of -the polyline in case of a multi-polyline, but can be overridden by passing -a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Circle

    A class for drawing circle overlays on a map. Extends CircleMarker.

    -

    It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).

    - -
    -

    Usage example

    - -
    - - - - - -
    L.circle([50.5, 30.5], {radius: 200}).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.circle(<LatLng> latlng, <Circle options> options?)Instantiates a circle object given a geographical point, and an options object -which contains the circle radius.
    L.circle(<LatLng> latlng, <Number> radius, <Circle options> options?)Obsolete way of instantiating a circle, for compatibility with 0.7.x code. -Do not use in new applications or plugins.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumberRadius of the circle, in meters.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - -
    EventDataDescription
    moveEventFired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setRadius(<Number> radius)this

    Sets the radius of a circle. Units are in meters.

    -
    getRadius()Number

    Returns the current radius of a circle. Units are in meters.

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    CircleMarker

    A circle of a fixed size with radius specified in pixels. Extends Path.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.circleMarker(<LatLng> latlng, <CircleMarker options> options?)Instantiates a circle marker object given a geographical point, and an optional options object.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    radiusNumber10Radius of the circle marker, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes -precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - -
    EventDataDescription
    moveEventFired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    -
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    -
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    -
    setRadius(<Number> radius)this

    Sets the radius of a circle marker. Units are in pixels.

    -
    getRadius()Number

    Returns the current radius of the circle

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    -
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    -
    bringToFront()this

    Brings the layer to the top of all path layers.

    -
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    SVG

    VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility -with old versions of Internet Explorer.

    -

    Allows vector layers to be displayed with SVG. -Inherits Renderer.

    -

    Due to technical limitations, SVG is not -available in all web browsers, notably Android 2.x and 3.x.

    -

    Although SVG is not available on IE7 and IE8, these browsers support -VML -(a now deprecated technology), and the SVG renderer will fall back to VML in -this case.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use SVG by default for all paths in the map:

    -
    var map = L.map('map', {
    -	renderer: L.svg()
    -});
    -
    -

    Use a SVG renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.svg({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.svg(<Renderer options> options?)Creates a SVG renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber0How much to extend click tolerance round a path/object on the map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - -
    EventDataDescription
    updateEventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - -
    There are several static functions which can be called without instantiating L.SVG:
    - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    create(<String> name)SVGElementReturns a instance of SVGElement, -corresponding to the class name passed. For example, using 'line' will return -an instance of SVGLineElement.
    pointsToPath(<Point[]> rings, <Boolean> closed)StringGenerates a SVG path string for multiple rings, with each ring turning -into "M..L..L.." instructions
    - -
    - - -

    Canvas

    Allows vector layers to be displayed with <canvas>. -Inherits Renderer.

    -

    Due to technical limitations, Canvas is not -available in all web browsers, notably IE8, and overlapping geometries might -not display properly in some edge cases.

    - -
    -

    Usage example

    - -
    - - - - - -

    Use Canvas by default for all paths in the map:

    -
    var map = L.map('map', {
    -	renderer: L.canvas()
    -});
    -
    -

    Use a Canvas renderer with extra padding for specific vector geometries:

    -
    var map = L.map('map');
    -var myRenderer = L.canvas({ padding: 0.5 });
    -var line = L.polyline( coordinates, { renderer: myRenderer } );
    -var circle = L.circle( center, { renderer: myRenderer } );
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.canvas(<Renderer options> options?)Creates a Canvas renderer with the given options.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber0How much to extend click tolerance round a path/object on the map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - -
    EventDataDescription
    updateEventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LayerGroup

    Used to group several layers and handle them as one. If you add it to the map, -any layers added or removed from the group will be added/removed on the map as -well. Extends Layer.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.layerGroup([marker1, marker2])
    -	.addLayer(polyline)
    -	.addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.layerGroup(<Layer[]> layers?, <Object> options?)Create a layer group, optionally given an initial set of layers and an options object.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -	layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    FeatureGroup

    Extended LayerGroup that makes it easier to do the same thing to all its member layers:

    -
      -
    • bindPopup binds a popup to all of the layers at once (likewise with bindTooltip)
    • -
    • Events are propagated to the FeatureGroup, so if the group has an event -handler, it will handle events from any of the layers. This includes mouse events -and custom events.
    • -
    • Has layeradd and layerremove events
    • -
    - -
    -

    Usage example

    - -
    - - - - - -
    L.featureGroup([marker1, marker2, polyline])
    -	.bindPopup('Hello world!')
    -	.on('click', function() { alert('Clicked on a member of the group!'); })
    -	.addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.featureGroup(<Layer[]> layers?, <Object> options?)Create a feature group, optionally given an initial set of layers and an options object.
    - -
    - - -
    -

    Options

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeraddLayerEventFired when a layer is added to this FeatureGroup
    layerremoveLayerEventFired when a layer is removed from this FeatureGroup
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setStyle(<Path options> style)this

    Sets the given path options to each layer of the group that has a setStyle method.

    -
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -	layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    GeoJSON

    Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse -GeoJSON data and display it on the map. Extends FeatureGroup.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.geoJSON(data, {
    -	style: function (feature) {
    -		return {color: feature.properties.color};
    -	}
    -}).bindPopup(function (layer) {
    -	return layer.feature.properties.description;
    -}).addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.geoJSON(<Object> geojson?, <GeoJSON options> options?)Creates a GeoJSON layer. Optionally accepts an object in -GeoJSON format to display on the map -(you can alternatively add it later with addData method) and an options object.
    - -
    - - -
    -

    Options

    - -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    pointToLayerFunction*A Function defining how GeoJSON points spawn Leaflet layers. It is internally -called when data is added, passing the GeoJSON point feature and its LatLng. -The default is to spawn a default Marker: -
    function(geoJsonPoint, latlng) {
    -	return L.marker(latlng);
    -}
    -
    styleFunction*A Function defining the Path options for styling GeoJSON lines and polygons, -called internally when data is added. -The default value is to not override any defaults: -
    function (geoJsonFeature) {
    -	return {}
    -}
    -
    onEachFeatureFunction*A Function that will be called once for each created Feature, after it has -been created and styled. Useful for attaching events and popups to features. -The default is to do nothing with the newly created layers: -
    function (feature, layer) {}
    -
    filterFunction*A Function that will be used to decide whether to include a feature or not. -The default is to include all features: -
    function (geoJsonFeature) {
    -	return true;
    -}
    -
    -

    Note: dynamically changing the filter option will have effect only on newly -added data. It will not re-evaluate already included features.

    coordsToLatLngFunction*A Function that will be used for converting GeoJSON coordinates to LatLngs. -The default is the coordsToLatLng static method.
    markersInheritOptionsBooleanfalseWhether default Markers for "Point" type Features inherit from group options.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    layeraddLayerEventFired when a layer is added to this FeatureGroup
    layerremoveLayerEventFired when a layer is removed from this FeatureGroup
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addData(data)this

    Adds a GeoJSON object to the layer.

    -
    resetStyle(layer?)this

    Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. -If layer is omitted, the style of all features in the current layer is reset.

    -
    setStyle(style)this

    Changes styles of GeoJSON vector layers with the given style function.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the layer group to the top of all other layers

    -
    bringToBack()this

    Brings the layer group to the back of all other layers

    -
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. -The default value is 6 places. -Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    -
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    -
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    -
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    -
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    -
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    -
    clearLayers()this

    Removes all the layers from the group.

    -
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any -additional parameters. Has no effect if the layers contained do not -implement methodName.

    -
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    -
    group.eachLayer(function (layer) {
    -	layer.bindPopup('Hello');
    -});
    -
    -
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    -
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    -
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    -
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -
    -

    Functions

    - -
    - - - -
    There are several static functions which can be called without instantiating L.GeoJSON:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    geometryToLayer(<Object> featureData, <GeoJSON options> options?)LayerCreates a Layer from a given GeoJSON feature. Can use a custom -pointToLayer and/or coordsToLatLng -functions if provided as options.
    coordsToLatLng(<Array> coords)LatLngCreates a LatLng object from an array of 2 numbers (longitude, latitude) -or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
    coordsToLatLngs(<Array> coords, <Number> levelsDeep?, <Function> coordsToLatLng?)ArrayCreates a multidimensional array of LatLngs from a GeoJSON coordinates array. -levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). -Can use a custom coordsToLatLng function.
    latLngToCoords(<LatLng> latlng, <Number> precision?)ArrayReverse of coordsToLatLng
    latLngsToCoords(<Array> latlngs, <Number> levelsDeep?, <Boolean> closed?)ArrayReverse of coordsToLatLngs -closed determines whether the first point should be appended to the end of the array to close the feature, only used when levelsDeep is 0. False by default.
    asFeature(<Object> geojson)ObjectNormalize GeoJSON geometries/features into GeoJSON features.
    - -
    - - -

    GridLayer

    Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas. -GridLayer can be extended to create a tiled grid of HTML elements like <canvas>, <img> or <div>. GridLayer will handle creating and animating these DOM elements for you.

    - -
    -

    Usage example

    - -
    - -

    Synchronous usage

    - - - -

    To create a custom layer, extend GridLayer and implement the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords){
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -
    -        // get a canvas context and draw something on it using coords.x, coords.y and coords.z
    -        var ctx = tile.getContext('2d');
    -
    -        // return the tile so it can be rendered on screen
    -        return tile;
    -    }
    -});
    -
    - - - -
    - -

    Asynchronous usage

    - - - -

    Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the done() callback.

    -
    var CanvasLayer = L.GridLayer.extend({
    -    createTile: function(coords, done){
    -        var error;
    -
    -        // create a <canvas> element for drawing
    -        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    -
    -        // setup tile width and height according to the options
    -        var size = this.getTileSize();
    -        tile.width = size.x;
    -        tile.height = size.y;
    -
    -        // draw something asynchronously and pass the tile to the done() callback
    -        setTimeout(function() {
    -            done(error, tile);
    -        }, 1000);
    -
    -        return tile;
    -    }
    -});
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean(depends)Load new tiles only when panning ends. -true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. -false otherwise in order to display new tiles during panning, since it is easy to pan outside the -keepBuffer option in desktop browsers.
    updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber1The explicit zIndex of the tile layer.
    boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumberundefinedThe maximum zoom level up to which this layer will be displayed (inclusive).
    maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels higher than maxNativeZoom will be loaded -from maxNativeZoom level and auto-scaled.
    minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, -the tiles on all zoom levels lower than minNativeZoom will be loaded -from minNativeZoom level and auto-scaled.
    noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the -GridLayer will only be displayed once at low zoom levels. Has no -effect when the map CRS doesn't wrap around. Can be used -in combination with bounds to prevent requesting -tiles outside the CRS limits.
    paneString'tilePane'Map pane where the grid layer will be added.
    classNameString''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    loadingEventFired when the grid layer starts loading tiles.
    tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstartTileEventFired when a tile is requested and starts loading.
    tileerrorTileErrorEventFired when there is an error loading a tile.
    tileloadTileEventFired when a tile loads.
    loadEventFired when the grid layer loaded all visible tiles.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    -
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    -
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    -
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    -
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    -
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    -
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    -
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    -
    - -
    - -

    Extension methods

    - -
    Layers extending GridLayer shall reimplement the following method.
    - - - - - - - - - - - - - -
    MethodReturnsDescription
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, must be overridden by classes extending GridLayer. -Returns the HTMLElement corresponding to the given coords. If the done callback -is specified, it must be called when the tile has finished loading and drawing.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    LatLng

    Represents a geographical point with a certain latitude and longitude.

    - -
    -

    Usage example

    - -
    - - - - - -
    var latlng = L.latLng(50.5, 30.5);
    -
    -

    All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

    -
    map.panTo([50, 30]);
    -map.panTo({lon: 30, lat: 50});
    -map.panTo({lat: 50, lng: 30});
    -map.panTo(L.latLng(50, 30));
    -
    -

    Note that LatLng does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLng(<Number> latitude, <Number> longitude, <Number> altitude?)Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
    L.latLng(<Array> coords)Expects an array of the form [Number, Number] or [Number, Number, Number] instead.
    L.latLng(<Object> coords)Expects an plain object of the form {lat: Number, lng: Number} or {lat: Number, lng: Number, alt: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    equals(<LatLng> otherLatLng, <Number> maxMargin?)Boolean

    Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

    -
    toString()String

    Returns a string representation of the point (for debugging purposes).

    -
    distanceTo(<LatLng> otherLatLng)Number

    Returns the distance (in meters) to the given LatLng calculated using the Spherical Law of Cosines.

    -
    wrap()LatLng

    Returns a new LatLng object with the longitude wrapped so it's always between -180 and +180 degrees.

    -
    toBounds(<Number> sizeInMeters)LatLngBounds

    Returns a new LatLngBounds object in which each boundary is sizeInMeters/2 meters apart from the LatLng.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latNumberLatitude in degrees
    lngNumberLongitude in degrees
    altNumberAltitude in meters (optional)
    - -
    - - -

    LatLngBounds

    Represents a rectangular geographical area on a map.

    - -
    -

    Usage example

    - -
    - - - - - -
    var corner1 = L.latLng(40.712, -74.227),
    -corner2 = L.latLng(40.774, -74.125),
    -bounds = L.latLngBounds(corner1, corner2);
    -
    -

    All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    map.fitBounds([
    -	[40.712, -74.227],
    -	[40.774, -74.125]
    -]);
    -
    -

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range.

    -

    Note that LatLngBounds does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.latLngBounds(<LatLng> corner1, <LatLng> corner2)Creates a LatLngBounds object by defining two diagonally opposite corners of the rectangle.
    L.latLngBounds(<LatLng[]> latlngs)Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<LatLng> latlng)this

    Extend the bounds to contain the given point

    -
    extend(<LatLngBounds> otherBounds)this

    Extend the bounds to contain the given bounds

    -
    pad(<Number> bufferRatio)LatLngBounds

    Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. -For example, a ratio of 0.5 extends the bounds by 50% in each direction. -Negative values will retract the bounds.

    -
    getCenter()LatLng

    Returns the center point of the bounds.

    -
    getSouthWest()LatLng

    Returns the south-west point of the bounds.

    -
    getNorthEast()LatLng

    Returns the north-east point of the bounds.

    -
    getNorthWest()LatLng

    Returns the north-west point of the bounds.

    -
    getSouthEast()LatLng

    Returns the south-east point of the bounds.

    -
    getWest()Number

    Returns the west longitude of the bounds

    -
    getSouth()Number

    Returns the south latitude of the bounds

    -
    getEast()Number

    Returns the east longitude of the bounds

    -
    getNorth()Number

    Returns the north latitude of the bounds

    -
    contains(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<LatLng> latlng)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.

    -
    overlaps(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.

    -
    toBBoxString()String

    Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.

    -
    equals(<LatLngBounds> otherBounds, <Number> maxMargin?)Boolean

    Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting maxMargin to a small number.

    -
    isValid()Boolean

    Returns true if the bounds are properly initialized.

    -
    - -
    - - -

    Point

    Represents a point with x and y coordinates in pixels.

    - -
    -

    Usage example

    - -
    - - - - - -
    var point = L.point(200, 300);
    -
    -

    All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

    -
    map.panBy([200, 300]);
    -map.panBy(L.point(200, 300));
    -
    -

    Note that Point does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.point(<Number> x, <Number> y, <Boolean> round?)Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
    L.point(<Number[]> coords)Expects an array of the form [x, y] instead.
    L.point(<Object> coords)Expects a plain object of the form {x: Number, y: Number} instead.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    clone()Point

    Returns a copy of the current point.

    -
    add(<Point> otherPoint)Point

    Returns the result of addition of the current and the given points.

    -
    subtract(<Point> otherPoint)Point

    Returns the result of subtraction of the given point from the current.

    -
    divideBy(<Number> num)Point

    Returns the result of division of the current point by the given number.

    -
    multiplyBy(<Number> num)Point

    Returns the result of multiplication of the current point by the given number.

    -
    scaleBy(<Point> scale)Point

    Multiply each coordinate of the current point by each coordinate of -scale. In linear algebra terms, multiply the point by the -scaling matrix -defined by scale.

    -
    unscaleBy(<Point> scale)Point

    Inverse of scaleBy. Divide each coordinate of the current point by -each coordinate of scale.

    -
    round()Point

    Returns a copy of the current point with rounded coordinates.

    -
    floor()Point

    Returns a copy of the current point with floored coordinates (rounded down).

    -
    ceil()Point

    Returns a copy of the current point with ceiled coordinates (rounded up).

    -
    trunc()Point

    Returns a copy of the current point with truncated coordinates (rounded towards zero).

    -
    distanceTo(<Point> otherPoint)Number

    Returns the cartesian distance between the current and the given points.

    -
    equals(<Point> otherPoint)Boolean

    Returns true if the given point has the same coordinates.

    -
    contains(<Point> otherPoint)Boolean

    Returns true if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).

    -
    toString()String

    Returns a string representation of the point for debugging purposes.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    xNumberThe x coordinate of the point
    yNumberThe y coordinate of the point
    - -
    - - -

    Bounds

    Represents a rectangular area in pixel coordinates.

    - -
    -

    Usage example

    - -
    - - - - - -
    var p1 = L.point(10, 10),
    -p2 = L.point(40, 60),
    -bounds = L.bounds(p1, p2);
    -
    -

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    -
    otherBounds.intersects([[10, 10], [40, 60]]);
    -
    -

    Note that Bounds does not inherit from Leaflet's Class object, -which means new classes can't inherit from it, and new methods -can't be added to it with the include function.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.bounds(<Point> corner1, <Point> corner2)Creates a Bounds object from two corners coordinate pairs.
    L.bounds(<Point[]> points)Creates a Bounds object from the given array of points.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    extend(<Point> point)this

    Extends the bounds to contain the given point.

    -
    getCenter(<Boolean> round?)Point

    Returns the center point of the bounds.

    -
    getBottomLeft()Point

    Returns the bottom-left point of the bounds.

    -
    getTopRight()Point

    Returns the top-right point of the bounds.

    -
    getTopLeft()Point

    Returns the top-left point of the bounds (i.e. this.min).

    -
    getBottomRight()Point

    Returns the bottom-right point of the bounds (i.e. this.max).

    -
    getSize()Point

    Returns the size of the given bounds

    -
    contains(<Bounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    -
    contains(<Point> point)Boolean

    Returns true if the rectangle contains the given point.

    -
    intersects(<Bounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds -intersect if they have at least one point in common.

    -
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds -overlap if their intersection is an area.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    minPointThe top left corner of the rectangle.
    maxPointThe bottom right corner of the rectangle.
    - -
    - - -

    Icon

    Represents an icon to provide when creating a marker.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.icon({
    -    iconUrl: 'my-icon.png',
    -    iconSize: [38, 95],
    -    iconAnchor: [22, 94],
    -    popupAnchor: [-3, -76],
    -    shadowUrl: 'my-icon-shadow.png',
    -    shadowSize: [68, 95],
    -    shadowAnchor: [22, 94]
    -});
    -
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.icon(<Icon options> options)Creates an icon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlStringnull(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlStringnullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePointnullSize of the icon image in pixels.
    iconAnchorPointnullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint[0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint[0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlStringnullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlStringnull
    shadowSizePointnullSize of the shadow image in pixels.
    shadowAnchorPointnullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    - - -
    - -
    -

    Icon.Default

    - -
    - - - -
    A trivial subclass of Icon, represents the icon to use in Markers when -no icon is specified. Points to the blue marker image distributed with Leaflet -releases. -

    In order to customize the default icon, just change the properties of L.Icon.Default.prototype.options -(which is a set of Icon options).

    -

    If you want to completely replace the default icon, override the -L.Marker.prototype.options.icon with your own icon instead.

    - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    imagePathStringIcon.Default will try to auto-detect the location of the -blue icon images. If you are placing these images in a non-standard -way, set this option to point to the right path.
    - -
    - - -

    DivIcon

    Represents a lightweight icon for markers that uses a simple <div> -element instead of an image. Inherits from Icon but ignores the iconUrl and shadow options.

    - -
    -

    Usage example

    - -
    - - - - - -
    var myIcon = L.divIcon({className: 'my-div-icon'});
    -// you can set .my-div-icon styles in CSS
    -
    -L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    -
    -

    By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.

    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.divIcon(<DivIcon options> options)Creates a DivIcon instance with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    htmlString|HTMLElement''Custom HTML code to put inside the div element, empty by default. Alternatively, -an instance of HTMLElement.
    bgPosPoint[0, 0]Optional relative position of the background, in pixels
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    iconUrlStringnull(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlStringnullThe URL to a retina sized version of the icon image (absolute or relative to your -script path). Used for Retina screen devices.
    iconSizePointnullSize of the icon image in pixels.
    iconAnchorPointnullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon -will be aligned so that this point is at the marker's geographical location. Centered -by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint[0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint[0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlStringnullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlStringnull
    shadowSizePointnullSize of the shadow image in pixels.
    shadowAnchorPointnullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same -as iconAnchor if not specified).
    classNameString''A custom class name to assign to both icon and shadow images. Empty by default.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element -styled according to the options.

    -
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    -
    - -
    -
    -
    - -

    Control.Zoom

    A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.zoom(<Control.Zoom options> options)Creates a zoom control
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    zoomInTextString'+'The text set on the 'zoom in' button.
    zoomInTitleString'Zoom in'The title set on the 'zoom in' button.
    zoomOutTextString'&#x2212' -The text set on the 'zoom out' button.
    zoomOutTitleString'Zoom out'The title set on the 'zoom out' button.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Attribution

    The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with the getAttribution method automatically. Extends Control.

    - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.attribution(<Control.Attribution options> options)Creates an attribution control.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    prefixString'Leaflet'The HTML text shown before the attributions. Pass false to disable.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    setPrefix(<String> prefix)this

    Sets the text before the attributions.

    -
    addAttribution(<String> text)this

    Adds an attribution text (e.g. 'Vector data &copy; Mapbox').

    -
    removeAttribution(<String> text)this

    Removes an attribution text.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Layers

    The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    var baseLayers = {
    -	"Mapbox": mapbox,
    -	"OpenStreetMap": osm
    -};
    -
    -var overlays = {
    -	"Marker": marker,
    -	"Roads": roadsLayer
    -};
    -
    -L.control.layers(baseLayers, overlays).addTo(map);
    -
    -

    The baseLayers and overlays parameters are object literals with layer names as keys and Layer objects as values:

    -
    {
    -    "<someName1>": layer1,
    -    "<someName2>": layer2
    -}
    -
    -

    The layer names can contain HTML, which allows you to add additional styling to the items:

    -
    {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.layers(<Object> baselayers?, <Object> overlays?, <Control.Layers options> options?)Creates a layers control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    collapsedBooleantrueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
    autoZIndexBooleantrueIf true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
    hideSingleBaseBooleanfalseIf true, the base layers in the control will be hidden when there is only one.
    sortLayersBooleanfalseWhether to sort the layers. When false, layers will keep the order -in which they were added to the control.
    sortFunctionFunction*A compare function -that will be used for sorting the layers, when sortLayers is true. -The function receives both the L.Layer instances and their names, as in -sortFunction(layerA, layerB, nameA, nameB). -By default, it sorts layers alphabetically by their name.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addBaseLayer(<Layer> layer, <String> name)this

    Adds a base layer (radio button entry) with the given name to the control.

    -
    addOverlay(<Layer> layer, <String> name)this

    Adds an overlay (checkbox entry) with the given name to the control.

    -
    removeLayer(<Layer> layer)this

    Remove the given layer from the control.

    -
    expand()this

    Expand the control container if collapsed.

    -
    collapse()this

    Collapse the control container if expanded.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Control.Scale

    A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends Control.

    - -
    -

    Usage example

    - -
    - - - - - -
    L.control.scale().addTo(map);
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - -
    FactoryDescription
    L.control.scale(<Control.Scale options> options?)Creates an scale control with the given options.
    - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    maxWidthNumber100Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
    metricBooleanTrueWhether to show the metric scale line (m/km).
    imperialBooleanTrueWhether to show the imperial scale line (mi/ft).
    updateWhenIdleBooleanfalseIf true, the control is updated on moveend, otherwise it's always up-to-date (updated on move).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    -
    -
    - -

    Browser

    A namespace with static properties for browser/feature detection used by Leaflet internally.

    - -
    -

    Usage example

    - -
    - - - - - -
    if (L.Browser.ielt9) {
    -  alert('Upgrade your browser, dude!');
    -}
    -
    - - - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    ieBooleantrue for all Internet Explorer versions (not Edge).
    ielt9Booleantrue for Internet Explorer versions less than 9.
    edgeBooleantrue for the Edge web browser.
    webkitBooleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
    androidBooleantrue for any browser running on an Android platform.
    android23Booleantrue for browsers running on Android 2 or Android 3.
    androidStockBooleantrue for the Android stock browser (i.e. not Chrome)
    operaBooleantrue for the Opera browser
    chromeBooleantrue for the Chrome browser.
    geckoBooleantrue for gecko-based browsers like Firefox.
    safariBooleantrue for the Safari browser.
    opera12Booleantrue for the Opera browser supporting CSS transforms (version 12 or later).
    winBooleantrue when the browser is running in a Windows platform
    ie3dBooleantrue for all Internet Explorer versions supporting CSS transforms.
    webkit3dBooleantrue for webkit-based browsers supporting CSS transforms.
    gecko3dBooleantrue for gecko-based browsers supporting CSS transforms.
    any3dBooleantrue for all browsers supporting CSS transforms.
    mobileBooleantrue for all browsers running in a mobile device.
    mobileWebkitBooleantrue for all webkit-based browsers in a mobile device.
    mobileWebkit3dBooleantrue for all webkit-based browsers in a mobile device supporting CSS transforms.
    msPointerBooleantrue for browsers implementing the Microsoft touch events model (notably IE10).
    pointerBooleantrue for all browsers supporting pointer events.
    touchBooleantrue for all browsers supporting touch events. -This does not necessarily mean that the browser is running in a computer with -a touchscreen, it only means that the browser is capable of understanding -touch events.
    mobileOperaBooleantrue for the Opera browser in a mobile device.
    mobileGeckoBooleantrue for gecko-based browsers running in a mobile device.
    retinaBooleantrue for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%.
    passiveEventsBooleantrue for browsers that support passive events.
    canvasBooleantrue when the browser supports <canvas>.
    svgBooleantrue when the browser supports SVG.
    vmlBooleantrue if the browser supports VML.
    - -
    - - -

    Util

    Various utility functions, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> dest, <Object> src?)ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
    create(<Object> proto, <Object> properties?)ObjectCompatibility polyfill for Object.create
    bind(<Function> fn, )FunctionReturns a new function bound to the arguments passed, like Function.prototype.bind. -Has a L.bind() shortcut.
    stamp(<Object> obj)NumberReturns the unique ID of an object, assigning it one if it doesn't have it.
    throttle(<Function> fn, <Number> time, <Object> context)FunctionReturns a function which executes function fn with the given scope context -(so that the this keyword refers to context inside fn's code). The function -fn will be called no more than one time per given amount of time. The arguments -received by the bound function will be any arguments passed when binding the -function, followed by any arguments passed when invoking the bound function. -Has an L.throttle shortcut.
    wrapNum(<Number> num, <Number[]> range, <Boolean> includeMax?)NumberReturns the number num modulo range in such a way so it lies within -range[0] and range[1]. The returned value will be always smaller than -range[1] unless includeMax is set to true.
    falseFn()FunctionReturns a function which always returns false.
    formatNum(<Number> num, <Number> digits?)NumberReturns the number num rounded to digits decimals, or to 6 decimals by default.
    trim(<String> str)StringCompatibility polyfill for String.prototype.trim
    splitWords(<String> str)String[]Trims and splits the string on whitespace and returns the array of parts.
    setOptions(<Object> obj, <Object> options)ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.
    getParamString(<Object> obj, <String> existingUrl?, <Boolean> uppercase?)StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} -translates to '?a=foo&b=bar'. If existingUrl is set, the parameters will -be appended at the end. If uppercase is true, the parameter names will -be uppercased (e.g. '?A=foo&B=bar')
    template(<String> str, <Object> data)StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' -and a data object like {a: 'foo', b: 'bar'}, returns evaluated string -('Hello foo, bar'). You can also specify functions instead of strings for -data values — they will be evaluated passing data as an argument.
    isArray(obj)BooleanCompatibility polyfill for Array.isArray
    indexOf(<Array> array, <Object> el)NumberCompatibility polyfill for Array.prototype.indexOf
    requestAnimFrame(<Function> fn, <Object> context?, <Boolean> immediate?)NumberSchedules fn to be executed when the browser repaints. fn is bound to -context if given. When immediate is set, fn is called immediately if -the browser doesn't have native support for -window.requestAnimationFrame, -otherwise it's delayed. Returns a request ID that can be used to cancel the request.
    cancelAnimFrame(<Number> id)undefinedCancels a previous requestAnimFrame. See also window.cancelAnimationFrame.
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    lastIdNumberLast unique ID used by stamp()
    emptyImageUrlStringData URI string containing a base64-encoded empty GIF image. -Used as a hack to free memory from unused images on WebKit-powered -mobile devices (by setting image src to this string).
    - -
    - - -

    Transformation

    Represents an affine transformation: a set of coefficients a, b, c, d -for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing -the reverse. Used by Leaflet in its projections code.

    - -
    -

    Usage example

    - -
    - - - - - -
    var transformation = L.transformation(2, 5, -1, 10),
    -	p = L.point(1, 2),
    -	p2 = transformation.transform(p), //  L.point(7, 8)
    -	p3 = transformation.untransform(p2); //  L.point(1, 2)
    -
    - - - -
    - - -
    -

    Creation

    - -
    - - - - - - - - - - - - - - - - - - -
    FactoryDescription
    L.transformation(<Number> a, <Number> b, <Number> c, <Number> d)Instantiates a Transformation object with the given coefficients.
    L.transformation(<Array> coefficients)Expects an coefficients array of the form -[a: Number, b: Number, c: Number, d: Number].
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    transform(<Point> point, <Number> scale?)Point

    Returns a transformed point, optionally multiplied by the given scale. -Only accepts actual L.Point instances, not arrays.

    -
    untransform(<Point> point, <Number> scale?)Point

    Returns the reverse transformation of the given point, optionally divided -by the given scale. Only accepts actual L.Point instances, not arrays.

    -
    - -
    - - -

    LineUtil

    Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    simplify(<Point[]> points, <Number> tolerance)Point[]Dramatically reduces the number of points in a polyline while retaining -its shape and returns a new array of simplified points, using the -Douglas-Peucker algorithm. -Used for a huge performance boost when processing/displaying Leaflet polylines for -each zoom level and also reducing visual noise. tolerance affects the amount of -simplification (lesser value means higher quality but slower and with more points). -Also released as a separated micro-library Simplify.js.
    pointToSegmentDistance(<Point> p, <Point> p1, <Point> p2)NumberReturns the distance between point p and segment p1 to p2.
    closestPointOnSegment(<Point> p, <Point> p1, <Point> p2)NumberReturns the closest point from a point p on a segment p1 to p2.
    clipSegment(<Point> a, <Point> b, <Bounds> bounds, <Boolean> useLastCode?, <Boolean> round?)Point[]|BooleanClips the segment a to b by rectangular bounds with the -Cohen-Sutherland algorithm -(modifying the segment points directly!). Used by Leaflet to only show polyline -points that are on the screen or near, increasing performance.
    isFlat(<LatLng[]> latlngs)BooleanReturns true if latlngs is a flat array, false is nested.
    - -
    - - -

    PolyUtil

    Various utility functions for polygon geometries.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    clipPolygon(<Point[]> points, <Bounds> bounds, <Boolean> round?)Point[]Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgman algorithm). -Used by Leaflet to only show polygon points that are on the screen or near, increasing -performance. Note that polygon points needs different algorithm for clipping -than polyline, so there's a separate method for it.
    - -
    - - -

    DomEvent

    Utility functions to work with the DOM events, used by Leaflet internally.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    on(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisAdds a listener function (fn) to a particular DOM event type of the -element el. You can optionally specify the context of the listener -(object the this keyword will point to). You can also pass several -space-separated types (e.g. 'click dblclick').
    on(<HTMLElement> el, <Object> eventMap, <Object> context?)thisAdds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    off(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisRemoves a previously added listener function. -Note that if you passed a custom context to on, you must pass the same -context to off in order to remove the listener.
    off(<HTMLElement> el, <Object> eventMap, <Object> context?)thisRemoves a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    stopPropagation(<DOMEvent> ev)thisStop the given event from propagation to parent elements. Used inside the listener functions: -
    L.DomEvent.on(div, 'click', function (ev) {
    -	L.DomEvent.stopPropagation(ev);
    -});
    -
    disableScrollPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'wheel' events (plus browser variants).
    disableClickPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'click', 'doubleclick', -'mousedown' and 'touchstart' events (plus browser variants).
    preventDefault(<DOMEvent> ev)thisPrevents the default action of the DOM Event ev from happening (such as -following a link in the href of the a element, or doing a POST request -with page reload when a <form> is submitted). -Use it inside listener functions.
    stop(<DOMEvent> ev)thisDoes stopPropagation and preventDefault at the same time.
    getMousePosition(<DOMEvent> ev, <HTMLElement> container?)PointGets normalized mouse position from a DOM event relative to the -container (border excluded) or to the whole page if not specified.
    getWheelDelta(<DOMEvent> ev)NumberGets normalized wheel delta from a wheel DOM event, in vertical -pixels scrolled (negative if scrolling down). -Events from pointing devices without precise scrolling are mapped to -a best guess of 60 pixels.
    addListener()thisAlias to L.DomEvent.on
    removeListener()thisAlias to L.DomEvent.off
    - -
    - - -

    DomUtil

    Utility functions to work with the DOM -tree, used by Leaflet internally.

    -

    Most functions expecting or returning a HTMLElement also work for -SVG elements. The only difference is that classes refer to CSS classes -in HTML and SVG classes in SVG.

    - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    get(<String|HTMLElement> id)HTMLElementReturns an element given its DOM id, or returns the element itself -if it was passed directly.
    getStyle(<HTMLElement> el, <String> styleAttrib)StringReturns the value for a certain style attribute on an element, -including computed values or values set through CSS.
    create(<String> tagName, <String> className?, <HTMLElement> container?)HTMLElementCreates an HTML element with tagName, sets its class to className, and optionally appends it to container element.
    remove(<HTMLElement> el)Removes el from its parent element
    empty(<HTMLElement> el)Removes all of el's children elements from el
    toFront(<HTMLElement> el)Makes el the last child of its parent, so it renders in front of the other children.
    toBack(<HTMLElement> el)Makes el the first child of its parent, so it renders behind the other children.
    hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element's class attribute contains name.
    addClass(<HTMLElement> el, <String> name)Adds name to the element's class attribute.
    removeClass(<HTMLElement> el, <String> name)Removes name from the element's class attribute.
    setClass(<HTMLElement> el, <String> name)Sets the element's class.
    getClass(<HTMLElement> el)StringReturns the element's class.
    setOpacity(<HTMLElement> el, <Number> opacity)Set the opacity of an element (including old IE support). -opacity must be a number from 0 to 1.
    testProp(<String[]> props)String|falseGoes through the array of style names and returns the first name -that is a valid style name for an element. If no such name is found, -it returns false. Useful for vendor-prefixed styles like transform.
    setTransform(<HTMLElement> el, <Point> offset, <Number> scale?)Resets the 3D CSS transform of el so it is translated by offset pixels -and optionally scaled by scale. Does not have an effect if the -browser doesn't support 3D CSS transforms.
    setPosition(<HTMLElement> el, <Point> position)Sets the position of el to coordinates specified by position, -using CSS translate or top/left positioning depending on the browser -(used by Leaflet internally to position its layers).
    getPosition(<HTMLElement> el)PointReturns the coordinates of an element previously positioned with setPosition.
    disableTextSelection()Prevents the user from generating selectstart DOM events, usually generated -when the user drags the mouse through a page with text. Used internally -by Leaflet to override the behaviour of any click-and-drag interaction on -the map. Affects drag interactions on the whole document.
    enableTextSelection()Cancels the effects of a previous L.DomUtil.disableTextSelection.
    disableImageDrag()As L.DomUtil.disableTextSelection, but -for dragstart DOM events, usually generated when the user drags an image.
    enableImageDrag()Cancels the effects of a previous L.DomUtil.disableImageDrag.
    preventOutline(<HTMLElement> el)Makes the outline -of the element el invisible. Used internally by Leaflet to prevent -focusable elements from displaying an outline when the user performs a -drag interaction on them.
    restoreOutline()Cancels the effects of a previous L.DomUtil.preventOutline.
    getSizedParentNode(<HTMLElement> el)HTMLElementFinds the closest parent node which size (width and height) is not null.
    getScale(<HTMLElement> el)ObjectComputes the CSS scale currently applied on the element. -Returns an object with x and y members as horizontal and vertical scales respectively, -and boundingClientRect as the result of getBoundingClientRect().
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    TRANSFORMStringVendor-prefixed transform style name (e.g. 'webkitTransform' for WebKit).
    TRANSITIONStringVendor-prefixed transition style name.
    TRANSITION_ENDStringVendor-prefixed transitionend event name.
    - -
    - - -

    PosAnimation

    Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

    - -
    -

    Usage example

    - -
    - - - - - -
    var fx = new L.PosAnimation();
    -fx.run(el, [300, 500], 0.5);
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.PosAnimation()Creates a PosAnimation object.
    - - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    startEventFired when the animation starts
    stepEventFired continuously during the animation.
    endEventFired when the animation ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    run(<HTMLElement> el, <Point> newPos, <Number> duration?, <Number> easeLinearity?)

    Run an animation of a given element to a new position, optionally setting -duration in seconds (0.25 by default) and easing linearity factor (3rd -argument of the cubic bezier curve, -0.5 by default).

    -
    stop()

    Stops the animation (if currently running).

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Draggable

    A class for making DOM elements draggable (including touch support). -Used internally for map and marker dragging. Only works for elements -that were positioned with L.DomUtil.setPosition.

    - -
    -

    Usage example

    - -
    - - - - - -
    var draggable = new L.Draggable(elementToDrag);
    -draggable.enable();
    -
    - - - -
    - - -
    -

    Constructor

    - -
    - - - - - - - - - - - - - - -
    ConstructorDescription
    L.Draggable(<HTMLElement> el, <HTMLElement> dragHandle?, <Boolean> preventOutline?, <Draggable options> options?)Creates a Draggable object for moving el when you start dragging the dragHandle element (equals el itself by default).
    - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    clickToleranceNumber3The max number of pixels a user can shift the mouse pointer during a click -for it to be considered a valid click (as opposed to a mouse drag).
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    downEventFired when a drag is about to start.
    dragstartEventFired when a drag starts
    predragEventFired continuously during dragging before each corresponding -update of the element's position.
    dragEventFired continuously during dragging.
    dragendDragEndEventFired when the drag ends.
    - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()

    Enables the dragging ability

    -
    disable()

    Disables the dragging ability

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Class

    L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

    -

    In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

    - -
    -

    Usage example

    - -
    - - - - - -
    var MyClass = L.Class.extend({
    -initialize: function (greeter) {
    -	this.greeter = greeter;
    -	// class constructor
    -},
    -
    -greet: function (name) {
    -	alert(this.greeter + ', ' + name)
    -	}
    -});
    -
    -// create instance of MyClass, passing "Hello" to the constructor
    -var a = new MyClass("Hello");
    -
    -// call greet method, alerting "Hello, World"
    -a.greet("World");
    -
    - - - -
    - -

    Class Factories

    - - - -

    You may have noticed that Leaflet objects are created without using -the new keyword. This is achieved by complementing each class with a -lowercase factory method:

    -
    new L.Map('map'); // becomes:
    -L.map('map');
    -
    -

    The factories are implemented very easily, and you can do this for your own classes:

    -
    L.map = function (id, options) {
    -    return new L.Map(id, options);
    -};
    -
    - - - -
    - -

    Inheritance

    - - - -

    You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

    -
    var MyChildClass = MyClass.extend({
    -    // ... new properties and methods
    -});
    -
    -

    This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

    -
    var a = new MyChildClass();
    -a instanceof MyChildClass; // true
    -a instanceof MyClass; // true
    -
    -

    You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

    -
    var MyChildClass = MyClass.extend({
    -    initialize: function () {
    -        MyClass.prototype.initialize.call(this, "Yo");
    -    },
    -
    -    greet: function (name) {
    -        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
    -    }
    -});
    -
    -var a = new MyChildClass();
    -a.greet('Jason'); // alerts "Yo, bro Jason!"
    -
    - - - -
    - -

    Options

    - - - -

    options is a special property that unlike other objects that you pass -to extend will be merged with the parent one instead of overriding it -completely, which makes managing configuration of objects and default -values convenient:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        myOption1: 'foo',
    -        myOption2: 'bar'
    -    }
    -});
    -
    -var MyChildClass = MyClass.extend({
    -    options: {
    -        myOption1: 'baz',
    -        myOption3: 5
    -    }
    -});
    -
    -var a = new MyChildClass();
    -a.options.myOption1; // 'baz'
    -a.options.myOption2; // 'bar'
    -a.options.myOption3; // 5
    -
    -

    There's also L.Util.setOptions, a method for -conveniently merging options passed to constructor with the defaults -defines in the class:

    -
    var MyClass = L.Class.extend({
    -    options: {
    -        foo: 'bar',
    -        bla: 5
    -    },
    -
    -    initialize: function (options) {
    -        L.Util.setOptions(this, options);
    -        ...
    -    }
    -});
    -
    -var a = new MyClass({bla: 10});
    -a.options; // {foo: 'bar', bla: 10}
    -
    -

    Note that the options object allows any keys, not just -the options defined by the class and its base classes. -This means you can use the options object to store -application specific information, as long as you avoid -keys that are already used by the class in question.

    - - - -
    - -

    Includes

    - - - -

    includes is a special class property that merges all specified objects into the class (such objects are called mixins).

    -
     var MyMixin = {
    -    foo: function () { ... },
    -    bar: 5
    -};
    -
    -var MyClass = L.Class.extend({
    -    includes: MyMixin
    -});
    -
    -var a = new MyClass();
    -a.foo();
    -
    -

    You can also do such includes in runtime with the include method:

    -
    MyClass.include(MyMixin);
    -
    -

    statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

    -
    var MyClass = L.Class.extend({
    -    statics: {
    -        FOO: 'bar',
    -        BLA: 5
    -    }
    -});
    -
    -MyClass.FOO; // 'bar'
    -
    - - - -
    - -

    Constructor hooks

    - - - -

    If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

    -
    MyClass.addInitHook(function () {
    -    // ... do something in constructor additionally
    -    // e.g. add event listeners, set custom properties etc.
    -});
    -
    -

    You can also use the following shortcut when you just need to make one additional method call:

    -
    MyClass.addInitHook('methodName', arg1, arg2, …);
    -
    - - - -
    - - -
    -

    Functions

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    extend(<Object> props)FunctionExtends the current class given the properties to be included. -Returns a Javascript function that is a class constructor (to be called with new).
    include(<Object> properties)thisIncludes a mixin into the current class.
    mergeOptions(<Object> options)thisMerges options into the defaults of the class.
    addInitHook(<Function> fn)thisAdds a constructor hook to the class.
    - -
    - - -

    Evented

    A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

    - -
    -

    Usage example

    - -
    - - - - - -
    map.on('click', function(e) {
    -	alert(e.latlng);
    -} );
    -
    -

    Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

    -
    function onClick(e) { ... }
    -
    -map.on('click', onClick);
    -map.off('click', onClick);
    -
    - - - -
    - - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    - - -

    Layer

    A set of methods from the Layer base class that all Leaflet layers use. -Inherits all methods, options and events from L.Evented.

    - -
    -

    Usage example

    - -
    - - - - - -
    var layer = L.marker(latlng).addTo(map);
    -layer.addTo(map);
    -layer.remove();
    -
    - - - -
    - - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    - - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    - -

    Popup events

    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    - -

    Tooltip events

    - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Layer will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    - -

    Extension methods

    - -
    Every layer should extend from L.Layer and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)this

    Should contain code that creates DOM elements for the layer, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).

    -
    onRemove(<Map> map)this

    Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).

    -
    getEvents()Object

    This optional method should return an object like { viewreset: this._reset } for addEventListener. The event handlers in this object will be automatically added and removed from the map with your layer.

    -
    getAttribution()String

    This optional method should return a string containing HTML to be shown on the Attribution control whenever the layer is visible.

    -
    beforeAdd(<Map> map)this

    Optional method. Called on map.addLayer(layer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.

    -
    - -
    - -

    Popup methods

    - -
    All layers share a set of methods convenient for binding popups to it. -
    var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
    -layer.openPopup();
    -layer.closePopup();
    -
    -

    Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    - -

    Tooltip methods

    - -
    All layers share a set of methods convenient for binding tooltips to it. -
    var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
    -layer.openTooltip();
    -layer.closeTooltip();
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Interactive layer

    Some Layers can be made interactive - when the user interacts -with such a layer, mouse events like click and mouseover can be handled. -Use the event handling methods to handle these events.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map -(unless L.DomEvent.stopPropagation is used).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - -

    Mouse events

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents -default browser context menu from showing if there are listeners on -this event. Also fired on mobile when the user holds a single touch -for a second (also called long press).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Control

    L.Control is a base class for implementing map controls. Handles positioning. -All other controls extend from this class.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', -'topright', 'bottomleft' or 'bottomright'
    - -
    - - -
    -

    Methods

    - -
    - - - -
    Classes extending L.Control will inherit the following methods:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    -
    setPosition(<string> position)this

    Sets the position of the control.

    -
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    -
    addTo(<Map> map)this

    Adds the control to the given map.

    -
    remove()this

    Removes the control from the map it is currently active on.

    -
    - -
    - -

    Extension methods

    - -
    Every control should extend from L.Control and (re-)implement the following methods.
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    onAdd(<Map> map)HTMLElement

    Should return the container DOM element for the control and add listeners on relevant map events. Called on control.addTo(map).

    -
    onRemove(<Map> map)

    Optional method. Should contain all clean up code that removes the listeners previously added in onAdd. Called on control.remove().

    -
    - -
    - - -

    Handler

    Abstract class for map interaction handlers

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    enable()this

    Enables the handler

    -
    disable()this

    Disables the handler

    -
    enabled()Boolean

    Returns true if the handler is enabled

    -
    - -
    - -

    Extension methods

    - -
    Classes inheriting from Handler must implement the two following methods:
    - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addHooks()

    Called when the handler is enabled, should add event hooks.

    -
    removeHooks()

    Called when the handler is disabled, should remove the event hooks added previously.

    -
    - -
    - - -
    -

    Functions

    - -
    - -

    There is static function which can be called without instantiating L.Handler:

    - - - - - - - - - - - - - - -
    FunctionReturnsDescription
    addTo(<Map> map, <String> name)thisAdds a new Handler to the given map with the given name.
    - -
    - - -

    Projection

    An object with methods for projecting geographical coordinates of the world onto -a flat surface (and back). See Map projection.

    - -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    project(<LatLng> latlng)Point

    Projects geographical coordinates into a 2D point. -Only accepts actual L.LatLng instances, not arrays.

    -
    unproject(<Point> point)LatLng

    The inverse of project. Projects a 2D point into a geographical location. -Only accepts actual L.Point instances, not arrays.

    -

    Note that the projection instances do not inherit from Leaflet's Class object, -and can't be instantiated. Also, new classes can't inherit from them, -and methods can't be added to them with the include function.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    boundsBoundsThe bounds (specified in CRS units) where the projection is valid
    - -
    - - -
    -

    Defined projections

    - -
    - - - -
    Leaflet comes with a set of already defined Projections out of the box:
    - - - - - - - - - - - - - - - - - - - -
    ProjectionDescription
    L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, -mostly used by GIS enthusiasts. Directly maps x as longitude, and y as -latitude. Also suitable for flat worlds, e.g. game maps. Used by the -EPSG:4326 and Simple CRS.
    L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS.
    L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, -used by almost all free and commercial tile providers. Assumes that Earth is -a sphere. Used by the EPSG:3857 CRS.
    - -
    - - -

    CRS

    -
    -

    Methods

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    latLngToPoint(<LatLng> latlng, <Number> zoom)Point

    Projects geographical coordinates into pixel coordinates for a given zoom.

    -
    pointToLatLng(<Point> point, <Number> zoom)LatLng

    The inverse of latLngToPoint. Projects pixel coordinates on a given -zoom into geographical coordinates.

    -
    project(<LatLng> latlng)Point

    Projects geographical coordinates into coordinates in units accepted for -this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).

    -
    unproject(<Point> point)LatLng

    Given a projected coordinate returns the corresponding LatLng. -The inverse of project.

    -
    scale(<Number> zoom)Number

    Returns the scale used when transforming projected coordinates into -pixel coordinates for a particular zoom. For example, it returns -256 * 2^zoom for Mercator-based CRS.

    -
    zoom(<Number> scale)Number

    Inverse of scale(), returns the zoom level corresponding to a scale -factor of scale.

    -
    getProjectedBounds(<Number> zoom)Bounds

    Returns the projection's bounds scaled and transformed for the provided zoom.

    -
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates.

    -
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the -CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds.

    -
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring -that its center is within the CRS's bounds. -Only accepts actual L.LatLngBounds instances, not arrays.

    -
    - -
    - - -
    -

    Properties

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    codeStringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857')
    wrapLngNumber[]An array of two numbers defining whether the longitude (horizontal) coordinate -axis wraps around a given range and how. Defaults to [-180, 180] in most -geographical CRSs. If undefined, the longitude axis does not wrap around.
    wrapLatNumber[]Like wrapLng, but for the latitude (vertical) axis.
    infiniteBooleanIf true, the coordinate space will be unbounded (infinite in both axes)
    - -
    - - -
    -

    Defined CRSs

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CRSDescription
    L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
    L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial -tile providers. Uses Spherical Mercator projection. Set in by default in -Map's crs option.
    L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. -

    Leaflet 1.0.x complies with the TMS coordinate scheme for EPSG:4326, -which is a breaking change from 0.7.x behaviour. If you are using a TileLayer -with this CRS, ensure that there are two 256x256 pixel tiles covering the -whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), -or (-180,-90) for TileLayers with the tms option set.

    L.CRS.EarthServes as the base for CRS that are global such that they cover the earth. -Can only be used as the base for other CRS and cannot be used directly, -since it does not have a code, projection or transformation. distance() returns -meters.
    L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. -May be used for maps of flat surfaces (e.g. game maps). Note that the y -axis should still be inverted (going from bottom to top). distance() returns -simple euclidean distance.
    L.CRS.BaseObject that defines coordinate reference systems for projecting -geographical points into pixel (screen) coordinates and back (and to -coordinates in other units for WMS services). See -spatial reference system. -

    Leaflet defines the most usual CRSs by default. If you want to use a -CRS not defined by default, take a look at the -Proj4Leaflet plugin.

    -

    Note that the CRS instances do not inherit from Leaflet's Class object, -and can't be instantiated. Also, new classes can't inherit from them, -and methods can't be added to them with the include function.

    - -
    - - -

    Renderer

    Base class for vector renderer implementations (SVG, Canvas). Handles the -DOM container of the renderer, its bounds, and its zoom animation.

    -

    A Renderer works as an implicit layer group for all Paths - the renderer -itself can be added or removed to the map. All paths use a renderer, which can -be implicit (the map will decide the type of renderer and use it automatically) -or explicit (using the renderer option of the path).

    -

    Do not use this class directly, use SVG and Canvas instead.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paddingNumber0.1How much to extend the clip area around the map view (relative to its size) -e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber0How much to extend click tolerance round a path/object on the map
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - -
    - - - - - - - - - - - - - - - - -
    EventDataDescription
    updateEventFired when the renderer updates its bounds, center and zoom, for example when -its map has moved
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Event objects

    Whenever a class inheriting from Evented fires an event, a listener function -will be called with an event argument, which is a plain object containing -information about the event. For example:

    -
    map.on('click', function(ev) {
    -    alert(ev.latlng); // ev is an event object (MouseEvent in this case)
    -});
    -
    -

    The information available depends on the event type:

    - - - -
    -

    Event

    - -
    - - - -
    The base event object. All other event objects contain these properties too.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    - - -
    - -
    -

    KeyboardEvent

    - -
    - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    originalEventDOMEventThe original DOM KeyboardEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    MouseEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlngLatLngThe geographical point where the mouse event occurred.
    layerPointPointPixel coordinates of the point where the mouse event occurred relative to the map layer.
    containerPointPointPixel coordinates of the point where the mouse event occurred relative to the map сontainer.
    originalEventDOMEventThe original DOM MouseEvent or DOM TouchEvent that triggered this Leaflet event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    LocationEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    latlngLatLngDetected geographical location of the user.
    boundsLatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
    accuracyNumberAccuracy of location in meters.
    altitudeNumberHeight of the position above the WGS84 ellipsoid in meters.
    altitudeAccuracyNumberAccuracy of altitude in meters.
    headingNumberThe direction of travel in degrees counting clockwise from true North.
    speedNumberCurrent velocity in meters per second.
    timestampNumberThe time when the position was acquired.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    messageStringError message.
    codeNumberError code (if applicable).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    LayerEvent

    - -
    - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layerLayerThe layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    LayersControlEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layerLayerThe layer that was added or removed.
    nameStringThe name of the layer that was added or removed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    TileEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tileHTMLElementThe tile element (image).
    coordsPointPoint object with the tile's x, y, and z (zoom level) coordinates.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    TileErrorEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tileHTMLElementThe tile element (image).
    coordsPointPoint object with the tile's x, y, and z (zoom level) coordinates.
    error*Error passed to the tile's done() callback.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ResizeEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    oldSizePointThe old size before resize event.
    newSizePointThe new size after the resize event.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    GeoJSONEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    layerLayerThe layer for the GeoJSON feature that is being added to the map.
    propertiesObjectGeoJSON properties of the feature.
    geometryTypeStringGeoJSON geometry type of the feature.
    idStringGeoJSON ID of the feature (if present).
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    - -
    -
    -
    - -
    - -
    -

    PopupEvent

    - -
    - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    popupPopupThe popup that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    TooltipEvent

    - -
    - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    tooltipTooltipThe tooltip that was opened or closed.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    DragEndEvent

    - -
    - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    distanceNumberThe distance in pixels the draggable element was moved by.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -
    - -
    -

    ZoomAnimEvent

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    centerLatLngThe current center of the map
    zoomNumberThe current zoom level of the map
    noUpdateBooleanWhether layers should update their contents due to this event
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in -the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will -be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its -event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    - -
    -
    -
    - -

    DivOverlay

    Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.

    - -
    -

    Options

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    offsetPointPoint(0, 7)The offset of the popup position. Useful to control the anchor -of the popup when opening it on some overlays.
    classNameString''A custom CSS class name to assign to the popup.
    paneString'popupPane'Map pane where the popup will be added.
    - -
    - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    - -
    -
    -
    - -
    -

    Events

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    - -
    -
    -
    - -
    -

    Methods

    - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    -
    remove()this

    Removes the layer from the map it is currently active on.

    -
    removeFrom(<Map> map)this

    Removes the layer from the given map

    -
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    -
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    -
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    -
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    -
    closePopup()this

    Closes the popup bound to this layer if it is open.

    -
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    -
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    -
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    -
    getPopup()Popup

    Returns the popup bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the -necessary event listeners. If a Function is passed it will receive -the layer as the first argument and should return a String or HTMLElement.

    -
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    -
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    -
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    -
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    -
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    -
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    -
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    -
    - -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    -
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    -
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    -
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    -
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    -
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data -object — the first argument of the listener function will contain its -properties. The event can optionally be propagated to event parents.

    -
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    -
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    -
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    -
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    -
    addEventListener()this

    Alias to on(…)

    -
    removeEventListener()this

    Alias to off(…)

    -
    clearAllEventListeners()this

    Alias to off()

    -
    addOneTimeEventListener()this

    Alias to once(…)

    -
    fireEvent()this

    Alias to fire(…)

    -
    hasEventListeners()Boolean

    Alias to listens(…)

    -
    - -
    -
    -
    - -

    Global Switches

    Global switches are created for rare cases and generally make -Leaflet to not detect a particular browser feature even if it's -there. You need to set the switch as a global variable to true -before including Leaflet on the page, like this:

    -
    <script>L_NO_TOUCH = true;</script>
    -<script src="leaflet.js"></script>
    -
    - - - - - - - - - - - - - - - - - -
    SwitchDescription
    L_NO_TOUCHForces Leaflet to not use touch events even if it detects them.
    L_DISABLE_3DForces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.
    - -

    noConflict

    This method restores the L global variable to the original value -it had before Leaflet inclusion, and returns the real Leaflet -namespace so you can put it elsewhere, like this:

    -
    <script src='libs/l.js'>
    -<!-- L points to some other library -->
    -
    -<script src='leaflet.js'>
    -<!-- you include Leaflet, it replaces the L variable to Leaflet namespace -->
    -
    -<script>
    -var Leaflet = L.noConflict();
    -// now L points to that other library again, and you can use Leaflet.Map etc.
    -</script>
    -
    - -

    version

    A constant that represents the Leaflet version in use.

    -
    L.version; // contains "1.0.0" (or whatever version is currently in use)
    -
    diff --git a/docs/reference-versions.html b/docs/reference-versions.html index 84046c56544..a99a7833adc 100644 --- a/docs/reference-versions.html +++ b/docs/reference-versions.html @@ -17,5 +17,5 @@

    Available API References

  • API reference for 1.4.0
  • API reference for 1.5.1
  • API reference for 1.6.0 -
  • API reference for 1.7.1 +
  • API reference for 1.7.1

    diff --git a/docs/reference.html b/docs/reference.html index 24751ea59b2..b83b5efce2c 100644 --- a/docs/reference.html +++ b/docs/reference.html @@ -1,4 +1,25068 @@ --- -layout: redirected -redirect_to: reference-1.7.1.html +layout: v2 +title: Documentation +bodyclass: api-page --- + +

    Leaflet API reference

    + +

    This reference reflects Leaflet 1.7.1. Check this list if you are using a different version of Leaflet.

    + +
    + +
    +

    UI Layers

    + +

    Raster Layers

    + +

    Vector Layers

    + +
    +
    +

    Other Layers

    + +

    Basic Types

    + +

    Controls

    + +
    +
    + + + + + + +

    Utility

    + +

    DOM Utility

    + +
    +
    +

    Base Classes

    + + +

    Misc

    + +
    +
    + +

    Map

    The central class of the API — it is used to create a map on a page and manipulate it.

    + +
    +

    Usage example

    + +
    + + + + + +
    // initialize the map on the "map" div with a given center and zoom
    +var map = L.map('map', {
    +	center: [51.505, -0.09],
    +	zoom: 13
    +});
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.map(<String> id, <Map options> options?)Instantiates a map object given the DOM ID of a <div> element +and optionally an object literal with Map options.
    L.map(<HTMLElement> el, <Map options> options?)Instantiates a map object given an instance of a <div> HTML element +and optionally an object literal with Map options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    preferCanvasBooleanfalseWhether Paths should be rendered on a Canvas renderer. +By default, all Paths are rendered in a SVG renderer.
    + +
    + +

    Control options

    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionControlBooleantrueWhether a attribution control is added to the map by default.
    zoomControlBooleantrueWhether a zoom control is added to the map by default.
    + +
    + +

    Interaction Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    closePopupOnClickBooleantrueSet it to false if you don't want popups to close when user clicks the map.
    zoomSnapNumber1Forces the map's zoom level to always be a multiple of this, particularly +right after a fitBounds() or a pinch-zoom. +By default, the zoom level snaps to the nearest integer; lower values +(e.g. 0.5 or 0.1) allow for greater granularity. A value of 0 +means the zoom level will not be snapped after fitBounds or a pinch-zoom.
    zoomDeltaNumber1Controls how much the map's zoom level will change after a +zoomIn(), zoomOut(), pressing + +or - on the keyboard, or using the zoom controls. +Values smaller than 1 (e.g. 0.5) allow for greater granularity.
    trackResizeBooleantrueWhether the map automatically handles browser window resize to update itself.
    boxZoomBooleantrueWhether the map can be zoomed to a rectangular area specified by +dragging the mouse while pressing the shift key.
    doubleClickZoomBoolean|StringtrueWhether the map can be zoomed in by double clicking on it and +zoomed out by double clicking while holding shift. If passed +'center', double-click zoom will zoom to the center of the +view regardless of where the mouse was.
    draggingBooleantrueWhether the map be draggable with mouse/touch or not.
    + +
    + +

    Map State Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    crsCRSL.CRS.EPSG3857The Coordinate Reference System to use. Don't change this if you're not +sure what it means.
    centerLatLngundefinedInitial geographic center of the map
    zoomNumberundefinedInitial map zoom level
    minZoomNumber*Minimum zoom level of the map. +If not specified and at least one GridLayer or TileLayer is in the map, +the lowest of their minZoom options will be used instead.
    maxZoomNumber*Maximum zoom level of the map. +If not specified and at least one GridLayer or TileLayer is in the map, +the highest of their maxZoom options will be used instead.
    layersLayer[][]Array of layers that will be added to the map initially
    maxBoundsLatLngBoundsnullWhen this option is set, the map restricts the view to the given +geographical bounds, bouncing the user back if the user tries to pan +outside the view. To set the restriction dynamically, use +setMaxBounds method.
    rendererRenderer*The default method for drawing vector layers on the map. L.SVG +or L.Canvas by default depending on browser support.
    + +
    + +

    Animation Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    zoomAnimationBooleantrueWhether the map zoom animation is enabled. By default it's enabled +in all browsers that support CSS3 Transitions except Android.
    zoomAnimationThresholdNumber4Won't animate zoom if the zoom difference exceeds this value.
    fadeAnimationBooleantrueWhether the tile fade animation is enabled. By default it's enabled +in all browsers that support CSS3 Transitions except Android.
    markerZoomAnimationBooleantrueWhether markers animate their zoom with the zoom animation, if disabled +they will disappear for the length of the animation. By default it's +enabled in all browsers that support CSS3 Transitions except Android.
    transform3DLimitNumber2^23Defines the maximum size of a CSS translation transform. The default +value should not be changed unless a web browser positions layers in +the wrong place after doing a large panBy.
    + +
    + +

    Panning Inertia Options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    inertiaBoolean*If enabled, panning of the map will have an inertia effect where +the map builds momentum while dragging and continues moving in +the same direction for some time. Feels especially nice on touch +devices. Enabled by default unless running on old Android devices.
    inertiaDecelerationNumber3000The rate with which the inertial movement slows down, in pixels/second².
    inertiaMaxSpeedNumberInfinityMax speed of the inertial movement, in pixels/second.
    easeLinearityNumber0.2
    worldCopyJumpBooleanfalseWith this option enabled, the map tracks when you pan to another "copy" +of the world and seamlessly jumps to the original one so that all overlays +like markers and vector layers are still visible.
    maxBoundsViscosityNumber0.0If maxBounds is set, this option will control how solid the bounds +are when dragging the map around. The default value of 0.0 allows the +user to drag outside the bounds at normal speed, higher values will +slow down map dragging outside bounds, and 1.0 makes the bounds fully +solid, preventing the user from dragging outside the bounds.
    + +
    + +

    Keyboard Navigation Options

    + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    keyboardBooleantrueMakes the map focusable and allows users to navigate the map with keyboard +arrows and +/- keys.
    keyboardPanDeltaNumber80Amount of pixels to pan when pressing an arrow key.
    + +
    + +

    Mouse wheel options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    scrollWheelZoomBoolean|StringtrueWhether the map can be zoomed by using the mouse wheel. If passed 'center', +it will zoom to the center of the view regardless of where the mouse was.
    wheelDebounceTimeNumber40Limits the rate at which a wheel can fire (in milliseconds). By default +user can't zoom via wheel more often than once per 40 ms.
    wheelPxPerZoomLevelNumber60How many scroll pixels (as reported by L.DomEvent.getWheelDelta) +mean a change of one full zoom level. Smaller values will make wheel-zooming +faster (and vice versa).
    + +
    + +

    Touch interaction options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tapBooleantrueEnables mobile hacks for supporting instant taps (fixing 200ms click +delay on iOS/Android) and touch holds (fired as contextmenu events).
    tapToleranceNumber15The max number of pixels a user can shift his finger during touch +for it to be considered a valid tap.
    touchZoomBoolean|String*Whether the map can be zoomed by touch-dragging with two fingers. If +passed 'center', it will zoom to the center of the view regardless of +where the touch events (fingers) were. Enabled for touch-capable web +browsers except for old Androids.
    bounceAtZoomLimitsBooleantrueSet it to false if you don't want the map to zoom beyond min/max zoom +and then bounce back when pinch-zooming.
    + +
    + + +
    +

    Events

    + +
    + +

    Layer events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    baselayerchangeLayersControlEventFired when the base layer is changed through the layers control.
    overlayaddLayersControlEventFired when an overlay is selected through the layers control.
    overlayremoveLayersControlEventFired when an overlay is deselected through the layers control.
    layeraddLayerEventFired when a new layer is added to the map.
    layerremoveLayerEventFired when some layer is removed from the map
    + +
    + +

    Map state change events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    zoomlevelschangeEventFired when the number of zoomlevels on the map is changed due +to adding or removing a layer.
    resizeResizeEventFired when the map is resized.
    unloadEventFired when the map is destroyed with remove method.
    viewresetEventFired when the map needs to redraw its content (this usually happens +on map zoom or load). Very useful for creating custom overlays.
    loadEventFired when the map is initialized (when its center and zoom are set +for the first time).
    zoomstartEventFired when the map zoom is about to change (e.g. before zoom animation).
    movestartEventFired when the view of the map starts changing (e.g. user starts dragging the map).
    zoomEventFired repeatedly during any change in zoom level, including zoom +and fly animations.
    moveEventFired repeatedly during any movement of the map, including pan and +fly animations.
    zoomendEventFired when the map zoom has changed, after any animations.
    moveendEventFired when the center of the map stops changing (e.g. user stopped dragging the map or when a non-centered zoom ends).
    + +
    + +

    Popup events

    + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup is opened in the map
    popupclosePopupEventFired when a popup in the map is closed
    autopanstartEventFired when the map starts autopanning when opening a popup.
    + +
    + +

    Tooltip events

    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip is opened in the map.
    tooltipcloseTooltipEventFired when a tooltip in the map is closed.
    + +
    + +

    Location events

    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    locationerrorErrorEventFired when geolocation (using the locate method) failed.
    locationfoundLocationEventFired when geolocation (using the locate method) +went successfully.
    + +
    + +

    Interaction events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the map.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the map.
    mousedownMouseEventFired when the user pushes the mouse button on the map.
    mouseupMouseEventFired when the user releases the mouse button on the map.
    mouseoverMouseEventFired when the mouse enters the map.
    mouseoutMouseEventFired when the mouse leaves the map.
    mousemoveMouseEventFired while the mouse moves over the map.
    contextmenuMouseEventFired when the user pushes the right mouse button on the map, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    keypressKeyboardEventFired when the user presses a key from the keyboard that produces a character value while the map is focused.
    keydownKeyboardEventFired when the user presses a key from the keyboard while the map is focused. Unlike the keypress event, +the keydown event is fired for keys that produce a character value and for keys +that do not produce a character value.
    keyupKeyboardEventFired when the user releases a key from the keyboard while the map is focused.
    preclickMouseEventFired before mouse click on the map (sometimes useful when you +want something to happen on click before any existing click +handlers start running).
    + +
    + +

    Other Events

    + + + + + + + + + + + + + + +
    EventDataDescription
    zoomanimZoomAnimEventFired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getRenderer(<Path> layer)Renderer

    Returns the instance of Renderer that should be used to render the given +Path. It will ensure that the renderer options of the map and paths +are respected, and that the renderers do exist on the map.

    +
    + +
    + +

    Methods for Layers and Controls

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addControl(<Control> control)this

    Adds the given control to the map

    +
    removeControl(<Control> control)this

    Removes the given control from the map

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the map

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the map.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the map

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the map, optionally specifying context of the iterator function.

    +
    map.eachLayer(function(layer){
    +    layer.bindPopup('Hello');
    +});
    +
    +
    openPopup(<Popup> popup)this

    Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).

    +
    openPopup(<String|HTMLElement> content, <LatLng> latlng, <Popup options> options?)this

    Creates a popup with the specified content and options and opens it in the given point on a map.

    +
    closePopup(<Popup> popup?)this

    Closes the popup previously opened with openPopup (or the given one).

    +
    openTooltip(<Tooltip> tooltip)this

    Opens the specified tooltip.

    +
    openTooltip(<String|HTMLElement> content, <LatLng> latlng, <Tooltip options> options?)this

    Creates a tooltip with the specified content and options and open it.

    +
    closeTooltip(<Tooltip> tooltip?)this

    Closes the tooltip given as parameter.

    +
    + +
    + +

    Methods for modifying map state

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setView(<LatLng> center, <Number> zoom, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) with the given +animation options.

    +
    setZoom(<Number> zoom, <Zoom/pan options> options?)this

    Sets the zoom of the map.

    +
    zoomIn(<Number> delta?, <Zoom options> options?)this

    Increases the zoom of the map by delta (zoomDelta by default).

    +
    zoomOut(<Number> delta?, <Zoom options> options?)this

    Decreases the zoom of the map by delta (zoomDelta by default).

    +
    setZoomAround(<LatLng> latlng, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified geographical point on the map +stationary (e.g. used internally for scroll zoom and double-click zoom).

    +
    setZoomAround(<Point> offset, <Number> zoom, <Zoom options> options)this

    Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.

    +
    fitBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets a map view that contains the given geographical bounds with the +maximum zoom level possible.

    +
    fitWorld(<fitBounds options> options?)this

    Sets a map view that mostly contains the whole world with the maximum +zoom level possible.

    +
    panTo(<LatLng> latlng, <Pan options> options?)this

    Pans the map to a given center.

    +
    panBy(<Point> offset, <Pan options> options?)this

    Pans the map by a given number of pixels (animated).

    +
    flyTo(<LatLng> latlng, <Number> zoom?, <Zoom/pan options> options?)this

    Sets the view of the map (geographical center and zoom) performing a smooth +pan-zoom animation.

    +
    flyToBounds(<LatLngBounds> bounds, <fitBounds options> options?)this

    Sets the view of the map with a smooth animation like flyTo, +but takes a bounds parameter like fitBounds.

    +
    setMaxBounds(<LatLngBounds> bounds)this

    Restricts the map view to the given bounds (see the maxBounds option).

    +
    setMinZoom(<Number> zoom)this

    Sets the lower limit for the available zoom levels (see the minZoom option).

    +
    setMaxZoom(<Number> zoom)this

    Sets the upper limit for the available zoom levels (see the maxZoom option).

    +
    panInsideBounds(<LatLngBounds> bounds, <Pan options> options?)this

    Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.

    +
    panInside(<LatLng> latlng, <options> options?)this

    Pans the map the minimum amount to make the latlng visible. Use +padding, paddingTopLeft and paddingTopRight options to fit +the display to more restricted bounds, like fitBounds. +If latlng is already within the (optionally padded) display bounds, +the map will not be panned.

    +
    invalidateSize(<Zoom/pan options> options)this

    Checks if the map container size changed and updates the map if so — +call it after you've changed the map size dynamically, also animating +pan by default. If options.pan is false, panning will not occur. +If options.debounceMoveend is true, it will delay moveend event so +that it doesn't happen often even if the method is called many +times in a row.

    +
    invalidateSize(<Boolean> animate)this

    Checks if the map container size changed and updates the map if so — +call it after you've changed the map size dynamically, also animating +pan by default.

    +
    stop()this

    Stops the currently running panTo or flyTo animation, if any.

    +
    + +
    + +

    Geolocation methods

    + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    locate(<Locate options> options?)this

    Tries to locate the user using the Geolocation API, firing a locationfound +event with location data on success or a locationerror event on failure, +and optionally sets the map view to the user's location with respect to +detection accuracy (or to the world view if geolocation failed). +Note that, if your page doesn't use HTTPS, this method will fail in +modern browsers (Chrome 50 and newer) +See Locate options for more details.

    +
    stopLocate()this

    Stops watching location previously initiated by map.locate({watch: true}) +and aborts resetting the map view if map.locate was called with +{setView: true}.

    +
    + +
    + +

    Other Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addHandler(<String> name, <Function> HandlerClass)this

    Adds a new Handler to the map, given its name and constructor function.

    +
    remove()this

    Destroys the map and clears all related event listeners.

    +
    createPane(<String> name, <HTMLElement> container?)HTMLElement

    Creates a new map pane with the given name if it doesn't exist already, +then returns it. The pane is created as a child of container, or +as a child of the main map pane if not set.

    +
    getPane(<String|HTMLElement> pane)HTMLElement

    Returns a map pane, given its name or its HTML element (its identity).

    +
    getPanes()Object

    Returns a plain object containing the names of all panes as keys and +the panes as values.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the map.

    +
    whenReady(<Function> fn, <Object> context?)this

    Runs the given function fn when the map gets initialized with +a view (center and zoom) and at least one layer, or immediately +if it's already initialized, optionally passing a function context.

    +
    + +
    + +

    Methods for Getting Map State

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getCenter()LatLng

    Returns the geographical center of the map view

    +
    getZoom()Number

    Returns the current zoom level of the map view

    +
    getBounds()LatLngBounds

    Returns the geographical bounds visible in the current map view

    +
    getMinZoom()Number

    Returns the minimum zoom level of the map (if set in the minZoom option of the map or of any layers), or 0 by default.

    +
    getMaxZoom()Number

    Returns the maximum zoom level of the map (if set in the maxZoom option of the map or of any layers).

    +
    getBoundsZoom(<LatLngBounds> bounds, <Boolean> inside?, <Point> padding?)Number

    Returns the maximum zoom level on which the given bounds fit to the map +view in its entirety. If inside (optional) is set to true, the method +instead returns the minimum zoom level on which the map view fits into +the given bounds in its entirety.

    +
    getSize()Point

    Returns the current size of the map container (in pixels).

    +
    getPixelBounds()Bounds

    Returns the bounds of the current map view in projected pixel +coordinates (sometimes useful in layer and overlay implementations).

    +
    getPixelOrigin()Point

    Returns the projected pixel coordinates of the top left point of +the map layer (useful in custom layer and overlay implementations).

    +
    getPixelWorldBounds(<Number> zoom?)Bounds

    Returns the world's bounds in pixel coordinates for zoom level zoom. +If zoom is omitted, the map's current zoom level is used.

    +
    + +
    + +

    Conversion Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getZoomScale(<Number> toZoom, <Number> fromZoom)Number

    Returns the scale factor to be applied to a map transition from zoom level +fromZoom to toZoom. Used internally to help with zoom animations.

    +
    getScaleZoom(<Number> scale, <Number> fromZoom)Number

    Returns the zoom level that the map would end up at, if it is at fromZoom +level and everything is scaled by a factor of scale. Inverse of +getZoomScale.

    +
    project(<LatLng> latlng, <Number> zoom)Point

    Projects a geographical coordinate LatLng according to the projection +of the map's CRS, then scales it according to zoom and the CRS's +Transformation. The result is pixel coordinate relative to +the CRS origin.

    +
    unproject(<Point> point, <Number> zoom)LatLng

    Inverse of project.

    +
    layerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the origin pixel, +returns the corresponding geographical coordinate (for the current zoom level).

    +
    latLngToLayerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate +relative to the origin pixel.

    +
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the +map's CRS's wrapLat and wrapLng properties, if they are outside the +CRS's bounds. +By default this means longitude is wrapped around the dateline so its +value is between -180 and +180 degrees.

    +
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring that +its center is within the CRS's bounds. +By default this means the center longitude is wrapped around the dateline so its +value is between -180 and +180 degrees, and the majority of the bounds +overlaps the CRS's bounds.

    +
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates according to +the map's CRS. By default this measures distance in meters.

    +
    containerPointToLayerPoint(<Point> point)Point

    Given a pixel coordinate relative to the map container, returns the corresponding +pixel coordinate relative to the origin pixel.

    +
    layerPointToContainerPoint(<Point> point)Point

    Given a pixel coordinate relative to the origin pixel, +returns the corresponding pixel coordinate relative to the map container.

    +
    containerPointToLatLng(<Point> point)LatLng

    Given a pixel coordinate relative to the map container, returns +the corresponding geographical coordinate (for the current zoom level).

    +
    latLngToContainerPoint(<LatLng> latlng)Point

    Given a geographical coordinate, returns the corresponding pixel coordinate +relative to the map container.

    +
    mouseEventToContainerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to the +map container where the event took place.

    +
    mouseEventToLayerPoint(<MouseEvent> ev)Point

    Given a MouseEvent object, returns the pixel coordinate relative to +the origin pixel where the event took place.

    +
    mouseEventToLatLng(<MouseEvent> ev)LatLng

    Given a MouseEvent object, returns geographical coordinate where the +event took place.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Properties

    + +
    + +

    Controls

    + + + + + + + + + + + + + + +
    PropertyTypeDescription
    zoomControlControl.ZoomThe default zoom control (only available if the +zoomControl option was true when creating the map).
    + +
    + +

    Handlers

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    boxZoomHandlerBox (shift-drag with mouse) zoom handler.
    doubleClickZoomHandlerDouble click zoom handler.
    draggingHandlerMap dragging handler (by both mouse and touch).
    keyboardHandlerKeyboard navigation handler.
    scrollWheelZoomHandlerScroll wheel zoom handler.
    tapHandlerMobile touch hacks (quick tap and touch hold) handler.
    touchZoomHandlerTouch zoom handler.
    + +
    + + +
    +

    Map panes

    + +
    + + + +
    Panes are DOM elements used to control the ordering of layers on the map. You +can access panes with map.getPane or +map.getPanes methods. New panes can be created with the +map.createPane method. +

    Every map has the following default panes that differ only in zIndex.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PaneTypeZ-indexDescription
    mapPaneHTMLElement'auto'Pane that contains all other map panes
    tilePaneHTMLElement200Pane for GridLayers and TileLayers
    overlayPaneHTMLElement400Pane for overlay shadows (e.g. Marker shadows)
    shadowPaneHTMLElement500Pane for vectors (Paths, like Polylines and Polygons), ImageOverlays and VideoOverlays
    markerPaneHTMLElement600Pane for Icons of Markers
    tooltipPaneHTMLElement650Pane for Tooltips.
    popupPaneHTMLElement700Pane for Popups.
    + +
    + + +
    + +
    +

    Locate options

    + +
    + + + +
    Some of the geolocation methods for Map take in an options parameter. This +is a plain javascript object with the following optional components:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    watchBooleanfalseIf true, starts continuous watching of location changes (instead of detecting it +once) using W3C watchPosition method. You can later stop watching using +map.stopLocate() method.
    setViewBooleanfalseIf true, automatically sets the map view to the user location with respect to +detection accuracy, or to world view if geolocation failed.
    maxZoomNumberInfinityThe maximum zoom for automatic view setting when using setView option.
    timeoutNumber10000Number of milliseconds to wait for a response from geolocation before firing a +locationerror event.
    maximumAgeNumber0Maximum age of detected location. If less than this amount of milliseconds +passed since last geolocation response, locate will return a cached location.
    enableHighAccuracyBooleanfalseEnables high accuracy, see description in the W3C spec.
    + +
    + + +
    + +
    +

    Zoom options

    + +
    + + + +
    Some of the Map methods which modify the zoom level take in an options +parameter. This is a plain javascript object with the following optional +components:
    + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
    + +
    + + +
    + +
    +

    Pan options

    + +
    + + + +
    Some of the Map methods which modify the center of the map take in an options +parameter. This is a plain javascript object with the following optional +components:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBooleanIf true, panning will always be animated if possible. If false, it will +not animate panning, either resetting the map view if panning more than a +screen away, or just setting a new offset for the map pane (except for panBy +which always does the latter).
    durationNumber0.25Duration of animated panning, in seconds.
    easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
    noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
    + +
    + + +
    + +
    +

    Zoom/pan options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    durationNumber0.25Duration of animated panning, in seconds.
    easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
    noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
    + +
    +
    +
    + +
    + +
    +

    FitBounds options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingTopLeftPoint[0, 0]Sets the amount of padding in the top left corner of a map container that +shouldn't be accounted for when setting the view to fit bounds. Useful if you +have some control overlays on the map like a sidebar and you don't want them +to obscure objects you're zooming to.
    paddingBottomRightPoint[0, 0]The same for the bottom right corner of the map.
    paddingPoint[0, 0]Equivalent of setting both top left and bottom right padding to the same value.
    maxZoomNumbernullThe maximum possible zoom to use.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    animateBooleanIf not specified, zoom animation will happen if the zoom origin is inside the +current view. If true, the map will attempt animating zoom disregarding where +zoom origin is. Setting false will make it always reset the view completely +without animation.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    durationNumber0.25Duration of animated panning, in seconds.
    easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the +Cubic Bezier curve). 1.0 means linear animation, +and the smaller this number, the more bowed the curve.
    noMoveStartBooleanfalseIf true, panning won't fire movestart event on start (used internally for +panning inertia).
    + +
    +
    +
    + +

    Marker

    L.Marker is used to display clickable/draggable icons on the map. Extends Layer.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.marker([50.5, 30.5]).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.marker(<LatLng> latlng, <Marker options> options?)Instantiates a Marker object given a geographical point and optionally an options object.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    iconIcon*Icon instance to use for rendering the marker. +See Icon documentation for details on how to customize the marker icon. +If not specified, a common instance of L.Icon.Default is used.
    keyboardBooleantrueWhether the marker can be tabbed to with a keyboard and clicked by pressing enter.
    titleString''Text for the browser tooltip that appear on marker hover (no tooltip by default).
    altString''Text for the alt attribute of the icon image (useful for accessibility).
    zIndexOffsetNumber0By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
    opacityNumber1.0The opacity of the marker.
    riseOnHoverBooleanfalseIf true, the marker will get on top of others when you hover the mouse over it.
    riseOffsetNumber250The z-index offset used for the riseOnHover feature.
    paneString'markerPane'Map pane where the markers icon will be added.
    shadowPaneString'shadowPane'Map pane where the markers shadow will be added.
    bubblingMouseEventsBooleanfalseWhen true, a mouse event on this marker will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    + +

    Draggable marker options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    draggableBooleanfalseWhether the marker is draggable with mouse/touch or not.
    autoPanBooleanfalseWhether to pan the map when dragging this marker near its edge or not.
    autoPanPaddingPointPoint(50, 50)Distance (in pixels to the left/right and to the top/bottom) of the +map edge to start panning the map.
    autoPanSpeedNumber10Number of pixels the map should pan by.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    moveEventFired when the marker is moved via setLatLng or by dragging. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    + +
    + +

    Dragging events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    dragstartEventFired when the user starts dragging the marker.
    movestartEventFired when the marker starts moving (because of dragging).
    dragEventFired repeatedly while the user drags the marker.
    dragendDragEndEventFired when the user stops dragging the marker.
    moveendEventFired when the marker stops moving (because of dragging).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + +
    In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getLatLng()LatLng

    Returns the current geographical position of the marker.

    +
    setLatLng(<LatLng> latlng)this

    Changes the marker position to the given point.

    +
    setZIndexOffset(<Number> offset)this

    Changes the zIndex offset of the marker.

    +
    getIcon()Icon

    Returns the current icon used by the marker

    +
    setIcon(<Icon> icon)this

    Changes the marker icon.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the marker.

    +
    + +
    + +

    Other methods

    + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the marker (as a GeoJSON Point Feature).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Properties

    + +
    + +

    Interaction handlers

    + +
    Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see Handler methods). Example: +
    marker.dragging.disable();
    +
    + + + + + + + + + + + + + +
    PropertyTypeDescription
    draggingHandlerMarker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set marker.options.draggable).
    + +
    + + +

    Used to open popups in certain places of the map. Use Map.openPopup to +open popups while making sure that only one popup is open at one time +(recommended for usability), or use Map.addLayer to open as many as you want.

    + +
    + + +
    + + + + + +

    If you want to just bind a popup to marker click and then open it, it's really easy:

    +
    marker.bindPopup(popupContent).openPopup();
    +
    +

    Path overlays like polylines also have a bindPopup method. +Here's a more complicated way to open a popup on a map:

    +
    var popup = L.popup()
    +	.setLatLng(latlng)
    +	.setContent('<p>Hello world!<br />This is a nice popup.</p>')
    +	.openOn(map);
    +
    + + + +
    + + +
    + + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    + +
    +
    +
    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    + +
    +
    +
    + +

    Tooltip

    Used to display small texts on top of map layers.

    + +
    +

    Usage example

    + +
    + + + + + +
    marker.bindTooltip("my tooltip text").openTooltip();
    +
    +

    Note about tooltip offset. Leaflet takes two options in consideration +for computing tooltip offsetting:

    +
      +
    • the offset Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. +Add a positive x offset to move the tooltip to the right, and a positive y offset to +move it to the bottom. Negatives will move to the left and top.
    • +
    • the tooltipAnchor Icon option: this will only be considered for Marker. You +should adapt this value if you use a custom icon.
    • +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.tooltip(<Tooltip options> options?, <Layer> source?)Instantiates a Tooltip object given an optional options object that describes its appearance and location and an optional source object that is used to tag the tooltip with a reference to the Layer to which it refers.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'tooltipPane'Map pane where the tooltip will be added.
    offsetPointPoint(0, 0)Optional offset of the tooltip position.
    directionString'auto'Direction where to open the tooltip. Possible values are: right, left, +top, bottom, center, auto. +auto will dynamically switch between right and left according to the tooltip +position on the map.
    permanentBooleanfalseWhether to open the tooltip permanently or only on mouseover.
    stickyBooleanfalseIf true, the tooltip will follow the mouse instead of being fixed at the feature center.
    interactiveBooleanfalseIf true, the tooltip will listen to the feature events.
    opacityNumber0.9Tooltip container opacity.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    classNameString''A custom CSS class name to assign to the popup.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    TileLayer

    Used to load and display tile layers on the map. Note that most tile servers require attribution, which you can set under Layer. Extends GridLayer.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar', attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}).addTo(map);
    +
    + + + +
    + +

    URL template

    + + + +

    A string of the following form:

    +
    'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
    +
    +

    {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates. {r} can be used to add "@2x" to the URL to load retina tiles.

    +

    You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

    +
    L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
    +
    + + + +
    + + +
    +

    Creation

    + +
    + +

    Extension methods

    + + + + + + + + + + + + +
    FactoryDescription
    L.tilelayer(<String> urlTemplate, <TileLayer options> options?)Instantiates a tile layer object given a URL template and optionally an options object.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[]'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber0The zoom number used in tile URLs will be offset with this value.
    tmsBooleanfalseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBooleanfalseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBooleanfalseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the tiles. +If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. +Refer to CORS Settings for valid String values.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean(depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
    updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber1The explicit zIndex of the tile layer.
    boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
    minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
    noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with bounds to prevent requesting +tiles outside the CRS limits.
    paneString'tilePane'Map pane where the grid layer will be added.
    classNameString''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadingEventFired when the grid layer starts loading tiles.
    tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstartTileEventFired when a tile is requested and starts loading.
    tileerrorTileErrorEventFired when there is an error loading a tile.
    tileloadTileEventFired when a tile loads.
    loadEventFired when the grid layer loaded all visible tiles.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true). +If the URL does not change, the layer will not be redrawn unless +the noRedraw parameter is set to false.

    +
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() +to return an <img> HTML element with the appropriate image URL given coords. The done +callback is called when the tile has been loaded.

    +
    + +
    + +

    Extension methods

    + +
    Layers extending TileLayer might reimplement the following method.
    + + + + + + + + + + + + + +
    MethodReturnsDescription
    getTileUrl(<Object> coords)String

    Called only internally, returns the URL for a tile given its coordinates. +Classes extending TileLayer can override this function to provide custom tile URL naming schemes.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    +
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    +
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    +
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    +
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    +
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    TileLayer.WMS

    Used to display WMS services as tile layers on the map. Extends TileLayer.

    + +
    +

    Usage example

    + +
    + + + + + +
    var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
    +	layers: 'nexrad-n0r-900913',
    +	format: 'image/png',
    +	transparent: true,
    +	attribution: "Weather data © 2012 IEM Nexrad"
    +});
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.tileLayer.wms(<String> baseUrl, <TileLayer.WMS options> options)Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
    + +
    + + +
    +

    Options

    + +
    + + + +
    If any custom options not documented here are used, they will be sent to the +WMS server as extra parameters in each request URL. This can be useful for +non-standard vendor WMS parameters.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    layersString''(required) Comma-separated list of WMS layers to show.
    stylesString''Comma-separated list of WMS styles.
    formatString'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
    transparentBooleanfalseIf true, the WMS service will return images with transparency.
    versionString'1.1.1'Version of the WMS service to use
    crsCRSnullCoordinate Reference System to use for the WMS requests, defaults to +map CRS. Don't change this if you're not sure what it means.
    uppercaseBooleanfalseIf true, WMS request parameter keys will be uppercase.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumber18The maximum zoom level up to which this layer will be displayed (inclusive).
    subdomainsString|String[]'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
    errorTileUrlString''URL to the tile image to show in place of the tile that failed to load.
    zoomOffsetNumber0The zoom number used in tile URLs will be offset with this value.
    tmsBooleanfalseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
    zoomReverseBooleanfalseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
    detectRetinaBooleanfalseIf true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the tiles. +If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. +Refer to CORS Settings for valid String values.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean(depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
    updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber1The explicit zIndex of the tile layer.
    boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
    minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
    noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with bounds to prevent requesting +tiles outside the CRS limits.
    paneString'tilePane'Map pane where the grid layer will be added.
    classNameString''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadingEventFired when the grid layer starts loading tiles.
    tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstartTileEventFired when a tile is requested and starts loading.
    tileerrorTileErrorEventFired when there is an error loading a tile.
    tileloadTileEventFired when a tile loads.
    loadEventFired when the grid layer loaded all visible tiles.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setParams(<Object> params, <Boolean> noRedraw?)this

    Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setUrl(<String> url, <Boolean> noRedraw?)this

    Updates the layer's URL template and redraws it (unless noRedraw is set to true). +If the URL does not change, the layer will not be redrawn unless +the noRedraw parameter is set to false.

    +
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, overrides GridLayer's createTile() +to return an <img> HTML element with the appropriate image URL given coords. The done +callback is called when the tile has been loaded.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    +
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    +
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    +
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    +
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    +
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    ImageOverlay

    Used to load and display a single image over specific bounds of the map. Extends Layer.

    + +
    +

    Usage example

    + +
    + + + + + +
    var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
    +	imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
    +L.imageOverlay(imageUrl, imageBounds).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.imageOverlay(<String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options?)Instantiates an image overlay object given the URL of the image and the +geographical bounds it is tied to.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    opacityNumber1.0The opacity of the image overlay.
    altString''Text for the alt attribute of the image (useful for accessibility).
    interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
    errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber1The explicit zIndex of the overlay layer.
    classNameString''A custom class name to assign to the image. Empty by default.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadEventFired when the ImageOverlay layer has loaded its image
    errorEventFired when the ImageOverlay layer fails to load its image
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    +
    bringToFront()this

    Brings the layer to the top of all overlays.

    +
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    +
    setUrl(<String> url)this

    Changes the URL of the image.

    +
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    +
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    +
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    +
    getElement()HTMLElement

    Returns the instance of HTMLImageElement +used by this overlay.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    VideoOverlay

    Used to load and display a video player over specific bounds of the map. Extends ImageOverlay.

    +

    A video overlay uses the <video> +HTML5 element.

    + +
    +

    Usage example

    + +
    + + + + + +
    var videoUrl = 'https://www.mapbox.com/bites/00188/patricia_nasa.webm',
    +	videoBounds = [[ 32, -130], [ 13, -100]];
    +L.videoOverlay(videoUrl, videoBounds ).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.videoOverlay(<String|Array|HTMLVideoElement> video, <LatLngBounds> bounds, <VideoOverlay options> options?)Instantiates an image overlay object given the URL of the video (or array of URLs, or even a video element) and the +geographical bounds it is tied to.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    autoplayBooleantrueWhether the video starts playing automatically when loaded.
    loopBooleantrueWhether the video will loop back to the beginning when played.
    keepAspectRatioBooleantrueWhether the video will save aspect ratio after the projection. +Relevant for supported browsers. See browser compatibility
    mutedBooleanfalseWhether the video starts on mute when loaded.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    opacityNumber1.0The opacity of the image overlay.
    altString''Text for the alt attribute of the image (useful for accessibility).
    interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
    errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber1The explicit zIndex of the overlay layer.
    classNameString''A custom class name to assign to the image. Empty by default.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadEventFired when the video has finished loading the first frame
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    errorEventFired when the ImageOverlay layer fails to load its image
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getElement()HTMLVideoElement

    Returns the instance of HTMLVideoElement +used by this overlay.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    +
    bringToFront()this

    Brings the layer to the top of all overlays.

    +
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    +
    setUrl(<String> url)this

    Changes the URL of the image.

    +
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    +
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    +
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    SVGOverlay

    Used to load, display and provide DOM access to an SVG file over specific bounds of the map. Extends ImageOverlay.

    +

    An SVG overlay uses the <svg> element.

    + +
    +

    Usage example

    + +
    + + + + + +
    var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
    +svgElement.setAttribute('xmlns', "http://www.w3.org/2000/svg");
    +svgElement.setAttribute('viewBox', "0 0 200 200");
    +svgElement.innerHTML = '<rect width="200" height="200"/><rect x="75" y="23" width="50" height="50" style="fill:red"/><rect x="75" y="123" width="50" height="50" style="fill:#0013ff"/>';
    +var svgElementBounds = [ [ 32, -130 ], [ 13, -100 ] ];
    +L.svgOverlay(svgElement, svgElementBounds).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.svgOverlay(<String|SVGElement> svg, <LatLngBounds> bounds, <SVGOverlay options> options?)Instantiates an image overlay object given an SVG element and the geographical bounds it is tied to. +A viewBox attribute is required on the SVG element to zoom in and out properly.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    opacityNumber1.0The opacity of the image overlay.
    altString''Text for the alt attribute of the image (useful for accessibility).
    interactiveBooleanfalseIf true, the image overlay will emit mouse events when clicked or hovered.
    crossOriginBoolean|StringfalseWhether the crossOrigin attribute will be added to the image. +If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. +Refer to CORS Settings for valid String values.
    errorOverlayUrlString''URL to the overlay image to show in place of the overlay that failed to load.
    zIndexNumber1The explicit zIndex of the overlay layer.
    classNameString''A custom class name to assign to the image. Empty by default.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadEventFired when the ImageOverlay layer has loaded its image
    errorEventFired when the ImageOverlay layer fails to load its image
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getElement()SVGElement

    Returns the instance of SVGElement +used by this overlay.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setOpacity(<Number> opacity)this

    Sets the opacity of the overlay.

    +
    bringToFront()this

    Brings the layer to the top of all overlays.

    +
    bringToBack()this

    Brings the layer to the bottom of all overlays.

    +
    setUrl(<String> url)this

    Changes the URL of the image.

    +
    setBounds(<LatLngBounds> bounds)this

    Update the bounds that this ImageOverlay covers

    +
    setZIndex(<Number> value)this

    Changes the zIndex of the image overlay.

    +
    getBounds()LatLngBounds

    Get the bounds that this ImageOverlay covers

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Path

    An abstract class that contains options and constants shared between vector +overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Polyline

    A class for drawing polyline overlays on a map. Extends Path.

    + +
    +

    Usage example

    + +
    + + + + + +
    // create a red polyline from an array of LatLng points
    +var latlngs = [
    +	[45.51, -122.68],
    +	[37.77, -122.43],
    +	[34.04, -118.2]
    +];
    +
    +var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
    +
    +// zoom the map to the polyline
    +map.fitBounds(polyline.getBounds());
    +
    +

    You can also pass a multi-dimensional array to represent a MultiPolyline shape:

    +
    // create a red polyline from an array of arrays of LatLng points
    +var latlngs = [
    +	[[45.51, -122.68],
    +	 [37.77, -122.43],
    +	 [34.04, -118.2]],
    +	[[40.78, -73.91],
    +	 [41.83, -87.62],
    +	 [32.76, -96.72]]
    +];
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.polyline(<LatLng[]> latlngs, <Polyline options> options?)Instantiates a polyline object given an array of geographical points and +optionally an options object. You can create a Polyline object with +multiple separate lines (MultiPolyline) by passing an array of arrays +of geographic points.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
    noClipBooleanfalseDisable polyline clipping.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the polyline (as a GeoJSON LineString or MultiLineString Feature).

    +
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    +
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    +
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    +
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    +
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    addLatLng(<LatLng> latlng, <LatLng[]> latlngs?)this

    Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Polygon

    A class for drawing polygon overlays on a map. Extends Polyline.

    +

    Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

    + +
    +

    Usage example

    + +
    + + + + + +
    // create a red polygon from an array of LatLng points
    +var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];
    +
    +var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
    +
    +// zoom the map to the polygon
    +map.fitBounds(polygon.getBounds());
    +
    +

    You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

    +
    var latlngs = [
    +  [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    +  [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    +];
    +
    +

    Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

    +
    var latlngs = [
    +  [ // first polygon
    +    [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring
    +    [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole
    +  ],
    +  [ // second polygon
    +    [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]
    +  ]
    +];
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.polygon(<LatLng[]> latlngs, <Polyline options> options?)
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
    noClipBooleanfalseDisable polyline clipping.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    +
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    +
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    +
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    +
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    addLatLng(<LatLng> latlng, <LatLng[]> latlngs?)this

    Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Rectangle

    A class for drawing rectangle overlays on a map. Extends Polygon.

    + +
    +

    Usage example

    + +
    + + + + + +
    // define rectangle geographical bounds
    +var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
    +
    +// create an orange rectangle
    +L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
    +
    +// zoom the map to the rectangle bounds
    +map.fitBounds(bounds);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.rectangle(<LatLngBounds> latLngBounds, <Polyline options> options?)
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means +better performance and smoother look, and less means more accurate representation.
    noClipBooleanfalseDisable polyline clipping.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setBounds(<LatLngBounds> latLngBounds)this

    Redraws the rectangle with the passed bounds.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the polygon (as a GeoJSON Polygon or MultiPolygon Feature).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getLatLngs()LatLng[]

    Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.

    +
    setLatLngs(<LatLng[]> latlngs)this

    Replaces all the points in the polyline with the given array of geographical points.

    +
    isEmpty()Boolean

    Returns true if the Polyline has no LatLngs.

    +
    closestLayerPoint(<Point> p)Point

    Returns the point closest to p on the Polyline.

    +
    getCenter()LatLng

    Returns the center (centroid) of the polyline.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    addLatLng(<LatLng> latlng, <LatLng[]> latlngs?)this

    Adds a given point to the polyline. By default, adds to the first ring of +the polyline in case of a multi-polyline, but can be overridden by passing +a specific ring as a LatLng array (that you can earlier access with getLatLngs).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Circle

    A class for drawing circle overlays on a map. Extends CircleMarker.

    +

    It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).

    + +
    +

    Usage example

    + +
    + + + + + +
    L.circle([50.5, 30.5], {radius: 200}).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.circle(<LatLng> latlng, <Circle options> options?)Instantiates a circle object given a geographical point, and an options object +which contains the circle radius.
    L.circle(<LatLng> latlng, <Number> radius, <Circle options> options?)Obsolete way of instantiating a circle, for compatibility with 0.7.x code. +Do not use in new applications or plugins.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    radiusNumberRadius of the circle, in meters.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    moveEventFired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setRadius(<Number> radius)this

    Sets the radius of a circle. Units are in meters.

    +
    getRadius()Number

    Returns the current radius of a circle. Units are in meters.

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the path.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    +
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    +
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    CircleMarker

    A circle of a fixed size with radius specified in pixels. Extends Path.

    + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.circleMarker(<LatLng> latlng, <CircleMarker options> options?)Instantiates a circle marker object given a geographical point, and an optional options object.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    radiusNumber10Radius of the circle marker, in pixels
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
    colorString'#3388ff'Stroke color
    weightNumber3Stroke width in pixels
    opacityNumber1.0Stroke opacity
    lineCapString'round'A string that defines shape to be used at the end of the stroke.
    lineJoinString'round'A string that defines shape to be used at the corners of the stroke.
    dashArrayStringnullA string that defines the stroke dash pattern. Doesn't work on Canvas-powered layers in some old browsers.
    dashOffsetStringnullA string that defines the distance into the dash pattern to start the dash. Doesn't work on Canvas-powered layers in some old browsers.
    fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
    fillColorString*Fill color. Defaults to the value of the color option
    fillOpacityNumber0.2Fill opacity.
    fillRuleString'evenodd'A string that defines how the inside of a shape is determined.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this path will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    rendererRendererUse this specific instance of Renderer for this path. Takes +precedence over the map's default renderer.
    classNameStringnullCustom class name set on an element. Only for SVG renderer.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    moveEventFired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the circle marker (as a GeoJSON Point Feature).

    +
    setLatLng(<LatLng> latLng)this

    Sets the position of a circle marker to a new location.

    +
    getLatLng()LatLng

    Returns the current geographical position of the circle marker

    +
    setRadius(<Number> radius)this

    Sets the radius of a circle marker. Units are in pixels.

    +
    getRadius()Number

    Returns the current radius of the circle

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    redraw()this

    Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.

    +
    setStyle(<Path options> style)this

    Changes the appearance of a Path based on the options in the Path options object.

    +
    bringToFront()this

    Brings the layer to the top of all path layers.

    +
    bringToBack()this

    Brings the layer to the bottom of all path layers.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    SVG

    VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility +with old versions of Internet Explorer.

    +

    Allows vector layers to be displayed with SVG. +Inherits Renderer.

    +

    Due to technical limitations, SVG is not +available in all web browsers, notably Android 2.x and 3.x.

    +

    Although SVG is not available on IE7 and IE8, these browsers support +VML +(a now deprecated technology), and the SVG renderer will fall back to VML in +this case.

    + +
    +

    Usage example

    + +
    + + + + + +

    Use SVG by default for all paths in the map:

    +
    var map = L.map('map', {
    +	renderer: L.svg()
    +});
    +
    +

    Use a SVG renderer with extra padding for specific vector geometries:

    +
    var map = L.map('map');
    +var myRenderer = L.svg({ padding: 0.5 });
    +var line = L.polyline( coordinates, { renderer: myRenderer } );
    +var circle = L.circle( center, { renderer: myRenderer } );
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.svg(<Renderer options> options?)Creates a SVG renderer with the given options.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingNumber0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber0How much to extend click tolerance round a path/object on the map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    updateEventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Functions

    + +
    + + + +
    There are several static functions which can be called without instantiating L.SVG:
    + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    create(<String> name)SVGElementReturns a instance of SVGElement, +corresponding to the class name passed. For example, using 'line' will return +an instance of SVGLineElement.
    pointsToPath(<Point[]> rings, <Boolean> closed)StringGenerates a SVG path string for multiple rings, with each ring turning +into "M..L..L.." instructions
    + +
    + + +

    Canvas

    Allows vector layers to be displayed with <canvas>. +Inherits Renderer.

    +

    Due to technical limitations, Canvas is not +available in all web browsers, notably IE8, and overlapping geometries might +not display properly in some edge cases.

    + +
    +

    Usage example

    + +
    + + + + + +

    Use Canvas by default for all paths in the map:

    +
    var map = L.map('map', {
    +	renderer: L.canvas()
    +});
    +
    +

    Use a Canvas renderer with extra padding for specific vector geometries:

    +
    var map = L.map('map');
    +var myRenderer = L.canvas({ padding: 0.5 });
    +var line = L.polyline( coordinates, { renderer: myRenderer } );
    +var circle = L.circle( center, { renderer: myRenderer } );
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.canvas(<Renderer options> options?)Creates a Canvas renderer with the given options.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingNumber0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber0How much to extend click tolerance round a path/object on the map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    updateEventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    LayerGroup

    Used to group several layers and handle them as one. If you add it to the map, +any layers added or removed from the group will be added/removed on the map as +well. Extends Layer.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.layerGroup([marker1, marker2])
    +	.addLayer(polyline)
    +	.addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.layerGroup(<Layer[]> layers?, <Object> options?)Create a layer group, optionally given an initial set of layers and an options object.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    +
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    +
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    +
    clearLayers()this

    Removes all the layers from the group.

    +
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    +
    group.eachLayer(function (layer) {
    +	layer.bindPopup('Hello');
    +});
    +
    +
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    +
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    +
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    +
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    FeatureGroup

    Extended LayerGroup that makes it easier to do the same thing to all its member layers:

    +
      +
    • bindPopup binds a popup to all of the layers at once (likewise with bindTooltip)
    • +
    • Events are propagated to the FeatureGroup, so if the group has an event +handler, it will handle events from any of the layers. This includes mouse events +and custom events.
    • +
    • Has layeradd and layerremove events
    • +
    + +
    +

    Usage example

    + +
    + + + + + +
    L.featureGroup([marker1, marker2, polyline])
    +	.bindPopup('Hello world!')
    +	.on('click', function() { alert('Clicked on a member of the group!'); })
    +	.addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.featureGroup(<Layer[]> layers?, <Object> options?)Create a feature group, optionally given an initial set of layers and an options object.
    + +
    + + +
    +

    Options

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    layeraddLayerEventFired when a layer is added to this FeatureGroup
    layerremoveLayerEventFired when a layer is removed from this FeatureGroup
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setStyle(<Path options> style)this

    Sets the given path options to each layer of the group that has a setStyle method.

    +
    bringToFront()this

    Brings the layer group to the top of all other layers

    +
    bringToBack()this

    Brings the layer group to the back of all other layers

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    +
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    +
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    +
    clearLayers()this

    Removes all the layers from the group.

    +
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    +
    group.eachLayer(function (layer) {
    +	layer.bindPopup('Hello');
    +});
    +
    +
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    +
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    +
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    +
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    GeoJSON

    Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse +GeoJSON data and display it on the map. Extends FeatureGroup.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.geoJSON(data, {
    +	style: function (feature) {
    +		return {color: feature.properties.color};
    +	}
    +}).bindPopup(function (layer) {
    +	return layer.feature.properties.description;
    +}).addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.geoJSON(<Object> geojson?, <GeoJSON options> options?)Creates a GeoJSON layer. Optionally accepts an object in +GeoJSON format to display on the map +(you can alternatively add it later with addData method) and an options object.
    + +
    + + +
    +

    Options

    + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    pointToLayerFunction*A Function defining how GeoJSON points spawn Leaflet layers. It is internally +called when data is added, passing the GeoJSON point feature and its LatLng. +The default is to spawn a default Marker: +
    function(geoJsonPoint, latlng) {
    +	return L.marker(latlng);
    +}
    +
    styleFunction*A Function defining the Path options for styling GeoJSON lines and polygons, +called internally when data is added. +The default value is to not override any defaults: +
    function (geoJsonFeature) {
    +	return {}
    +}
    +
    onEachFeatureFunction*A Function that will be called once for each created Feature, after it has +been created and styled. Useful for attaching events and popups to features. +The default is to do nothing with the newly created layers: +
    function (feature, layer) {}
    +
    filterFunction*A Function that will be used to decide whether to include a feature or not. +The default is to include all features: +
    function (geoJsonFeature) {
    +	return true;
    +}
    +
    +

    Note: dynamically changing the filter option will have effect only on newly +added data. It will not re-evaluate already included features.

    coordsToLatLngFunction*A Function that will be used for converting GeoJSON coordinates to LatLngs. +The default is the coordsToLatLng static method.
    markersInheritOptionsBooleanfalseWhether default Markers for "Point" type Features inherit from group options.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    layeraddLayerEventFired when a layer is added to this FeatureGroup
    layerremoveLayerEventFired when a layer is removed from this FeatureGroup
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addData(data)this

    Adds a GeoJSON object to the layer.

    +
    resetStyle(layer?)this

    Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. +If layer is omitted, the style of all features in the current layer is reset.

    +
    setStyle(style)this

    Changes styles of GeoJSON vector layers with the given style function.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the layer group to the top of all other layers

    +
    bringToBack()this

    Brings the layer group to the back of all other layers

    +
    getBounds()LatLngBounds

    Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    toGeoJSON(<Number> precision?)Object

    precision is the number of decimal places for coordinates. +The default value is 6 places. +Returns a GeoJSON representation of the layer group (as a GeoJSON FeatureCollection, GeometryCollection, or MultiPoint).

    +
    addLayer(<Layer> layer)this

    Adds the given layer to the group.

    +
    removeLayer(<Layer> layer)this

    Removes the given layer from the group.

    +
    removeLayer(<Number> id)this

    Removes the layer with the given internal ID from the group.

    +
    hasLayer(<Layer> layer)Boolean

    Returns true if the given layer is currently added to the group.

    +
    hasLayer(<Number> id)Boolean

    Returns true if the given internal ID is currently added to the group.

    +
    clearLayers()this

    Removes all the layers from the group.

    +
    invoke(<String> methodName, )this

    Calls methodName on every layer contained in this group, passing any +additional parameters. Has no effect if the layers contained do not +implement methodName.

    +
    eachLayer(<Function> fn, <Object> context?)this

    Iterates over the layers of the group, optionally specifying context of the iterator function.

    +
    group.eachLayer(function (layer) {
    +	layer.bindPopup('Hello');
    +});
    +
    +
    getLayer(<Number> id)Layer

    Returns the layer with the given internal ID.

    +
    getLayers()Layer[]

    Returns an array of all the layers added to the group.

    +
    setZIndex(<Number> zIndex)this

    Calls setZIndex on every layer contained in this group, passing the z-index.

    +
    getLayerId(<Layer> layer)Number

    Returns the internal ID for a layer

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +
    +

    Functions

    + +
    + + + +
    There are several static functions which can be called without instantiating L.GeoJSON:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    geometryToLayer(<Object> featureData, <GeoJSON options> options?)LayerCreates a Layer from a given GeoJSON feature. Can use a custom +pointToLayer and/or coordsToLatLng +functions if provided as options.
    coordsToLatLng(<Array> coords)LatLngCreates a LatLng object from an array of 2 numbers (longitude, latitude) +or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.
    coordsToLatLngs(<Array> coords, <Number> levelsDeep?, <Function> coordsToLatLng?)ArrayCreates a multidimensional array of LatLngs from a GeoJSON coordinates array. +levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). +Can use a custom coordsToLatLng function.
    latLngToCoords(<LatLng> latlng, <Number> precision?)ArrayReverse of coordsToLatLng
    latLngsToCoords(<Array> latlngs, <Number> levelsDeep?, <Boolean> closed?)ArrayReverse of coordsToLatLngs +closed determines whether the first point should be appended to the end of the array to close the feature, only used when levelsDeep is 0. False by default.
    asFeature(<Object> geojson)ObjectNormalize GeoJSON geometries/features into GeoJSON features.
    + +
    + + +

    GridLayer

    Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas. +GridLayer can be extended to create a tiled grid of HTML elements like <canvas>, <img> or <div>. GridLayer will handle creating and animating these DOM elements for you.

    + +
    +

    Usage example

    + +
    + +

    Synchronous usage

    + + + +

    To create a custom layer, extend GridLayer and implement the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

    +
    var CanvasLayer = L.GridLayer.extend({
    +    createTile: function(coords){
    +        // create a <canvas> element for drawing
    +        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    +
    +        // setup tile width and height according to the options
    +        var size = this.getTileSize();
    +        tile.width = size.x;
    +        tile.height = size.y;
    +
    +        // get a canvas context and draw something on it using coords.x, coords.y and coords.z
    +        var ctx = tile.getContext('2d');
    +
    +        // return the tile so it can be rendered on screen
    +        return tile;
    +    }
    +});
    +
    + + + +
    + +

    Asynchronous usage

    + + + +

    Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the done() callback.

    +
    var CanvasLayer = L.GridLayer.extend({
    +    createTile: function(coords, done){
    +        var error;
    +
    +        // create a <canvas> element for drawing
    +        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
    +
    +        // setup tile width and height according to the options
    +        var size = this.getTileSize();
    +        tile.width = size.x;
    +        tile.height = size.y;
    +
    +        // draw something asynchronously and pass the tile to the done() callback
    +        setTimeout(function() {
    +            done(error, tile);
    +        }, 1000);
    +
    +        return tile;
    +    }
    +});
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    tileSizeNumber|Point256Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise.
    opacityNumber1.0Opacity of the tiles. Can be used in the createTile() function.
    updateWhenIdleBoolean(depends)Load new tiles only when panning ends. +true by default on mobile browsers, in order to avoid too many requests and keep smooth navigation. +false otherwise in order to display new tiles during panning, since it is easy to pan outside the +keepBuffer option in desktop browsers.
    updateWhenZoomingBooleantrueBy default, a smooth zoom animation (during a touch zoom or a flyTo()) will update grid layers every integer zoom level. Setting this option to false will update the grid layer only when the smooth animation ends.
    updateIntervalNumber200Tiles will not update more than once every updateInterval milliseconds when panning.
    zIndexNumber1The explicit zIndex of the tile layer.
    boundsLatLngBoundsundefinedIf set, tiles will only be loaded inside the set LatLngBounds.
    minZoomNumber0The minimum zoom level down to which this layer will be displayed (inclusive).
    maxZoomNumberundefinedThe maximum zoom level up to which this layer will be displayed (inclusive).
    maxNativeZoomNumberundefinedMaximum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels higher than maxNativeZoom will be loaded +from maxNativeZoom level and auto-scaled.
    minNativeZoomNumberundefinedMinimum zoom number the tile source has available. If it is specified, +the tiles on all zoom levels lower than minNativeZoom will be loaded +from minNativeZoom level and auto-scaled.
    noWrapBooleanfalseWhether the layer is wrapped around the antimeridian. If true, the +GridLayer will only be displayed once at low zoom levels. Has no +effect when the map CRS doesn't wrap around. Can be used +in combination with bounds to prevent requesting +tiles outside the CRS limits.
    paneString'tilePane'Map pane where the grid layer will be added.
    classNameString''A custom class name to assign to the tile layer. Empty by default.
    keepBufferNumber2When panning the map, keep this many rows and columns of tiles before unloading them.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    loadingEventFired when the grid layer starts loading tiles.
    tileunloadTileEventFired when a tile is removed (e.g. when a tile goes off the screen).
    tileloadstartTileEventFired when a tile is requested and starts loading.
    tileerrorTileErrorEventFired when there is an error loading a tile.
    tileloadTileEventFired when a tile loads.
    loadEventFired when the grid layer loaded all visible tiles.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bringToFront()this

    Brings the tile layer to the top of all tile layers.

    +
    bringToBack()this

    Brings the tile layer to the bottom of all tile layers.

    +
    getContainer()HTMLElement

    Returns the HTML element that contains the tiles for this layer.

    +
    setOpacity(<Number> opacity)this

    Changes the opacity of the grid layer.

    +
    setZIndex(<Number> zIndex)this

    Changes the zIndex of the grid layer.

    +
    isLoading()Boolean

    Returns true if any tile in the grid layer has not finished loading.

    +
    redraw()this

    Causes the layer to clear all the tiles and request them again.

    +
    getTileSize()Point

    Normalizes the tileSize option into a point. Used by the createTile() method.

    +
    + +
    + +

    Extension methods

    + +
    Layers extending GridLayer shall reimplement the following method.
    + + + + + + + + + + + + + +
    MethodReturnsDescription
    createTile(<Object> coords, <Function> done?)HTMLElement

    Called only internally, must be overridden by classes extending GridLayer. +Returns the HTMLElement corresponding to the given coords. If the done callback +is specified, it must be called when the tile has finished loading and drawing.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    LatLng

    Represents a geographical point with a certain latitude and longitude.

    + +
    +

    Usage example

    + +
    + + + + + +
    var latlng = L.latLng(50.5, 30.5);
    +
    +

    All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

    +
    map.panTo([50, 30]);
    +map.panTo({lon: 30, lat: 50});
    +map.panTo({lat: 50, lng: 30});
    +map.panTo(L.latLng(50, 30));
    +
    +

    Note that LatLng does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.latLng(<Number> latitude, <Number> longitude, <Number> altitude?)Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
    L.latLng(<Array> coords)Expects an array of the form [Number, Number] or [Number, Number, Number] instead.
    L.latLng(<Object> coords)Expects an plain object of the form {lat: Number, lng: Number} or {lat: Number, lng: Number, alt: Number} instead.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    equals(<LatLng> otherLatLng, <Number> maxMargin?)Boolean

    Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overridden by setting maxMargin to a small number.

    +
    toString()String

    Returns a string representation of the point (for debugging purposes).

    +
    distanceTo(<LatLng> otherLatLng)Number

    Returns the distance (in meters) to the given LatLng calculated using the Spherical Law of Cosines.

    +
    wrap()LatLng

    Returns a new LatLng object with the longitude wrapped so it's always between -180 and +180 degrees.

    +
    toBounds(<Number> sizeInMeters)LatLngBounds

    Returns a new LatLngBounds object in which each boundary is sizeInMeters/2 meters apart from the LatLng.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    latNumberLatitude in degrees
    lngNumberLongitude in degrees
    altNumberAltitude in meters (optional)
    + +
    + + +

    LatLngBounds

    Represents a rectangular geographical area on a map.

    + +
    +

    Usage example

    + +
    + + + + + +
    var corner1 = L.latLng(40.712, -74.227),
    +corner2 = L.latLng(40.774, -74.125),
    +bounds = L.latLngBounds(corner1, corner2);
    +
    +

    All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    +
    map.fitBounds([
    +	[40.712, -74.227],
    +	[40.774, -74.125]
    +]);
    +
    +

    Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners outside the [-180, 180] degrees longitude range.

    +

    Note that LatLngBounds does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.latLngBounds(<LatLng> corner1, <LatLng> corner2)Creates a LatLngBounds object by defining two diagonally opposite corners of the rectangle.
    L.latLngBounds(<LatLng[]> latlngs)Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    extend(<LatLng> latlng)this

    Extend the bounds to contain the given point

    +
    extend(<LatLngBounds> otherBounds)this

    Extend the bounds to contain the given bounds

    +
    pad(<Number> bufferRatio)LatLngBounds

    Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. +For example, a ratio of 0.5 extends the bounds by 50% in each direction. +Negative values will retract the bounds.

    +
    getCenter()LatLng

    Returns the center point of the bounds.

    +
    getSouthWest()LatLng

    Returns the south-west point of the bounds.

    +
    getNorthEast()LatLng

    Returns the north-east point of the bounds.

    +
    getNorthWest()LatLng

    Returns the north-west point of the bounds.

    +
    getSouthEast()LatLng

    Returns the south-east point of the bounds.

    +
    getWest()Number

    Returns the west longitude of the bounds

    +
    getSouth()Number

    Returns the south latitude of the bounds

    +
    getEast()Number

    Returns the east longitude of the bounds

    +
    getNorth()Number

    Returns the north latitude of the bounds

    +
    contains(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    +
    contains(<LatLng> latlng)Boolean

    Returns true if the rectangle contains the given point.

    +
    intersects(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.

    +
    overlaps(<LatLngBounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.

    +
    toBBoxString()String

    Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.

    +
    equals(<LatLngBounds> otherBounds, <Number> maxMargin?)Boolean

    Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting maxMargin to a small number.

    +
    isValid()Boolean

    Returns true if the bounds are properly initialized.

    +
    + +
    + + +

    Point

    Represents a point with x and y coordinates in pixels.

    + +
    +

    Usage example

    + +
    + + + + + +
    var point = L.point(200, 300);
    +
    +

    All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

    +
    map.panBy([200, 300]);
    +map.panBy(L.point(200, 300));
    +
    +

    Note that Point does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.point(<Number> x, <Number> y, <Boolean> round?)Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
    L.point(<Number[]> coords)Expects an array of the form [x, y] instead.
    L.point(<Object> coords)Expects a plain object of the form {x: Number, y: Number} instead.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    clone()Point

    Returns a copy of the current point.

    +
    add(<Point> otherPoint)Point

    Returns the result of addition of the current and the given points.

    +
    subtract(<Point> otherPoint)Point

    Returns the result of subtraction of the given point from the current.

    +
    divideBy(<Number> num)Point

    Returns the result of division of the current point by the given number.

    +
    multiplyBy(<Number> num)Point

    Returns the result of multiplication of the current point by the given number.

    +
    scaleBy(<Point> scale)Point

    Multiply each coordinate of the current point by each coordinate of +scale. In linear algebra terms, multiply the point by the +scaling matrix +defined by scale.

    +
    unscaleBy(<Point> scale)Point

    Inverse of scaleBy. Divide each coordinate of the current point by +each coordinate of scale.

    +
    round()Point

    Returns a copy of the current point with rounded coordinates.

    +
    floor()Point

    Returns a copy of the current point with floored coordinates (rounded down).

    +
    ceil()Point

    Returns a copy of the current point with ceiled coordinates (rounded up).

    +
    trunc()Point

    Returns a copy of the current point with truncated coordinates (rounded towards zero).

    +
    distanceTo(<Point> otherPoint)Number

    Returns the cartesian distance between the current and the given points.

    +
    equals(<Point> otherPoint)Boolean

    Returns true if the given point has the same coordinates.

    +
    contains(<Point> otherPoint)Boolean

    Returns true if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).

    +
    toString()String

    Returns a string representation of the point for debugging purposes.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    xNumberThe x coordinate of the point
    yNumberThe y coordinate of the point
    + +
    + + +

    Bounds

    Represents a rectangular area in pixel coordinates.

    + +
    +

    Usage example

    + +
    + + + + + +
    var p1 = L.point(10, 10),
    +p2 = L.point(40, 60),
    +bounds = L.bounds(p1, p2);
    +
    +

    All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

    +
    otherBounds.intersects([[10, 10], [40, 60]]);
    +
    +

    Note that Bounds does not inherit from Leaflet's Class object, +which means new classes can't inherit from it, and new methods +can't be added to it with the include function.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.bounds(<Point> corner1, <Point> corner2)Creates a Bounds object from two corners coordinate pairs.
    L.bounds(<Point[]> points)Creates a Bounds object from the given array of points.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    extend(<Point> point)this

    Extends the bounds to contain the given point.

    +
    getCenter(<Boolean> round?)Point

    Returns the center point of the bounds.

    +
    getBottomLeft()Point

    Returns the bottom-left point of the bounds.

    +
    getTopRight()Point

    Returns the top-right point of the bounds.

    +
    getTopLeft()Point

    Returns the top-left point of the bounds (i.e. this.min).

    +
    getBottomRight()Point

    Returns the bottom-right point of the bounds (i.e. this.max).

    +
    getSize()Point

    Returns the size of the given bounds

    +
    contains(<Bounds> otherBounds)Boolean

    Returns true if the rectangle contains the given one.

    +
    contains(<Point> point)Boolean

    Returns true if the rectangle contains the given point.

    +
    intersects(<Bounds> otherBounds)Boolean

    Returns true if the rectangle intersects the given bounds. Two bounds +intersect if they have at least one point in common.

    +
    overlaps(<Bounds> otherBounds)Boolean

    Returns true if the rectangle overlaps the given bounds. Two bounds +overlap if their intersection is an area.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    minPointThe top left corner of the rectangle.
    maxPointThe bottom right corner of the rectangle.
    + +
    + + +

    Icon

    Represents an icon to provide when creating a marker.

    + +
    +

    Usage example

    + +
    + + + + + +
    var myIcon = L.icon({
    +    iconUrl: 'my-icon.png',
    +    iconSize: [38, 95],
    +    iconAnchor: [22, 94],
    +    popupAnchor: [-3, -76],
    +    shadowUrl: 'my-icon-shadow.png',
    +    shadowSize: [68, 95],
    +    shadowAnchor: [22, 94]
    +});
    +
    +L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    +
    +

    L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.icon(<Icon options> options)Creates an icon instance with the given options.
    + +
    + + +
    +

    Options

    + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    iconUrlStringnull(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlStringnullThe URL to a retina sized version of the icon image (absolute or relative to your +script path). Used for Retina screen devices.
    iconSizePointnullSize of the icon image in pixels.
    iconAnchorPointnullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon +will be aligned so that this point is at the marker's geographical location. Centered +by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint[0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint[0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlStringnullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlStringnull
    shadowSizePointnullSize of the shadow image in pixels.
    shadowAnchorPointnullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same +as iconAnchor if not specified).
    classNameString''A custom class name to assign to both icon and shadow images. Empty by default.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element +styled according to the options.

    +
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    +
    + +
    + + +
    + +
    +

    Icon.Default

    + +
    + + + +
    A trivial subclass of Icon, represents the icon to use in Markers when +no icon is specified. Points to the blue marker image distributed with Leaflet +releases. +

    In order to customize the default icon, just change the properties of L.Icon.Default.prototype.options +(which is a set of Icon options).

    +

    If you want to completely replace the default icon, override the +L.Marker.prototype.options.icon with your own icon instead.

    + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    imagePathStringIcon.Default will try to auto-detect the location of the +blue icon images. If you are placing these images in a non-standard +way, set this option to point to the right path.
    + +
    + + +

    DivIcon

    Represents a lightweight icon for markers that uses a simple <div> +element instead of an image. Inherits from Icon but ignores the iconUrl and shadow options.

    + +
    +

    Usage example

    + +
    + + + + + +
    var myIcon = L.divIcon({className: 'my-div-icon'});
    +// you can set .my-div-icon styles in CSS
    +
    +L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
    +
    +

    By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.

    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.divIcon(<DivIcon options> options)Creates a DivIcon instance with the given options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    htmlString|HTMLElement''Custom HTML code to put inside the div element, empty by default. Alternatively, +an instance of HTMLElement.
    bgPosPoint[0, 0]Optional relative position of the background, in pixels
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    iconUrlStringnull(required) The URL to the icon image (absolute or relative to your script path).
    iconRetinaUrlStringnullThe URL to a retina sized version of the icon image (absolute or relative to your +script path). Used for Retina screen devices.
    iconSizePointnullSize of the icon image in pixels.
    iconAnchorPointnullThe coordinates of the "tip" of the icon (relative to its top left corner). The icon +will be aligned so that this point is at the marker's geographical location. Centered +by default if size is specified, also can be set in CSS with negative margins.
    popupAnchorPoint[0, 0]The coordinates of the point from which popups will "open", relative to the icon anchor.
    tooltipAnchorPoint[0, 0]The coordinates of the point from which tooltips will "open", relative to the icon anchor.
    shadowUrlStringnullThe URL to the icon shadow image. If not specified, no shadow image will be created.
    shadowRetinaUrlStringnull
    shadowSizePointnullSize of the shadow image in pixels.
    shadowAnchorPointnullThe coordinates of the "tip" of the shadow (relative to its top left corner) (the same +as iconAnchor if not specified).
    classNameString''A custom class name to assign to both icon and shadow images. Empty by default.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    createIcon(<HTMLElement> oldIcon?)HTMLElement

    Called internally when the icon has to be shown, returns a <img> HTML element +styled according to the options.

    +
    createShadow(<HTMLElement> oldIcon?)HTMLElement

    As createIcon, but for the shadow beneath it.

    +
    + +
    +
    +
    + +

    Control.Zoom

    A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

    + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.zoom(<Control.Zoom options> options)Creates a zoom control
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    zoomInTextString'+'The text set on the 'zoom in' button.
    zoomInTitleString'Zoom in'The title set on the 'zoom in' button.
    zoomOutTextString'&#x2212' +The text set on the 'zoom out' button.
    zoomOutTitleString'Zoom out'The title set on the 'zoom out' button.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Control.Attribution

    The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with the getAttribution method automatically. Extends Control.

    + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.attribution(<Control.Attribution options> options)Creates an attribution control.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    prefixString'Leaflet'The HTML text shown before the attributions. Pass false to disable.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    setPrefix(<String> prefix)this

    Sets the text before the attributions.

    +
    addAttribution(<String> text)this

    Adds an attribution text (e.g. 'Vector data &copy; Mapbox').

    +
    removeAttribution(<String> text)this

    Removes an attribution text.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Control.Layers

    The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

    + +
    +

    Usage example

    + +
    + + + + + +
    var baseLayers = {
    +	"Mapbox": mapbox,
    +	"OpenStreetMap": osm
    +};
    +
    +var overlays = {
    +	"Marker": marker,
    +	"Roads": roadsLayer
    +};
    +
    +L.control.layers(baseLayers, overlays).addTo(map);
    +
    +

    The baseLayers and overlays parameters are object literals with layer names as keys and Layer objects as values:

    +
    {
    +    "<someName1>": layer1,
    +    "<someName2>": layer2
    +}
    +
    +

    The layer names can contain HTML, which allows you to add additional styling to the items:

    +
    {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.layers(<Object> baselayers?, <Object> overlays?, <Control.Layers options> options?)Creates a layers control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    collapsedBooleantrueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
    autoZIndexBooleantrueIf true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.
    hideSingleBaseBooleanfalseIf true, the base layers in the control will be hidden when there is only one.
    sortLayersBooleanfalseWhether to sort the layers. When false, layers will keep the order +in which they were added to the control.
    sortFunctionFunction*A compare function +that will be used for sorting the layers, when sortLayers is true. +The function receives both the L.Layer instances and their names, as in +sortFunction(layerA, layerB, nameA, nameB). +By default, it sorts layers alphabetically by their name.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addBaseLayer(<Layer> layer, <String> name)this

    Adds a base layer (radio button entry) with the given name to the control.

    +
    addOverlay(<Layer> layer, <String> name)this

    Adds an overlay (checkbox entry) with the given name to the control.

    +
    removeLayer(<Layer> layer)this

    Remove the given layer from the control.

    +
    expand()this

    Expand the control container if collapsed.

    +
    collapse()this

    Collapse the control container if expanded.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Control.Scale

    A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends Control.

    + +
    +

    Usage example

    + +
    + + + + + +
    L.control.scale().addTo(map);
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + +
    FactoryDescription
    L.control.scale(<Control.Scale options> options?)Creates an scale control with the given options.
    + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    maxWidthNumber100Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
    metricBooleanTrueWhether to show the metric scale line (m/km).
    imperialBooleanTrueWhether to show the imperial scale line (mi/ft).
    updateWhenIdleBooleanfalseIf true, the control is updated on moveend, otherwise it's always up-to-date (updated on move).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    +
    +
    + +

    Browser

    A namespace with static properties for browser/feature detection used by Leaflet internally.

    + +
    +

    Usage example

    + +
    + + + + + +
    if (L.Browser.ielt9) {
    +  alert('Upgrade your browser, dude!');
    +}
    +
    + + + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    ieBooleantrue for all Internet Explorer versions (not Edge).
    ielt9Booleantrue for Internet Explorer versions less than 9.
    edgeBooleantrue for the Edge web browser.
    webkitBooleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
    androidBooleantrue for any browser running on an Android platform.
    android23Booleantrue for browsers running on Android 2 or Android 3.
    androidStockBooleantrue for the Android stock browser (i.e. not Chrome)
    operaBooleantrue for the Opera browser
    chromeBooleantrue for the Chrome browser.
    geckoBooleantrue for gecko-based browsers like Firefox.
    safariBooleantrue for the Safari browser.
    opera12Booleantrue for the Opera browser supporting CSS transforms (version 12 or later).
    winBooleantrue when the browser is running in a Windows platform
    ie3dBooleantrue for all Internet Explorer versions supporting CSS transforms.
    webkit3dBooleantrue for webkit-based browsers supporting CSS transforms.
    gecko3dBooleantrue for gecko-based browsers supporting CSS transforms.
    any3dBooleantrue for all browsers supporting CSS transforms.
    mobileBooleantrue for all browsers running in a mobile device.
    mobileWebkitBooleantrue for all webkit-based browsers in a mobile device.
    mobileWebkit3dBooleantrue for all webkit-based browsers in a mobile device supporting CSS transforms.
    msPointerBooleantrue for browsers implementing the Microsoft touch events model (notably IE10).
    pointerBooleantrue for all browsers supporting pointer events.
    touchBooleantrue for all browsers supporting touch events. +This does not necessarily mean that the browser is running in a computer with +a touchscreen, it only means that the browser is capable of understanding +touch events.
    mobileOperaBooleantrue for the Opera browser in a mobile device.
    mobileGeckoBooleantrue for gecko-based browsers running in a mobile device.
    retinaBooleantrue for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%.
    passiveEventsBooleantrue for browsers that support passive events.
    canvasBooleantrue when the browser supports <canvas>.
    svgBooleantrue when the browser supports SVG.
    vmlBooleantrue if the browser supports VML.
    + +
    + + +

    Util

    Various utility functions, used by Leaflet internally.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    extend(<Object> dest, <Object> src?)ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
    create(<Object> proto, <Object> properties?)ObjectCompatibility polyfill for Object.create
    bind(<Function> fn, )FunctionReturns a new function bound to the arguments passed, like Function.prototype.bind. +Has a L.bind() shortcut.
    stamp(<Object> obj)NumberReturns the unique ID of an object, assigning it one if it doesn't have it.
    throttle(<Function> fn, <Number> time, <Object> context)FunctionReturns a function which executes function fn with the given scope context +(so that the this keyword refers to context inside fn's code). The function +fn will be called no more than one time per given amount of time. The arguments +received by the bound function will be any arguments passed when binding the +function, followed by any arguments passed when invoking the bound function. +Has an L.throttle shortcut.
    wrapNum(<Number> num, <Number[]> range, <Boolean> includeMax?)NumberReturns the number num modulo range in such a way so it lies within +range[0] and range[1]. The returned value will be always smaller than +range[1] unless includeMax is set to true.
    falseFn()FunctionReturns a function which always returns false.
    formatNum(<Number> num, <Number> digits?)NumberReturns the number num rounded to digits decimals, or to 6 decimals by default.
    trim(<String> str)StringCompatibility polyfill for String.prototype.trim
    splitWords(<String> str)String[]Trims and splits the string on whitespace and returns the array of parts.
    setOptions(<Object> obj, <Object> options)ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.
    getParamString(<Object> obj, <String> existingUrl?, <Boolean> uppercase?)StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} +translates to '?a=foo&b=bar'. If existingUrl is set, the parameters will +be appended at the end. If uppercase is true, the parameter names will +be uppercased (e.g. '?A=foo&B=bar')
    template(<String> str, <Object> data)StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' +and a data object like {a: 'foo', b: 'bar'}, returns evaluated string +('Hello foo, bar'). You can also specify functions instead of strings for +data values — they will be evaluated passing data as an argument.
    isArray(obj)BooleanCompatibility polyfill for Array.isArray
    indexOf(<Array> array, <Object> el)NumberCompatibility polyfill for Array.prototype.indexOf
    requestAnimFrame(<Function> fn, <Object> context?, <Boolean> immediate?)NumberSchedules fn to be executed when the browser repaints. fn is bound to +context if given. When immediate is set, fn is called immediately if +the browser doesn't have native support for +window.requestAnimationFrame, +otherwise it's delayed. Returns a request ID that can be used to cancel the request.
    cancelAnimFrame(<Number> id)undefinedCancels a previous requestAnimFrame. See also window.cancelAnimationFrame.
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    lastIdNumberLast unique ID used by stamp()
    emptyImageUrlStringData URI string containing a base64-encoded empty GIF image. +Used as a hack to free memory from unused images on WebKit-powered +mobile devices (by setting image src to this string).
    + +
    + + +

    Transformation

    Represents an affine transformation: a set of coefficients a, b, c, d +for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing +the reverse. Used by Leaflet in its projections code.

    + +
    +

    Usage example

    + +
    + + + + + +
    var transformation = L.transformation(2, 5, -1, 10),
    +	p = L.point(1, 2),
    +	p2 = transformation.transform(p), //  L.point(7, 8)
    +	p3 = transformation.untransform(p2); //  L.point(1, 2)
    +
    + + + +
    + + +
    +

    Creation

    + +
    + + + + + + + + + + + + + + + + + + +
    FactoryDescription
    L.transformation(<Number> a, <Number> b, <Number> c, <Number> d)Instantiates a Transformation object with the given coefficients.
    L.transformation(<Array> coefficients)Expects an coefficients array of the form +[a: Number, b: Number, c: Number, d: Number].
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    transform(<Point> point, <Number> scale?)Point

    Returns a transformed point, optionally multiplied by the given scale. +Only accepts actual L.Point instances, not arrays.

    +
    untransform(<Point> point, <Number> scale?)Point

    Returns the reverse transformation of the given point, optionally divided +by the given scale. Only accepts actual L.Point instances, not arrays.

    +
    + +
    + + +

    LineUtil

    Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    simplify(<Point[]> points, <Number> tolerance)Point[]Dramatically reduces the number of points in a polyline while retaining +its shape and returns a new array of simplified points, using the +Douglas-Peucker algorithm. +Used for a huge performance boost when processing/displaying Leaflet polylines for +each zoom level and also reducing visual noise. tolerance affects the amount of +simplification (lesser value means higher quality but slower and with more points). +Also released as a separated micro-library Simplify.js.
    pointToSegmentDistance(<Point> p, <Point> p1, <Point> p2)NumberReturns the distance between point p and segment p1 to p2.
    closestPointOnSegment(<Point> p, <Point> p1, <Point> p2)NumberReturns the closest point from a point p on a segment p1 to p2.
    clipSegment(<Point> a, <Point> b, <Bounds> bounds, <Boolean> useLastCode?, <Boolean> round?)Point[]|BooleanClips the segment a to b by rectangular bounds with the +Cohen-Sutherland algorithm +(modifying the segment points directly!). Used by Leaflet to only show polyline +points that are on the screen or near, increasing performance.
    isFlat(<LatLng[]> latlngs)BooleanReturns true if latlngs is a flat array, false is nested.
    + +
    + + +

    PolyUtil

    Various utility functions for polygon geometries.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    clipPolygon(<Point[]> points, <Bounds> bounds, <Boolean> round?)Point[]Clips the polygon geometry defined by the given points by the given bounds (using the Sutherland-Hodgman algorithm). +Used by Leaflet to only show polygon points that are on the screen or near, increasing +performance. Note that polygon points needs different algorithm for clipping +than polyline, so there's a separate method for it.
    + +
    + + +

    DomEvent

    Utility functions to work with the DOM events, used by Leaflet internally.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    on(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisAdds a listener function (fn) to a particular DOM event type of the +element el. You can optionally specify the context of the listener +(object the this keyword will point to). You can also pass several +space-separated types (e.g. 'click dblclick').
    on(<HTMLElement> el, <Object> eventMap, <Object> context?)thisAdds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    off(<HTMLElement> el, <String> types, <Function> fn, <Object> context?)thisRemoves a previously added listener function. +Note that if you passed a custom context to on, you must pass the same +context to off in order to remove the listener.
    off(<HTMLElement> el, <Object> eventMap, <Object> context?)thisRemoves a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}
    stopPropagation(<DOMEvent> ev)thisStop the given event from propagation to parent elements. Used inside the listener functions: +
    L.DomEvent.on(div, 'click', function (ev) {
    +	L.DomEvent.stopPropagation(ev);
    +});
    +
    disableScrollPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'wheel' events (plus browser variants).
    disableClickPropagation(<HTMLElement> el)thisAdds stopPropagation to the element's 'click', 'doubleclick', +'mousedown' and 'touchstart' events (plus browser variants).
    preventDefault(<DOMEvent> ev)thisPrevents the default action of the DOM Event ev from happening (such as +following a link in the href of the a element, or doing a POST request +with page reload when a <form> is submitted). +Use it inside listener functions.
    stop(<DOMEvent> ev)thisDoes stopPropagation and preventDefault at the same time.
    getMousePosition(<DOMEvent> ev, <HTMLElement> container?)PointGets normalized mouse position from a DOM event relative to the +container (border excluded) or to the whole page if not specified.
    getWheelDelta(<DOMEvent> ev)NumberGets normalized wheel delta from a wheel DOM event, in vertical +pixels scrolled (negative if scrolling down). +Events from pointing devices without precise scrolling are mapped to +a best guess of 60 pixels.
    addListener()thisAlias to L.DomEvent.on
    removeListener()thisAlias to L.DomEvent.off
    + +
    + + +

    DomUtil

    Utility functions to work with the DOM +tree, used by Leaflet internally.

    +

    Most functions expecting or returning a HTMLElement also work for +SVG elements. The only difference is that classes refer to CSS classes +in HTML and SVG classes in SVG.

    + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    get(<String|HTMLElement> id)HTMLElementReturns an element given its DOM id, or returns the element itself +if it was passed directly.
    getStyle(<HTMLElement> el, <String> styleAttrib)StringReturns the value for a certain style attribute on an element, +including computed values or values set through CSS.
    create(<String> tagName, <String> className?, <HTMLElement> container?)HTMLElementCreates an HTML element with tagName, sets its class to className, and optionally appends it to container element.
    remove(<HTMLElement> el)Removes el from its parent element
    empty(<HTMLElement> el)Removes all of el's children elements from el
    toFront(<HTMLElement> el)Makes el the last child of its parent, so it renders in front of the other children.
    toBack(<HTMLElement> el)Makes el the first child of its parent, so it renders behind the other children.
    hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element's class attribute contains name.
    addClass(<HTMLElement> el, <String> name)Adds name to the element's class attribute.
    removeClass(<HTMLElement> el, <String> name)Removes name from the element's class attribute.
    setClass(<HTMLElement> el, <String> name)Sets the element's class.
    getClass(<HTMLElement> el)StringReturns the element's class.
    setOpacity(<HTMLElement> el, <Number> opacity)Set the opacity of an element (including old IE support). +opacity must be a number from 0 to 1.
    testProp(<String[]> props)String|falseGoes through the array of style names and returns the first name +that is a valid style name for an element. If no such name is found, +it returns false. Useful for vendor-prefixed styles like transform.
    setTransform(<HTMLElement> el, <Point> offset, <Number> scale?)Resets the 3D CSS transform of el so it is translated by offset pixels +and optionally scaled by scale. Does not have an effect if the +browser doesn't support 3D CSS transforms.
    setPosition(<HTMLElement> el, <Point> position)Sets the position of el to coordinates specified by position, +using CSS translate or top/left positioning depending on the browser +(used by Leaflet internally to position its layers).
    getPosition(<HTMLElement> el)PointReturns the coordinates of an element previously positioned with setPosition.
    disableTextSelection()Prevents the user from generating selectstart DOM events, usually generated +when the user drags the mouse through a page with text. Used internally +by Leaflet to override the behaviour of any click-and-drag interaction on +the map. Affects drag interactions on the whole document.
    enableTextSelection()Cancels the effects of a previous L.DomUtil.disableTextSelection.
    disableImageDrag()As L.DomUtil.disableTextSelection, but +for dragstart DOM events, usually generated when the user drags an image.
    enableImageDrag()Cancels the effects of a previous L.DomUtil.disableImageDrag.
    preventOutline(<HTMLElement> el)Makes the outline +of the element el invisible. Used internally by Leaflet to prevent +focusable elements from displaying an outline when the user performs a +drag interaction on them.
    restoreOutline()Cancels the effects of a previous L.DomUtil.preventOutline.
    getSizedParentNode(<HTMLElement> el)HTMLElementFinds the closest parent node which size (width and height) is not null.
    getScale(<HTMLElement> el)ObjectComputes the CSS scale currently applied on the element. +Returns an object with x and y members as horizontal and vertical scales respectively, +and boundingClientRect as the result of getBoundingClientRect().
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    TRANSFORMStringVendor-prefixed transform style name (e.g. 'webkitTransform' for WebKit).
    TRANSITIONStringVendor-prefixed transition style name.
    TRANSITION_ENDStringVendor-prefixed transitionend event name.
    + +
    + + +

    PosAnimation

    Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

    + +
    +

    Usage example

    + +
    + + + + + +
    var fx = new L.PosAnimation();
    +fx.run(el, [300, 500], 0.5);
    +
    + + + +
    + + +
    +

    Constructor

    + +
    + + + + + + + + + + + + + + +
    ConstructorDescription
    L.PosAnimation()Creates a PosAnimation object.
    + + +
    + + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    startEventFired when the animation starts
    stepEventFired continuously during the animation.
    endEventFired when the animation ends.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    run(<HTMLElement> el, <Point> newPos, <Number> duration?, <Number> easeLinearity?)

    Run an animation of a given element to a new position, optionally setting +duration in seconds (0.25 by default) and easing linearity factor (3rd +argument of the cubic bezier curve, +0.5 by default).

    +
    stop()

    Stops the animation (if currently running).

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Draggable

    A class for making DOM elements draggable (including touch support). +Used internally for map and marker dragging. Only works for elements +that were positioned with L.DomUtil.setPosition.

    + +
    +

    Usage example

    + +
    + + + + + +
    var draggable = new L.Draggable(elementToDrag);
    +draggable.enable();
    +
    + + + +
    + + +
    +

    Constructor

    + +
    + + + + + + + + + + + + + + +
    ConstructorDescription
    L.Draggable(<HTMLElement> el, <HTMLElement> dragHandle?, <Boolean> preventOutline?, <Draggable options> options?)Creates a Draggable object for moving el when you start dragging the dragHandle element (equals el itself by default).
    + + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    clickToleranceNumber3The max number of pixels a user can shift the mouse pointer during a click +for it to be considered a valid click (as opposed to a mouse drag).
    + +
    + + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    downEventFired when a drag is about to start.
    dragstartEventFired when a drag starts
    predragEventFired continuously during dragging before each corresponding +update of the element's position.
    dragEventFired continuously during dragging.
    dragendDragEndEventFired when the drag ends.
    + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    enable()

    Enables the dragging ability

    +
    disable()

    Disables the dragging ability

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Class

    L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

    +

    In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

    + +
    +

    Usage example

    + +
    + + + + + +
    var MyClass = L.Class.extend({
    +initialize: function (greeter) {
    +	this.greeter = greeter;
    +	// class constructor
    +},
    +
    +greet: function (name) {
    +	alert(this.greeter + ', ' + name)
    +	}
    +});
    +
    +// create instance of MyClass, passing "Hello" to the constructor
    +var a = new MyClass("Hello");
    +
    +// call greet method, alerting "Hello, World"
    +a.greet("World");
    +
    + + + +
    + +

    Class Factories

    + + + +

    You may have noticed that Leaflet objects are created without using +the new keyword. This is achieved by complementing each class with a +lowercase factory method:

    +
    new L.Map('map'); // becomes:
    +L.map('map');
    +
    +

    The factories are implemented very easily, and you can do this for your own classes:

    +
    L.map = function (id, options) {
    +    return new L.Map(id, options);
    +};
    +
    + + + +
    + +

    Inheritance

    + + + +

    You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

    +
    var MyChildClass = MyClass.extend({
    +    // ... new properties and methods
    +});
    +
    +

    This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

    +
    var a = new MyChildClass();
    +a instanceof MyChildClass; // true
    +a instanceof MyClass; // true
    +
    +

    You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

    +
    var MyChildClass = MyClass.extend({
    +    initialize: function () {
    +        MyClass.prototype.initialize.call(this, "Yo");
    +    },
    +
    +    greet: function (name) {
    +        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
    +    }
    +});
    +
    +var a = new MyChildClass();
    +a.greet('Jason'); // alerts "Yo, bro Jason!"
    +
    + + + +
    + +

    Options

    + + + +

    options is a special property that unlike other objects that you pass +to extend will be merged with the parent one instead of overriding it +completely, which makes managing configuration of objects and default +values convenient:

    +
    var MyClass = L.Class.extend({
    +    options: {
    +        myOption1: 'foo',
    +        myOption2: 'bar'
    +    }
    +});
    +
    +var MyChildClass = MyClass.extend({
    +    options: {
    +        myOption1: 'baz',
    +        myOption3: 5
    +    }
    +});
    +
    +var a = new MyChildClass();
    +a.options.myOption1; // 'baz'
    +a.options.myOption2; // 'bar'
    +a.options.myOption3; // 5
    +
    +

    There's also L.Util.setOptions, a method for +conveniently merging options passed to constructor with the defaults +defines in the class:

    +
    var MyClass = L.Class.extend({
    +    options: {
    +        foo: 'bar',
    +        bla: 5
    +    },
    +
    +    initialize: function (options) {
    +        L.Util.setOptions(this, options);
    +        ...
    +    }
    +});
    +
    +var a = new MyClass({bla: 10});
    +a.options; // {foo: 'bar', bla: 10}
    +
    +

    Note that the options object allows any keys, not just +the options defined by the class and its base classes. +This means you can use the options object to store +application specific information, as long as you avoid +keys that are already used by the class in question.

    + + + +
    + +

    Includes

    + + + +

    includes is a special class property that merges all specified objects into the class (such objects are called mixins).

    +
     var MyMixin = {
    +    foo: function () { ... },
    +    bar: 5
    +};
    +
    +var MyClass = L.Class.extend({
    +    includes: MyMixin
    +});
    +
    +var a = new MyClass();
    +a.foo();
    +
    +

    You can also do such includes in runtime with the include method:

    +
    MyClass.include(MyMixin);
    +
    +

    statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

    +
    var MyClass = L.Class.extend({
    +    statics: {
    +        FOO: 'bar',
    +        BLA: 5
    +    }
    +});
    +
    +MyClass.FOO; // 'bar'
    +
    + + + +
    + +

    Constructor hooks

    + + + +

    If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

    +
    MyClass.addInitHook(function () {
    +    // ... do something in constructor additionally
    +    // e.g. add event listeners, set custom properties etc.
    +});
    +
    +

    You can also use the following shortcut when you just need to make one additional method call:

    +
    MyClass.addInitHook('methodName', arg1, arg2, …);
    +
    + + + +
    + + +
    +

    Functions

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    extend(<Object> props)FunctionExtends the current class given the properties to be included. +Returns a Javascript function that is a class constructor (to be called with new).
    include(<Object> properties)thisIncludes a mixin into the current class.
    mergeOptions(<Object> options)thisMerges options into the defaults of the class.
    addInitHook(<Function> fn)thisAdds a constructor hook to the class.
    + +
    + + +

    Evented

    A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

    + +
    +

    Usage example

    + +
    + + + + + +
    map.on('click', function(e) {
    +	alert(e.latlng);
    +} );
    +
    +

    Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

    +
    function onClick(e) { ... }
    +
    +map.on('click', onClick);
    +map.off('click', onClick);
    +
    + + + +
    + + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    + + +

    Layer

    A set of methods from the Layer base class that all Leaflet layers use. +Inherits all methods, options and events from L.Evented.

    + +
    +

    Usage example

    + +
    + + + + + +
    var layer = L.marker(latlng).addTo(map);
    +layer.addTo(map);
    +layer.remove();
    +
    + + + +
    + + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    + + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    + +

    Popup events

    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    + +

    Tooltip events

    + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    + + +
    +

    Methods

    + +
    + + + +
    Classes extending L.Layer will inherit the following methods:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    + +

    Extension methods

    + +
    Every layer should extend from L.Layer and (re-)implement the following methods.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    onAdd(<Map> map)this

    Should contain code that creates DOM elements for the layer, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).

    +
    onRemove(<Map> map)this

    Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).

    +
    getEvents()Object

    This optional method should return an object like { viewreset: this._reset } for addEventListener. The event handlers in this object will be automatically added and removed from the map with your layer.

    +
    getAttribution()String

    This optional method should return a string containing HTML to be shown on the Attribution control whenever the layer is visible.

    +
    beforeAdd(<Map> map)this

    Optional method. Called on map.addLayer(layer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.

    +
    + +
    + +

    Popup methods

    + +
    All layers share a set of methods convenient for binding popups to it. +
    var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);
    +layer.openPopup();
    +layer.closePopup();
    +
    +

    Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    + +

    Tooltip methods

    + +
    All layers share a set of methods convenient for binding tooltips to it. +
    var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);
    +layer.openTooltip();
    +layer.closeTooltip();
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Interactive layer

    Some Layers can be made interactive - when the user interacts +with such a layer, mouse events like click and mouseover can be handled. +Use the event handling methods to handle these events.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    interactiveBooleantrueIf false, the layer will not emit mouse events and will act as a part of the underlying map.
    bubblingMouseEventsBooleantrueWhen true, a mouse event on this layer will trigger the same event on the map +(unless L.DomEvent.stopPropagation is used).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + +

    Mouse events

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    clickMouseEventFired when the user clicks (or taps) the layer.
    dblclickMouseEventFired when the user double-clicks (or double-taps) the layer.
    mousedownMouseEventFired when the user pushes the mouse button on the layer.
    mouseupMouseEventFired when the user releases the mouse button pushed on the layer.
    mouseoverMouseEventFired when the mouse enters the layer.
    mouseoutMouseEventFired when the mouse leaves the layer.
    contextmenuMouseEventFired when the user right-clicks on the layer, prevents +default browser context menu from showing if there are listeners on +this event. Also fired on mobile when the user holds a single touch +for a second (also called long press).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Control

    L.Control is a base class for implementing map controls. Handles positioning. +All other controls extend from this class.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    positionString'topright'The position of the control (one of the map corners). Possible values are 'topleft', +'topright', 'bottomleft' or 'bottomright'
    + +
    + + +
    +

    Methods

    + +
    + + + +
    Classes extending L.Control will inherit the following methods:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    getPosition()string

    Returns the position of the control.

    +
    setPosition(<string> position)this

    Sets the position of the control.

    +
    getContainer()HTMLElement

    Returns the HTMLElement that contains the control.

    +
    addTo(<Map> map)this

    Adds the control to the given map.

    +
    remove()this

    Removes the control from the map it is currently active on.

    +
    + +
    + +

    Extension methods

    + +
    Every control should extend from L.Control and (re-)implement the following methods.
    + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    onAdd(<Map> map)HTMLElement

    Should return the container DOM element for the control and add listeners on relevant map events. Called on control.addTo(map).

    +
    onRemove(<Map> map)

    Optional method. Should contain all clean up code that removes the listeners previously added in onAdd. Called on control.remove().

    +
    + +
    + + +

    Handler

    Abstract class for map interaction handlers

    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    enable()this

    Enables the handler

    +
    disable()this

    Disables the handler

    +
    enabled()Boolean

    Returns true if the handler is enabled

    +
    + +
    + +

    Extension methods

    + +
    Classes inheriting from Handler must implement the two following methods:
    + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addHooks()

    Called when the handler is enabled, should add event hooks.

    +
    removeHooks()

    Called when the handler is disabled, should remove the event hooks added previously.

    +
    + +
    + + +
    +

    Functions

    + +
    + +

    There is static function which can be called without instantiating L.Handler:

    + + + + + + + + + + + + + + +
    FunctionReturnsDescription
    addTo(<Map> map, <String> name)thisAdds a new Handler to the given map with the given name.
    + +
    + + +

    Projection

    An object with methods for projecting geographical coordinates of the world onto +a flat surface (and back). See Map projection.

    + +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    project(<LatLng> latlng)Point

    Projects geographical coordinates into a 2D point. +Only accepts actual L.LatLng instances, not arrays.

    +
    unproject(<Point> point)LatLng

    The inverse of project. Projects a 2D point into a geographical location. +Only accepts actual L.Point instances, not arrays.

    +

    Note that the projection instances do not inherit from Leaflet's Class object, +and can't be instantiated. Also, new classes can't inherit from them, +and methods can't be added to them with the include function.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    boundsBoundsThe bounds (specified in CRS units) where the projection is valid
    + +
    + + +
    +

    Defined projections

    + +
    + + + +
    Leaflet comes with a set of already defined Projections out of the box:
    + + + + + + + + + + + + + + + + + + + +
    ProjectionDescription
    L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, +mostly used by GIS enthusiasts. Directly maps x as longitude, and y as +latitude. Also suitable for flat worlds, e.g. game maps. Used by the +EPSG:4326 and Simple CRS.
    L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS.
    L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, +used by almost all free and commercial tile providers. Assumes that Earth is +a sphere. Used by the EPSG:3857 CRS.
    + +
    + + +

    CRS

    +
    +

    Methods

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    latLngToPoint(<LatLng> latlng, <Number> zoom)Point

    Projects geographical coordinates into pixel coordinates for a given zoom.

    +
    pointToLatLng(<Point> point, <Number> zoom)LatLng

    The inverse of latLngToPoint. Projects pixel coordinates on a given +zoom into geographical coordinates.

    +
    project(<LatLng> latlng)Point

    Projects geographical coordinates into coordinates in units accepted for +this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).

    +
    unproject(<Point> point)LatLng

    Given a projected coordinate returns the corresponding LatLng. +The inverse of project.

    +
    scale(<Number> zoom)Number

    Returns the scale used when transforming projected coordinates into +pixel coordinates for a particular zoom. For example, it returns +256 * 2^zoom for Mercator-based CRS.

    +
    zoom(<Number> scale)Number

    Inverse of scale(), returns the zoom level corresponding to a scale +factor of scale.

    +
    getProjectedBounds(<Number> zoom)Bounds

    Returns the projection's bounds scaled and transformed for the provided zoom.

    +
    distance(<LatLng> latlng1, <LatLng> latlng2)Number

    Returns the distance between two geographical coordinates.

    +
    wrapLatLng(<LatLng> latlng)LatLng

    Returns a LatLng where lat and lng has been wrapped according to the +CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds.

    +
    wrapLatLngBounds(<LatLngBounds> bounds)LatLngBounds

    Returns a LatLngBounds with the same size as the given one, ensuring +that its center is within the CRS's bounds. +Only accepts actual L.LatLngBounds instances, not arrays.

    +
    + +
    + + +
    +

    Properties

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    codeStringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857')
    wrapLngNumber[]An array of two numbers defining whether the longitude (horizontal) coordinate +axis wraps around a given range and how. Defaults to [-180, 180] in most +geographical CRSs. If undefined, the longitude axis does not wrap around.
    wrapLatNumber[]Like wrapLng, but for the latitude (vertical) axis.
    infiniteBooleanIf true, the coordinate space will be unbounded (infinite in both axes)
    + +
    + + +
    +

    Defined CRSs

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CRSDescription
    L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
    L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial +tile providers. Uses Spherical Mercator projection. Set in by default in +Map's crs option.
    L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. +

    Leaflet 1.0.x complies with the TMS coordinate scheme for EPSG:4326, +which is a breaking change from 0.7.x behaviour. If you are using a TileLayer +with this CRS, ensure that there are two 256x256 pixel tiles covering the +whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), +or (-180,-90) for TileLayers with the tms option set.

    L.CRS.EarthServes as the base for CRS that are global such that they cover the earth. +Can only be used as the base for other CRS and cannot be used directly, +since it does not have a code, projection or transformation. distance() returns +meters.
    L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. +May be used for maps of flat surfaces (e.g. game maps). Note that the y +axis should still be inverted (going from bottom to top). distance() returns +simple euclidean distance.
    L.CRS.BaseObject that defines coordinate reference systems for projecting +geographical points into pixel (screen) coordinates and back (and to +coordinates in other units for WMS services). See +spatial reference system. +

    Leaflet defines the most usual CRSs by default. If you want to use a +CRS not defined by default, take a look at the +Proj4Leaflet plugin.

    +

    Note that the CRS instances do not inherit from Leaflet's Class object, +and can't be instantiated. Also, new classes can't inherit from them, +and methods can't be added to them with the include function.

    + +
    + + +

    Renderer

    Base class for vector renderer implementations (SVG, Canvas). Handles the +DOM container of the renderer, its bounds, and its zoom animation.

    +

    A Renderer works as an implicit layer group for all Paths - the renderer +itself can be added or removed to the map. All paths use a renderer, which can +be implicit (the map will decide the type of renderer and use it automatically) +or explicit (using the renderer option of the path).

    +

    Do not use this class directly, use SVG and Canvas instead.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paddingNumber0.1How much to extend the clip area around the map view (relative to its size) +e.g. 0.1 would be 10% of map view in each direction
    toleranceNumber0How much to extend click tolerance round a path/object on the map
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    paneString'overlayPane'By default the layer will be added to the map's overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + +
    + + + + + + + + + + + + + + + + +
    EventDataDescription
    updateEventFired when the renderer updates its bounds, center and zoom, for example when +its map has moved
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Event objects

    Whenever a class inheriting from Evented fires an event, a listener function +will be called with an event argument, which is a plain object containing +information about the event. For example:

    +
    map.on('click', function(ev) {
    +    alert(ev.latlng); // ev is an event object (MouseEvent in this case)
    +});
    +
    +

    The information available depends on the event type:

    + + + +
    +

    Event

    + +
    + + + +
    The base event object. All other event objects contain these properties too.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    + + +
    + +
    +

    KeyboardEvent

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    originalEventDOMEventThe original DOM KeyboardEvent that triggered this Leaflet event.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    MouseEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    latlngLatLngThe geographical point where the mouse event occurred.
    layerPointPointPixel coordinates of the point where the mouse event occurred relative to the map layer.
    containerPointPointPixel coordinates of the point where the mouse event occurred relative to the map сontainer.
    originalEventDOMEventThe original DOM MouseEvent or DOM TouchEvent that triggered this Leaflet event.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    LocationEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    latlngLatLngDetected geographical location of the user.
    boundsLatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
    accuracyNumberAccuracy of location in meters.
    altitudeNumberHeight of the position above the WGS84 ellipsoid in meters.
    altitudeAccuracyNumberAccuracy of altitude in meters.
    headingNumberThe direction of travel in degrees counting clockwise from true North.
    speedNumberCurrent velocity in meters per second.
    timestampNumberThe time when the position was acquired.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    ErrorEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    messageStringError message.
    codeNumberError code (if applicable).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    LayerEvent

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    layerLayerThe layer that was added or removed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    + +
    +
    +
    + +
    + +
    +

    LayersControlEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    layerLayerThe layer that was added or removed.
    nameStringThe name of the layer that was added or removed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    + +
    +
    +
    + +
    + +
    +

    TileEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    tileHTMLElementThe tile element (image).
    coordsPointPoint object with the tile's x, y, and z (zoom level) coordinates.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    TileErrorEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    tileHTMLElementThe tile element (image).
    coordsPointPoint object with the tile's x, y, and z (zoom level) coordinates.
    error*Error passed to the tile's done() callback.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    ResizeEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    oldSizePointThe old size before resize event.
    newSizePointThe new size after the resize event.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    GeoJSONEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    layerLayerThe layer for the GeoJSON feature that is being added to the map.
    propertiesObjectGeoJSON properties of the feature.
    geometryTypeStringGeoJSON geometry type of the feature.
    idStringGeoJSON ID of the feature (if present).
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    + +
    +
    +
    + +
    + +
    +

    PopupEvent

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    popupPopupThe popup that was opened or closed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    TooltipEvent

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    tooltipTooltipThe tooltip that was opened or closed.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    DragEndEvent

    + +
    + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    distanceNumberThe distance in pixels the draggable element was moved by.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +
    + +
    +

    ZoomAnimEvent

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    centerLatLngThe current center of the map
    zoomNumberThe current zoom level of the map
    noUpdateBooleanWhether layers should update their contents due to this event
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    typeStringThe event type (e.g. 'click').
    targetObjectThe object that fired the event. For propagated events, the last object in +the propagation chain that fired the event.
    sourceTargetObjectThe object that originally fired the event. For non-propagated events, this will +be the same as the target.
    propagatedFromObjectFor propagated events, the last object that propagated the event to its +event parent.
    layerObjectDeprecated. The same as propagatedFrom.
    + +
    +
    +
    + +

    DivOverlay

    Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins.

    + +
    +

    Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    offsetPointPoint(0, 7)The offset of the popup position. Useful to control the anchor +of the popup when opening it on some overlays.
    classNameString''A custom CSS class name to assign to the popup.
    paneString'popupPane'Map pane where the popup will be added.
    + +
    + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    attributionStringnullString to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.
    + +
    +
    +
    + +
    +

    Events

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    addEventFired after the layer is added to a map
    removeEventFired after the layer is removed from a map
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    popupopenPopupEventFired when a popup bound to this layer is opened
    popupclosePopupEventFired when a popup bound to this layer is closed
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    EventDataDescription
    tooltipopenTooltipEventFired when a tooltip bound to this layer is opened.
    tooltipcloseTooltipEventFired when a tooltip bound to this layer is closed.
    + +
    +
    +
    + +
    +

    Methods

    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addTo(<Map|LayerGroup> map)this

    Adds the layer to the given map or layer group.

    +
    remove()this

    Removes the layer from the map it is currently active on.

    +
    removeFrom(<Map> map)this

    Removes the layer from the given map

    +
    removeFrom(<LayerGroup> group)this

    Removes the layer from the given LayerGroup

    +
    getPane(<String> name?)HTMLElement

    Returns the HTMLElement representing the named pane on the map. If name is omitted, returns the pane for this layer.

    +
    getAttribution()String

    Used by the attribution control, returns the attribution option.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup(<String|HTMLElement|Function|Popup> content, <Popup options> options?)this

    Binds a popup to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindPopup()this

    Removes the popup previously bound with bindPopup.

    +
    openPopup(<LatLng> latlng?)this

    Opens the bound popup at the specified latlng or at the default popup anchor if no latlng is passed.

    +
    closePopup()this

    Closes the popup bound to this layer if it is open.

    +
    togglePopup()this

    Opens or closes the popup bound to this layer depending on its current state.

    +
    isPopupOpen()boolean

    Returns true if the popup bound to this layer is currently open.

    +
    setPopupContent(<String|HTMLElement|Popup> content)this

    Sets the content of the popup bound to this layer.

    +
    getPopup()Popup

    Returns the popup bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    bindTooltip(<String|HTMLElement|Function|Tooltip> content, <Tooltip options> options?)this

    Binds a tooltip to the layer with the passed content and sets up the +necessary event listeners. If a Function is passed it will receive +the layer as the first argument and should return a String or HTMLElement.

    +
    unbindTooltip()this

    Removes the tooltip previously bound with bindTooltip.

    +
    openTooltip(<LatLng> latlng?)this

    Opens the bound tooltip at the specified latlng or at the default tooltip anchor if no latlng is passed.

    +
    closeTooltip()this

    Closes the tooltip bound to this layer if it is open.

    +
    toggleTooltip()this

    Opens or closes the tooltip bound to this layer depending on its current state.

    +
    isTooltipOpen()boolean

    Returns true if the tooltip bound to this layer is currently open.

    +
    setTooltipContent(<String|HTMLElement|Tooltip> content)this

    Sets the content of the tooltip bound to this layer.

    +
    getTooltip()Tooltip

    Returns the tooltip bound to this layer.

    +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    on(<String> type, <Function> fn, <Object> context?)this

    Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick').

    +
    on(<Object> eventMap)this

    Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove}

    +
    off(<String> type, <Function> fn?, <Object> context?)this

    Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener.

    +
    off(<Object> eventMap)this

    Removes a set of type/listener pairs.

    +
    off()this

    Removes all listeners to all events on the object. This includes implicitly attached events.

    +
    fire(<String> type, <Object> data?, <Boolean> propagate?)this

    Fires an event of the specified type. You can optionally provide an data +object — the first argument of the listener function will contain its +properties. The event can optionally be propagated to event parents.

    +
    listens(<String> type)Boolean

    Returns true if a particular event type has any listeners attached to it.

    +
    once()this

    Behaves as on(…), except the listener will only get fired once and then removed.

    +
    addEventParent(<Evented> obj)this

    Adds an event parent - an Evented that will receive propagated events

    +
    removeEventParent(<Evented> obj)this

    Removes an event parent, so it will stop receiving propagated events

    +
    addEventListener()this

    Alias to on(…)

    +
    removeEventListener()this

    Alias to off(…)

    +
    clearAllEventListeners()this

    Alias to off()

    +
    addOneTimeEventListener()this

    Alias to once(…)

    +
    fireEvent()this

    Alias to fire(…)

    +
    hasEventListeners()Boolean

    Alias to listens(…)

    +
    + +
    +
    +
    + +

    Global Switches

    Global switches are created for rare cases and generally make +Leaflet to not detect a particular browser feature even if it's +there. You need to set the switch as a global variable to true +before including Leaflet on the page, like this:

    +
    <script>L_NO_TOUCH = true;</script>
    +<script src="leaflet.js"></script>
    +
    + + + + + + + + + + + + + + + + + +
    SwitchDescription
    L_NO_TOUCHForces Leaflet to not use touch events even if it detects them.
    L_DISABLE_3DForces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.
    + +

    noConflict

    This method restores the L global variable to the original value +it had before Leaflet inclusion, and returns the real Leaflet +namespace so you can put it elsewhere, like this:

    +
    <script src='libs/l.js'>
    +<!-- L points to some other library -->
    +
    +<script src='leaflet.js'>
    +<!-- you include Leaflet, it replaces the L variable to Leaflet namespace -->
    +
    +<script>
    +var Leaflet = L.noConflict();
    +// now L points to that other library again, and you can use Leaflet.Map etc.
    +</script>
    +
    + +

    version

    A constant that represents the Leaflet version in use.

    +
    L.version; // contains "1.0.0" (or whatever version is currently in use)
    +
    From cfcff71adb090587dfa4daa108e7fd16b5a7ed0b Mon Sep 17 00:00:00 2001 From: johnd0e Date: Wed, 3 Nov 2021 14:15:44 +0300 Subject: [PATCH 179/306] DomEvent.Pointer: simplify and cover by tests (#7415) --- spec/index.html | 1 + spec/suites/SpecHelper.js | 13 +- spec/suites/dom/DomEvent.PointerSpec.js | 166 ++++++++++++++++++++++++ src/dom/DomEvent.Pointer.js | 117 ++++++----------- 4 files changed, 220 insertions(+), 77 deletions(-) create mode 100644 spec/suites/dom/DomEvent.PointerSpec.js diff --git a/spec/index.html b/spec/index.html index 5c129eef4d3..86597ee06e9 100644 --- a/spec/index.html +++ b/spec/index.html @@ -58,6 +58,7 @@ + diff --git a/spec/suites/SpecHelper.js b/spec/suites/SpecHelper.js index 664512ee5fd..b0818b3db48 100644 --- a/spec/suites/SpecHelper.js +++ b/spec/suites/SpecHelper.js @@ -53,6 +53,17 @@ happen.at = function (what, x, y, props) { }, props || {})); }; +happen.makeEvent = (function (makeEvent) { + return function (o) { + var evt = makeEvent(o); + if (o.type.substring(0, 7) === 'pointer') { + evt.pointerId = o.pointerId; + evt.pointerType = o.pointerType; + } + return evt; + }; +})(happen.makeEvent); + // We'll want to skip a couple of things when in PhantomJS, due to lack of CSS animations it.skipIfNo3d = L.Browser.any3d ? it : it.skip; @@ -67,4 +78,4 @@ var touchEventType = L.Browser.touchNative ? 'touch' : 'pointer'; // eslint-disa // see https://github.com/Leaflet/prosthetic-hand/issues/14 console.log('L.Browser.pointer', L.Browser.pointer); -console.log('L.Browser.touch', L.Browser.touch); +console.log('L.Browser.touchNative', L.Browser.touchNative); diff --git a/spec/suites/dom/DomEvent.PointerSpec.js b/spec/suites/dom/DomEvent.PointerSpec.js new file mode 100644 index 00000000000..25d8a3bf965 --- /dev/null +++ b/spec/suites/dom/DomEvent.PointerSpec.js @@ -0,0 +1,166 @@ +describe('DomEvent.Pointer', function () { + var el, + listeners = {}; + + var pointerEvents = ['pointerdown', 'pointermove', 'pointerup', 'pointercancel']; + var touchEvents = ['touchstart', 'touchmove', 'touchend', 'touchcancel']; + + beforeEach(function () { + el = document.createElement('div'); + document.body.appendChild(el); + touchEvents.forEach(function (type) { + listeners[type] = sinon.spy(); + L.DomEvent.on(el, type, listeners[type]); + }); + }); + + afterEach(function () { + happen.once(el, {type: 'pointercancel'}); // to reset prosphetic-hand + happen.once(el, {type: 'touchcancel'}); // + document.body.removeChild(el); + }); + + var skip = describe.skip; + + var pointerToTouch = L.Browser.pointer && !L.Browser.touchNative; + (pointerToTouch ? describe : skip)('#Simulates touch based on pointer events', function () { + it('adds a listener and calls it on pointer event', function () { + pointerEvents.forEach(function (type) { + happen.once(el, {type: type}); + }); + touchEvents.forEach(function (type) { + expect(listeners[type].called).to.be.ok(); + expect(listeners[type].calledOnce).to.be.ok(); + }); + }); + + it('does not call removed listener', function () { + touchEvents.forEach(function (type) { + L.DomEvent.off(el, type, listeners[type]); + }); + pointerEvents.forEach(function (type) { + happen.once(el, {type: type}); + }); + touchEvents.forEach(function (type) { + expect(listeners[type].notCalled).to.be.ok(); + }); + }); + + it('ignores native touch events', function () { + touchEvents.forEach(function (type) { + happen.once(el, {type: type}); + }); + touchEvents.forEach(function (type) { + expect(listeners[type].notCalled).to.be.ok(); + }); + }); + + it('simulates touch events with correct properties', function () { + function containIn(props, evt) { + if (Array.isArray(props)) { + return props.every(function (props0) { + return containIn(props0, evt); + }); + } + if ('length' in evt) { + return Array.prototype.some.call(evt, containIn.bind(this, props)); + } + for (var prop in props) { + var res = true; + if (props[prop] !== evt[prop]) { + return false; + } + } + return res; + } + // test helper function + expect(containIn(undefined, {a:1})).not.to.be.ok(); + expect(containIn({}, {a:1})).not.to.be.ok(); + expect(containIn({a:1}, {a:2})).not.to.be.ok(); + expect(containIn({a:1}, {a:1, b:2})).to.be.ok(); + expect(containIn({a:1, b:2}, {a:1})).not.to.be.ok(); + expect(containIn({a:1}, [{a:1}, {b:2}])).to.be.ok(); + expect(containIn({a:1}, [{a:0}, {b:2}])).not.to.be.ok(); + expect(containIn([{a:1}, {b:2}], [{a:1}, {b:2}, {c:3}])).to.be.ok(); + expect(containIn([{a:1}, {b:2}], [{a:0}, {b:2}])).not.to.be.ok(); + + // pointerdown/touchstart + var pointer1 = {clientX:1, clientY:1, pointerId: 1}; + happen.once(el, L.extend({type: 'pointerdown'}, pointer1)); + var evt = listeners.touchstart.lastCall.args[0]; + expect(evt.type).to.be('pointerdown'); + expect(evt).to.have.keys('touches', 'changedTouches'); + expect(evt.changedTouches).to.have.length(1); + expect(containIn(pointer1, evt.changedTouches[0])).to.be.ok(); + expect(evt.touches).to.have.length(1); + expect(containIn(pointer1, evt.touches[0])).to.be.ok(); + + // another pointerdown/touchstart (multitouch) + var pointer2 = {clientX:2, clientY:2, pointerId: 2}; + happen.once(el, L.extend({type: 'pointerdown'}, pointer2)); + evt = listeners.touchstart.lastCall.args[0]; + expect(evt.type).to.be('pointerdown'); + expect(evt).to.have.keys('touches', 'changedTouches'); + expect(evt.changedTouches).to.have.length(1); + expect(containIn(pointer2, evt.changedTouches[0])).to.be.ok(); + expect(evt.touches).to.have.length(2); + expect(containIn([pointer1, pointer2], evt.touches)).to.be.ok(); + + // pointermove/touchmove (multitouch) + L.extend(pointer1, {clientX:11, clientY:11}); + happen.once(el, L.extend({type: 'pointermove'}, pointer1)); + evt = listeners.touchmove.lastCall.args[0]; + expect(evt.type).to.be('pointermove'); + expect(evt).to.have.keys('touches', 'changedTouches'); + expect(evt.changedTouches).to.have.length(1); + expect(containIn(pointer1, evt.changedTouches[0])).to.be.ok(); + expect(evt.touches).to.have.length(2); + expect(containIn([pointer1, pointer2], evt.touches)).to.be.ok(); + + // pointerup/touchend (multitouch) + happen.once(el, L.extend({type: 'pointerup'}, pointer2)); + evt = listeners.touchend.lastCall.args[0]; + expect(evt.type).to.be('pointerup'); + expect(evt).to.have.keys('touches', 'changedTouches'); + expect(evt.changedTouches).to.have.length(1); + expect(containIn(pointer2, evt.changedTouches[0])).to.be.ok(); + expect(evt.touches).to.have.length(1); + expect(containIn(pointer1, evt.touches[0])).to.be.ok(); + + // pointercancel/touchcancel + happen.once(el, L.extend({type: 'pointercancel'}, pointer1)); + evt = listeners.touchcancel.lastCall.args[0]; + expect(evt.type).to.be('pointercancel'); + expect(evt).to.have.keys('touches', 'changedTouches'); + expect(evt.changedTouches).to.have.length(1); + expect(containIn(pointer1, evt.changedTouches[0])).to.be.ok(); + expect(evt.touches).to.be.empty(); + + expect(listeners.touchstart.calledTwice).to.be.ok(); + expect(listeners.touchmove.calledOnce).to.be.ok(); + expect(listeners.touchend.calledOnce).to.be.ok(); + expect(listeners.touchcancel.calledOnce).to.be.ok(); + }); + }); + + (L.Browser.pointer ? skip : describe)('#Does not intrude if pointer events are not available', function () { + it('adds a listener and calls it on touch event', function () { + touchEvents.forEach(function (type) { + happen.once(el, {type: type}); + }); + touchEvents.forEach(function (type) { + expect(listeners[type].calledOnce).to.be.ok(); + }); + }); + + it('ignores pointer events', function () { + pointerEvents.forEach(function (type) { + happen.once(el, {type: type}); + }); + touchEvents.forEach(function (type) { + expect(listeners[type].notCalled).to.be.ok(); + }); + }); + }); + +}); diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index 0f6f34ffcb0..ee4d18dccdb 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -5,12 +5,22 @@ import * as Browser from '../core/Browser'; * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. */ - var POINTER_DOWN = Browser.msPointer ? 'MSPointerDown' : 'pointerdown'; var POINTER_MOVE = Browser.msPointer ? 'MSPointerMove' : 'pointermove'; var POINTER_UP = Browser.msPointer ? 'MSPointerUp' : 'pointerup'; var POINTER_CANCEL = Browser.msPointer ? 'MSPointerCancel' : 'pointercancel'; - +var pEvent = { + touchstart : POINTER_DOWN, + touchmove : POINTER_MOVE, + touchend : POINTER_UP, + touchcancel : POINTER_CANCEL +}; +var handle = { + touchstart : _onPointerStart, + touchmove : _onPointerMove, + touchend : _handlePointer, + touchcancel : _handlePointer +}; var _pointers = {}; var _pointerDocListener = false; @@ -19,44 +29,32 @@ var _pointerDocListener = false; export function addPointerListener(obj, type, handler) { if (type === 'touchstart') { - return _addPointerStart(obj, handler); - - } else if (type === 'touchmove') { - return _addPointerMove(obj, handler); - - } else if (type === 'touchend') { - return _addPointerEnd(obj, handler); - - } else if (type === 'touchcancel') { - return _addPointerCancel(obj, handler); + _addPointerDocListener(); } + handler = handle[type].bind(this, handler); + obj.addEventListener(pEvent[type], handler, false); + return handler; } export function removePointerListener(obj, type, handler) { - if (type === 'touchstart') { - obj.removeEventListener(POINTER_DOWN, handler, false); - - } else if (type === 'touchmove') { - obj.removeEventListener(POINTER_MOVE, handler, false); + obj.removeEventListener(pEvent[type], handler, false); +} - } else if (type === 'touchend') { - obj.removeEventListener(POINTER_UP, handler, false); +function _globalPointerDown(e) { + _pointers[e.pointerId] = e; +} - } else if (type === 'touchcancel') { - obj.removeEventListener(POINTER_CANCEL, handler, false); +function _globalPointerMove(e) { + if (_pointers[e.pointerId]) { + _pointers[e.pointerId] = e; } } -function _addPointerStart(obj, handler) { - var onDown = function (e) { - // IE10 specific: MsTouch needs preventDefault. See #2000 - if (e.MSPOINTER_TYPE_TOUCH && e.pointerType === e.MSPOINTER_TYPE_TOUCH) { - DomEvent.preventDefault(e); - } - - _handlePointer(e, handler); - }; +function _globalPointerUp(e) { + delete _pointers[e.pointerId]; +} +function _addPointerDocListener() { // need to keep track of what pointers and how many are active to provide e.touches emulation if (!_pointerDocListener) { // we listen document as any drags that end by moving the touch off the screen get fired there @@ -67,26 +65,9 @@ function _addPointerStart(obj, handler) { _pointerDocListener = true; } - - obj.addEventListener(POINTER_DOWN, onDown, false); - return onDown; } -function _globalPointerDown(e) { - _pointers[e.pointerId] = e; -} - -function _globalPointerMove(e) { - if (_pointers[e.pointerId]) { - _pointers[e.pointerId] = e; - } -} - -function _globalPointerUp(e) { - delete _pointers[e.pointerId]; -} - -function _handlePointer(e, handler) { +function _handlePointer(handler, e) { e.touches = []; for (var i in _pointers) { e.touches.push(_pointers[i]); @@ -96,34 +77,18 @@ function _handlePointer(e, handler) { handler(e); } -function _addPointerMove(obj, handler) { - var onMove = function (e) { - // don't fire touch moves when mouse isn't down - if ((e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) && e.buttons === 0) { - return; - } - - _handlePointer(e, handler); - }; - - obj.addEventListener(POINTER_MOVE, onMove, false); - return onMove; -} - -function _addPointerEnd(obj, handler) { - var onUp = function (e) { - _handlePointer(e, handler); - }; - - obj.addEventListener(POINTER_UP, onUp, false); - return onUp; +function _onPointerStart(handler, e) { + // IE10 specific: MsTouch needs preventDefault. See #2000 + if (e.MSPOINTER_TYPE_TOUCH && e.pointerType === e.MSPOINTER_TYPE_TOUCH) { + DomEvent.preventDefault(e); + } + _handlePointer(handler, e); } -function _addPointerCancel(obj, handler) { - var onCancel = function (e) { - _handlePointer(e, handler); - }; - - obj.addEventListener(POINTER_CANCEL, onCancel, false); - return onCancel; +function _onPointerMove(handler, e) { + // don't fire touch moves when mouse isn't down + if ((e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) && e.buttons === 0) { + return; + } + _handlePointer(handler, e); } From f2d625fcad8b5bf01bd7e98293ea0607c9d4fff7 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Wed, 3 Nov 2021 17:43:16 +0300 Subject: [PATCH 180/306] DomEvent.Pointer: process touch events only (#7059) --- spec/suites/dom/DomEvent.PointerSpec.js | 9 +++++++++ src/dom/DomEvent.Pointer.js | 12 +++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/spec/suites/dom/DomEvent.PointerSpec.js b/spec/suites/dom/DomEvent.PointerSpec.js index 25d8a3bf965..f44df672ef2 100644 --- a/spec/suites/dom/DomEvent.PointerSpec.js +++ b/spec/suites/dom/DomEvent.PointerSpec.js @@ -46,6 +46,15 @@ describe('DomEvent.Pointer', function () { }); }); + it('ignores events from mouse', function () { + pointerEvents.forEach(function (type) { + happen.once(el, {type: type, pointerType: 'mouse'}); + }); + touchEvents.forEach(function (type) { + expect(listeners[type].notCalled).to.be.ok(); + }); + }); + it('ignores native touch events', function () { touchEvents.forEach(function (type) { happen.once(el, {type: type}); diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index ee4d18dccdb..1fa8a902136 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -17,7 +17,7 @@ var pEvent = { }; var handle = { touchstart : _onPointerStart, - touchmove : _onPointerMove, + touchmove : _handlePointer, touchend : _handlePointer, touchcancel : _handlePointer }; @@ -68,6 +68,8 @@ function _addPointerDocListener() { } function _handlePointer(handler, e) { + if (e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) { return; } + e.touches = []; for (var i in _pointers) { e.touches.push(_pointers[i]); @@ -84,11 +86,3 @@ function _onPointerStart(handler, e) { } _handlePointer(handler, e); } - -function _onPointerMove(handler, e) { - // don't fire touch moves when mouse isn't down - if ((e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) && e.buttons === 0) { - return; - } - _handlePointer(handler, e); -} From 69f73ed1e8a83724c086ce206e7f9d7babc5d3dc Mon Sep 17 00:00:00 2001 From: johnd0e Date: Wed, 3 Nov 2021 19:31:05 +0300 Subject: [PATCH 181/306] Get rid of android legacy hacks (#7022) * Control.Layers: clean up (continue e287b5ec1531238aaf4c4e5f5bfee51b5a577954) * Control.Layers: stop relying on Browser `android` and `touch` properties - `android` is useless here, as there are a lot of non-android touch devices (including desktop ones) - `touch` is useless, as mouse can be used on touch-screen too Now these usecases are covered: - `mouseenter/leave` are handled on touch devices too - If Layers control created with {collapsed:false}, and than it collapsed explicitly [using .collapse() method], it's now possible to expand it back with click. * Control.LayersSpec.js: add test for toggle focus * Control.Layers: fix unexpected layer switch when expanding control on touch Most browsers produce compatibility mouseenter for touch event, but not all, so we listen for click also. The problem is that these compatibility events come all in single batch, so same touch induces expand and then immediate input switching. To avoid this we temporarily prevent click on layers section. Note: more straight-forward way would be relying on e.sourceCapabilities.firesTouchEvents, but atm it has rather low support: https://caniuse.com/#feat=mdn-api_inputdevicecapabilities_firestouchevents * Deprecate Browser.android23 property * Deprecate Browser.androidStock property * Remove legacy android workaround * Remove legacy android Chrome workaround * Deprecate Browser.android property As we do not rely on it anymore User agent sniffing is evil, and we should not support it 'just in case'. https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent * Doc: remove statement about Android legacy support --- docs/index.html | 1 - src/core/Browser.js | 6 +++--- src/layer/tile/GridLayer.js | 6 ------ src/layer/tile/TileLayer.js | 11 ++--------- src/map/handler/Map.Drag.js | 5 ++--- src/map/handler/Map.TouchZoom.js | 4 ++-- 6 files changed, 9 insertions(+), 24 deletions(-) diff --git a/docs/index.html b/docs/index.html index b527efa9b7b..22c11227be4 100644 --- a/docs/index.html +++ b/docs/index.html @@ -162,7 +162,6 @@

    Mobile

    • Safari for iOS 7+
    • -
    • Android browser 2.2+, 3.1+, 4+
    • Chrome for mobile
    • Firefox for mobile
    • IE10+ for Win8 devices
    • diff --git a/src/core/Browser.js b/src/core/Browser.js index a47fc034de2..c782314aedb 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -32,15 +32,15 @@ export var edge = 'msLaunchUri' in navigator && !('documentMode' in document); export var webkit = userAgentContains('webkit'); // @property android: Boolean -// `true` for any browser running on an Android platform. +// **Deprecated.** `true` for any browser running on an Android platform. export var android = userAgentContains('android'); -// @property android23: Boolean; `true` for browsers running on Android 2 or Android 3. +// @property android23: Boolean; **Deprecated.** `true` for browsers running on Android 2 or Android 3. export var android23 = userAgentContains('android 2') || userAgentContains('android 3'); /* See https://stackoverflow.com/a/17961266 for details on detecting stock Android */ var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10); // also matches AppleWebKit -// @property androidStock: Boolean; `true` for the Android stock browser (i.e. not Chrome) +// @property androidStock: Boolean; **Deprecated.** `true` for the Android stock browser (i.e. not Chrome) export var androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window); // @property opera: Boolean; `true` for the Opera browser diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index c6e1e84405f..91183d324e0 100755 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -796,12 +796,6 @@ export var GridLayer = Layer.extend({ if (Browser.ielt9 && this.options.opacity < 1) { DomUtil.setOpacity(tile, this.options.opacity); } - - // without this hack, tiles disappear after zoom on Chrome for Android - // https://github.com/Leaflet/Leaflet/issues/2078 - if (Browser.android && !Browser.android23) { - tile.style.WebkitBackfaceVisibility = 'hidden'; - } }, _addTile: function (coords, container) { diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 3fe92d4edd7..95c8dd41a2d 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -106,10 +106,7 @@ export var TileLayer = GridLayer.extend({ options.subdomains = options.subdomains.split(''); } - // for https://github.com/Leaflet/Leaflet/issues/137 - if (!Browser.android) { - this.on('tileunload', this._onTileRemove); - } + this.on('tileunload', this._onTileRemove); }, // @method setUrl(url: String, noRedraw?: Boolean): this @@ -255,11 +252,7 @@ export var TileLayer = GridLayer.extend({ if (!tile) { return; } // Cancels any pending http requests associated with the tile - // unless we're on Android's stock browser, - // see https://github.com/Leaflet/Leaflet/issues/137 - if (!Browser.androidStock) { - tile.el.setAttribute('src', Util.emptyImageUrl); - } + tile.el.setAttribute('src', Util.emptyImageUrl); return GridLayer.prototype._removeTile.call(this, key); }, diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index 69597bd7763..3971a6fd537 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -1,5 +1,4 @@ import {Map} from '../Map'; -import * as Browser from '../../core/Browser'; import {Handler} from '../../core/Handler'; import {Draggable} from '../../dom/Draggable'; import * as Util from '../../core/Util'; @@ -23,8 +22,8 @@ Map.mergeOptions({ // If enabled, panning of the map will have an inertia effect where // the map builds momentum while dragging and continues moving in // the same direction for some time. Feels especially nice on touch - // devices. Enabled by default unless running on old Android devices. - inertia: !Browser.android23, + // devices. Enabled by default. + inertia: true, // @option inertiaDeceleration: Number = 3000 // The rate with which the inertial movement slows down, in pixels/second². diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index ecbd0b1e152..74bc20add7d 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -17,8 +17,8 @@ Map.mergeOptions({ // Whether the map can be zoomed by touch-dragging with two fingers. If // passed `'center'`, it will zoom to the center of the view regardless of // where the touch events (fingers) were. Enabled for touch-capable web - // browsers except for old Androids. - touchZoom: Browser.touch && !Browser.android23, + // browsers. + touchZoom: Browser.touch, // @option bounceAtZoomLimits: Boolean = true // Set it to false if you don't want the map to zoom beyond min/max zoom From cc9f327b41d5a283af40beae195d196ca4089599 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Wed, 3 Nov 2021 20:07:54 +0300 Subject: [PATCH 182/306] Allow to prevent round-off errors, caused by formatNum (#7100) * GeoJSON.latLngToCoords: do not force default precision value Rely on default value defined in `formatNum` itself. Specify all related docs. Document `precision` argument of `latLngsToCoords` function. * Util.formatNum: allow to skip processing specifying `false` as precision This is most necessary for cases where `formatNum` is called indirectly, e.g. by GeoJSON functions. --- spec/suites/core/UtilSpec.js | 1 + src/core/Util.js | 11 +++++++---- src/layer/GeoJSON.js | 32 ++++++++++++++------------------ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/spec/suites/core/UtilSpec.js b/spec/suites/core/UtilSpec.js index 80a4063795a..caac6ad71ae 100644 --- a/spec/suites/core/UtilSpec.js +++ b/spec/suites/core/UtilSpec.js @@ -85,6 +85,7 @@ describe('Util', function () { expect(L.Util.formatNum(13.12325555, 3)).to.eql(13.123); expect(L.Util.formatNum(13.12325555)).to.eql(13.123256); expect(L.Util.formatNum(13.12325555, 0)).to.eql(13); + expect(L.Util.formatNum(13.12325555, false)).to.eql(13.12325555); expect(isNaN(L.Util.formatNum(-7.993322e-10))).to.eql(false); }); }); diff --git a/src/core/Util.js b/src/core/Util.js index fa97caf01d6..2d821998fe1 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -108,10 +108,13 @@ export function wrapNum(x, range, includeMax) { // Returns a function which always returns `false`. export function falseFn() { return false; } -// @function formatNum(num: Number, digits?: Number): Number -// Returns the number `num` rounded to `digits` decimals, or to 6 decimals by default. -export function formatNum(num, digits) { - var pow = Math.pow(10, (digits === undefined ? 6 : digits)); +// @function formatNum(num: Number, precision?: Number|false): Number +// Returns the number `num` rounded with specified `precision`. +// The default `precision` value is 6 decimal places. +// `false` can be passed to skip any processing (can be useful to avoid round-off errors). +export function formatNum(num, precision) { + if (precision === false) { return num; } + var pow = Math.pow(10, precision === undefined ? 6 : precision); return Math.round(num * pow) / pow; } diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index c5f130ab064..9e96fc2adca 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -253,18 +253,19 @@ export function coordsToLatLngs(coords, levelsDeep, _coordsToLatLng) { return latlngs; } -// @function latLngToCoords(latlng: LatLng, precision?: Number): Array +// @function latLngToCoords(latlng: LatLng, precision?: Number|false): Array // Reverse of [`coordsToLatLng`](#geojson-coordstolatlng) +// Coordinates values are rounded with [`formatNum`](#util-formatnum) function. export function latLngToCoords(latlng, precision) { - precision = typeof precision === 'number' ? precision : 6; return latlng.alt !== undefined ? [Util.formatNum(latlng.lng, precision), Util.formatNum(latlng.lat, precision), Util.formatNum(latlng.alt, precision)] : [Util.formatNum(latlng.lng, precision), Util.formatNum(latlng.lat, precision)]; } -// @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array +// @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean, precision?: Number|false): Array // Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs) // `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default. +// Coordinates values are rounded with [`formatNum`](#util-formatnum) function. export function latLngsToCoords(latlngs, levelsDeep, closed, precision) { var coords = []; @@ -312,25 +313,22 @@ var PointToGeoJSON = { // @namespace Marker // @section Other methods -// @method toGeoJSON(precision?: Number): Object -// `precision` is the number of decimal places for coordinates. -// The default value is 6 places. +// @method toGeoJSON(precision?: Number|false): Object +// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`. // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature). Marker.include(PointToGeoJSON); // @namespace CircleMarker -// @method toGeoJSON(precision?: Number): Object -// `precision` is the number of decimal places for coordinates. -// The default value is 6 places. +// @method toGeoJSON(precision?: Number|false): Object +// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`. // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature). Circle.include(PointToGeoJSON); CircleMarker.include(PointToGeoJSON); // @namespace Polyline -// @method toGeoJSON(precision?: Number): Object -// `precision` is the number of decimal places for coordinates. -// The default value is 6 places. +// @method toGeoJSON(precision?: Number|false): Object +// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`. // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature). Polyline.include({ toGeoJSON: function (precision) { @@ -346,9 +344,8 @@ Polyline.include({ }); // @namespace Polygon -// @method toGeoJSON(precision?: Number): Object -// `precision` is the number of decimal places for coordinates. -// The default value is 6 places. +// @method toGeoJSON(precision?: Number|false): Object +// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`. // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature). Polygon.include({ toGeoJSON: function (precision) { @@ -384,9 +381,8 @@ LayerGroup.include({ }); }, - // @method toGeoJSON(precision?: Number): Object - // `precision` is the number of decimal places for coordinates. - // The default value is 6 places. + // @method toGeoJSON(precision?: Number|false): Object + // Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`. // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `FeatureCollection`, `GeometryCollection`, or `MultiPoint`). toGeoJSON: function (precision) { From 7b15104f2fc5e16fb23d5e13468c5df558cbf006 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Wed, 3 Nov 2021 20:39:42 +0300 Subject: [PATCH 183/306] Avoid modifying source props object in Class.extend (#6766) * Class.extend: do not modify source props.options `extend` method had side effects: - (if parent prototype has options) props.options got rewritten - (if parent does not have options) props.options object was used directly that behavior was undesirable, as it prevented to reuse props. E.g. this case had unexpected behavior: var props = { // ... // some useful props and methods } var MyLine = L.Polyline.extend(props); var MyGon = L.Polygon.extend(props); var line = new MyLine([]); var gon = new MyGon([]); console.log(line.options.fill, gon.options.fill); // Output expected: false, true // Output before fix: false, false * Class.extend: do not modify source props object Previously 'statics' and 'includes' were removed, that prevented source props reusing --- spec/suites/core/ClassSpec.js | 41 +++++++++++++++++++++++++++++++++-- src/core/Class.js | 13 ++++++----- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/spec/suites/core/ClassSpec.js b/spec/suites/core/ClassSpec.js index 62f45c4e28b..cf489bb10c8 100644 --- a/spec/suites/core/ClassSpec.js +++ b/spec/suites/core/ClassSpec.js @@ -2,6 +2,7 @@ describe("Class", function () { describe("#extend", function () { var Klass, + props, constructor, method; @@ -9,14 +10,15 @@ describe("Class", function () { constructor = sinon.spy(); method = sinon.spy(); - Klass = L.Class.extend({ + props = { statics: {bla: 1}, includes: {mixin: true}, initialize: constructor, foo: 5, bar: method - }); + }; + Klass = L.Class.extend(props); }); it("creates a class with the given constructor & properties", function () { @@ -46,10 +48,25 @@ describe("Class", function () { expect(method.called).to.be.ok(); }); + it("does not modify source props object", function () { + expect(props).to.eql({ + statics: {bla: 1}, + includes: {mixin: true}, + + initialize: constructor, + foo: 5, + bar: method + }); + }); + it("supports static properties", function () { expect(Klass.bla).to.eql(1); }); + it("does not merge 'statics' property itself", function () { + expect('statics' in Klass.prototype).to.not.be.ok(); + }); + it("inherits parent static properties", function () { var Klass2 = Klass.extend({}); @@ -67,6 +84,10 @@ describe("Class", function () { expect(a.mixin).to.be.ok(); }); + it("does not merge 'includes' property itself", function () { + expect('includes' in Klass.prototype).to.not.be.ok(); + }); + it("includes multiple mixins", function () { var Klass2 = L.Class.extend({ includes: [{mixin: true}, {mixin2: true}] @@ -117,6 +138,22 @@ describe("Class", function () { expect(K2.prototype.options.foo).to.eql('bar'); }); + it("does not reuse original props.options", function () { + var props = {options: {}}; + var K = L.Class.extend(props); + + expect(K.prototype.options).not.to.be(props.options); + }); + + it("does not replace source props.options object", function () { + var K1 = L.Class.extend({options: {}}); + var opts = {}; + var props = {options: opts}; + K1.extend(props); + + expect(props.options).to.be(opts); + }); + it("adds constructor hooks correctly", function () { var spy1 = sinon.spy(); diff --git a/src/core/Class.js b/src/core/Class.js index f60bda9e13e..12f8e49eb71 100644 --- a/src/core/Class.js +++ b/src/core/Class.js @@ -43,24 +43,25 @@ Class.extend = function (props) { // mix static properties into the class if (props.statics) { Util.extend(NewClass, props.statics); - delete props.statics; } // mix includes into the prototype if (props.includes) { checkDeprecatedMixinEvents(props.includes); Util.extend.apply(null, [proto].concat(props.includes)); - delete props.includes; } + // mix given properties into the prototype + Util.extend(proto, props); + delete proto.statics; + delete proto.includes; + // merge options if (proto.options) { - props.options = Util.extend(Util.create(proto.options), props.options); + proto.options = parentProto.options ? Util.create(parentProto.options) : {}; + Util.extend(proto.options, props.options); } - // mix given properties into the prototype - Util.extend(proto, props); - proto._initHooks = []; // add method for calling all hooks From bcc6730a8bf35a15775f1b6f38c1d4b608c76d8c Mon Sep 17 00:00:00 2001 From: rala Date: Wed, 3 Nov 2021 20:10:14 +0100 Subject: [PATCH 184/306] cleanup marker.svg (#7600) Co-authored-by: Raphael Lackner --- src/images/marker.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/images/marker.svg b/src/images/marker.svg index d9ee408c783..29faabb7a1e 100644 --- a/src/images/marker.svg +++ b/src/images/marker.svg @@ -1 +1 @@ - Use this one. Select it and the area around with box select. should be exactly 25x41 at 90dpi How to do the inset border: Delete the existing inset border. Select the background, duplicate. Path, Dynamic offset. Fill: None, Stroke Paint: RGBA #ffffff1f Zoom down to the top and grab the diamond, drag it down and fiddle it untill it looks in line with the main color layers border. \ No newline at end of file + From 541a0f1ec15227ad9a39b746473c4383b3740173 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Thu, 4 Nov 2021 15:17:39 +0300 Subject: [PATCH 185/306] Tests: remove non-functional Firefox setting (#7736) dom.w3c_pointer_events.enabled does not exist in recent Firefox Anyway, it is not really useful after 0ae68f4658cb1cd85e6e0c67a24b12e5e6282e22 --- .github/workflows/main.yml | 1 - spec/karma.conf.js | 9 --------- 2 files changed, 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3befe2e6d11..e75db8abb7e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -66,7 +66,6 @@ jobs: browser: [ Chrome1280x1024, - FirefoxPointer, FirefoxTouch, FirefoxPointerTouch, ] diff --git a/spec/karma.conf.js b/spec/karma.conf.js index c469f76a75b..35c8502b1ee 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -102,24 +102,15 @@ module.exports = function (config) { // https://github.com/Leaflet/Leaflet/issues/7113#issuecomment-619528577 flags: ['--window-size=1280,1024'] }, - 'FirefoxPointer': { - base: 'FirefoxHeadless', - prefs: { - 'dom.w3c_pointer_events.enabled': true, - 'dom.w3c_touch_events.enabled': 0 - } - }, 'FirefoxTouch': { base: 'FirefoxHeadless', prefs: { - 'dom.w3c_pointer_events.enabled': false, 'dom.w3c_touch_events.enabled': 1 } }, 'FirefoxPointerTouch': { base: 'FirefoxHeadless', prefs: { - 'dom.w3c_pointer_events.enabled': true, 'dom.w3c_touch_events.enabled': 1 } }, From 9e7bf9ec6b4442dd6142d8bcd566c3e6f568420a Mon Sep 17 00:00:00 2001 From: Jonatan Heyman Date: Thu, 4 Nov 2021 13:54:08 +0100 Subject: [PATCH 186/306] Add Leaflet.CenterMarker to list of plugins (#7312) --- docs/plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 5e4dd3f4eb4..298784ee14c 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1921,6 +1921,16 @@ These plugins provide new markers or news ways of converting abstract data into R.A. Porter + + + Leaflet.CenterMarker + + Marker that is kept fixed to the center of the map when the map is panned by dragging. + Can be seen in action on What is my adress? + + Jonatan Heyman + + L.Donut From 7029c2c7c906e9153e50dc3ef67bd562398c68ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Nov 2021 15:13:39 +0200 Subject: [PATCH 187/306] Bump karma from 6.3.6 to 6.3.7 (#7737) Bumps [karma](https://github.com/karma-runner/karma) from 6.3.6 to 6.3.7. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v6.3.6...v6.3.7) --- updated-dependencies: - dependency-name: karma dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index baa2b3cc63c..8027f0ba1a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1671,9 +1671,9 @@ "dev": true }, "node_modules/karma": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.6.tgz", - "integrity": "sha512-xsiu3D6AjCv6Uq0YKXJgC6TvXX2WloQ5+XtHXmC1lwiLVG617DDV3W2DdM4BxCMKHlmz6l3qESZHFQGHAKvrew==", + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.7.tgz", + "integrity": "sha512-EEkswZhOx3EFt1ELlVECeOXHONbHSGw6fkbeMxvCSkLD77X38Kb1d/Oup2Re9ep/tSoa1He3YIBf3Hp+9EsKtg==", "dev": true, "dependencies": { "body-parser": "^1.19.0", @@ -4482,9 +4482,9 @@ "dev": true }, "karma": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.6.tgz", - "integrity": "sha512-xsiu3D6AjCv6Uq0YKXJgC6TvXX2WloQ5+XtHXmC1lwiLVG617DDV3W2DdM4BxCMKHlmz6l3qESZHFQGHAKvrew==", + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.7.tgz", + "integrity": "sha512-EEkswZhOx3EFt1ELlVECeOXHONbHSGw6fkbeMxvCSkLD77X38Kb1d/Oup2Re9ep/tSoa1He3YIBf3Hp+9EsKtg==", "dev": true, "requires": { "body-parser": "^1.19.0", From 5d4307ec45a74cbc093ec43a03830eda917e9a63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Nov 2021 15:14:06 +0200 Subject: [PATCH 188/306] Bump karma-firefox-launcher from 2.1.1 to 2.1.2 (#7738) Bumps [karma-firefox-launcher](https://github.com/karma-runner/karma-firefox-launcher) from 2.1.1 to 2.1.2. - [Release notes](https://github.com/karma-runner/karma-firefox-launcher/releases) - [Changelog](https://github.com/karma-runner/karma-firefox-launcher/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma-firefox-launcher/compare/v2.1.1...v2.1.2) --- updated-dependencies: - dependency-name: karma-firefox-launcher dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8027f0ba1a2..0996a70ec87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1753,9 +1753,9 @@ } }, "node_modules/karma-firefox-launcher": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.1.tgz", - "integrity": "sha512-VzDMgPseXak9DtfyE1O5bB2BwsMy1zzO1kUxVW1rP0yhC4tDNJ0p3JoFdzvrK4QqVzdqUMa9Rx9YzkdFp8hz3Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz", + "integrity": "sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==", "dev": true, "dependencies": { "is-wsl": "^2.2.0", @@ -4559,9 +4559,9 @@ } }, "karma-firefox-launcher": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.1.tgz", - "integrity": "sha512-VzDMgPseXak9DtfyE1O5bB2BwsMy1zzO1kUxVW1rP0yhC4tDNJ0p3JoFdzvrK4QqVzdqUMa9Rx9YzkdFp8hz3Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz", + "integrity": "sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==", "dev": true, "requires": { "is-wsl": "^2.2.0", From d17ac0c76f6bf63adbb6eb39d72f47844f483b97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Nov 2021 15:14:38 +0200 Subject: [PATCH 189/306] Bump sinon from 11.1.2 to 12.0.0 (#7739) Bumps [sinon](https://github.com/sinonjs/sinon) from 11.1.2 to 12.0.0. - [Release notes](https://github.com/sinonjs/sinon/releases) - [Changelog](https://github.com/sinonjs/sinon/blob/master/docs/changelog.md) - [Commits](https://github.com/sinonjs/sinon/compare/v11.1.2...v12.0.0) --- updated-dependencies: - dependency-name: sinon dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 38 +++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0996a70ec87..52960a74a34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "prosthetic-hand": "^1.3.1", "rollup": "^2.59.0", "rollup-plugin-git-version": "^0.3.1", - "sinon": "^11.1.2", + "sinon": "^12.0.0", "ssri": "^8.0.1", "uglify-js": "^3.14.2" } @@ -2694,13 +2694,13 @@ } }, "node_modules/sinon": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", - "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.0.tgz", + "integrity": "sha512-wVMT1jvgyLroQu+tWTa2XJu2g5SoVaEBhdwGPuzmWlRvZNSG+pcEb8HEmsxTdoPjUL58pJFQ3+oFRWrhC4JKHw==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/fake-timers": "^8.1.0", "@sinonjs/samsam": "^6.0.2", "diff": "^5.0.0", "nise": "^5.1.0", @@ -2711,6 +2711,15 @@ "url": "https://opencollective.com/sinon" } }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, "node_modules/socket.io": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.1.tgz", @@ -5269,17 +5278,28 @@ } }, "sinon": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", - "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.0.tgz", + "integrity": "sha512-wVMT1jvgyLroQu+tWTa2XJu2g5SoVaEBhdwGPuzmWlRvZNSG+pcEb8HEmsxTdoPjUL58pJFQ3+oFRWrhC4JKHw==", "dev": true, "requires": { "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/fake-timers": "^8.1.0", "@sinonjs/samsam": "^6.0.2", "diff": "^5.0.0", "nise": "^5.1.0", "supports-color": "^7.2.0" + }, + "dependencies": { + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } } }, "socket.io": { diff --git a/package.json b/package.json index bd59187db5d..ba70d03bc94 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "prosthetic-hand": "^1.3.1", "rollup": "^2.59.0", "rollup-plugin-git-version": "^0.3.1", - "sinon": "^11.1.2", + "sinon": "^12.0.0", "ssri": "^8.0.1", "uglify-js": "^3.14.2" }, From 9e4309984d2281f2308107b0f25584fc669bbfe9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Nov 2021 13:10:48 +0000 Subject: [PATCH 190/306] Bump uglify-js from 3.14.2 to 3.14.3 Bumps [uglify-js](https://github.com/mishoo/UglifyJS) from 3.14.2 to 3.14.3. - [Release notes](https://github.com/mishoo/UglifyJS/releases) - [Commits](https://github.com/mishoo/UglifyJS/compare/v3.14.2...v3.14.3) --- updated-dependencies: - dependency-name: uglify-js dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 52960a74a34..f902f5562e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2977,9 +2977,9 @@ "dev": true }, "node_modules/uglify-js": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", - "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", + "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", "dev": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -5488,9 +5488,9 @@ "dev": true }, "uglify-js": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", - "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", + "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", "dev": true }, "universalify": { From 38c330defb2baf76514b7d199c6b000a61cd9653 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 4 Nov 2021 15:28:09 +0200 Subject: [PATCH 191/306] simplify workflow config --- .github/workflows/main.yml | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e75db8abb7e..86011f28f95 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -64,11 +64,9 @@ jobs: fail-fast: false matrix: browser: - [ - Chrome1280x1024, - FirefoxTouch, - FirefoxPointerTouch, - ] + - Chrome1280x1024 + - FirefoxTouch + - FirefoxPointerTouch steps: - name: Restore setup uses: actions/cache@v2 @@ -84,24 +82,9 @@ jobs: - name: Run tests on ${{ matrix.browser }} run: npm test -- --browsers ${{ matrix.browser }} - check-secrets: - needs: [setup] - runs-on: ubuntu-latest - if: github.repository_owner == 'Leaflet' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')) - outputs: - ok: ${{ steps.ok.outputs.defined }} - steps: - - id: ok - env: - AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - if: env.AWS_S3_BUCKET && env.AWS_ACCESS_KEY_ID && env.AWS_SECRET_ACCESS_KEY - run: echo "::set-output name=defined::true" - deploy: - needs: [check-secrets] - if: needs.check-secrets.outputs.ok == 'true' + needs: setup + if: github.repository_owner == 'Leaflet' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')) runs-on: ubuntu-latest steps: - name: Restore setup @@ -116,9 +99,7 @@ jobs: - name: Determine directory for artifacts id: artifacts-directory - run: | - VERSION=$(git tag --points-at HEAD) - echo "::set-output name=path::content/leaflet/${VERSION:-master}" + run: VERSION=$(git tag --points-at HEAD) echo "::set-output name=path::content/leaflet/${VERSION:-master}" - name: Deploy artifacts uses: jakejarvis/s3-sync-action@v0.5.1 From 89f99708b0371424be1a718c2cac945172146340 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Thu, 4 Nov 2021 17:27:34 +0300 Subject: [PATCH 192/306] Fixup #7736 (#7742) --- .github/workflows/main.yml | 2 +- spec/karma.conf.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 86011f28f95..0ecef406f2b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -66,7 +66,7 @@ jobs: browser: - Chrome1280x1024 - FirefoxTouch - - FirefoxPointerTouch + - FirefoxNoTouch steps: - name: Restore setup uses: actions/cache@v2 diff --git a/spec/karma.conf.js b/spec/karma.conf.js index 35c8502b1ee..3381dfc2db8 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -108,10 +108,10 @@ module.exports = function (config) { 'dom.w3c_touch_events.enabled': 1 } }, - 'FirefoxPointerTouch': { + 'FirefoxNoTouch': { base: 'FirefoxHeadless', prefs: { - 'dom.w3c_touch_events.enabled': 1 + 'dom.w3c_touch_events.enabled': 0 } }, IE8: { // not working in IE 11!! From 1703e9354ecc7245a3da889b28f517a94a6ee8d3 Mon Sep 17 00:00:00 2001 From: Jon Koops Date: Thu, 4 Nov 2021 19:10:12 +0100 Subject: [PATCH 193/306] Fix indentation issues in Karma config (#7743) --- spec/karma.conf.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/spec/karma.conf.js b/spec/karma.conf.js index 3381dfc2db8..9170cc39f37 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -104,15 +104,15 @@ module.exports = function (config) { }, 'FirefoxTouch': { base: 'FirefoxHeadless', - prefs: { + prefs: { 'dom.w3c_touch_events.enabled': 1 - } + } }, 'FirefoxNoTouch': { base: 'FirefoxHeadless', - prefs: { + prefs: { 'dom.w3c_touch_events.enabled': 0 - } + } }, IE8: { // not working in IE 11!! base: 'IE', @@ -138,9 +138,9 @@ module.exports = function (config) { singleRun: true, client: { - mocha: { - forbidOnly: process.env.CI || false - } + mocha: { + forbidOnly: process.env.CI || false + } } }); }; From 7f47b29b31266329556f59ec5200ed0a7cf8443d Mon Sep 17 00:00:00 2001 From: Adam Mertel Date: Fri, 5 Nov 2021 08:19:36 +0100 Subject: [PATCH 194/306] Plugins.md - Leaflet.Control.Select added to the list of plugins (#7050) * Plugins.md - Leaflet.Control.Select added to the list of plugins https://github.com/adammertel/Leaflet.Control.Select * Restore tabs in plugins.md * Restore tabs in plugins.md * Update tabs * Revert "Update tabs" This reverts commit 150bfda18ac8dce75ffa232e16efbe346f98ff40. --- docs/plugins.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 298784ee14c..630671949dc 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -4212,6 +4212,18 @@ Buttons, sliders, toolbars, sidebars, and panels. JJ Jin + + + Leaflet.Control.Select + + + + Customisable menu-style control. See demo. + + + Adam Mertel + + From 36d4858bf3e80dd77a8486664f59bf74d9509e1b Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 5 Nov 2021 13:28:00 +0300 Subject: [PATCH 195/306] Evented: protect from common errors (+tests) (#7518) * Evented:_off: get rid of redundant condition * Evented:_off: minor optimization of case when remove happens in fire * Evented:_off: prevent removing all listeners when false fn argument specified (by mistake) * Evented:_on,_off: ignore non-function listeners passed * Evented:_on,_off: throw on wrong types passed * Evented: console.warn on common errors --- spec/suites/core/EventsSpec.js | 32 +++++++++++++++++++ src/core/Events.js | 58 ++++++++++++++++++++++------------ 2 files changed, 69 insertions(+), 21 deletions(-) diff --git a/spec/suites/core/EventsSpec.js b/spec/suites/core/EventsSpec.js index d29e560c033..722b02495c0 100644 --- a/spec/suites/core/EventsSpec.js +++ b/spec/suites/core/EventsSpec.js @@ -378,6 +378,38 @@ describe('Events', function () { }); describe('#on, #off & #fire', function () { + it('does not remove all listeners when any fn argument specified', function () { + var obj = new L.Evented(); + obj.on('test', L.Util.falseFn); + obj.off('test', undefined); + obj.off({test: undefined}); + + expect(obj.listens('test')).to.be(true); + }); + + it('ignores non-function listeners passed', function () { + var obj = new L.Evented(); + var off = obj.off.bind(obj); + ['string', {}, [], true, false, undefined].forEach(function (fn) { + obj.on('test', fn); + expect(obj.listens('test')).to.be(false); + expect(off).withArgs('test', fn).to.not.throwException(); + }); + }); + + it('throws with wrong types passed', function () { + var obj = new L.Evented(); + var on = obj.on.bind(obj); + var off = obj.off.bind(obj); + // todo? make it throw with [] + [true, false, undefined, 1].forEach(function (type) { + expect(on).withArgs(type, L.Util.falseFn).to.throwException(); + expect(off).withArgs(type, L.Util.falseFn).to.throwException(); + }); + + // todo? make `fire` and `listen` to throw with wrong type + }); + it('works like #addEventListener && #removeEventListener', function () { var obj = new L.Evented(), spy = sinon.spy(); diff --git a/src/core/Events.js b/src/core/Events.js index d2a18bb6a93..661a3c720cc 100644 --- a/src/core/Events.js +++ b/src/core/Events.js @@ -69,7 +69,7 @@ export var Events = { */ off: function (types, fn, context) { - if (!types) { + if (!arguments.length) { // clear all listeners if called without arguments delete this._events; @@ -81,8 +81,13 @@ export var Events = { } else { types = Util.splitWords(types); + var removeAll = arguments.length === 1; for (var i = 0, len = types.length; i < len; i++) { - this._off(types[i], fn, context); + if (removeAll) { + this._off(types[i]); + } else { + this._off(types[i], fn, context); + } } } @@ -91,6 +96,10 @@ export var Events = { // attach listener (without syntactic sugar now) _on: function (type, fn, context) { + if (typeof fn !== 'function') { + console.warn('wrong listener type: ' + typeof fn); + return; + } this._events = this._events || {}; /* get/init listeners for type */ @@ -130,10 +139,13 @@ export var Events = { return; } - if (!fn) { - // Set all removed listeners to noop so they are not called if remove happens in fire - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].fn = Util.falseFn; + if (arguments.length === 1) { // remove all + if (this._firingCount) { + // Set all removed listeners to noop + // so they are not called if remove happens in fire + for (i = 0, len = listeners.length; i < len; i++) { + listeners[i].fn = Util.falseFn; + } } // clear all listeners for a type if function isn't specified delete this._events[type]; @@ -144,26 +156,27 @@ export var Events = { context = undefined; } - if (listeners) { - - // find fn and remove it - for (i = 0, len = listeners.length; i < len; i++) { - var l = listeners[i]; - if (l.ctx !== context) { continue; } - if (l.fn === fn) { - + if (typeof fn !== 'function') { + console.warn('wrong listener type: ' + typeof fn); + return; + } + // find fn and remove it + for (i = 0, len = listeners.length; i < len; i++) { + var l = listeners[i]; + if (l.ctx !== context) { continue; } + if (l.fn === fn) { + if (this._firingCount) { // set the removed listener to noop so that's not called if remove happens in fire l.fn = Util.falseFn; - if (this._firingCount) { - /* copy array in case events are being fired */ - this._events[type] = listeners = listeners.slice(); - } - listeners.splice(i, 1); - - return; + /* copy array in case events are being fired */ + this._events[type] = listeners = listeners.slice(); } + listeners.splice(i, 1); + + return; } + console.warn('listener not found'); } }, @@ -205,6 +218,9 @@ export var Events = { // @method listens(type: String): Boolean // Returns `true` if a particular event type has any listeners attached to it. listens: function (type, propagate) { + if (typeof type !== 'string') { + console.warn('"string" type argument expected'); + } var listeners = this._events && this._events[type]; if (listeners && listeners.length) { return true; } From 9e03bc5f597e975867bb1655b0e6c0629b041a28 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 5 Nov 2021 15:18:25 +0300 Subject: [PATCH 196/306] Restore DomEvent.off(el) functionality when calling with one arg (#7125) --- spec/suites/dom/DomEventSpec.js | 98 +++++++++++++++++++++++++++++++++ src/dom/DomEvent.js | 54 ++++++++++++------ 2 files changed, 136 insertions(+), 16 deletions(-) diff --git a/spec/suites/dom/DomEventSpec.js b/spec/suites/dom/DomEventSpec.js index 55296134bf0..48a459af2f3 100644 --- a/spec/suites/dom/DomEventSpec.js +++ b/spec/suites/dom/DomEventSpec.js @@ -11,7 +11,36 @@ describe('DomEvent', function () { document.body.removeChild(el); }); + describe('#arguments check', function () { + it('throws when el is not HTMLElement', function () { + expect(L.DomEvent.on).withArgs({}, 'click', L.Util.falseFn) + .to.throwException(); + expect(L.DomEvent.disableScrollPropagation).withArgs({}) + .to.throwException(); + expect(L.DomEvent.disableClickPropagation).withArgs({}) + .to.throwException(); + expect(L.DomEvent.getMousePosition).withArgs({clientX: 0, clientY: 0}, {}) + .to.throwException(); + // .off and .isExternalTarget do not throw atm + }); + }); + describe('#on (addListener)', function () { + it('throws when types/fn are undefined/null/false', function () { + expect(L.DomEvent.on).withArgs(el, undefined, L.Util.falseFn) + .to.throwException(); + expect(L.DomEvent.on).withArgs(el, null, L.Util.falseFn) + .to.throwException(); + expect(L.DomEvent.on).withArgs(el, false, L.Util.falseFn) + .to.throwException(); + expect(L.DomEvent.on).withArgs(el, 'click', undefined) + .to.throwException(); + expect(L.DomEvent.on).withArgs(el, 'click', null) + .to.throwException(); + expect(L.DomEvent.on).withArgs(el, 'click', false) + .to.throwException(); + }); + it('adds a listener and calls it on event', function () { var listener2 = sinon.spy(); L.DomEvent.on(el, 'click', listener); @@ -82,6 +111,20 @@ describe('DomEvent', function () { expect(listener.notCalled).to.be.ok(); }); + it('only removes the specified listener', function () { + var listenerA = sinon.spy(), + listenerB = sinon.spy(); + + L.DomEvent.on(el, 'click', listenerA); + L.DomEvent.on(el, 'click', listenerB); + L.DomEvent.off(el, 'click', listenerA); + + happen.click(el); + + expect(listenerA.called).to.not.be.ok(); + expect(listenerB.called).to.be.ok(); + }); + it('removes a previously added listener when passed an event map', function () { var listener = sinon.spy(), events = {click: listener}; @@ -164,6 +207,61 @@ describe('DomEvent', function () { sinon.assert.called(listener); }); + it('removes all listeners when only passed the HTMLElement', function () { + var listenerA = sinon.spy(), + listenerB = sinon.spy(); + + L.DomEvent.on(el, 'click', listenerA); + L.DomEvent.on(el, 'click', listenerB, {}); + L.DomEvent.off(el); + + happen.click(el); + + expect(listenerA.called).to.not.be.ok(); + expect(listenerB.called).to.not.be.ok(); + }); + + it('only removes specified listeners type', function () { + var listenerClick = sinon.spy(), + listenerDblClick = sinon.spy(); + + L.DomEvent.on(el, 'click', listenerClick); + L.DomEvent.on(el, 'dblclick', listenerDblClick); + L.DomEvent.off(el, 'click'); + happen.click(el); + happen.dblclick(el); + + sinon.assert.notCalled(listenerClick); + sinon.assert.called(listenerDblClick); + }); + + it('throws when types/fn are undefined/null/false', function () { + expect(L.DomEvent.off).withArgs(el, undefined) + .to.throwException(); + expect(L.DomEvent.off).withArgs(el, null) + .to.throwException(); + expect(L.DomEvent.off).withArgs(el, false) + .to.throwException(); + + expect(L.DomEvent.off).withArgs(el, 'click', undefined) + .to.throwException(); + expect(L.DomEvent.off).withArgs(el, 'click', null) + .to.throwException(); + expect(L.DomEvent.off).withArgs(el, 'click', false) + .to.throwException(); + }); + + it('removes listener when passed an event map', function () { + var listener = sinon.spy(); + + L.DomEvent.on(el, 'click', listener); + L.DomEvent.off(el, {'click': listener}); + + happen.click(el); + + expect(listener.called).to.not.be.ok(); + }); + it('is chainable', function () { var res = L.DomEvent.off(el, 'click', function () {}); diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 0537a270510..5f7d894529e 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -23,7 +23,7 @@ import {getScale} from './DomUtil'; // Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` export function on(obj, types, fn, context) { - if (typeof types === 'object') { + if (types && typeof types === 'object') { for (var type in types) { addOne(obj, type, types[type], fn); } @@ -48,28 +48,51 @@ var eventsKey = '_leaflet_events'; // @alternative // @function off(el: HTMLElement, eventMap: Object, context?: Object): this // Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` + +// @alternative +// @function off(el: HTMLElement, types: String): this +// Removes all previously added listeners of given types. + +// @alternative +// @function off(el: HTMLElement): this +// Removes all previously added listeners from given HTMLElement export function off(obj, types, fn, context) { - if (typeof types === 'object') { + if (arguments.length === 1) { + batchRemove(obj); + delete obj[eventsKey]; + + } else if (types && typeof types === 'object') { for (var type in types) { removeOne(obj, type, types[type], fn); } - } else if (types) { - types = Util.splitWords(types); - for (var i = 0, len = types.length; i < len; i++) { - removeOne(obj, types[i], fn, context); - } } else { - for (var j in obj[eventsKey]) { - removeOne(obj, j, obj[eventsKey][j]); + types = Util.splitWords(types); + + if (arguments.length === 2) { + batchRemove(obj, function (type) { + return Util.indexOf(types, type) !== -1; + }); + } else { + for (var i = 0, len = types.length; i < len; i++) { + removeOne(obj, types[i], fn, context); + } } - delete obj[eventsKey]; } return this; } +function batchRemove(obj, filterFn) { + for (var id in obj[eventsKey]) { + var type = id.split(/\d/)[0]; + if (!filterFn || filterFn(type)) { + removeOne(obj, type, null, null, id); + } + } +} + var mouseSubst = { mouseenter: 'mouseover', mouseleave: 'mouseout', @@ -112,7 +135,7 @@ function addOne(obj, type, fn, context) { obj.addEventListener(type, originalHandler, false); } - } else if ('attachEvent' in obj) { + } else { obj.attachEvent('on' + type, handler); } @@ -120,10 +143,9 @@ function addOne(obj, type, fn, context) { obj[eventsKey][id] = handler; } -function removeOne(obj, type, fn, context) { - - var id = type + Util.stamp(fn) + (context ? '_' + Util.stamp(context) : ''), - handler = obj[eventsKey] && obj[eventsKey][id]; +function removeOne(obj, type, fn, context, id) { + id = id || type + Util.stamp(fn) + (context ? '_' + Util.stamp(context) : ''); + var handler = obj[eventsKey] && obj[eventsKey][id]; if (!handler) { return this; } @@ -137,7 +159,7 @@ function removeOne(obj, type, fn, context) { obj.removeEventListener(mouseSubst[type] || type, handler, false); - } else if ('detachEvent' in obj) { + } else { obj.detachEvent('on' + type, handler); } From 5b9458e82ec61b08cae90a57765b9514e8964b86 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 5 Nov 2021 15:29:35 +0300 Subject: [PATCH 197/306] Change undefined argument handling in Layer/hasLayer() and LayerGroup/hasLayer() (#6999) undefined/null/false are not considered as special case anymore, `layer` argument is always required, as per docs. Previous excessive tolerance may lead to real errors get masked. --- spec/suites/layer/LayerGroupSpec.js | 12 ++++++++---- spec/suites/map/MapSpec.js | 13 +++++++++---- src/layer/Layer.js | 2 +- src/layer/LayerGroup.js | 1 - 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/spec/suites/layer/LayerGroupSpec.js b/spec/suites/layer/LayerGroupSpec.js index 3767e4b488a..2dba44f3619 100644 --- a/spec/suites/layer/LayerGroupSpec.js +++ b/spec/suites/layer/LayerGroupSpec.js @@ -1,10 +1,14 @@ describe('LayerGroup', function () { describe("#hasLayer", function () { - it("returns false when passed undefined, null, or false", function () { + it("throws when called without proper argument", function () { var lg = L.layerGroup(); - expect(lg.hasLayer(undefined)).to.equal(false); - expect(lg.hasLayer(null)).to.equal(false); - expect(lg.hasLayer(false)).to.equal(false); + var hasLayer = L.Util.bind(lg.hasLayer, lg); + expect(hasLayer).withArgs(new L.Layer()).to.not.throwException(); // control case + + expect(hasLayer).withArgs(undefined).to.throwException(); + expect(hasLayer).withArgs(null).to.throwException(); + expect(hasLayer).withArgs(false).to.throwException(); + expect(hasLayer).to.throwException(); }); }); diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 678640987bb..cf7b2dba83b 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -357,12 +357,17 @@ describe("Map", function () { }); describe("#hasLayer", function () { - it("returns false when passed undefined, null, or false", function () { + it("throws when called without proper argument", function () { var map = L.map(document.createElement("div")); + var hasLayer = L.Util.bind(map.hasLayer, map); + expect(hasLayer).withArgs(new L.Layer()).to.not.throwException(); // control case + + expect(hasLayer).withArgs(undefined).to.throwException(); + expect(hasLayer).withArgs(null).to.throwException(); + expect(hasLayer).withArgs(false).to.throwException(); + expect(hasLayer).to.throwException(); + map.remove(); // clean up - expect(map.hasLayer(undefined)).to.equal(false); - expect(map.hasLayer(null)).to.equal(false); - expect(map.hasLayer(false)).to.equal(false); }); }); diff --git a/src/layer/Layer.js b/src/layer/Layer.js index c6285a9c057..8d4df864cb6 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -208,7 +208,7 @@ Map.include({ // @method hasLayer(layer: Layer): Boolean // Returns `true` if the given layer is currently added to the map hasLayer: function (layer) { - return !!layer && (Util.stamp(layer) in this._layers); + return Util.stamp(layer) in this._layers; }, /* @method eachLayer(fn: Function, context?: Object): this diff --git a/src/layer/LayerGroup.js b/src/layer/LayerGroup.js index 202328380ab..afbdc1ff5bc 100644 --- a/src/layer/LayerGroup.js +++ b/src/layer/LayerGroup.js @@ -73,7 +73,6 @@ export var LayerGroup = Layer.extend({ // @method hasLayer(id: Number): Boolean // Returns `true` if the given internal ID is currently added to the group. hasLayer: function (layer) { - if (!layer) { return false; } var layerId = typeof layer === 'number' ? layer : this.getLayerId(layer); return layerId in this._layers; }, From 4c1a396feeb674d414391c338bb4ee9660b431bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Nov 2021 14:30:41 +0000 Subject: [PATCH 198/306] Bump prosthetic-hand from 1.3.1 to 1.4.0 Bumps [prosthetic-hand](https://github.com/IvanSanchez/prosthetic-hand) from 1.3.1 to 1.4.0. - [Release notes](https://github.com/IvanSanchez/prosthetic-hand/releases) - [Changelog](https://github.com/Leaflet/prosthetic-hand/blob/master/CHANGELOG.md) - [Commits](https://github.com/IvanSanchez/prosthetic-hand/commits) --- updated-dependencies: - dependency-name: prosthetic-hand dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f902f5562e7..59de83ff603 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2386,9 +2386,9 @@ } }, "node_modules/prosthetic-hand": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prosthetic-hand/-/prosthetic-hand-1.3.1.tgz", - "integrity": "sha1-qhPUqZ1aOcXRaMviB7zOV26EpzI=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosthetic-hand/-/prosthetic-hand-1.4.0.tgz", + "integrity": "sha512-H0YgNfPFkO6x00Viw8+6LnqYisivAt8i3enoLnCxRUlT80DM/9i99BVBcKGUosPJ635CxlJMsYbjYLHCFpvF2w==", "dev": true }, "node_modules/punycode": { @@ -5053,9 +5053,9 @@ "dev": true }, "prosthetic-hand": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prosthetic-hand/-/prosthetic-hand-1.3.1.tgz", - "integrity": "sha1-qhPUqZ1aOcXRaMviB7zOV26EpzI=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosthetic-hand/-/prosthetic-hand-1.4.0.tgz", + "integrity": "sha512-H0YgNfPFkO6x00Viw8+6LnqYisivAt8i3enoLnCxRUlT80DM/9i99BVBcKGUosPJ635CxlJMsYbjYLHCFpvF2w==", "dev": true }, "punycode": { From adfafbb41d9b2d241128bf7129a05801ebc16903 Mon Sep 17 00:00:00 2001 From: Luka Steinbach <45404400+luka1199@users.noreply.github.com> Date: Sat, 6 Nov 2021 12:24:33 +0100 Subject: [PATCH 199/306] Added plugin Leaflet.AnimatedSearchBox to plugins.md (#7053) Added Leaflet.AnimatedSearchBox to plugins.md --- docs/plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 630671949dc..43f44a5f944 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -2798,6 +2798,16 @@ Plugins that search for overlays and enhance how to display information about th + + Leaflet.AnimatedSearchBox + + + A simple Leaflet plugin that provides a collapsible search box. + + + Luka Steinbach + + Leaflet.Rrose From b4a1556132922c5f9c03679fc81229d0583a0186 Mon Sep 17 00:00:00 2001 From: Jon Koops Date: Sat, 6 Nov 2021 13:15:40 +0100 Subject: [PATCH 200/306] Run tests on Internet Explorer 11 (#7741) Co-authored-by: johndoe --- .github/dependabot.yml | 2 + .github/workflows/main.yml | 27 ++- package-lock.json | 220 +++++++++++++------- package.json | 6 +- spec/karma.conf.js | 8 - spec/suites/layer/marker/Marker.DragSpec.js | 3 +- spec/suites/map/handler/Map.DragSpec.js | 3 +- src/core/Util.js | 6 +- 8 files changed, 177 insertions(+), 98 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 7956f251440..0a5e51c2013 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,3 +9,5 @@ updates: ignore: - dependency-name: eslint-config-mourner update-types: ["version-update:semver-major"] + - dependency-name: sinon + update-types: ["version-update:semver-major"] diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0ecef406f2b..fd19d6a5798 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,7 +4,10 @@ env: NODE_VERSION: 16 jobs: setup: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-2019] steps: - name: Check out repository uses: actions/checkout@v2 @@ -34,7 +37,7 @@ jobs: uses: actions/cache@v2 with: path: ./* - key: ${{ github.sha }} + key: ${{ runner.os }}-${{ github.sha }} run: needs: setup @@ -47,7 +50,7 @@ jobs: uses: actions/cache@v2 with: path: ./* - key: ${{ github.sha }} + key: ${{ runner.os }}-${{ github.sha }} - name: Set up Node uses: actions/setup-node@v2 @@ -59,20 +62,24 @@ jobs: test: needs: setup - runs-on: ubuntu-latest + runs-on: ${{ matrix.os || 'ubuntu-latest' }} strategy: fail-fast: false matrix: - browser: - - Chrome1280x1024 - - FirefoxTouch - - FirefoxNoTouch + include: + - browser: Chrome1280x1024 + - browser: FirefoxTouch + - browser: FirefoxNoTouch + - browser: IE + os: windows-2019 + - browser: IE10 + os: windows-2019 steps: - name: Restore setup uses: actions/cache@v2 with: path: ./* - key: ${{ github.sha }} + key: ${{ runner.os }}-${{ github.sha }} - name: Set up Node uses: actions/setup-node@v2 @@ -91,7 +98,7 @@ jobs: uses: actions/cache@v2 with: path: ./* - key: ${{ github.sha }} + key: ${{ runner.os }}-${{ github.sha }} - name: Compress artifacts working-directory: dist diff --git a/package-lock.json b/package-lock.json index 59de83ff603..4fdb7905bbe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "prosthetic-hand": "^1.3.1", "rollup": "^2.59.0", "rollup-plugin-git-version": "^0.3.1", - "sinon": "^12.0.0", + "sinon": "^7.5.0", "ssri": "^8.0.1", "uglify-js": "^3.14.2" } @@ -147,24 +147,25 @@ "type-detect": "4.0.8" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "node_modules/@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" } }, "node_modules/@sinonjs/samsam": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", - "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" } }, "node_modules/@sinonjs/text-encoding": { @@ -311,6 +312,12 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1893,12 +1900,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -1943,6 +1944,12 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "node_modules/lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2194,18 +2201,27 @@ "dev": true }, "node_modules/nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/formatio": "^3.2.1", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", + "lolex": "^5.0.1", "path-to-regexp": "^1.7.0" } }, + "node_modules/nise/node_modules/lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2694,21 +2710,48 @@ } }, "node_modules/sinon": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.0.tgz", - "integrity": "sha512-wVMT1jvgyLroQu+tWTa2XJu2g5SoVaEBhdwGPuzmWlRvZNSG+pcEb8HEmsxTdoPjUL58pJFQ3+oFRWrhC4JKHw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^8.1.0", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.3", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.2", + "supports-color": "^5.5.0" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/sinon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" + "engines": { + "node": ">=4" } }, "node_modules/sinon/node_modules/@sinonjs/fake-timers": { @@ -3302,24 +3345,25 @@ "type-detect": "4.0.8" } }, - "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" } }, "@sinonjs/samsam": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", - "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", "dev": true, "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" } }, "@sinonjs/text-encoding": { @@ -3436,6 +3480,12 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4673,12 +4723,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4716,6 +4760,12 @@ } } }, + "lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4912,16 +4962,27 @@ "dev": true }, "nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/formatio": "^3.2.1", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", + "lolex": "^5.0.1", "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } } }, "normalize-path": { @@ -5278,26 +5339,39 @@ } }, "sinon": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.0.tgz", - "integrity": "sha512-wVMT1jvgyLroQu+tWTa2XJu2g5SoVaEBhdwGPuzmWlRvZNSG+pcEb8HEmsxTdoPjUL58pJFQ3+oFRWrhC4JKHw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", "dev": true, "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^8.1.0", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" - }, - "dependencies": { - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.3", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.2", + "supports-color": "^5.5.0" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" + "has-flag": "^3.0.0" } } } diff --git a/package.json b/package.json index ba70d03bc94..4e85fc237d7 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "prosthetic-hand": "^1.3.1", "rollup": "^2.59.0", "rollup-plugin-git-version": "^0.3.1", - "sinon": "^12.0.0", + "sinon": "^7.5.0", "ssri": "^8.0.1", "uglify-js": "^3.14.2" }, @@ -95,7 +95,9 @@ }, "overrides": [ { - "files": ["build/**/*"], + "files": [ + "build/**/*" + ], "env": { "node": true }, diff --git a/spec/karma.conf.js b/spec/karma.conf.js index 9170cc39f37..202b88898b4 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -114,14 +114,6 @@ module.exports = function (config) { 'dom.w3c_touch_events.enabled': 0 } }, - IE8: { // not working in IE 11!! - base: 'IE', - 'X-UA-Compatible': 'IE=EmulateIE8' - }, - IE9: { // not working in IE 11!! - base: 'IE', - 'X-UA-Compatible': 'IE=EmulateIE9' - }, IE10: { base: 'IE', 'x-ua-compatible': 'IE=EmulateIE10' diff --git a/spec/suites/layer/marker/Marker.DragSpec.js b/spec/suites/layer/marker/Marker.DragSpec.js index f2035763d4b..72fea583658 100644 --- a/spec/suites/layer/marker/Marker.DragSpec.js +++ b/spec/suites/layer/marker/Marker.DragSpec.js @@ -55,7 +55,8 @@ describe("Marker.Drag", function () { div.style.webkitTransform = 'scale(' + scaleX + ', ' + scaleY + ')'; }); - it("drags a marker with mouse, compensating for CSS scale", function (done) { + // fixme IE + (L.Browser.ie ? it.skip : it)("drags a marker with mouse, compensating for CSS scale", function (done) { var marker = new L.Marker([0, 0], { draggable: true }).addTo(map); diff --git a/spec/suites/map/handler/Map.DragSpec.js b/spec/suites/map/handler/Map.DragSpec.js index 0b7cbf53abd..c86701104d6 100644 --- a/spec/suites/map/handler/Map.DragSpec.js +++ b/spec/suites/map/handler/Map.DragSpec.js @@ -97,7 +97,8 @@ describe("Map.Drag", function () { container.style.webkitTransform = 'scale(' + scaleX + ', ' + scaleY + ')'; }); - it("change the center of the map, compensating for CSS scale", function (done) { + // fixme IE + (L.Browser.ie ? it.skip : it)("change the center of the map, compensating for CSS scale", function (done) { map = new L.Map(container, { dragging: true, inertia: false diff --git a/src/core/Util.js b/src/core/Util.js index 2d821998fe1..526d97c26c0 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -52,10 +52,10 @@ export var lastId = 0; // @function stamp(obj: Object): Number // Returns the unique ID of an object, assigning it one if it doesn't have it. export function stamp(obj) { - /*eslint-disable */ - obj._leaflet_id = obj._leaflet_id || ++lastId; + if (!('_leaflet_id' in obj)) { + obj['_leaflet_id'] = ++lastId; + } return obj._leaflet_id; - /* eslint-enable */ } // @function throttle(fn: Function, time: Number, context: Object): Function From 4ec3c5f96389fca1875d2b1700cb251cc413d8c8 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Sat, 6 Nov 2021 18:07:28 +0300 Subject: [PATCH 201/306] Fixup #7518 (#7748) --- src/core/Events.js | 2 +- src/map/Map.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/Events.js b/src/core/Events.js index 661a3c720cc..9cb4704c745 100644 --- a/src/core/Events.js +++ b/src/core/Events.js @@ -176,8 +176,8 @@ export var Events = { return; } - console.warn('listener not found'); } + console.warn('listener not found'); }, // @method fire(type: String, data?: Object, propagate?: Boolean): this diff --git a/src/map/Map.js b/src/map/Map.js index 185dbf413ca..fc7e8636ac8 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -736,7 +736,7 @@ export var Map = Evented.extend({ remove: function () { this._initEvents(true); - this.off('moveend', this._panInsideMaxBounds); + if (this.options.maxBounds) { this.off('moveend', this._panInsideMaxBounds); } if (this._containerId !== this._container._leaflet_id) { throw new Error('Map container is being reused by another instance'); From 257ca098f1edfe091ec029bcead25f7f9ce2b676 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Nov 2021 17:11:05 +0200 Subject: [PATCH 202/306] Bump eslint from 8.1.0 to 8.2.0 (#7747) --- package-lock.json | 107 ++++++++-------------------------------------- 1 file changed, 18 insertions(+), 89 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4fdb7905bbe..904525ee5b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,9 +48,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", - "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", + "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -59,7 +59,7 @@ "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, @@ -67,28 +67,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", @@ -855,12 +833,12 @@ } }, "node_modules/eslint": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", - "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", + "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.3", + "@eslint/eslintrc": "^1.0.4", "@humanwhocodes/config-array": "^0.6.0", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -894,7 +872,7 @@ "progress": "^2.0.0", "regexpp": "^3.2.0", "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" @@ -978,19 +956,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", @@ -2754,15 +2719,6 @@ "node": ">=4" } }, - "node_modules/sinon/node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, "node_modules/socket.io": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.1.tgz", @@ -3262,9 +3218,9 @@ } }, "@eslint/eslintrc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", - "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", + "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -3273,30 +3229,9 @@ "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } } }, "@humanwhocodes/config-array": { @@ -3915,12 +3850,12 @@ "dev": true }, "eslint": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", - "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", + "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.3", + "@eslint/eslintrc": "^1.0.4", "@humanwhocodes/config-array": "^0.6.0", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -3954,7 +3889,7 @@ "progress": "^2.0.0", "regexpp": "^3.2.0", "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" @@ -4010,12 +3945,6 @@ "eslint-visitor-keys": "^3.0.0" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", From 59d2cb89919bb8ae22da7b5411b178aa4dada99e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Nov 2021 12:11:07 +0000 Subject: [PATCH 203/306] Bump karma from 6.3.7 to 6.3.8 Bumps [karma](https://github.com/karma-runner/karma) from 6.3.7 to 6.3.8. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v6.3.7...v6.3.8) --- updated-dependencies: - dependency-name: karma dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 904525ee5b6..eff6451ebea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1643,9 +1643,9 @@ "dev": true }, "node_modules/karma": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.7.tgz", - "integrity": "sha512-EEkswZhOx3EFt1ELlVECeOXHONbHSGw6fkbeMxvCSkLD77X38Kb1d/Oup2Re9ep/tSoa1He3YIBf3Hp+9EsKtg==", + "version": "6.3.8", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.8.tgz", + "integrity": "sha512-10wBBU9S0lBHhbCNfmmbWQaY5C1bXlKdnvzN2QKThujCI/+DKaezrI08l6bfTlpJ92VsEboq3zYKpXwK6DOi3A==", "dev": true, "dependencies": { "body-parser": "^1.19.0", @@ -4470,9 +4470,9 @@ "dev": true }, "karma": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.7.tgz", - "integrity": "sha512-EEkswZhOx3EFt1ELlVECeOXHONbHSGw6fkbeMxvCSkLD77X38Kb1d/Oup2Re9ep/tSoa1He3YIBf3Hp+9EsKtg==", + "version": "6.3.8", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.8.tgz", + "integrity": "sha512-10wBBU9S0lBHhbCNfmmbWQaY5C1bXlKdnvzN2QKThujCI/+DKaezrI08l6bfTlpJ92VsEboq3zYKpXwK6DOi3A==", "dev": true, "requires": { "body-parser": "^1.19.0", From 572f4f7989d7a6c7e3748c7f55927c49b07c3afb Mon Sep 17 00:00:00 2001 From: Grzegorz Tomicki Date: Mon, 8 Nov 2021 17:49:33 +0100 Subject: [PATCH 204/306] New plugin: Leaflet.Autocomplete (#7236) --- docs/plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 43f44a5f944..2d8dedec703 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -4642,6 +4642,17 @@ External services that transform an address or the name of a place into latitude Lou Huang + + + + Leaflet.Autocomplete + + + Leaflet.Autocomplete is to expand the autosugestion plugin with the ability to geocode and show data on the map in the way you think you need. The DEMO is based on the use of OpenstreetMap Nominatim to locate places by address. Accessible, with full support for ARIA attributes and keyboard interactions. + + + Grzegorz Tomicki + From 98fb4ab3a52ae95ea8292b1488cde705beaccd0b Mon Sep 17 00:00:00 2001 From: Jon Koops Date: Mon, 8 Nov 2021 18:14:11 +0100 Subject: [PATCH 205/306] Lint all files unless explicitly ignored (#7757) * Lint all files unless explicitly ignored * Only ignore some code in the docs --- package.json | 10 +++++++++- spec/karma.conf.js | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 4e85fc237d7..9128a8e8385 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "docs": "node ./build/docs.js", "test": "karma start ./spec/karma.conf.js", "build": "npm run rollup && npm run uglify", - "lint": "eslint src spec/suites docs/docs/js build", + "lint": "eslint .", "lintfix": "npm run lint -- --fix", "rollup": "rollup -c build/rollup-config.js", "watch": "rollup -w -c build/rollup-watch-config.js", @@ -49,6 +49,14 @@ "prepublishOnly": "npm ci && npm run lint && npm run test && NODE_ENV=release npm run build" }, "eslintConfig": { + "ignorePatterns": [ + "dist", + "debug", + "docs/docs/highlight", + "docs/examples/choropleth", + "docs/examples/geojson", + "docs/examples/map-panes" + ], "root": true, "globals": { "L": true diff --git a/spec/karma.conf.js b/spec/karma.conf.js index 202b88898b4..92dded89f4c 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -131,6 +131,7 @@ module.exports = function (config) { client: { mocha: { + // eslint-disable-next-line no-undef forbidOnly: process.env.CI || false } } From 315e4d7bde7a4979485320b643a1990ac29bf3be Mon Sep 17 00:00:00 2001 From: johnd0e Date: Mon, 8 Nov 2021 20:16:42 +0300 Subject: [PATCH 206/306] Class.include: keep parent options (#7756) And add a couple of related tests --- spec/suites/core/ClassSpec.js | 31 +++++++++++++++++++++++++++++++ src/core/Class.js | 5 +++++ 2 files changed, 36 insertions(+) diff --git a/spec/suites/core/ClassSpec.js b/spec/suites/core/ClassSpec.js index cf489bb10c8..040fe0e6e5b 100644 --- a/spec/suites/core/ClassSpec.js +++ b/spec/suites/core/ClassSpec.js @@ -230,6 +230,37 @@ describe("Class", function () { b.quux(); expect(q.called).to.be.ok(); }); + + it("keeps parent options", function () { // #6070 + + var Quux = L.Class.extend({ + options: {foo: 'Foo!'} + }); + + Quux.include({ + options: {bar: 'Bar!'} + }); + + var q = new Quux(); + expect(q.options).to.have.property('foo'); + expect(q.options).to.have.property('bar'); + }); + + it("does not reuse original props.options", function () { + var props = {options: {}}; + var K = Klass.include(props); + + expect(K.prototype.options).not.to.be(props.options); + }); + + it("does not replace source props.options object", function () { + var K1 = Klass.include({options: {}}); + var opts = {}; + var props = {options: opts}; + K1.extend(props); + + expect(props.options).to.be(opts); + }); }); // TODO Class.mergeOptions diff --git a/src/core/Class.js b/src/core/Class.js index 12f8e49eb71..6cae85b0082 100644 --- a/src/core/Class.js +++ b/src/core/Class.js @@ -87,7 +87,12 @@ Class.extend = function (props) { // @function include(properties: Object): this // [Includes a mixin](#class-includes) into the current class. Class.include = function (props) { + var parentOptions = this.prototype.options; Util.extend(this.prototype, props); + if (props.options) { + this.prototype.options = parentOptions; + this.mergeOptions(props.options); + } return this; }; From d03a2d09aab86481793836cc6a4b80dff19b32ca Mon Sep 17 00:00:00 2001 From: Alexandria Quelle <38425426+aquelle-cp@users.noreply.github.com> Date: Tue, 9 Nov 2021 00:42:40 -0800 Subject: [PATCH 207/306] Minor typos (#7758) --- docs/examples/quick-start/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/quick-start/index.md b/docs/examples/quick-start/index.md index a953cd710a5..faf12bf1351 100644 --- a/docs/examples/quick-start/index.md +++ b/docs/examples/quick-start/index.md @@ -48,9 +48,9 @@ Let's create a map of the center of London with pretty Mapbox Streets tiles. Fir By default (as we didn't pass any options when creating the map instance), all mouse and touch interactions on the map are enabled, and it has zoom and attribution controls. -Note that `setView` call also returns the map object --- most Leaflet methods act like this when they don't return an explicit value, which allows convenient jQuery-like method chaining. +Note that the `setView` call also returns the map object --- most Leaflet methods act like this when they don't return an explicit value, which allows convenient jQuery-like method chaining. -Next we'll add a tile layer to add to our map, in this case it's a Mapbox Streets tile layer. Creating a tile layer usually involves setting the [URL template](/reference.html#tilelayer-url-template) for the tile images, the attribution text and the maximum zoom level of the layer. In this example we'll use the `mapbox/streets-v11` tiles from [Mapbox's Static Tiles API](https://docs.mapbox.com/api/maps/#static-tiles) (in order to use tiles from Mapbox, you must also [request an access token](https://www.mapbox.com/studio/account/tokens/)). Because this API returns 512x512 tiles by default (instead of 256x256), we will also have to explicitly specify this and offset our zoom by a value of -1. +Next, we'll add a tile layer to add to our map, in this case it's a Mapbox Streets tile layer. Creating a tile layer usually involves setting the [URL template](/reference.html#tilelayer-url-template) for the tile images, the attribution text, and the maximum zoom level of the layer. In this example, we'll use the `mapbox/streets-v11` tiles from [Mapbox's Static Tiles API](https://docs.mapbox.com/api/maps/#static-tiles) (in order to use tiles from Mapbox, you must also [request an access token](https://www.mapbox.com/studio/account/tokens/)). Because this API returns 512x512 tiles by default (instead of 256x256), we will also have to explicitly specify this and offset our zoom by a value of -1.
      L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', {
       	attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
      @@ -68,7 +68,7 @@ It's worth noting that Leaflet is provider-agnostic, meaning that it doesn't enf
       Whenever using anything based on OpenStreetMap, an *attribution* is obligatory as per the [copyright notice](https://www.openstreetmap.org/copyright). Most other tile providers (such as [Mapbox](https://docs.mapbox.com/help/how-mapbox-works/attribution/), [Stamen](http://maps.stamen.com/) or [Thunderforest](https://www.thunderforest.com/terms/)) require an attribution as well. Make sure to give credit where credit is due.
       
       
      -### Markers, circles and polygons
      +### Markers, circles, and polygons
       
       {% include frame.html url="example-overlays.html" %}
       
      
      From 93ebeb7786772c95c572737a4b026b15899e7826 Mon Sep 17 00:00:00 2001
      From: Philipp Loose <37411699+phloose@users.noreply.github.com>
      Date: Tue, 9 Nov 2021 14:34:22 +0100
      Subject: [PATCH 208/306] plugin: leaflet-layervisibility (#7484)
      
      ---
       docs/plugins.md | 21 ++++++++++++++++-----
       1 file changed, 16 insertions(+), 5 deletions(-)
      
      diff --git a/docs/plugins.md b/docs/plugins.md
      index 2d8dedec703..b1879e89bc8 100644
      --- a/docs/plugins.md
      +++ b/docs/plugins.md
      @@ -1237,7 +1237,7 @@ Load overlay data from third-party-services. See also [basemap providers](#basem
         		leaflet-radar
       		
       		
      -			Animated satellite weather radar overlays for Leaflet. 
      +			Animated satellite weather radar overlays for Leaflet.
       		
       		
       			rwev
      @@ -1921,6 +1921,17 @@ These plugins provide new markers or news ways of converting abstract data into
       			R.A. Porter
       		
       	
      +	
      +		
      +			leaflet-layervisibility
      +		
      +		
      +			Extends L.Layer and L.LayerGroup with methods to hide/show layers without removing/re-adding them.
      +		
      +		
      +			Philipp Loose
      +		
      +	
       	
       		
       			Leaflet.CenterMarker
      @@ -2429,7 +2440,7 @@ Powerful multi-purpose libraries for data visualization.
       		
       			onaci
       		
      -		
      +	
       
       
       
      @@ -3417,7 +3428,7 @@ Change the way the user is moved around the map, by jumping to predefined/stored
       			leaflet-view-meta
       		
       		
      -			Plugin control that displays and persists map view meta-data, center and boundary coordinates to URL for precise sharing and view reconstruction. 
      +			Plugin control that displays and persists map view meta-data, center and boundary coordinates to URL for precise sharing and view reconstruction.
       		
       		
       			rwev
      @@ -3639,7 +3650,7 @@ Allow the user to measure distances or areas.
       			rwev
       		
       	
      -	
      +
       
       
       
      @@ -4748,7 +4759,7 @@ Ease your development integrating Leaflet into a development framework or automa
       		
       			leaflet-geoserver-request
       		
      -			Basic geoserver requests in leaflet. Currently supports wms, wfs, legend, wmsImage request on the leaflet. 
      +			Basic geoserver requests in leaflet. Currently supports wms, wfs, legend, wmsImage request on the leaflet.
       		Demo
       		
       			Iamtekson
      
      From 5bae38bd3bb5e4c4d359664cbcd2743b3ccdcf3e Mon Sep 17 00:00:00 2001
      From: Astrid 
      Date: Thu, 11 Nov 2021 09:13:17 +0100
      Subject: [PATCH 209/306] Adding Leaflet control Routetoaddress (#6500)
      
      * leafletroutetoaddress
      
      * Update docs/plugins.md
      
      Co-authored-by: Falke Design 
      
      Co-authored-by: Falke Design 
      ---
       docs/plugins.md | 12 ++++++++++++
       1 file changed, 12 insertions(+)
      
      diff --git a/docs/plugins.md b/docs/plugins.md
      index b1879e89bc8..b77347d7920 100644
      --- a/docs/plugins.md
      +++ b/docs/plugins.md
      @@ -4523,6 +4523,18 @@ The following plugins use external services to calculate driving or walking rout
           			Jack Good
           		
           	
      +
      +	
      +		
      +			Leaflet RouteToAddress
      +		
      +			Control for route search from a custom address to a fixed address. 
      +The Plugin integrates a simple geocoder that uses OpenstreetMap Nominatim to locate places by address. Ideal for the description of the directions "Find your way to us" on a website. Uses OSRM by default, but also supports
      +Mapbox Directions API. Demo
      +		
      +			Astrid Günther
      +		
      +	
           
           	
           		Leaflet TripGo routing
      
      From daeb86b360badc5b4e00ff317b181e2c093f6140 Mon Sep 17 00:00:00 2001
      From: Ricky Brundritt 
      Date: Thu, 11 Nov 2021 00:13:41 -0800
      Subject: [PATCH 210/306] New Plugin: Azure Maps basemap provider (#7408)
      
      * Update plugins.md
      
      * Update plugins.md
      
      Replacing markdown link with HTML anchor
      
      * Update plugins.md
      
      Fixed the one line and indented using tabs rather than space.
      ---
       docs/plugins.md | 10 ++++++++++
       1 file changed, 10 insertions(+)
      
      diff --git a/docs/plugins.md b/docs/plugins.md
      index b77347d7920..9a4a9359d4b 100644
      --- a/docs/plugins.md
      +++ b/docs/plugins.md
      @@ -234,6 +234,16 @@ Ready-to-go basemaps, with little or no configuration at all.
       			Roman Karavia
       		
       	
      +	
      +		
      +			Azure Maps Leaflet plugin
      +		
      +			A leafletjs plugin that makes it easy to overlay all the different tile layers available from the Azure Maps. Supports using an Azure Maps subscription key or Azure Active Directory for authentication.
      +			Demos.
      +		
      +			Ricky Brundritt
      +		
      +	
       	
       		
       			Leaflet.TileLayer.HERE
      
      From c1e6751f5c3db1b710b9a63d2ea9919be9cbb574 Mon Sep 17 00:00:00 2001
      From: johnd0e 
      Date: Thu, 11 Nov 2021 11:14:21 +0300
      Subject: [PATCH 211/306] L.Control.Attribution: encapsulate some code from
       L.Layer (#7764)
      
      ---
       src/control/Control.Attribution.js | 15 +++++++++++++++
       src/layer/Layer.js                 |  8 --------
       2 files changed, 15 insertions(+), 8 deletions(-)
      
      diff --git a/src/control/Control.Attribution.js b/src/control/Control.Attribution.js
      index 48e738a838e..6177c48e6dc 100644
      --- a/src/control/Control.Attribution.js
      +++ b/src/control/Control.Attribution.js
      @@ -45,9 +45,24 @@ export var Attribution = Control.extend({
       
       		this._update();
       
      +		map.on('layeradd', this._addAttribution, this);
      +
       		return this._container;
       	},
       
      +	onRemove: function (map) {
      +		map.off('layeradd', this._addAttribution, this);
      +	},
      +
      +	_addAttribution: function (ev) {
      +		if (ev.layer.getAttribution) {
      +			this.addAttribution(ev.layer.getAttribution());
      +			ev.layer.once('remove', function () {
      +				this.removeAttribution(ev.layer.getAttribution());
      +			}, this);
      +		}
      +	},
      +
       	// @method setPrefix(prefix: String): this
       	// Sets the text before the attributions.
       	setPrefix: function (prefix) {
      diff --git a/src/layer/Layer.js b/src/layer/Layer.js
      index 8d4df864cb6..ab5a8bc6920 100644
      --- a/src/layer/Layer.js
      +++ b/src/layer/Layer.js
      @@ -113,10 +113,6 @@ export var Layer = Evented.extend({
       
       		this.onAdd(map);
       
      -		if (this.getAttribution && map.attributionControl) {
      -			map.attributionControl.addAttribution(this.getAttribution());
      -		}
      -
       		this.fire('add');
       		map.fire('layeradd', {layer: this});
       	}
      @@ -189,10 +185,6 @@ Map.include({
       			layer.onRemove(this);
       		}
       
      -		if (layer.getAttribution && this.attributionControl) {
      -			this.attributionControl.removeAttribution(layer.getAttribution());
      -		}
      -
       		delete this._layers[id];
       
       		if (this._loaded) {
      
      From b61dad1b519382f16779d3b99b6ae6f9eb79c48a Mon Sep 17 00:00:00 2001
      From: Evo Stamatov 
      Date: Thu, 11 Nov 2021 19:29:50 +1100
      Subject: [PATCH 212/306] Make docs headings sticky (#7703)
      
      * make headings sticky
      
      * fix anchors position under the sticky headings
      ---
       docs/docs/css/main.css      | 9 +++++++++
       docs/docs/css/reference.css | 9 +++++++++
       2 files changed, 18 insertions(+)
      
      diff --git a/docs/docs/css/main.css b/docs/docs/css/main.css
      index bb7a50e370d..fddb02fcabf 100644
      --- a/docs/docs/css/main.css
      +++ b/docs/docs/css/main.css
      @@ -9,6 +9,11 @@ html, body, input, select, button, textarea, table {
       	text-rendering: optimizeLegibility;
       }
       
      +html {
      +	scroll-padding-top: 5em;
      +	overflow: auto;
      +}
      +
       body {
       	line-height: 1.5;
       	color: black;
      @@ -488,6 +493,10 @@ table.plugins td:first-child a {
       	color: #333;
       	border-bottom: 3px solid #555;
       	transition: border-color .25s ease;
      +	position: sticky;
      +	top: 0;
      +	z-index: 1;
      +	background-color: white;
       }
       .api-page #toc ~ h2:target {
       	border-color: #1EB300;
      diff --git a/docs/docs/css/reference.css b/docs/docs/css/reference.css
      index dbbbb97a369..376021848da 100644
      --- a/docs/docs/css/reference.css
      +++ b/docs/docs/css/reference.css
      @@ -23,6 +23,15 @@ section > h4 {
           font-weight: 500;
           margin: 1em 0 0.25em;
       }
      +div.accordion.expanded label,
      +section > h4 {
      +    margin: 0.75em 0 0;
      +    padding: 0.25em 0;
      +    position: sticky;
      +    top: 2.8em;
      +    background-color: white;
      +    border-bottom: 1px solid #eee;
      +}
       
       label {
           cursor: pointer;
      
      From 2c105060a93a645b14e82532926a63b1f5d8e323 Mon Sep 17 00:00:00 2001
      From: Vladimir Agafonkin 
      Date: Thu, 11 Nov 2021 10:33:31 +0200
      Subject: [PATCH 213/306] add a redirect from /reference-1.7.1.html
      
      ---
       docs/reference-1.7.1.html | 4 ++++
       1 file changed, 4 insertions(+)
       create mode 100644 docs/reference-1.7.1.html
      
      diff --git a/docs/reference-1.7.1.html b/docs/reference-1.7.1.html
      new file mode 100644
      index 00000000000..87fbc08f2ba
      --- /dev/null
      +++ b/docs/reference-1.7.1.html
      @@ -0,0 +1,4 @@
      +---
      +layout: redirected
      +redirect_to: reference.html
      +---
      
      From 7cb3c0e43b6350437971ed1c43668ae964ba5bdd Mon Sep 17 00:00:00 2001
      From: Philipp Loose <37411699+phloose@users.noreply.github.com>
      Date: Thu, 11 Nov 2021 15:19:46 +0100
      Subject: [PATCH 214/306] Tests for L.GeoJSON static functions (#7147)
      
      ---
       spec/suites/layer/GeoJSONSpec.js | 355 +++++++++++++++++++++++++++++++
       1 file changed, 355 insertions(+)
      
      diff --git a/spec/suites/layer/GeoJSONSpec.js b/spec/suites/layer/GeoJSONSpec.js
      index 3c81fa4e193..74a00f44520 100644
      --- a/spec/suites/layer/GeoJSONSpec.js
      +++ b/spec/suites/layer/GeoJSONSpec.js
      @@ -512,3 +512,358 @@ describe("L.LayerGroup#toGeoJSON", function () {
       		});
       	});
       });
      +
      +describe("L.GeoJSON functions", function () {
      +	describe("#geometryToLayer", function () {
      +		var point = {
      +			type: "Point",
      +			coordinates: [0, 0]
      +		};
      +		var multiPoint  = {
      +			type: "MultiPoint",
      +			coordinates: [
      +				[0, 0], [10, 10]
      +			]
      +		};
      +		var line =  {
      +			type: "LineString",
      +			coordinates: [
      +				[0, 0], [10, 10], [20, 20]
      +			]
      +		};
      +		var multiLine = {
      +			type: "MultiLineString",
      +			coordinates: [
      +				[[10, 10], [20, 20], [30, 30]],
      +				[[50, 50], [60, 60], [70, 70]]
      +			]
      +		};
      +		var polygon = {
      +			type: "Polygon",
      +			coordinates: [
      +				[[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]]
      +			]
      +		};
      +		var multiPolygon = {
      +			type: "MultiPolygon",
      +			coordinates: [
      +				[
      +					[[30, 20], [45, 40], [10, 40], [30, 20]]
      +				],
      +				[
      +					[[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]]
      +				]
      +			]
      +		};
      +		var geometryCollection  = {
      +			type: "GeometryCollection",
      +			geometries: [
      +				{
      +					type: "Point",
      +					coordinates: [0, 0]
      +				},
      +				{
      +					type: "LineString",
      +					coordinates: [
      +						[10, 10], [20, 20]
      +					]
      +				}
      +			]
      +		};
      +
      +		function customPointToLayer(geojsonPoint, latLng) {
      +			return L.circle(latLng, {
      +				radius: geojsonPoint.properties.radius
      +			});
      +		}
      +
      +		function customCoordstoLatLng(coords) {
      +			return L.latLng(coords[1] + 1, coords[0] + 1, coords[2] + 1);
      +		}
      +
      +		[
      +			[point, L.Marker],
      +			[line, L.Polyline],
      +			[polygon, L.Polygon],
      +			[multiPoint, L.FeatureGroup],
      +			[multiLine, L.Polyline],
      +			[multiPolygon, L.Polygon],
      +			[geometryCollection, L.FeatureGroup]
      +		].forEach(function (item) {
      +			var geometry = item[0], expectedType = item[1];
      +
      +			it("creates a Layer from a GeoJSON feature (type='" + geometry.type + "')", function () {
      +				var layer = L.GeoJSON.geometryToLayer({
      +					type: "Feature",
      +					geometry: geometry
      +				});
      +				expect(layer).to.be.a(expectedType);
      +			});
      +
      +			it("creates a Layer from a GeoJSON geometry (type='" + geometry.type + "')", function () {
      +				var layer = L.GeoJSON.geometryToLayer(geometry);
      +				expect(layer).to.be.a(expectedType);
      +			});
      +		});
      +
      +		it("throws an error if feature is an invalid GeoJSON object", function () {
      +			expect(L.GeoJSON.geometryToLayer).withArgs({
      +				type: "Feature",
      +				geometry: {
      +					type: "invalid",
      +					coordinates: [0, 0]
      +				}
      +			}).to.throwError("Invalid GeoJSON object.");
      +		});
      +
      +		it("returns nothing if feature does not have a geometry property", function () {
      +			var ret = L.GeoJSON.geometryToLayer({type: "Feature"});
      +			expect(ret).not.to.be.ok();
      +		});
      +
      +		it("creates a Layer using pointToLayer option (Point)", function () {
      +			var layer = L.GeoJSON.geometryToLayer({
      +				type: "Feature",
      +				geometry: point,
      +				properties: {radius: 100}
      +			}, {
      +				pointToLayer: customPointToLayer
      +			});
      +			expect(layer).to.be.a(L.Circle);
      +			expect(layer.options.radius).to.be(100);
      +		});
      +
      +		it("creates a Layer using pointToLayer option (MultiPoint)", function () {
      +			var layer = L.GeoJSON.geometryToLayer({
      +				type: "Feature",
      +				geometry: multiPoint,
      +				properties: {radius: 100}
      +			}, {
      +				pointToLayer: customPointToLayer
      +			});
      +			layer.eachLayer(function (lyr) {
      +				expect(lyr).to.be.a(L.Circle);
      +				expect(lyr.options.radius).to.be(100);
      +			});
      +		});
      +
      +		it("creates a Layer using coordsToLatLng option (Point)", function () {
      +			var layer = L.GeoJSON.geometryToLayer({
      +				type: "Feature",
      +				geometry: {
      +					type: "Point",
      +					coordinates: [1, 2, 3]
      +				}
      +			}, {
      +				coordsToLatLng: customCoordstoLatLng
      +			});
      +			expect(layer.getLatLng()).to.eql({lat: 3, lng: 2, alt: 4});
      +		});
      +
      +		it("creates a Layer using coordsToLatLng option (MultiPoint)", function () {
      +			var layer = L.GeoJSON.geometryToLayer({
      +				type: "Feature",
      +				geometry: {
      +					type: "MultiPoint",
      +					coordinates: [
      +						[1, 2, 3], [4, 5, 6]
      +					]
      +				}
      +			}, {
      +				coordsToLatLng: customCoordstoLatLng
      +			});
      +			expect(layer.getLayers().map(function (lyr) {
      +				return lyr.getLatLng();
      +			})).to.eql([
      +				{lat: 3, lng: 2, alt: 4},
      +				{lat: 6, lng: 5, alt: 7}
      +			]);
      +		});
      +	});
      +
      +	describe("#coordsToLatLng", function () {
      +		it("creates a LatLng object with given coordinates", function () {
      +			var latLng = L.GeoJSON.coordsToLatLng([1, 2]);
      +			var latLngWithAlt = L.GeoJSON.coordsToLatLng([3, 4, 5]);
      +			expect(latLng).to.be.a(L.LatLng);
      +			expect(latLngWithAlt).to.be.a(L.LatLng);
      +			expect(latLng).to.eql({lng: 1, lat: 2});
      +			expect(latLngWithAlt).to.eql({lng: 3, lat: 4, alt: 5});
      +		});
      +	});
      +
      +	describe("#coordsToLatLngs", function () {
      +
      +		function customCoordsToLatLng(coords) {
      +			return L.latLng(coords[1] + 1, coords[0] + 1, coords[2] + 1);
      +		}
      +
      +		it("creates a multidimensional array of LatLngs", function () {
      +			var latLngs = L.GeoJSON.coordsToLatLngs([[1, 2], [3, 4], [5, 6]]);
      +			expect(latLngs).to.eql([{lng: 1, lat: 2}, {lng: 3, lat: 4}, {lng: 5, lat: 6}]);
      +			latLngs.forEach(function (latLng) {
      +				expect(latLng).to.be.a(L.LatLng);
      +			});
      +		});
      +
      +		it("creates a multidimensional array of LatLngs (levelsDeep=1)", function () {
      +			var latLngs = L.GeoJSON.coordsToLatLngs([
      +				[[1, 2], [3, 4], [5, 6]],
      +				[[5, 6], [7, 8], [9, 10]]
      +			], 1);
      +			expect(latLngs).to.eql([
      +				[{lng: 1, lat: 2}, {lng: 3, lat: 4}, {lng: 5, lat: 6}],
      +				[{lng: 5, lat: 6}, {lng: 7, lat: 8}, {lng: 9, lat: 10}]
      +			]);
      +			latLngs.forEach(function (arr) {
      +				arr.forEach(function (latlng) {
      +					expect(latlng).to.be.a(L.LatLng);
      +				});
      +			});
      +		});
      +
      +		it("creates a multidimensional array of LatLngs with custom coordsToLatLng", function () {
      +			var coords = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
      +			var latLngs = L.GeoJSON.coordsToLatLngs(coords, 0, customCoordsToLatLng);
      +			expect(latLngs).to.eql([
      +				{lat: 3, lng: 2, alt: 4},
      +				{lat: 6, lng: 5, alt: 7},
      +				{lat: 9, lng: 8, alt: 10}
      +			]);
      +		});
      +
      +		it("creates a multidimensional array of LatLngs with custom coordsToLatLng (levelDeep=1)", function () {
      +			var coords = [
      +				[[1, 2, 3], [4, 5, 6]],
      +				[[12, 13, 14], [15, 16, 17]]
      +			];
      +			var latLngs = L.GeoJSON.coordsToLatLngs(coords, 1, customCoordsToLatLng);
      +			expect(latLngs).to.eql([
      +				[
      +					{lat: 3, lng: 2, alt: 4},
      +					{lat: 6, lng: 5, alt: 7}
      +				],
      +				[
      +					{lat: 14, lng: 13, alt: 15},
      +					{lat: 17, lng: 16, alt: 18}
      +				]
      +			]);
      +		});
      +	});
      +
      +	describe("#latLngToCoords", function () {
      +		it("returns an array of coordinates and altitude", function () {
      +			var coords = L.GeoJSON.latLngToCoords(L.latLng(2, 1));
      +			var coordsWithAlt = L.GeoJSON.latLngToCoords(L.latLng(2, 1, 3));
      +			expect(coords).to.eql([1, 2]);
      +			expect(coordsWithAlt).to.eql([1, 2, 3]);
      +		});
      +
      +		it("returns an array of coordinates with given precision", function () {
      +			var coords = L.GeoJSON.latLngToCoords(L.latLng(
      +				2.123456, 1.123456
      +			), 3);
      +			var coordsWithAlt = L.GeoJSON.latLngToCoords(L.latLng(
      +				2.123456, 1.123456, 3.123456
      +			), 3);
      +			expect(coords).to.eql([1.123, 2.123]);
      +			expect(coordsWithAlt).to.eql([1.123, 2.123, 3.123]);
      +		});
      +	});
      +
      +	describe("#latLngsToCoords", function () {
      +		it("returns a multidimensional array of coordinates", function () {
      +			var coords = L.GeoJSON.latLngsToCoords([L.latLng(2, 1), L.latLng(4, 3)]);
      +			var coordWithAlt = L.GeoJSON.latLngsToCoords([L.latLng(2, 1, 3), L.latLng(5, 4, 6)]);
      +			expect(coords).to.eql([[1, 2], [3, 4]]);
      +			expect(coordWithAlt).to.eql([[1, 2, 3], [4, 5, 6]]);
      +		});
      +
      +		it("returns a multidimensional array of coordinates (levelDeep=1)", function () {
      +			var latLngs = [
      +				[L.latLng(2, 1), L.latLng(4, 3)],
      +				[L.latLng(6, 5), L.latLng(8, 7)]
      +			];
      +			var coords = L.GeoJSON.latLngsToCoords(latLngs, 1);
      +			expect(coords).to.eql([
      +				[[1, 2], [3, 4]],
      +				[[5, 6], [7, 8]]
      +			]);
      +		});
      +
      +		it("returns a multidimensional array of coordinates (closed=True)", function () {
      +			var latLngs = [L.latLng(2, 1), L.latLng(4, 3), L.latLng(6, 5)];
      +			var coords = L.GeoJSON.latLngsToCoords(latLngs, 0, true);
      +			expect(coords).to.eql([[1, 2], [3, 4], [5, 6], [1, 2]]);
      +		});
      +
      +		it("returns a multidimensional array of coordinates (levelsDeep=1, closed=True)", function () {
      +			var latLngs = [
      +				[L.latLng(2, 1), L.latLng(4, 3), L.latLng(6, 5)],
      +				[L.latLng(8, 7), L.latLng(10, 9), L.latLng(12, 11)]
      +			];
      +			var coords = L.GeoJSON.latLngsToCoords(latLngs, 1, true);
      +			expect(coords).to.eql([
      +				[[1, 2], [3, 4], [5, 6], [1, 2]],
      +				[[7, 8], [9, 10], [11, 12], [7, 8]]
      +			]);
      +		});
      +
      +		it("returns a multidimensional array of coordinates with given precision", function () {
      +			var latLngs = [L.latLng(2.123456, 1.123456), L.latLng(4.123456, 3.123456)];
      +			var coords = L.GeoJSON.latLngsToCoords(latLngs, 0, false, 3);
      +			expect(coords).to.eql([[1.123, 2.123], [3.123, 4.123]]);
      +		});
      +	});
      +
      +	describe("#asFeature", function () {
      +		var geometry1 = {
      +			type: "Point",
      +			coordinates: [0, 0]
      +		};
      +
      +		var geometry2 = {
      +			type: "Point",
      +			coordinates: [1, 1]
      +		};
      +
      +		var feature1 = {
      +			type: "Feature",
      +			geometry: geometry1,
      +			properties: {a: 1}
      +		};
      +
      +		var feature2 = {
      +			type: "Feature",
      +			geometry: geometry2,
      +			properties: {b: 2}
      +		};
      +
      +		var featureCollection = {
      +			type: "FeatureCollection",
      +			features: [
      +				feature1,
      +				feature2
      +			]
      +		};
      +
      +		it("given a bare geometry returns a GeoJSON-like feature", function () {
      +			var ret = L.GeoJSON.asFeature(geometry1);
      +			expect(ret).to.eql({
      +				type: "Feature",
      +				properties: {},
      +				geometry: geometry1
      +			});
      +		});
      +
      +		it("given a GeoJSON feature directly returns it", function () {
      +			var ret = L.GeoJSON.asFeature(feature1);
      +			expect(ret).to.eql(feature1);
      +		});
      +
      +		it("given a GeoJSON feature collection directly returns it", function () {
      +			var ret = L.GeoJSON.asFeature(featureCollection);
      +			expect(ret).to.eql(featureCollection);
      +		});
      +	});
      +});
      
      From a37f0297afd1e547e94d5ae4e217f7cef1d696c8 Mon Sep 17 00:00:00 2001
      From: Mateusz Konieczny 
      Date: Thu, 11 Nov 2021 16:03:10 +0100
      Subject: [PATCH 215/306] simplify. update description - geojson is popular
       (#7602)
      
      ---
       docs/examples/geojson/index.md | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/docs/examples/geojson/index.md b/docs/examples/geojson/index.md
      index 1b19caae34d..d161622df03 100644
      --- a/docs/examples/geojson/index.md
      +++ b/docs/examples/geojson/index.md
      @@ -5,7 +5,7 @@ title: Using GeoJSON with Leaflet
       
       

      Using GeoJSON with Leaflet

      -

      GeoJSON is becoming a very popular data format among many GIS technologies and services — it's simple, lightweight, straightforward, and Leaflet is quite good at handling it. In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

      +

      GeoJSON is a very popular data format among many GIS technologies and services — it's simple, lightweight, straightforward, and Leaflet is quite good at handling it. In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

      {% include frame.html url="example.html" %} From b52961aa469dc17b3710ef7a9c0f13b6f4dba550 Mon Sep 17 00:00:00 2001 From: Candid Dauth Date: Mon, 15 Nov 2021 09:59:27 +0100 Subject: [PATCH 216/306] Add Leaflet.HighlightableLayers and Leaflet.DraggableLines plugins to docs (#7437) * Add Leaflet.HighlightableLayers plugin to docs * Add Leaflet.DraggableLines plugin to docs --- docs/plugins.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/plugins.md b/docs/plugins.md index 9a4a9359d4b..53528b77807 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1963,6 +1963,17 @@ These plugins provide new markers or news ways of converting abstract data into Falke-Design + + + Leaflet.HighlightableLayers + + + Highlight Leaflet lines and polygons by adding a border and raising them above others. Add a transparent border to increase the tolerance for mouse/touch interactions. Demo + + + Candid Dauth + + @@ -2662,6 +2673,17 @@ Allows users to create, draw, edit and/or delete points, lines and polygons. Lemaf + + + Leaflet.DraggableLines + + + Add/move/remove points on routes, lines and polygons by drag&drop. Demo + + + Candid Dauth + + @@ -4538,7 +4560,7 @@ The following plugins use external services to calculate driving or walking rout Leaflet RouteToAddress - Control for route search from a custom address to a fixed address. + Control for route search from a custom address to a fixed address. The Plugin integrates a simple geocoder that uses OpenstreetMap Nominatim to locate places by address. Ideal for the description of the directions "Find your way to us" on a website. Uses OSRM by default, but also supports Mapbox Directions API. Demo From bda4004ef993507c760a40b4be3db8ee81da4b41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 00:45:52 +0200 Subject: [PATCH 217/306] Bump rollup from 2.59.0 to 2.60.0 (#7785) Bumps [rollup](https://github.com/rollup/rollup) from 2.59.0 to 2.60.0. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v2.59.0...v2.60.0) --- updated-dependencies: - dependency-name: rollup dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index eff6451ebea..e340d9de744 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2557,9 +2557,9 @@ } }, "node_modules/rollup": { - "version": "2.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.59.0.tgz", - "integrity": "sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==", + "version": "2.60.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.0.tgz", + "integrity": "sha512-cHdv9GWd58v58rdseC8e8XIaPUo8a9cgZpnCMMDGZFDZKEODOiPPEQFXLriWr/TjXzhPPmG5bkAztPsOARIcGQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5188,9 +5188,9 @@ } }, "rollup": { - "version": "2.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.59.0.tgz", - "integrity": "sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==", + "version": "2.60.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.0.tgz", + "integrity": "sha512-cHdv9GWd58v58rdseC8e8XIaPUo8a9cgZpnCMMDGZFDZKEODOiPPEQFXLriWr/TjXzhPPmG5bkAztPsOARIcGQ==", "dev": true, "requires": { "fsevents": "~2.3.2" From dd1ab61bd1b5fa79e4245226431a5141b3073c38 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Tue, 16 Nov 2021 00:48:08 +0200 Subject: [PATCH 218/306] Fixup #7068 and add test (#7781) --- spec/suites/layer/vector/CanvasSpec.js | 19 +++++++++++++++++++ src/layer/vector/Canvas.js | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/spec/suites/layer/vector/CanvasSpec.js b/spec/suites/layer/vector/CanvasSpec.js index 512bdd9c03c..7506500fa68 100644 --- a/spec/suites/layer/vector/CanvasSpec.js +++ b/spec/suites/layer/vector/CanvasSpec.js @@ -137,6 +137,25 @@ describe('Canvas', function () { .down().moveBy(20, 10, 200).up(); }); + it("does fire mousedown on layer after dragging map", function (done) { // #7775 + var spy = sinon.spy(); + var circle = L.circle(p2ll(300, 300)).addTo(map); + circle.on('mousedown', spy); + + var hand = new Hand({ + timing: 'fastframe', + onStop: function () { + expect(spy.callCount).to.eql(2); + done(); + } + }); + var mouse = hand.growFinger('mouse'); + + mouse.wait(100) + .moveTo(300, 300, 0).down().moveBy(5, 0, 20).up() + .moveTo(100, 100, 0).down().moveBy(5, 0, 20).up() + .moveTo(300, 300, 0).down().moveBy(5, 0, 20).up(); + }); }); describe("#events(interactive=false)", function () { diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index bc364cc8c4e..2c5a3dfde9e 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -350,7 +350,7 @@ export var Canvas = Renderer.extend({ for (var order = this._drawFirst; order; order = order.next) { layer = order.layer; if (layer.options.interactive && layer._containsPoint(point)) { - if (!(e.type === 'click' || e.type !== 'preclick') || !this._map._draggableMoved(layer)) { + if (!(e.type === 'click' || e.type === 'preclick') || !this._map._draggableMoved(layer)) { clickedLayer = layer; } } From 3466cbba34351ee0d7477a83eb0215cc0e6b454b Mon Sep 17 00:00:00 2001 From: Simon Champion Date: Tue, 16 Nov 2021 09:14:06 +0000 Subject: [PATCH 219/306] Reset width & padding to prevent cascading CSS from breaking image rendering (#6843) --- dist/leaflet.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dist/leaflet.css b/dist/leaflet.css index d253c057ba2..6a7c146fb18 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -53,6 +53,8 @@ .leaflet-container .leaflet-tile { max-width: none !important; max-height: none !important; + width: auto; + padding: 0; } .leaflet-container.leaflet-touch-zoom { From a0efd4921fdb6f221bc8504650bd3a2eff411964 Mon Sep 17 00:00:00 2001 From: Falke Design Date: Mon, 22 Nov 2021 10:32:04 +0100 Subject: [PATCH 220/306] Fix current error in the maser (SVG width: auto in IE) (#7793) * Remove width: auto from svg layer * Lint css * Replaced with tabs * Format css --- dist/leaflet.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 6a7c146fb18..bdcde50cc5e 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -45,7 +45,10 @@ } /* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ /* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ -.leaflet-container .leaflet-overlay-pane svg, +.leaflet-container .leaflet-overlay-pane svg { + max-width: none !important; + max-height: none !important; + } .leaflet-container .leaflet-marker-pane img, .leaflet-container .leaflet-shadow-pane img, .leaflet-container .leaflet-tile-pane img, From f1d8644a8a9ce13a0213f81e11537e0dc8ae7b88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Nov 2021 12:14:24 +0000 Subject: [PATCH 221/306] Bump rollup from 2.60.0 to 2.60.1 Bumps [rollup](https://github.com/rollup/rollup) from 2.60.0 to 2.60.1. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v2.60.0...v2.60.1) --- updated-dependencies: - dependency-name: rollup dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e340d9de744..cc752645684 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2557,9 +2557,9 @@ } }, "node_modules/rollup": { - "version": "2.60.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.0.tgz", - "integrity": "sha512-cHdv9GWd58v58rdseC8e8XIaPUo8a9cgZpnCMMDGZFDZKEODOiPPEQFXLriWr/TjXzhPPmG5bkAztPsOARIcGQ==", + "version": "2.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", + "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5188,9 +5188,9 @@ } }, "rollup": { - "version": "2.60.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.0.tgz", - "integrity": "sha512-cHdv9GWd58v58rdseC8e8XIaPUo8a9cgZpnCMMDGZFDZKEODOiPPEQFXLriWr/TjXzhPPmG5bkAztPsOARIcGQ==", + "version": "2.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", + "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", "dev": true, "requires": { "fsevents": "~2.3.2" From 2488cfc9ca6dbcc9ae487f03f7c169faf98e7fc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Nov 2021 12:14:17 +0000 Subject: [PATCH 222/306] Bump eslint from 8.2.0 to 8.3.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.2.0 to 8.3.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.2.0...v8.3.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 80 +++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc752645684..7ff235a5484 100644 --- a/package-lock.json +++ b/package-lock.json @@ -202,9 +202,9 @@ } }, "node_modules/acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -833,9 +833,9 @@ } }, "node_modules/eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", - "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", + "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.0.4", @@ -847,10 +847,10 @@ "doctrine": "^3.0.0", "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", + "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.1.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -894,9 +894,9 @@ "dev": true }, "node_modules/eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -934,23 +934,23 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", + "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", "dev": true, "dependencies": { - "acorn": "^8.5.0", + "acorn": "^8.6.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" + "eslint-visitor-keys": "^3.1.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3354,9 +3354,9 @@ } }, "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", "dev": true }, "acorn-jsx": { @@ -3850,9 +3850,9 @@ "dev": true }, "eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", - "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", + "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", "dev": true, "requires": { "@eslint/eslintrc": "^1.0.4", @@ -3864,10 +3864,10 @@ "doctrine": "^3.0.0", "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", + "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.1.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -3902,9 +3902,9 @@ "dev": true }, "eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -3929,20 +3929,20 @@ } }, "eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", "dev": true }, "espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", + "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", "dev": true, "requires": { - "acorn": "^8.5.0", + "acorn": "^8.6.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" + "eslint-visitor-keys": "^3.1.0" } }, "esquery": { From 9f0a6225d49da1e8e21a574de85b9e7055c2ab0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Nov 2021 12:14:10 +0000 Subject: [PATCH 223/306] Bump karma from 6.3.8 to 6.3.9 Bumps [karma](https://github.com/karma-runner/karma) from 6.3.8 to 6.3.9. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v6.3.8...v6.3.9) --- updated-dependencies: - dependency-name: karma dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ff235a5484..4407ebed5f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1643,9 +1643,9 @@ "dev": true }, "node_modules/karma": { - "version": "6.3.8", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.8.tgz", - "integrity": "sha512-10wBBU9S0lBHhbCNfmmbWQaY5C1bXlKdnvzN2QKThujCI/+DKaezrI08l6bfTlpJ92VsEboq3zYKpXwK6DOi3A==", + "version": "6.3.9", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.9.tgz", + "integrity": "sha512-E/MqdLM9uVIhfuyVnrhlGBu4miafBdXEAEqCmwdEMh3n17C7UWC/8Kvm3AYKr91gc7scutekZ0xv6rxRaUCtnw==", "dev": true, "dependencies": { "body-parser": "^1.19.0", @@ -4470,9 +4470,9 @@ "dev": true }, "karma": { - "version": "6.3.8", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.8.tgz", - "integrity": "sha512-10wBBU9S0lBHhbCNfmmbWQaY5C1bXlKdnvzN2QKThujCI/+DKaezrI08l6bfTlpJ92VsEboq3zYKpXwK6DOi3A==", + "version": "6.3.9", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.9.tgz", + "integrity": "sha512-E/MqdLM9uVIhfuyVnrhlGBu4miafBdXEAEqCmwdEMh3n17C7UWC/8Kvm3AYKr91gc7scutekZ0xv6rxRaUCtnw==", "dev": true, "requires": { "body-parser": "^1.19.0", From 4a282830788b37ad68839e1301000fedbf4eb5e4 Mon Sep 17 00:00:00 2001 From: Stefano Cudini Date: Tue, 23 Nov 2021 11:59:37 +0100 Subject: [PATCH 224/306] add new in plugin lists (#7631) * wrong method name * add plugin layer json --- docs/plugins.md | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/docs/plugins.md b/docs/plugins.md index 53528b77807..2ca1dce3abd 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -991,6 +991,15 @@ Load your own data from various GIS formats. Gherardo Varando + + + Leaflet LayerJSON + + Simple way for transform any JSON data source in a Leaflet Layer, load JSON data in layer and minimize remote requests with caching system Demo. + + Stefano Cudini + + @@ -2826,7 +2835,7 @@ Plugins that search for overlays and enhance how to display information about th A control for search Markers/Features location by custom property in LayerGroup/GeoJSON. Support AJAX/JSONP, Autocompletion and 3rd party service - Stefano Cudini + Stefano Cudini @@ -2984,10 +2993,10 @@ These plugins help users select either overlays or areas in the map. Leaflet GeoJSON Selector - Leaflet Control for selection from GeoJSON feature in an interactive list and map (Demo). + Leaflet Control for selection from GeoJSON feature in an interactive list and map (Demo). - Stefano Cudini + Stefano Cudini @@ -3129,7 +3138,7 @@ The following plugins enhance or extend `L.Control.Layers`. Leaflet Control Layers extended for group of layers and icons legend - Stefano Cudini + Stefano Cudini @@ -3778,10 +3787,10 @@ Show the geographical coordinates under the mouse cursor in different ways. Leaflet Location Picker - Simple location picker with mini Leaflet map (Demo) + Simple location picker with mini Leaflet map (Demo) - Stefano Cudini + Stefano Cudini @@ -4379,7 +4388,7 @@ Plugins that extend Leaflet's geolocation capabilities. A leaflet control plugin to build a simple rotating compass - Stefano Cudini + Stefano Cudini From dd975a668f5db5c71747db48c26ff9b47e29439b Mon Sep 17 00:00:00 2001 From: Damian Czapiewski Date: Tue, 23 Nov 2021 12:00:08 +0100 Subject: [PATCH 225/306] Add leaflet-place-groups-picker to plugins list (#7412) --- docs/plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 2ca1dce3abd..83c4755e8f6 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1315,6 +1315,15 @@ The following plugins provide new ways of displaying overlay data information. These plugins provide new markers or news ways of converting abstract data into images in your screen. Leaflet users versed in GIS also know these as symbolizers. + + + + + +
      PluginDescriptionMaintainer
      + leaflet-place-groups-picker + + Plugin for the Leaflet maps that allows grouping places in groups whose visibility can be toggled. + + damianc +
      Leaflet.RoughCanvas From 913e0e99b678622f1e90448a4899c3f5716fbcd7 Mon Sep 17 00:00:00 2001 From: Ruben Holthuijsen <39499953+rhlt@users.noreply.github.com> Date: Tue, 23 Nov 2021 12:00:29 +0100 Subject: [PATCH 226/306] Update plugins.md with my own plugin (#7392) --- docs/plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 83c4755e8f6..87bdbb87c52 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -4409,6 +4409,15 @@ Plugins that extend Leaflet's geolocation capabilities. Michael Schmidt-Voigt
      + Geolet + + A simple but highly customizable geolocation plugin for Leaflet + + Ruben Holthuijsen +
      From ba8153673464a5d7774e3b1d96eb0ea1981532f4 Mon Sep 17 00:00:00 2001 From: Luca Fabbri Date: Tue, 23 Nov 2021 12:00:48 +0100 Subject: [PATCH 227/306] Adding leaflet-area-select to the plugin list (#7367) --- docs/plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 87bdbb87c52..a0c607ec15d 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -3062,6 +3062,17 @@ These plugins help users select either overlays or areas in the map. Erick S Escalante Olano + + + @bopen/leaflet-area-selection + + + leaflet-area-selection allows to easily select a polygonal area on the map (see the demo) + + + B-Open + + From ef3e4f0b47886dd5f8bdc1eeeb0a2d65a3194ec5 Mon Sep 17 00:00:00 2001 From: An Tran Date: Tue, 23 Nov 2021 06:01:01 -0500 Subject: [PATCH 228/306] Update plugins.md (#6547) Added Leaflet GeoSSE plugin to load real time data with server sent events. --- docs/plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index a0c607ec15d..5bcc7bd5fb4 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -1009,6 +1009,15 @@ Load your own data from various GIS formats. Load dynamic data which is updated in the map, or load GIS vector data in non-standard ways. + + + + + + + + +
      PluginDescriptionMaintainer
      + Leaflet GeoSSE + + Add realtime data to a Leaflet map using server sent events. + + An Tran +
      Leaflet Realtime From 371672166490984b3fa990819f17b3f3f078c6f2 Mon Sep 17 00:00:00 2001 From: "Daniel J. Dufour" Date: Tue, 23 Nov 2021 06:01:18 -0500 Subject: [PATCH 229/306] Added GeoRasterLayer Plugin (#6534) --- docs/plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index 5bcc7bd5fb4..e7e5b5f5260 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -389,6 +389,15 @@ Plugins for loading basemaps or GIS raster layers in common (albeit non-default) Stuart Matthews
      + GeoRasterLayer + + Display small and large GeoTIFF files with configurable resolution. Built for simplicity and performance. Integrates with GeoBlaze, a JavaScript raster analysis library. See the demo. + + Daniel J. Dufour +
      Leaflet.projwmts From 0b603eaf83d1761a3e97bc1b3c9218b076edd916 Mon Sep 17 00:00:00 2001 From: Jon Koops Date: Tue, 23 Nov 2021 12:04:23 +0100 Subject: [PATCH 230/306] Add Leaflet.NonTiledLayers to plugins (#7802) --- docs/plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index e7e5b5f5260..b4282ccb4cf 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -684,6 +684,16 @@ The following plugins change the way that tile or image layers are displayed in Thorbjørn Horgen
      + Leaflet.NonTiledLayers + + A Leaflet layer for non-tiled overlays. + (Demo). + + PTV Logistics +
      From f4d8f1083ba4e0ee49d8e6bf4fd0805b416ad7df Mon Sep 17 00:00:00 2001 From: williamlow <44437051+williamlow@users.noreply.github.com> Date: Tue, 23 Nov 2021 11:46:39 +0000 Subject: [PATCH 231/306] Update plugins.md (Leaflet.Signposts) (#7786) Submitting new Leaflet plugin under User Interface: Leaflet.Signposts --- docs/plugins.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/plugins.md b/docs/plugins.md index b4282ccb4cf..6529e745af8 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -4334,6 +4334,18 @@ Buttons, sliders, toolbars, sidebars, and panels. Adam Mertel + + + Leaflet.Signposts + + + + Guides users to points outside the current map view with directional arrows and a count of points in each given direction. See demo. + + + William Low + + From 5eca46962d1c1ab376395b622480bdbda64edf8d Mon Sep 17 00:00:00 2001 From: johnd0e Date: Thu, 25 Nov 2021 16:47:35 +0200 Subject: [PATCH 232/306] add/removePointerListener: tolerate wrong event names (#7808) --- spec/suites/dom/DomEvent.PointerSpec.js | 5 +++++ src/dom/DomEvent.Pointer.js | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/spec/suites/dom/DomEvent.PointerSpec.js b/spec/suites/dom/DomEvent.PointerSpec.js index f44df672ef2..a190cb46d83 100644 --- a/spec/suites/dom/DomEvent.PointerSpec.js +++ b/spec/suites/dom/DomEvent.PointerSpec.js @@ -64,6 +64,11 @@ describe('DomEvent.Pointer', function () { }); }); + it('does not throw on invalid event names', function () { + L.DomEvent.on(el, 'touchleave', L.Util.falseFn); + L.DomEvent.off(el, 'touchleave', L.Util.falseFn); + }); + it('simulates touch events with correct properties', function () { function containIn(props, evt) { if (Array.isArray(props)) { diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index 1fa8a902136..a050cdecdad 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -31,12 +31,20 @@ export function addPointerListener(obj, type, handler) { if (type === 'touchstart') { _addPointerDocListener(); } + if (!handle[type]) { + console.warn('wrong event specified:', type); + return L.Util.falseFn; + } handler = handle[type].bind(this, handler); obj.addEventListener(pEvent[type], handler, false); return handler; } export function removePointerListener(obj, type, handler) { + if (!pEvent[type]) { + console.warn('wrong event specified:', type); + return; + } obj.removeEventListener(pEvent[type], handler, false); } From 8eb9ac246152becc9f05c78bc6003255d01062ef Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 25 Nov 2021 15:54:50 +0100 Subject: [PATCH 233/306] Converted Plugins.md to single files (jekyll) (#7805) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * WIP: Minimal jekyll setup for handling the plugins webpage in a data-driven manner. * Docs: Jekyll collections config, whitespace * Add plugins * Remove special chars from names and remove default value from compatible-v0 * Push new plugin files * Rename to plugins.md * Update Plugins * Update links in plugins * Update Links * Move plugins into category folders * Add `template.md` and update PLUGIN-GUIDE.md * PR #6307 * PR #6971 * PR #7043 * PR #7130 * Fix Url #7442 * PR #7513 * Update Author #7554 * PR #7590 * PR #7640 * PR #7760 * Update template.md Co-authored-by: Iván Sánchez Ortega --- PLUGIN-GUIDE.md | 2 +- docs/_config.yml | 5 + docs/_includes/plugin_category_table.html | 22 + .../3rd-party-integration/abp-usermap-mybb.md | 12 + .../3rd-party-integration/joomla-3-x.md | 12 + .../3rd-party-integration/leaflet-easymap.md | 12 + .../leaflet-editinosm.md | 12 + .../3rd-party-integration/leaflet-facebook.md | 12 + .../leaflet-for-drupal.md | 12 + .../map-block-leaflet.md | 12 + .../3rd-party-integration/maps-marker-pro.md | 12 + .../_plugins/3rd-party-integration/maptiks.md | 12 + .../wordpress-leaflet-map.md | 12 + .../wp-locations-and-areas.md | 12 + .../3rd-party-integration/wp-mapit.md | 12 + .../3rd-party-integration/wp-open-user-map.md | 12 + .../3rd-party-integration/wptripsummary.md | 12 + .../3rd-party-integration/yii2-locator.md | 12 + .../bopenleafletareaselection.md | 12 + .../l-control-linestringselect.md | 12 + .../leaflet-areaselect.md | 12 + .../leaflet-cheaplayerat.md | 12 + .../leaflet-featureselect.md | 12 + .../leaflet-geojson-selector.md | 12 + .../leaflet-selectareafeature.md | 12 + .../area-overlay-selection/leafletlasso.md | 12 + .../leafletlocationfilter.md | 12 + .../leafletselectpolygons.md | 12 + .../area-overlay-selection/leafletshades.md | 12 + docs/_plugins/basemap-formats/azgsleaflet.md | 12 + .../basemap-formats/cartodbleaflet.md | 12 + .../basemap-formats/georasterlayer.md | 12 + .../basemap-formats/l-tilelayer-wmts.md | 12 + docs/_plugins/basemap-formats/leaflet-bpg.md | 12 + .../leaflet-canvaslayer-field.md | 12 + .../leaflet-geojson-encoded.md | 12 + .../leaflet-nontiledlayer-wcs.md | 12 + .../basemap-formats/leaflet-projwmts.md | 12 + .../leaflet-tilelayer-mbtiles.md | 12 + .../basemap-formats/leaflet-tilelayer-wmts.md | 12 + docs/_plugins/basemap-formats/leaflet-wms.md | 12 + docs/_plugins/basemap-formats/leaflet2gis.md | 12 + .../basemap-formats/leafletgeotiff.md | 12 + .../basemap-formats/leaflettilejson.md | 12 + .../basemap-formats/tilelayer-geojson.md | 12 + .../azure-maps-leaflet-plugin.md | 12 + .../basemap-providers/bing-maps-layer.md | 12 + .../basemap-providers/esri-leaflet.md | 12 + .../l-gridlayer-googlemutant.md | 12 + .../basemap-providers/l-mapkitmutant.md | 12 + .../basemap-providers/l-tilelayer-here.md | 12 + .../l-tilelayer-kartverket.md | 12 + .../leaflet-chinesetmsproviders.md | 12 + .../basemap-providers/leaflet-gibs.md | 12 + .../leaflet-koreantmsproviders.md | 12 + .../basemap-providers/leaflet-spain-wms.md | 12 + .../leaflet-tilelayer-here.md | 12 + .../leaflet-tilelayer-hongkong.md | 12 + .../leaflet-tilelayer-mierune.md | 12 + .../leaflet-tilelayer-swiss.md | 12 + .../basemap-providers/leafletproviders.md | 12 + .../_plugins/basemap-providers/polarmap-js.md | 12 + .../basemap-providers/supermap-leaflet.md | 12 + .../bookmarked-pan-zoom/leaflet-bookmarks.md | 12 + .../leaflet-defaultextent.md | 12 + .../leaflet-locationlist.md | 12 + .../leaflet-navigation-toolbar.md | 12 + .../leaflet-restoreview.md | 12 + .../bookmarked-pan-zoom/leaflet-showall.md | 12 + .../bookmarked-pan-zoom/leaflet-viewcenter.md | 12 + .../bookmarked-pan-zoom/leaflet-zoomhome.md | 12 + .../bookmarked-pan-zoom/leaflethash.md | 12 + .../bookmarked-pan-zoom/leaflethistory.md | 12 + .../bookmarked-pan-zoom/leafletviewmeta.md | 12 + .../bookmarked-pan-zoom/leafletzoommin.md | 12 + .../leaflet-conditionallayer.md | 12 + .../leaflet-deflate.md | 12 + .../leaflet-featuregroup-subgroup.md | 12 + .../leaflet-gridcluster.md | 12 + .../leaflet-layergroup-collision.md | 12 + .../leaflet-markercluster.md | 12 + .../leaflettooltiplayout.md | 12 + .../overlapping-marker-spiderfier.md | 12 + .../clustering-decluttering/prunecluster.md | 12 + .../clustering-decluttering/qcluster.md | 12 + .../data-providers/leaflet-dbpedialayer.md | 12 + .../data-providers/leaflet-freietonne.md | 12 + .../data-providers/leaflet-geographphotos.md | 12 + .../data-providers/leaflet-overpass-layer.md | 12 + .../data-providers/leaflet-rainviewer.md | 12 + .../data-providers/leaflet-vector-layers.md | 12 + .../leafletenvironmentallayers.md | 12 + docs/_plugins/data-providers/leafletradar.md | 12 + .../data-providers/leafletwikipedia.md | 12 + .../data-providers/windyleafletplugin.md | 12 + docs/_plugins/dataviz/geogrid-js.md | 12 + docs/_plugins/dataviz/jquerystorymap.md | 12 + .../dataviz/leaflet-canvasflowmaplayer.md | 12 + docs/_plugins/dataviz/leaflet-d3svgoverlay.md | 12 + .../leaflet-data-visualization-framework.md | 12 + docs/_plugins/dataviz/leaflet-for-r.md | 12 + docs/_plugins/dataviz/leaflet-glify-layer.md | 12 + docs/_plugins/dataviz/leaflet-glify.md | 12 + .../dataviz/leaflet-migrationlayer.md | 12 + docs/_plugins/dataviz/leaflet-pixioverlay.md | 12 + docs/_plugins/dataviz/leaflet-quadtree.md | 12 + docs/_plugins/dataviz/leafletecharts.md | 12 + docs/_plugins/dataviz/leafletpartition.md | 12 + docs/_plugins/dataviz/leafletvelocity.md | 12 + docs/_plugins/dataviz/mapboxglleaflet.md | 12 + docs/_plugins/dataviz/raphaellayer.md | 12 + .../leaflet-ajax.md | 12 + .../leaflet-geosse.md | 12 + .../leaflet-indoor.md | 12 + .../leaflet-liveupdate.md | 12 + .../leaflet-mytrack.md | 12 + .../leaflet-pouch.md | 12 + .../leaflet-realtime.md | 12 + .../leaflet-ugeojson.md | 12 + docs/_plugins/edit-geometries/l-geoman.md | 12 + .../edit-geometries/leaflet-clipper.md | 12 + .../leaflet-control-paintpolygon.md | 12 + .../edit-geometries/leaflet-draggablelines.md | 12 + docs/_plugins/edit-geometries/leaflet-draw.md | 12 + .../leaflet-editable-polyline.md | 12 + .../edit-geometries/leaflet-editable.md | 12 + .../leaflet-editablehandlers.md | 12 + .../edit-geometries/leaflet-freedraw.md | 12 + .../edit-geometries/leaflet-illustrate.md | 12 + .../edit-geometries/leaflet-mappaint.md | 12 + .../edit-geometries/leaflet-path-drag.md | 12 + .../edit-geometries/leaflet-path-transform.md | 12 + .../edit-geometries/leaflet-pather.md | 12 + docs/_plugins/edit-geometries/leaflet-pin.md | 12 + .../edit-geometries/leaflet-plotter.md | 12 + .../edit-geometries/leaflet-segmentedit.md | 12 + .../edit-geometries/leaflet-simplemarkers.md | 12 + docs/_plugins/edit-geometries/leaflet-snap.md | 12 + .../edit-geometries/leaflet-storage.md | 12 + .../edit-geometries/leaflet-styleeditor.md | 12 + docs/_plugins/edit-geometries/leafletcraft.md | 12 + docs/_plugins/events/l-draggableenhancer.md | 12 + docs/_plugins/events/l-sleep.md | 12 + docs/_plugins/events/l-spotlight.md | 12 + docs/_plugins/events/leaflet-almostover.md | 12 + .../_plugins/events/leaflet-clicktolerance.md | 12 + .../events/leaflet-controlledbounds.md | 12 + .../events/leaflet-gesturehandling.md | 12 + docs/_plugins/events/leaflet-overintent.md | 12 + docs/_plugins/events/leaflet-touch-helper.md | 12 + docs/_plugins/events/leaflet-visualclick.md | 12 + docs/_plugins/events/leafletactivearea.md | 12 + docs/_plugins/events/singleclick.md | 12 + .../angular-leaflet-directive.md | 12 + .../frameworks-build-systems/emberleaflet.md | 12 + .../frameworks-build-systems/famousmap.md | 12 + .../frameworks-build-systems/gwtyleaflet.md | 12 + .../frameworks-build-systems/jsf2leaf.md | 12 + .../l-control-bootstrapmodal.md | 12 + .../l-control-jquerydialog.md | 12 + .../leaflet-control-angular.md | 12 + .../frameworks-build-systems/leaflet-css.md | 12 + .../frameworks-build-systems/leaflet-i18n.md | 12 + .../frameworks-build-systems/leaflet-jsf.md | 12 + .../leaflet-layerconfig.md | 12 + .../leaflet-map-builder.md | 12 + .../leaflet-map-component.md | 12 + .../leaflet-popup-angular.md | 12 + .../leaflet-yeoman-generator.md | 12 + .../leaflet-zoomlevel-css-class.md | 12 + .../leafletdefaulticoncompatibility.md | 12 + .../leafletgeoserverrequest.md | 12 + .../frameworks-build-systems/leafletmap.md | 12 + .../leafletrails-gem.md | 12 + .../frameworks-build-systems/meteorleaflet.md | 12 + .../frameworks-build-systems/ngxleaflet.md | 12 + .../frameworks-build-systems/reactleaflet.md | 12 + .../tiny-leaflet-directive.md | 12 + .../frameworks-build-systems/vleaflet.md | 12 + .../frameworks-build-systems/vue2leaflet.md | 12 + .../yaga-leafletng2.md | 12 + .../fullscreen-controls/leaflet-fullscreen.md | 12 + .../fullscreen-controls/leaflet-zoomfs.md | 12 + .../geocoding/esri-leaflet-geocoder.md | 12 + docs/_plugins/geocoding/l-highlight.md | 12 + .../geocoding/leaflet-autocomplete.md | 12 + .../leaflet-control-bing-geocoder.md | 12 + .../geocoding/leaflet-control-geocoder.md | 12 + .../geocoding/leaflet-control-osm-geocoder.md | 12 + .../geocoding/leaflet-geoip-locator.md | 12 + docs/_plugins/geocoding/leaflet-geonames.md | 12 + docs/_plugins/geocoding/leaflet-geosearch.md | 12 + .../geocoding/leaflet-locationiq-geocoder.md | 12 + .../geocoding/leaflet-opencage-search.md | 12 + docs/_plugins/geocoding/leaflet-search.md | 12 + .../geocoding/pelias-leaflet-plugin.md | 12 + docs/_plugins/geolocation/geolet.md | 12 + docs/_plugins/geolocation/l-locationshare.md | 12 + .../geolocation/leaflet-accurateposition.md | 12 + .../geolocation/leaflet-control-compass.md | 12 + docs/_plugins/geolocation/leaflet-locate.md | 12 + docs/_plugins/geoprocessing/arc-js.md | 12 + docs/_plugins/geoprocessing/greinerhormann.md | 12 + .../geoprocessing/leaflet-antimeridian.md | 12 + docs/_plugins/geoprocessing/leaflet-buffer.md | 12 + .../geoprocessing/leaflet-geometryutil.md | 12 + .../geoprocessing/leaflet-layerindex.md | 12 + docs/_plugins/geoprocessing/leaflet-utm.md | 12 + docs/_plugins/geoprocessing/leafletpip.md | 12 + .../geoprocessing/leafletspatialprefixtree.md | 12 + docs/_plugins/geoprocessing/proj4leaflet.md | 12 + docs/_plugins/heatmaps/heatcanvas.md | 12 + docs/_plugins/heatmaps/heatmap-js.md | 12 + docs/_plugins/heatmaps/leaflet-divheatmap.md | 12 + docs/_plugins/heatmaps/leaflet-heat.md | 12 + .../heatmaps/leaflet-smoothpolygons.md | 12 + docs/_plugins/heatmaps/leafletsolrheatmap.md | 12 + docs/_plugins/heatmaps/maskcanvas.md | 12 + docs/_plugins/heatmaps/webgl-heatmap.md | 12 + .../interactive-pan-zoom/l-control-zoombar.md | 12 + .../interactive-pan-zoom/leaflet-borderpan.md | 12 + .../interactive-pan-zoom/leaflet-boxzoom.md | 12 + .../leaflet-doublerightclickzoom.md | 12 + .../leaflet-doubletouchdragzoom.md | 12 + .../leaflet-gamecontroller.md | 12 + .../interactive-pan-zoom/leaflet-limitzoom.md | 12 + .../leaflet-pancontrol.md | 12 + .../leaflet-twofingerzoom.md | 12 + .../interactive-pan-zoom/leaflet-zoombox.md | 12 + .../interactive-pan-zoom/leaflet-zoominfo.md | 12 + .../interactive-pan-zoom/leaflet-zoomlabel.md | 12 + .../interactive-pan-zoom/leaflet-zoompanel.md | 12 + .../leaflet-zoomslider.md | 12 + .../leaflet-activelayers.md | 12 + .../leaflet-autolayers.md | 12 + .../leaflet-basemaps.md | 12 + .../leaflet-categorized-layers.md | 12 + .../leaflet-control-appearance.md | 12 + .../leaflet-control-layers-tree.md | 12 + .../leaflet-control-order-layers.md | 12 + .../leaflet-groupedlayercontrol.md | 12 + .../leaflet-layertreeplugin.md | 12 + .../leaflet-panel-layers.md | 12 + .../leaflet-selectlayers.md | 12 + .../leaflet-styledlayercontrol.md | 12 + .../leaflet-uniformcontrol.md | 12 + .../leafleticonlayers.md | 12 + docs/_plugins/markers-renderers/l-donut.md | 12 + .../_plugins/markers-renderers/leaflet-arc.md | 12 + .../markers-renderers/leaflet-arrowcircle.md | 12 + .../leaflet-awesomemarkers.md | 12 + .../leaflet-beautifymarkers.md | 12 + .../markers-renderers/leaflet-bezier.md | 12 + .../markers-renderers/leaflet-boatmarker.md | 12 + .../leaflet-canvasmarkers.md | 12 + .../markers-renderers/leaflet-centermarker.md | 12 + .../markers-renderers/leaflet-curve.md | 12 + .../markers-renderers/leaflet-customlayer.md | 12 + .../markers-renderers/leaflet-edgemarker.md | 12 + .../markers-renderers/leaflet-ellipse.md | 12 + .../markers-renderers/leaflet-extramarkers.md | 12 + .../markers-renderers/leaflet-geodesic.md | 12 + .../markers-renderers/leaflet-geojsoncss.md | 12 + .../markers-renderers/leaflet-geotagphoto.md | 12 + .../markers-renderers/leaflet-glmarkers.md | 12 + .../markers-renderers/leaflet-greatcircle.md | 12 + .../leaflet-highlightablelayers.md | 12 + .../markers-renderers/leaflet-icon-glyph.md | 12 + .../markers-renderers/leaflet-label.md | 12 + .../leaflet-labeltextcollision.md | 12 + .../leaflet-lineextremities.md | 12 + .../markers-renderers/leaflet-magicmarker.md | 12 + .../markers-renderers/leaflet-makimarkers.md | 12 + .../leaflet-marker-highlight.md | 12 + .../markers-renderers/leaflet-marker-stack.md | 12 + .../leaflet-orientedmarker.md | 12 + .../leaflet-parallaxmarker.md | 12 + .../markers-renderers/leaflet-pattern.md | 12 + .../markers-renderers/leaflet-photo.md | 12 + .../leaflet-polyline-offset.md | 12 + .../leaflet-polylinedecorator.md | 12 + .../leaflet-repeatedmarkers.md | 12 + .../markers-renderers/leaflet-river.md | 12 + .../leaflet-rotated-marker.md | 12 + .../markers-renderers/leaflet-roughcanvas.md | 12 + .../markers-renderers/leaflet-speechbubble.md | 12 + .../markers-renderers/leaflet-sprite.md | 12 + .../markers-renderers/leaflet-streetlabels.md | 12 + .../leaflet-svgshapemarkers.md | 12 + .../markers-renderers/leaflet-swoopy.md | 12 + .../markers-renderers/leaflet-textpath.md | 12 + .../markers-renderers/leaflet-truesize.md | 12 + .../leaflet-vectormarkers.md | 12 + .../markers-renderers/leaflet-viewpoint.md | 12 + .../leafletaistracksymbol.md | 12 + .../leafletaistracksymbolsearch.md | 12 + .../markers-renderers/leafletarrowheads.md | 12 + .../markers-renderers/leafletchoropleth.md | 12 + .../markers-renderers/leafletcorridor.md | 12 + .../leafletdistancemarkers.md | 12 + .../markers-renderers/leafleticonpulse.md | 12 + .../markers-renderers/leafletlabeledcircle.md | 12 + .../leafletlayervisibility.md | 12 + .../markers-renderers/leafletmapkeyicon.md | 12 + .../leafletmarkerdirection.md | 12 + .../leafletplacegroupspicker.md | 12 + .../markers-renderers/leafletpolycolor.md | 12 + .../leafletpolygon-fillpattern.md | 12 + .../markers-renderers/leafletsemicircle.md | 12 + .../markers-renderers/leafletsimplestyle.md | 12 + .../markers-renderers/leafletsvgicon.md | 12 + .../markers-renderers/leaflettracksymbol.md | 12 + .../markers-renderers/leafletusermarker.md | 12 + .../markers-renderers/osm-buildings.md | 12 + .../measurement/leaflet-linearmeasurement.md | 12 + .../measurement/leaflet-measure-path.md | 12 + .../measurement/leaflet-measureareacontrol.md | 12 + .../measurement/leaflet-measurecontrol.md | 12 + .../measurement/leaflet-nauticscale.md | 12 + .../measurement/leaflet-polylinemeasure.md | 12 + .../measurement/leaflet-scalefactor.md | 12 + .../measurement/leafletgraphicscale.md | 12 + docs/_plugins/measurement/leafletmeasure.md | 12 + docs/_plugins/measurement/leafletreticle.md | 12 + docs/_plugins/measurement/leafletruler.md | 12 + .../leaflet-globeminimap.md | 12 + .../leaflet-layerscontrolminimap.md | 12 + .../leaflet-magnifyingglass.md | 12 + .../minimaps-synced-maps/leaflet-minimap.md | 12 + .../minimaps-synced-maps/leaflet-sync.md | 12 + .../minimaps-synced-maps/leafletclonelayer.md | 12 + .../leaflet-coordinates-control.md | 12 + .../mouse-coordinates/leaflet-coordinates.md | 12 + .../leaflet-coordprojection.md | 12 + .../leaflet-copy-coordinates-control.md | 12 + .../leaflet-location-picker.md | 12 + .../leaflet-mapcentercoord.md | 12 + .../mouse-coordinates/leaflet-mapcodes.md | 12 + .../leaflet-mousecoordinates.md | 12 + .../leaflet-mouseposition-ts.md | 12 + .../leaflet-mouseposition.md | 12 + .../leaflet-naccoordinates.md | 12 + .../leaflet-tilelayer-iip.md | 12 + .../non-map-base-layers/leafletfractal.md | 12 + .../non-map-base-layers/leafletiiif.md | 12 + .../leafletrastercoords.md | 12 + .../non-map-base-layers/tilelayer-deepzoom.md | 12 + .../non-map-base-layers/tilelayer-gigapan.md | 12 + .../non-map-base-layers/tilelayer-zoomify.md | 12 + .../leaflet-animatedmarker.md | 12 + .../overlay-animations/leaflet-antpath.md | 12 + .../leaflet-bouncemarker.md | 12 + .../leaflet-marker-slideto.md | 12 + .../overlay-animations/leaflet-motion.md | 12 + .../leaflet-movingmarker.md | 12 + .../leaflet-path-dashflow.md | 12 + .../leaflet-polyline-snakeanim.md | 12 + .../overlay-animations/leaflet-rain.md | 12 + .../leaflet-smoothmarkerbouncing.md | 12 + .../overlay-animations/leaflet-snow.md | 12 + .../leaflet-transitionedicon.md | 12 + .../leafletpointanimator.md | 12 + .../leaflettemporalgeojson.md | 12 + .../overlay-data-formats/leaflet-encoded.md | 12 + .../overlay-data-formats/leaflet-filegdb.md | 12 + .../overlay-data-formats/leaflet-filelayer.md | 12 + .../overlay-data-formats/leaflet-geocsv.md | 12 + .../overlay-data-formats/leaflet-gpx.md | 12 + .../overlay-data-formats/leaflet-layerjson.md | 12 + .../overlay-data-formats/leaflet-shapefile.md | 12 + .../leafletbetterscale.md | 12 + .../overlay-data-formats/leafletcsvtiles.md | 12 + .../overlay-data-formats/leafletgeopackage.md | 12 + .../overlay-data-formats/leafletkml.md | 12 + .../overlay-data-formats/leafletomnivore.md | 12 + .../overlay-data-formats/leafletwfst.md | 12 + .../_plugins/overlay-data-formats/qgis2web.md | 12 + docs/_plugins/overlay-data-formats/wicket.md | 12 + .../mapbbcoderelated-leaflet-plugins.md | 12 + .../plugins-by-pavel-shramov.md | 12 + .../plugin-collections/spectrum4leaflet.md | 12 + .../_plugins/print-export/leaflet-bigimage.md | 12 + .../print-export/leaflet-browser-print.md | 12 + docs/_plugins/print-export/leaflet-print.md | 12 + .../_plugins/print-export/leafleteasyprint.md | 12 + docs/_plugins/print-export/leafletimage.md | 12 + .../print-export/leafletrouteprint.md | 12 + docs/_plugins/routing/leaflet-reachability.md | 12 + docs/_plugins/routing/leaflet-routeboxer.md | 12 + .../routing/leaflet-routetoaddress.md | 12 + docs/_plugins/routing/leaflet-routing-amap.md | 12 + .../routing/leaflet-routing-machine.md | 12 + docs/_plugins/routing/leaflet-routing.md | 12 + docs/_plugins/routing/leaflet-travelnotes.md | 12 + .../routing/leaflet-tripgo-routing.md | 12 + docs/_plugins/routing/targomo-js.md | 12 + .../search-popups/l-tagfilterbutton.md | 12 + .../leaflet-animatedsearchbox.md | 12 + .../leaflet-geojsonautocomplete.md | 12 + .../search-popups/leaflet-revealosm.md | 12 + docs/_plugins/search-popups/leaflet-rrose.md | 12 + docs/_plugins/search-popups/leaflet-search.md | 12 + .../search-popups/leaflet-underneath.md | 12 + .../_plugins/search-popups/leaflet-utfgrid.md | 13 + .../search-popups/leafletcustomsearchbox.md | 12 + .../search-popups/leafletfusesearch.md | 12 + .../leafletgplacesautocomplete.md | 12 + .../search-popups/leafletpopupmodifier.md | 12 + .../search-popups/leafletresponsivepopup.md | 12 + .../synthetic-overlays/l-os-graticule.md | 12 + .../leaflet-autograticule.md | 12 + .../leaflet-edgescalebar.md | 12 + .../synthetic-overlays/leaflet-graticule.md | 12 + .../leaflet-latlnggraticule.md | 12 + .../synthetic-overlays/leaflet-maidenhead.md | 12 + .../synthetic-overlays/leaflet-metricgrid.md | 12 + .../leaflet-simplegraticule.md | 12 + .../synthetic-overlays/leaflet-sun.md | 12 + .../synthetic-overlays/leaflet-terminator.md | 12 + .../synthetic-overlays/leaflet-timezones.md | 12 + docs/_plugins/template.md | 12 + .../leaflet-control-detaillevel.md | 12 + .../leaflet-control-opacity.md | 12 + .../leaflet-control-sidebyside.md | 12 + .../leaflet-distortableimage.md | 12 + .../leaflet-distortablevideo.md | 12 + .../leaflet-imageoverlay-arrugator.md | 12 + .../leaflet-imageoverlay-rotate.md | 12 + .../leaflet-multispectral.md | 12 + .../leaflet-nontiledlayers.md | 12 + .../leaflet-opacitycontrols.md | 12 + .../leaflet-tilelayer-canvas.md | 12 + .../leaflet-tilelayer-colorfilter.md | 12 + .../leaflet-tilelayer-colorizr.md | 12 + .../leaflet-tilelayer-colorpicker.md | 12 + .../leaflet-tilelayer-gl.md | 12 + .../leaflet-tilelayer-glcolorscale.md | 12 + .../leaflet-tilelayer-gloperations.md | 12 + .../leaflet-tilelayer-mask.md | 12 + .../leaflet-tilelayer-pixelfilter.md | 12 + .../tilelayer-boundarycanvas.md | 12 + .../tile-image-display/tilelayer-grayscale.md | 12 + docs/_plugins/tile-load/leaflet-edgebuffer.md | 12 + .../leaflet-featuregroup-loadevents.md | 12 + .../tile-load/leaflet-functionaltilelayer.md | 12 + .../tile-load/leaflet-gridlayer-fadeout.md | 12 + docs/_plugins/tile-load/leaflet-loading.md | 12 + .../tile-load/leaflet-multitilelayer.md | 12 + docs/_plugins/tile-load/leaflet-offline.md | 12 + .../tile-load/leaflet-tilecorrection.md | 12 + .../tile-load/leaflet-tilelayer-fallback.md | 12 + docs/_plugins/tile-load/tilelayer-cordova.md | 12 + .../tile-load/tilelayer-pouchdbcached.md | 12 + .../time-elevation/leaflet-elevation.md | 12 + .../time-elevation/leaflet-heightgraph.md | 12 + .../time-elevation/leaflet-hex-timeslider.md | 12 + .../time-elevation/leaflet-hotline.md | 12 + .../time-elevation/leaflet-timedimension.md | 12 + .../leaflet-timeline-control.md | 12 + .../time-elevation/leaflet-timeline.md | 12 + .../time-elevation/leaflet-timelineslider.md | 12 + .../time-elevation/leaflet-timeslider.md | 12 + .../time-elevation/leaflet-topography.md | 12 + .../time-elevation/leaflet-trackplayback.md | 12 + .../time-elevation/leafletplayback.md | 12 + docs/_plugins/user-interface/l-credits.md | 12 + docs/_plugins/user-interface/l-easybutton.md | 12 + .../user-interface/leaflet-bootstrapzoom.md | 12 + .../leaflet-condensedattribution.md | 12 + .../user-interface/leaflet-contextmenu.md | 12 + .../user-interface/leaflet-control-custom.md | 12 + .../user-interface/leaflet-control-resizer.md | 12 + .../user-interface/leaflet-control-select.md | 12 + .../leaflet-coordinatedimagepreview.md | 12 + .../user-interface/leaflet-countryselect.md | 12 + .../_plugins/user-interface/leaflet-dialog.md | 12 + .../leaflet-geojsonlayerswitcher.md | 12 + .../user-interface/leaflet-htmllegend.md | 12 + .../_plugins/user-interface/leaflet-legend.md | 12 + .../user-interface/leaflet-messagebox.md | 12 + .../user-interface/leaflet-notifications.md | 12 + .../leaflet-resizablecontrol.md | 12 + .../user-interface/leaflet-signposts.md | 12 + .../user-interface/leaflet-slidemenu.md | 12 + .../_plugins/user-interface/leaflet-slider.md | 12 + docs/_plugins/user-interface/leaflet-spin.md | 12 + .../user-interface/leaflet-tilelegend.md | 12 + .../user-interface/leaflet-toolbar.md | 12 + .../user-interface/leaflet-weather.md | 12 + .../user-interface/leafletblurredlocation.md | 12 + .../leafletblurredlocationdisplay.md | 12 + .../user-interface/leafletcontrolwindow.md | 12 + .../_plugins/user-interface/leafletsidebar.md | 12 + .../user-interface/leafletsidebarv2.md | 12 + docs/_plugins/user-interface/sidebarv2.md | 12 + docs/_plugins/vector-tiles/geojsonvt.md | 12 + docs/_plugins/vector-tiles/hoverboard.md | 12 + .../vector-tiles/leaflet-mapboxvectortile.md | 12 + .../vector-tiles/leaflet-vectorgrid.md | 12 + .../vector-tiles/leaflet-vectortilelayer.md | 12 + .../_plugins/vector-tiles/leafletgeojsonvt.md | 12 + docs/plugins.md | 4978 +---------------- 502 files changed, 6050 insertions(+), 4934 deletions(-) create mode 100644 docs/_includes/plugin_category_table.html create mode 100644 docs/_plugins/3rd-party-integration/abp-usermap-mybb.md create mode 100644 docs/_plugins/3rd-party-integration/joomla-3-x.md create mode 100644 docs/_plugins/3rd-party-integration/leaflet-easymap.md create mode 100644 docs/_plugins/3rd-party-integration/leaflet-editinosm.md create mode 100644 docs/_plugins/3rd-party-integration/leaflet-facebook.md create mode 100644 docs/_plugins/3rd-party-integration/leaflet-for-drupal.md create mode 100644 docs/_plugins/3rd-party-integration/map-block-leaflet.md create mode 100644 docs/_plugins/3rd-party-integration/maps-marker-pro.md create mode 100644 docs/_plugins/3rd-party-integration/maptiks.md create mode 100644 docs/_plugins/3rd-party-integration/wordpress-leaflet-map.md create mode 100644 docs/_plugins/3rd-party-integration/wp-locations-and-areas.md create mode 100644 docs/_plugins/3rd-party-integration/wp-mapit.md create mode 100644 docs/_plugins/3rd-party-integration/wp-open-user-map.md create mode 100644 docs/_plugins/3rd-party-integration/wptripsummary.md create mode 100644 docs/_plugins/3rd-party-integration/yii2-locator.md create mode 100644 docs/_plugins/area-overlay-selection/bopenleafletareaselection.md create mode 100644 docs/_plugins/area-overlay-selection/l-control-linestringselect.md create mode 100644 docs/_plugins/area-overlay-selection/leaflet-areaselect.md create mode 100644 docs/_plugins/area-overlay-selection/leaflet-cheaplayerat.md create mode 100644 docs/_plugins/area-overlay-selection/leaflet-featureselect.md create mode 100644 docs/_plugins/area-overlay-selection/leaflet-geojson-selector.md create mode 100644 docs/_plugins/area-overlay-selection/leaflet-selectareafeature.md create mode 100644 docs/_plugins/area-overlay-selection/leafletlasso.md create mode 100644 docs/_plugins/area-overlay-selection/leafletlocationfilter.md create mode 100644 docs/_plugins/area-overlay-selection/leafletselectpolygons.md create mode 100644 docs/_plugins/area-overlay-selection/leafletshades.md create mode 100644 docs/_plugins/basemap-formats/azgsleaflet.md create mode 100644 docs/_plugins/basemap-formats/cartodbleaflet.md create mode 100644 docs/_plugins/basemap-formats/georasterlayer.md create mode 100644 docs/_plugins/basemap-formats/l-tilelayer-wmts.md create mode 100644 docs/_plugins/basemap-formats/leaflet-bpg.md create mode 100644 docs/_plugins/basemap-formats/leaflet-canvaslayer-field.md create mode 100644 docs/_plugins/basemap-formats/leaflet-geojson-encoded.md create mode 100644 docs/_plugins/basemap-formats/leaflet-nontiledlayer-wcs.md create mode 100644 docs/_plugins/basemap-formats/leaflet-projwmts.md create mode 100644 docs/_plugins/basemap-formats/leaflet-tilelayer-mbtiles.md create mode 100644 docs/_plugins/basemap-formats/leaflet-tilelayer-wmts.md create mode 100644 docs/_plugins/basemap-formats/leaflet-wms.md create mode 100644 docs/_plugins/basemap-formats/leaflet2gis.md create mode 100644 docs/_plugins/basemap-formats/leafletgeotiff.md create mode 100644 docs/_plugins/basemap-formats/leaflettilejson.md create mode 100644 docs/_plugins/basemap-formats/tilelayer-geojson.md create mode 100644 docs/_plugins/basemap-providers/azure-maps-leaflet-plugin.md create mode 100644 docs/_plugins/basemap-providers/bing-maps-layer.md create mode 100644 docs/_plugins/basemap-providers/esri-leaflet.md create mode 100644 docs/_plugins/basemap-providers/l-gridlayer-googlemutant.md create mode 100644 docs/_plugins/basemap-providers/l-mapkitmutant.md create mode 100644 docs/_plugins/basemap-providers/l-tilelayer-here.md create mode 100644 docs/_plugins/basemap-providers/l-tilelayer-kartverket.md create mode 100644 docs/_plugins/basemap-providers/leaflet-chinesetmsproviders.md create mode 100644 docs/_plugins/basemap-providers/leaflet-gibs.md create mode 100644 docs/_plugins/basemap-providers/leaflet-koreantmsproviders.md create mode 100644 docs/_plugins/basemap-providers/leaflet-spain-wms.md create mode 100644 docs/_plugins/basemap-providers/leaflet-tilelayer-here.md create mode 100644 docs/_plugins/basemap-providers/leaflet-tilelayer-hongkong.md create mode 100644 docs/_plugins/basemap-providers/leaflet-tilelayer-mierune.md create mode 100644 docs/_plugins/basemap-providers/leaflet-tilelayer-swiss.md create mode 100644 docs/_plugins/basemap-providers/leafletproviders.md create mode 100644 docs/_plugins/basemap-providers/polarmap-js.md create mode 100644 docs/_plugins/basemap-providers/supermap-leaflet.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leaflet-bookmarks.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leaflet-defaultextent.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leaflet-locationlist.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leaflet-navigation-toolbar.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leaflet-restoreview.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leaflet-showall.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leaflet-viewcenter.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leaflet-zoomhome.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leaflethash.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leaflethistory.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leafletviewmeta.md create mode 100644 docs/_plugins/bookmarked-pan-zoom/leafletzoommin.md create mode 100644 docs/_plugins/clustering-decluttering/leaflet-conditionallayer.md create mode 100644 docs/_plugins/clustering-decluttering/leaflet-deflate.md create mode 100644 docs/_plugins/clustering-decluttering/leaflet-featuregroup-subgroup.md create mode 100644 docs/_plugins/clustering-decluttering/leaflet-gridcluster.md create mode 100644 docs/_plugins/clustering-decluttering/leaflet-layergroup-collision.md create mode 100644 docs/_plugins/clustering-decluttering/leaflet-markercluster.md create mode 100644 docs/_plugins/clustering-decluttering/leaflettooltiplayout.md create mode 100644 docs/_plugins/clustering-decluttering/overlapping-marker-spiderfier.md create mode 100644 docs/_plugins/clustering-decluttering/prunecluster.md create mode 100644 docs/_plugins/clustering-decluttering/qcluster.md create mode 100644 docs/_plugins/data-providers/leaflet-dbpedialayer.md create mode 100644 docs/_plugins/data-providers/leaflet-freietonne.md create mode 100644 docs/_plugins/data-providers/leaflet-geographphotos.md create mode 100644 docs/_plugins/data-providers/leaflet-overpass-layer.md create mode 100644 docs/_plugins/data-providers/leaflet-rainviewer.md create mode 100644 docs/_plugins/data-providers/leaflet-vector-layers.md create mode 100644 docs/_plugins/data-providers/leafletenvironmentallayers.md create mode 100644 docs/_plugins/data-providers/leafletradar.md create mode 100644 docs/_plugins/data-providers/leafletwikipedia.md create mode 100644 docs/_plugins/data-providers/windyleafletplugin.md create mode 100644 docs/_plugins/dataviz/geogrid-js.md create mode 100644 docs/_plugins/dataviz/jquerystorymap.md create mode 100644 docs/_plugins/dataviz/leaflet-canvasflowmaplayer.md create mode 100644 docs/_plugins/dataviz/leaflet-d3svgoverlay.md create mode 100644 docs/_plugins/dataviz/leaflet-data-visualization-framework.md create mode 100644 docs/_plugins/dataviz/leaflet-for-r.md create mode 100644 docs/_plugins/dataviz/leaflet-glify-layer.md create mode 100644 docs/_plugins/dataviz/leaflet-glify.md create mode 100644 docs/_plugins/dataviz/leaflet-migrationlayer.md create mode 100644 docs/_plugins/dataviz/leaflet-pixioverlay.md create mode 100644 docs/_plugins/dataviz/leaflet-quadtree.md create mode 100644 docs/_plugins/dataviz/leafletecharts.md create mode 100644 docs/_plugins/dataviz/leafletpartition.md create mode 100644 docs/_plugins/dataviz/leafletvelocity.md create mode 100644 docs/_plugins/dataviz/mapboxglleaflet.md create mode 100644 docs/_plugins/dataviz/raphaellayer.md create mode 100644 docs/_plugins/dynamic-custom-data-loading/leaflet-ajax.md create mode 100644 docs/_plugins/dynamic-custom-data-loading/leaflet-geosse.md create mode 100644 docs/_plugins/dynamic-custom-data-loading/leaflet-indoor.md create mode 100644 docs/_plugins/dynamic-custom-data-loading/leaflet-liveupdate.md create mode 100644 docs/_plugins/dynamic-custom-data-loading/leaflet-mytrack.md create mode 100644 docs/_plugins/dynamic-custom-data-loading/leaflet-pouch.md create mode 100644 docs/_plugins/dynamic-custom-data-loading/leaflet-realtime.md create mode 100644 docs/_plugins/dynamic-custom-data-loading/leaflet-ugeojson.md create mode 100644 docs/_plugins/edit-geometries/l-geoman.md create mode 100644 docs/_plugins/edit-geometries/leaflet-clipper.md create mode 100644 docs/_plugins/edit-geometries/leaflet-control-paintpolygon.md create mode 100644 docs/_plugins/edit-geometries/leaflet-draggablelines.md create mode 100644 docs/_plugins/edit-geometries/leaflet-draw.md create mode 100644 docs/_plugins/edit-geometries/leaflet-editable-polyline.md create mode 100644 docs/_plugins/edit-geometries/leaflet-editable.md create mode 100644 docs/_plugins/edit-geometries/leaflet-editablehandlers.md create mode 100644 docs/_plugins/edit-geometries/leaflet-freedraw.md create mode 100644 docs/_plugins/edit-geometries/leaflet-illustrate.md create mode 100644 docs/_plugins/edit-geometries/leaflet-mappaint.md create mode 100644 docs/_plugins/edit-geometries/leaflet-path-drag.md create mode 100644 docs/_plugins/edit-geometries/leaflet-path-transform.md create mode 100644 docs/_plugins/edit-geometries/leaflet-pather.md create mode 100644 docs/_plugins/edit-geometries/leaflet-pin.md create mode 100644 docs/_plugins/edit-geometries/leaflet-plotter.md create mode 100644 docs/_plugins/edit-geometries/leaflet-segmentedit.md create mode 100644 docs/_plugins/edit-geometries/leaflet-simplemarkers.md create mode 100644 docs/_plugins/edit-geometries/leaflet-snap.md create mode 100644 docs/_plugins/edit-geometries/leaflet-storage.md create mode 100644 docs/_plugins/edit-geometries/leaflet-styleeditor.md create mode 100644 docs/_plugins/edit-geometries/leafletcraft.md create mode 100644 docs/_plugins/events/l-draggableenhancer.md create mode 100644 docs/_plugins/events/l-sleep.md create mode 100644 docs/_plugins/events/l-spotlight.md create mode 100644 docs/_plugins/events/leaflet-almostover.md create mode 100644 docs/_plugins/events/leaflet-clicktolerance.md create mode 100644 docs/_plugins/events/leaflet-controlledbounds.md create mode 100644 docs/_plugins/events/leaflet-gesturehandling.md create mode 100644 docs/_plugins/events/leaflet-overintent.md create mode 100644 docs/_plugins/events/leaflet-touch-helper.md create mode 100644 docs/_plugins/events/leaflet-visualclick.md create mode 100644 docs/_plugins/events/leafletactivearea.md create mode 100644 docs/_plugins/events/singleclick.md create mode 100644 docs/_plugins/frameworks-build-systems/angular-leaflet-directive.md create mode 100644 docs/_plugins/frameworks-build-systems/emberleaflet.md create mode 100644 docs/_plugins/frameworks-build-systems/famousmap.md create mode 100644 docs/_plugins/frameworks-build-systems/gwtyleaflet.md create mode 100644 docs/_plugins/frameworks-build-systems/jsf2leaf.md create mode 100644 docs/_plugins/frameworks-build-systems/l-control-bootstrapmodal.md create mode 100644 docs/_plugins/frameworks-build-systems/l-control-jquerydialog.md create mode 100644 docs/_plugins/frameworks-build-systems/leaflet-control-angular.md create mode 100644 docs/_plugins/frameworks-build-systems/leaflet-css.md create mode 100644 docs/_plugins/frameworks-build-systems/leaflet-i18n.md create mode 100644 docs/_plugins/frameworks-build-systems/leaflet-jsf.md create mode 100644 docs/_plugins/frameworks-build-systems/leaflet-layerconfig.md create mode 100644 docs/_plugins/frameworks-build-systems/leaflet-map-builder.md create mode 100644 docs/_plugins/frameworks-build-systems/leaflet-map-component.md create mode 100644 docs/_plugins/frameworks-build-systems/leaflet-popup-angular.md create mode 100644 docs/_plugins/frameworks-build-systems/leaflet-yeoman-generator.md create mode 100644 docs/_plugins/frameworks-build-systems/leaflet-zoomlevel-css-class.md create mode 100644 docs/_plugins/frameworks-build-systems/leafletdefaulticoncompatibility.md create mode 100644 docs/_plugins/frameworks-build-systems/leafletgeoserverrequest.md create mode 100644 docs/_plugins/frameworks-build-systems/leafletmap.md create mode 100644 docs/_plugins/frameworks-build-systems/leafletrails-gem.md create mode 100644 docs/_plugins/frameworks-build-systems/meteorleaflet.md create mode 100644 docs/_plugins/frameworks-build-systems/ngxleaflet.md create mode 100644 docs/_plugins/frameworks-build-systems/reactleaflet.md create mode 100644 docs/_plugins/frameworks-build-systems/tiny-leaflet-directive.md create mode 100644 docs/_plugins/frameworks-build-systems/vleaflet.md create mode 100644 docs/_plugins/frameworks-build-systems/vue2leaflet.md create mode 100644 docs/_plugins/frameworks-build-systems/yaga-leafletng2.md create mode 100644 docs/_plugins/fullscreen-controls/leaflet-fullscreen.md create mode 100644 docs/_plugins/fullscreen-controls/leaflet-zoomfs.md create mode 100644 docs/_plugins/geocoding/esri-leaflet-geocoder.md create mode 100644 docs/_plugins/geocoding/l-highlight.md create mode 100644 docs/_plugins/geocoding/leaflet-autocomplete.md create mode 100644 docs/_plugins/geocoding/leaflet-control-bing-geocoder.md create mode 100644 docs/_plugins/geocoding/leaflet-control-geocoder.md create mode 100644 docs/_plugins/geocoding/leaflet-control-osm-geocoder.md create mode 100644 docs/_plugins/geocoding/leaflet-geoip-locator.md create mode 100644 docs/_plugins/geocoding/leaflet-geonames.md create mode 100644 docs/_plugins/geocoding/leaflet-geosearch.md create mode 100644 docs/_plugins/geocoding/leaflet-locationiq-geocoder.md create mode 100644 docs/_plugins/geocoding/leaflet-opencage-search.md create mode 100644 docs/_plugins/geocoding/leaflet-search.md create mode 100644 docs/_plugins/geocoding/pelias-leaflet-plugin.md create mode 100644 docs/_plugins/geolocation/geolet.md create mode 100644 docs/_plugins/geolocation/l-locationshare.md create mode 100644 docs/_plugins/geolocation/leaflet-accurateposition.md create mode 100644 docs/_plugins/geolocation/leaflet-control-compass.md create mode 100644 docs/_plugins/geolocation/leaflet-locate.md create mode 100644 docs/_plugins/geoprocessing/arc-js.md create mode 100644 docs/_plugins/geoprocessing/greinerhormann.md create mode 100644 docs/_plugins/geoprocessing/leaflet-antimeridian.md create mode 100644 docs/_plugins/geoprocessing/leaflet-buffer.md create mode 100644 docs/_plugins/geoprocessing/leaflet-geometryutil.md create mode 100644 docs/_plugins/geoprocessing/leaflet-layerindex.md create mode 100644 docs/_plugins/geoprocessing/leaflet-utm.md create mode 100644 docs/_plugins/geoprocessing/leafletpip.md create mode 100644 docs/_plugins/geoprocessing/leafletspatialprefixtree.md create mode 100644 docs/_plugins/geoprocessing/proj4leaflet.md create mode 100644 docs/_plugins/heatmaps/heatcanvas.md create mode 100644 docs/_plugins/heatmaps/heatmap-js.md create mode 100644 docs/_plugins/heatmaps/leaflet-divheatmap.md create mode 100644 docs/_plugins/heatmaps/leaflet-heat.md create mode 100644 docs/_plugins/heatmaps/leaflet-smoothpolygons.md create mode 100644 docs/_plugins/heatmaps/leafletsolrheatmap.md create mode 100644 docs/_plugins/heatmaps/maskcanvas.md create mode 100644 docs/_plugins/heatmaps/webgl-heatmap.md create mode 100644 docs/_plugins/interactive-pan-zoom/l-control-zoombar.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-borderpan.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-boxzoom.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-doublerightclickzoom.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-doubletouchdragzoom.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-gamecontroller.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-limitzoom.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-pancontrol.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-twofingerzoom.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-zoombox.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-zoominfo.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-zoomlabel.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-zoompanel.md create mode 100644 docs/_plugins/interactive-pan-zoom/leaflet-zoomslider.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-activelayers.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-autolayers.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-basemaps.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-categorized-layers.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-control-appearance.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-control-layers-tree.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-control-order-layers.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-groupedlayercontrol.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-layertreeplugin.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-panel-layers.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-selectlayers.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-styledlayercontrol.md create mode 100644 docs/_plugins/layer-switching-controls/leaflet-uniformcontrol.md create mode 100644 docs/_plugins/layer-switching-controls/leafleticonlayers.md create mode 100644 docs/_plugins/markers-renderers/l-donut.md create mode 100644 docs/_plugins/markers-renderers/leaflet-arc.md create mode 100644 docs/_plugins/markers-renderers/leaflet-arrowcircle.md create mode 100644 docs/_plugins/markers-renderers/leaflet-awesomemarkers.md create mode 100644 docs/_plugins/markers-renderers/leaflet-beautifymarkers.md create mode 100644 docs/_plugins/markers-renderers/leaflet-bezier.md create mode 100644 docs/_plugins/markers-renderers/leaflet-boatmarker.md create mode 100644 docs/_plugins/markers-renderers/leaflet-canvasmarkers.md create mode 100644 docs/_plugins/markers-renderers/leaflet-centermarker.md create mode 100644 docs/_plugins/markers-renderers/leaflet-curve.md create mode 100644 docs/_plugins/markers-renderers/leaflet-customlayer.md create mode 100644 docs/_plugins/markers-renderers/leaflet-edgemarker.md create mode 100644 docs/_plugins/markers-renderers/leaflet-ellipse.md create mode 100644 docs/_plugins/markers-renderers/leaflet-extramarkers.md create mode 100644 docs/_plugins/markers-renderers/leaflet-geodesic.md create mode 100644 docs/_plugins/markers-renderers/leaflet-geojsoncss.md create mode 100644 docs/_plugins/markers-renderers/leaflet-geotagphoto.md create mode 100644 docs/_plugins/markers-renderers/leaflet-glmarkers.md create mode 100644 docs/_plugins/markers-renderers/leaflet-greatcircle.md create mode 100644 docs/_plugins/markers-renderers/leaflet-highlightablelayers.md create mode 100644 docs/_plugins/markers-renderers/leaflet-icon-glyph.md create mode 100644 docs/_plugins/markers-renderers/leaflet-label.md create mode 100644 docs/_plugins/markers-renderers/leaflet-labeltextcollision.md create mode 100644 docs/_plugins/markers-renderers/leaflet-lineextremities.md create mode 100644 docs/_plugins/markers-renderers/leaflet-magicmarker.md create mode 100644 docs/_plugins/markers-renderers/leaflet-makimarkers.md create mode 100644 docs/_plugins/markers-renderers/leaflet-marker-highlight.md create mode 100644 docs/_plugins/markers-renderers/leaflet-marker-stack.md create mode 100644 docs/_plugins/markers-renderers/leaflet-orientedmarker.md create mode 100644 docs/_plugins/markers-renderers/leaflet-parallaxmarker.md create mode 100644 docs/_plugins/markers-renderers/leaflet-pattern.md create mode 100644 docs/_plugins/markers-renderers/leaflet-photo.md create mode 100644 docs/_plugins/markers-renderers/leaflet-polyline-offset.md create mode 100644 docs/_plugins/markers-renderers/leaflet-polylinedecorator.md create mode 100644 docs/_plugins/markers-renderers/leaflet-repeatedmarkers.md create mode 100644 docs/_plugins/markers-renderers/leaflet-river.md create mode 100644 docs/_plugins/markers-renderers/leaflet-rotated-marker.md create mode 100644 docs/_plugins/markers-renderers/leaflet-roughcanvas.md create mode 100644 docs/_plugins/markers-renderers/leaflet-speechbubble.md create mode 100644 docs/_plugins/markers-renderers/leaflet-sprite.md create mode 100644 docs/_plugins/markers-renderers/leaflet-streetlabels.md create mode 100644 docs/_plugins/markers-renderers/leaflet-svgshapemarkers.md create mode 100644 docs/_plugins/markers-renderers/leaflet-swoopy.md create mode 100644 docs/_plugins/markers-renderers/leaflet-textpath.md create mode 100644 docs/_plugins/markers-renderers/leaflet-truesize.md create mode 100644 docs/_plugins/markers-renderers/leaflet-vectormarkers.md create mode 100644 docs/_plugins/markers-renderers/leaflet-viewpoint.md create mode 100644 docs/_plugins/markers-renderers/leafletaistracksymbol.md create mode 100644 docs/_plugins/markers-renderers/leafletaistracksymbolsearch.md create mode 100644 docs/_plugins/markers-renderers/leafletarrowheads.md create mode 100644 docs/_plugins/markers-renderers/leafletchoropleth.md create mode 100644 docs/_plugins/markers-renderers/leafletcorridor.md create mode 100644 docs/_plugins/markers-renderers/leafletdistancemarkers.md create mode 100644 docs/_plugins/markers-renderers/leafleticonpulse.md create mode 100644 docs/_plugins/markers-renderers/leafletlabeledcircle.md create mode 100644 docs/_plugins/markers-renderers/leafletlayervisibility.md create mode 100644 docs/_plugins/markers-renderers/leafletmapkeyicon.md create mode 100644 docs/_plugins/markers-renderers/leafletmarkerdirection.md create mode 100644 docs/_plugins/markers-renderers/leafletplacegroupspicker.md create mode 100644 docs/_plugins/markers-renderers/leafletpolycolor.md create mode 100644 docs/_plugins/markers-renderers/leafletpolygon-fillpattern.md create mode 100644 docs/_plugins/markers-renderers/leafletsemicircle.md create mode 100644 docs/_plugins/markers-renderers/leafletsimplestyle.md create mode 100644 docs/_plugins/markers-renderers/leafletsvgicon.md create mode 100644 docs/_plugins/markers-renderers/leaflettracksymbol.md create mode 100644 docs/_plugins/markers-renderers/leafletusermarker.md create mode 100644 docs/_plugins/markers-renderers/osm-buildings.md create mode 100644 docs/_plugins/measurement/leaflet-linearmeasurement.md create mode 100644 docs/_plugins/measurement/leaflet-measure-path.md create mode 100644 docs/_plugins/measurement/leaflet-measureareacontrol.md create mode 100644 docs/_plugins/measurement/leaflet-measurecontrol.md create mode 100644 docs/_plugins/measurement/leaflet-nauticscale.md create mode 100644 docs/_plugins/measurement/leaflet-polylinemeasure.md create mode 100644 docs/_plugins/measurement/leaflet-scalefactor.md create mode 100644 docs/_plugins/measurement/leafletgraphicscale.md create mode 100644 docs/_plugins/measurement/leafletmeasure.md create mode 100644 docs/_plugins/measurement/leafletreticle.md create mode 100644 docs/_plugins/measurement/leafletruler.md create mode 100644 docs/_plugins/minimaps-synced-maps/leaflet-globeminimap.md create mode 100644 docs/_plugins/minimaps-synced-maps/leaflet-layerscontrolminimap.md create mode 100644 docs/_plugins/minimaps-synced-maps/leaflet-magnifyingglass.md create mode 100644 docs/_plugins/minimaps-synced-maps/leaflet-minimap.md create mode 100644 docs/_plugins/minimaps-synced-maps/leaflet-sync.md create mode 100644 docs/_plugins/minimaps-synced-maps/leafletclonelayer.md create mode 100644 docs/_plugins/mouse-coordinates/leaflet-coordinates-control.md create mode 100644 docs/_plugins/mouse-coordinates/leaflet-coordinates.md create mode 100644 docs/_plugins/mouse-coordinates/leaflet-coordprojection.md create mode 100644 docs/_plugins/mouse-coordinates/leaflet-copy-coordinates-control.md create mode 100644 docs/_plugins/mouse-coordinates/leaflet-location-picker.md create mode 100644 docs/_plugins/mouse-coordinates/leaflet-mapcentercoord.md create mode 100644 docs/_plugins/mouse-coordinates/leaflet-mapcodes.md create mode 100644 docs/_plugins/mouse-coordinates/leaflet-mousecoordinates.md create mode 100644 docs/_plugins/mouse-coordinates/leaflet-mouseposition-ts.md create mode 100644 docs/_plugins/mouse-coordinates/leaflet-mouseposition.md create mode 100644 docs/_plugins/mouse-coordinates/leaflet-naccoordinates.md create mode 100644 docs/_plugins/non-map-base-layers/leaflet-tilelayer-iip.md create mode 100644 docs/_plugins/non-map-base-layers/leafletfractal.md create mode 100644 docs/_plugins/non-map-base-layers/leafletiiif.md create mode 100644 docs/_plugins/non-map-base-layers/leafletrastercoords.md create mode 100644 docs/_plugins/non-map-base-layers/tilelayer-deepzoom.md create mode 100644 docs/_plugins/non-map-base-layers/tilelayer-gigapan.md create mode 100644 docs/_plugins/non-map-base-layers/tilelayer-zoomify.md create mode 100644 docs/_plugins/overlay-animations/leaflet-animatedmarker.md create mode 100644 docs/_plugins/overlay-animations/leaflet-antpath.md create mode 100644 docs/_plugins/overlay-animations/leaflet-bouncemarker.md create mode 100644 docs/_plugins/overlay-animations/leaflet-marker-slideto.md create mode 100644 docs/_plugins/overlay-animations/leaflet-motion.md create mode 100644 docs/_plugins/overlay-animations/leaflet-movingmarker.md create mode 100644 docs/_plugins/overlay-animations/leaflet-path-dashflow.md create mode 100644 docs/_plugins/overlay-animations/leaflet-polyline-snakeanim.md create mode 100644 docs/_plugins/overlay-animations/leaflet-rain.md create mode 100644 docs/_plugins/overlay-animations/leaflet-smoothmarkerbouncing.md create mode 100644 docs/_plugins/overlay-animations/leaflet-snow.md create mode 100644 docs/_plugins/overlay-animations/leaflet-transitionedicon.md create mode 100644 docs/_plugins/overlay-animations/leafletpointanimator.md create mode 100644 docs/_plugins/overlay-animations/leaflettemporalgeojson.md create mode 100644 docs/_plugins/overlay-data-formats/leaflet-encoded.md create mode 100644 docs/_plugins/overlay-data-formats/leaflet-filegdb.md create mode 100644 docs/_plugins/overlay-data-formats/leaflet-filelayer.md create mode 100644 docs/_plugins/overlay-data-formats/leaflet-geocsv.md create mode 100644 docs/_plugins/overlay-data-formats/leaflet-gpx.md create mode 100644 docs/_plugins/overlay-data-formats/leaflet-layerjson.md create mode 100644 docs/_plugins/overlay-data-formats/leaflet-shapefile.md create mode 100644 docs/_plugins/overlay-data-formats/leafletbetterscale.md create mode 100644 docs/_plugins/overlay-data-formats/leafletcsvtiles.md create mode 100644 docs/_plugins/overlay-data-formats/leafletgeopackage.md create mode 100644 docs/_plugins/overlay-data-formats/leafletkml.md create mode 100644 docs/_plugins/overlay-data-formats/leafletomnivore.md create mode 100644 docs/_plugins/overlay-data-formats/leafletwfst.md create mode 100644 docs/_plugins/overlay-data-formats/qgis2web.md create mode 100644 docs/_plugins/overlay-data-formats/wicket.md create mode 100644 docs/_plugins/plugin-collections/mapbbcoderelated-leaflet-plugins.md create mode 100644 docs/_plugins/plugin-collections/plugins-by-pavel-shramov.md create mode 100644 docs/_plugins/plugin-collections/spectrum4leaflet.md create mode 100644 docs/_plugins/print-export/leaflet-bigimage.md create mode 100644 docs/_plugins/print-export/leaflet-browser-print.md create mode 100644 docs/_plugins/print-export/leaflet-print.md create mode 100644 docs/_plugins/print-export/leafleteasyprint.md create mode 100644 docs/_plugins/print-export/leafletimage.md create mode 100644 docs/_plugins/print-export/leafletrouteprint.md create mode 100644 docs/_plugins/routing/leaflet-reachability.md create mode 100644 docs/_plugins/routing/leaflet-routeboxer.md create mode 100644 docs/_plugins/routing/leaflet-routetoaddress.md create mode 100644 docs/_plugins/routing/leaflet-routing-amap.md create mode 100644 docs/_plugins/routing/leaflet-routing-machine.md create mode 100644 docs/_plugins/routing/leaflet-routing.md create mode 100644 docs/_plugins/routing/leaflet-travelnotes.md create mode 100644 docs/_plugins/routing/leaflet-tripgo-routing.md create mode 100644 docs/_plugins/routing/targomo-js.md create mode 100644 docs/_plugins/search-popups/l-tagfilterbutton.md create mode 100644 docs/_plugins/search-popups/leaflet-animatedsearchbox.md create mode 100644 docs/_plugins/search-popups/leaflet-geojsonautocomplete.md create mode 100644 docs/_plugins/search-popups/leaflet-revealosm.md create mode 100644 docs/_plugins/search-popups/leaflet-rrose.md create mode 100644 docs/_plugins/search-popups/leaflet-search.md create mode 100644 docs/_plugins/search-popups/leaflet-underneath.md create mode 100644 docs/_plugins/search-popups/leaflet-utfgrid.md create mode 100644 docs/_plugins/search-popups/leafletcustomsearchbox.md create mode 100644 docs/_plugins/search-popups/leafletfusesearch.md create mode 100644 docs/_plugins/search-popups/leafletgplacesautocomplete.md create mode 100644 docs/_plugins/search-popups/leafletpopupmodifier.md create mode 100644 docs/_plugins/search-popups/leafletresponsivepopup.md create mode 100644 docs/_plugins/synthetic-overlays/l-os-graticule.md create mode 100644 docs/_plugins/synthetic-overlays/leaflet-autograticule.md create mode 100644 docs/_plugins/synthetic-overlays/leaflet-edgescalebar.md create mode 100644 docs/_plugins/synthetic-overlays/leaflet-graticule.md create mode 100644 docs/_plugins/synthetic-overlays/leaflet-latlnggraticule.md create mode 100644 docs/_plugins/synthetic-overlays/leaflet-maidenhead.md create mode 100644 docs/_plugins/synthetic-overlays/leaflet-metricgrid.md create mode 100644 docs/_plugins/synthetic-overlays/leaflet-simplegraticule.md create mode 100644 docs/_plugins/synthetic-overlays/leaflet-sun.md create mode 100644 docs/_plugins/synthetic-overlays/leaflet-terminator.md create mode 100644 docs/_plugins/synthetic-overlays/leaflet-timezones.md create mode 100644 docs/_plugins/template.md create mode 100644 docs/_plugins/tile-image-display/leaflet-control-detaillevel.md create mode 100644 docs/_plugins/tile-image-display/leaflet-control-opacity.md create mode 100644 docs/_plugins/tile-image-display/leaflet-control-sidebyside.md create mode 100644 docs/_plugins/tile-image-display/leaflet-distortableimage.md create mode 100644 docs/_plugins/tile-image-display/leaflet-distortablevideo.md create mode 100644 docs/_plugins/tile-image-display/leaflet-imageoverlay-arrugator.md create mode 100644 docs/_plugins/tile-image-display/leaflet-imageoverlay-rotate.md create mode 100644 docs/_plugins/tile-image-display/leaflet-multispectral.md create mode 100644 docs/_plugins/tile-image-display/leaflet-nontiledlayers.md create mode 100644 docs/_plugins/tile-image-display/leaflet-opacitycontrols.md create mode 100644 docs/_plugins/tile-image-display/leaflet-tilelayer-canvas.md create mode 100644 docs/_plugins/tile-image-display/leaflet-tilelayer-colorfilter.md create mode 100644 docs/_plugins/tile-image-display/leaflet-tilelayer-colorizr.md create mode 100644 docs/_plugins/tile-image-display/leaflet-tilelayer-colorpicker.md create mode 100644 docs/_plugins/tile-image-display/leaflet-tilelayer-gl.md create mode 100644 docs/_plugins/tile-image-display/leaflet-tilelayer-glcolorscale.md create mode 100644 docs/_plugins/tile-image-display/leaflet-tilelayer-gloperations.md create mode 100644 docs/_plugins/tile-image-display/leaflet-tilelayer-mask.md create mode 100644 docs/_plugins/tile-image-display/leaflet-tilelayer-pixelfilter.md create mode 100644 docs/_plugins/tile-image-display/tilelayer-boundarycanvas.md create mode 100644 docs/_plugins/tile-image-display/tilelayer-grayscale.md create mode 100644 docs/_plugins/tile-load/leaflet-edgebuffer.md create mode 100644 docs/_plugins/tile-load/leaflet-featuregroup-loadevents.md create mode 100644 docs/_plugins/tile-load/leaflet-functionaltilelayer.md create mode 100644 docs/_plugins/tile-load/leaflet-gridlayer-fadeout.md create mode 100644 docs/_plugins/tile-load/leaflet-loading.md create mode 100644 docs/_plugins/tile-load/leaflet-multitilelayer.md create mode 100644 docs/_plugins/tile-load/leaflet-offline.md create mode 100644 docs/_plugins/tile-load/leaflet-tilecorrection.md create mode 100644 docs/_plugins/tile-load/leaflet-tilelayer-fallback.md create mode 100644 docs/_plugins/tile-load/tilelayer-cordova.md create mode 100644 docs/_plugins/tile-load/tilelayer-pouchdbcached.md create mode 100644 docs/_plugins/time-elevation/leaflet-elevation.md create mode 100644 docs/_plugins/time-elevation/leaflet-heightgraph.md create mode 100644 docs/_plugins/time-elevation/leaflet-hex-timeslider.md create mode 100644 docs/_plugins/time-elevation/leaflet-hotline.md create mode 100644 docs/_plugins/time-elevation/leaflet-timedimension.md create mode 100644 docs/_plugins/time-elevation/leaflet-timeline-control.md create mode 100644 docs/_plugins/time-elevation/leaflet-timeline.md create mode 100644 docs/_plugins/time-elevation/leaflet-timelineslider.md create mode 100644 docs/_plugins/time-elevation/leaflet-timeslider.md create mode 100644 docs/_plugins/time-elevation/leaflet-topography.md create mode 100644 docs/_plugins/time-elevation/leaflet-trackplayback.md create mode 100644 docs/_plugins/time-elevation/leafletplayback.md create mode 100644 docs/_plugins/user-interface/l-credits.md create mode 100644 docs/_plugins/user-interface/l-easybutton.md create mode 100644 docs/_plugins/user-interface/leaflet-bootstrapzoom.md create mode 100644 docs/_plugins/user-interface/leaflet-condensedattribution.md create mode 100644 docs/_plugins/user-interface/leaflet-contextmenu.md create mode 100644 docs/_plugins/user-interface/leaflet-control-custom.md create mode 100644 docs/_plugins/user-interface/leaflet-control-resizer.md create mode 100644 docs/_plugins/user-interface/leaflet-control-select.md create mode 100644 docs/_plugins/user-interface/leaflet-coordinatedimagepreview.md create mode 100644 docs/_plugins/user-interface/leaflet-countryselect.md create mode 100644 docs/_plugins/user-interface/leaflet-dialog.md create mode 100644 docs/_plugins/user-interface/leaflet-geojsonlayerswitcher.md create mode 100644 docs/_plugins/user-interface/leaflet-htmllegend.md create mode 100644 docs/_plugins/user-interface/leaflet-legend.md create mode 100644 docs/_plugins/user-interface/leaflet-messagebox.md create mode 100644 docs/_plugins/user-interface/leaflet-notifications.md create mode 100644 docs/_plugins/user-interface/leaflet-resizablecontrol.md create mode 100644 docs/_plugins/user-interface/leaflet-signposts.md create mode 100644 docs/_plugins/user-interface/leaflet-slidemenu.md create mode 100644 docs/_plugins/user-interface/leaflet-slider.md create mode 100644 docs/_plugins/user-interface/leaflet-spin.md create mode 100644 docs/_plugins/user-interface/leaflet-tilelegend.md create mode 100644 docs/_plugins/user-interface/leaflet-toolbar.md create mode 100644 docs/_plugins/user-interface/leaflet-weather.md create mode 100644 docs/_plugins/user-interface/leafletblurredlocation.md create mode 100644 docs/_plugins/user-interface/leafletblurredlocationdisplay.md create mode 100644 docs/_plugins/user-interface/leafletcontrolwindow.md create mode 100644 docs/_plugins/user-interface/leafletsidebar.md create mode 100644 docs/_plugins/user-interface/leafletsidebarv2.md create mode 100644 docs/_plugins/user-interface/sidebarv2.md create mode 100644 docs/_plugins/vector-tiles/geojsonvt.md create mode 100644 docs/_plugins/vector-tiles/hoverboard.md create mode 100644 docs/_plugins/vector-tiles/leaflet-mapboxvectortile.md create mode 100644 docs/_plugins/vector-tiles/leaflet-vectorgrid.md create mode 100644 docs/_plugins/vector-tiles/leaflet-vectortilelayer.md create mode 100644 docs/_plugins/vector-tiles/leafletgeojsonvt.md diff --git a/PLUGIN-GUIDE.md b/PLUGIN-GUIDE.md index 09e1cc97089..9aff1985d00 100644 --- a/PLUGIN-GUIDE.md +++ b/PLUGIN-GUIDE.md @@ -213,7 +213,7 @@ Now your plugin is available as an AMD and CommonJS module and can be used in mo Once your plugin is published, it is a good idea to add it to the [Leaflet plugins list](http://leafletjs.com/plugins.html). To do so: * [Fork](https://help.github.com/articles/fork-a-repo/) the Leaflet repo. -* In the `docs/plugins.md` file, find the section your plugin should go in, and add a table row with information and links about your plugin. +* In the `docs/_plugins/` folder, copy the `template.md` file and add it to a category folder. Then put the information and links about your plugin into the new plugin file. * Commit the code to your fork. * [Open a pull request](https://help.github.com/articles/creating-a-pull-request/) from your fork to Leaflet's original repo. diff --git a/docs/_config.yml b/docs/_config.yml index 4e252bbbadb..ecacd84705f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -13,3 +13,8 @@ latest_leaflet_version: 1.7.1 integrity_hash_css: "sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A==" integrity_hash_source: "sha512-I5Hd7FcJ9rZkH7uD01G3AjsuzFy3gqz7HIJvzFZGFt2mrCS4Piw9bYZvCgUE0aiJuiZFYIJIwpbNnDIM6ohTrg==" integrity_hash_uglified: "sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA==" + + +collections: + plugins: + output: false diff --git a/docs/_includes/plugin_category_table.html b/docs/_includes/plugin_category_table.html new file mode 100644 index 00000000000..974928cdd23 --- /dev/null +++ b/docs/_includes/plugin_category_table.html @@ -0,0 +1,22 @@ +{% assign filteredplugins = site.plugins | where: "category", include.category %} + + +{% for plugin in filteredplugins %} + + + + + + +{% endfor %} +
      PluginDescriptionDemoMaintainer
      {{ plugin.name }}{{ plugin.content }} + {% if plugin.demo %} + Demo + {% endif %} + + {% if plugin.category %} + {{ plugin.author }} + {% else %} + {{ plugin.author }} + {% endif %} +
      diff --git a/docs/_plugins/3rd-party-integration/abp-usermap-mybb.md b/docs/_plugins/3rd-party-integration/abp-usermap-mybb.md new file mode 100644 index 00000000000..9770a07c673 --- /dev/null +++ b/docs/_plugins/3rd-party-integration/abp-usermap-mybb.md @@ -0,0 +1,12 @@ +--- +name: ABP Usermap MyBB +category: 3rd-party-integration +repo: https://community.mybb.com/mods.php?action=view&pid=1238 +author: CrazyCat +author-url: https://gitlab.com/AnoBug +demo: +compatible-v0: +compatible-v1: true +--- + +A plugin for MyBB creating a map of users based on Open Street Map and Leaflet, with customisable popup and markers diff --git a/docs/_plugins/3rd-party-integration/joomla-3-x.md b/docs/_plugins/3rd-party-integration/joomla-3-x.md new file mode 100644 index 00000000000..e9185bc7ddf --- /dev/null +++ b/docs/_plugins/3rd-party-integration/joomla-3-x.md @@ -0,0 +1,12 @@ +--- +name: Joomla! (3.x) +category: 3rd-party-integration +repo: https://www.joomla.org/ +author: Astrid Günther +author-url: https://github.com/astridx +demo: +compatible-v0: +compatible-v1: true +--- + +
      • Agosm:
        Joomla Module not only for showing Markers on a OpenStreetMap Map.
        Gibhub
      • Aggpxtrack:
        Joomla Custom Field for dispaying a GPX Track on a Map - you can choose an OpenStreetMap or GoogleMaps. With much options. For example: One option is an elevation profil.
        Gibhub
      • Agosmmapwithmarker:
        Custom field for show a map with a marker in frond end - always the right card for the content. You can enter the address in backend.
        Gibhub
      diff --git a/docs/_plugins/3rd-party-integration/leaflet-easymap.md b/docs/_plugins/3rd-party-integration/leaflet-easymap.md new file mode 100644 index 00000000000..556ee2df1b8 --- /dev/null +++ b/docs/_plugins/3rd-party-integration/leaflet-easymap.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Easymap +category: 3rd-party-integration +repo: https://lapizistik.github.io/leaflet-easymap/ +author: Klaus Stein +author-url: https://github.com/Lapizistik +demo: +compatible-v0: +compatible-v1: true +--- + +Include a map in your HTML page without one line of programming. A data-driven Javascript module. diff --git a/docs/_plugins/3rd-party-integration/leaflet-editinosm.md b/docs/_plugins/3rd-party-integration/leaflet-editinosm.md new file mode 100644 index 00000000000..4c01a91249d --- /dev/null +++ b/docs/_plugins/3rd-party-integration/leaflet-editinosm.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.EditInOSM +category: 3rd-party-integration +repo: https://github.com/yohanboniface/Leaflet.EditInOSM +author: Yohan Boniface +author-url: https://yohanboniface.me/ +demo: +compatible-v0: +compatible-v1: true +--- + +Add a control with links to open the current map view on main OSM editors. diff --git a/docs/_plugins/3rd-party-integration/leaflet-facebook.md b/docs/_plugins/3rd-party-integration/leaflet-facebook.md new file mode 100644 index 00000000000..ee7533f70b3 --- /dev/null +++ b/docs/_plugins/3rd-party-integration/leaflet-facebook.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Facebook +category: 3rd-party-integration +repo: https://github.com/mwasil/Leaflet.Facebook/ +author: Marcin Wasilewski +author-url: https://marcinwasilewski.eu/ +demo: +compatible-v0: +compatible-v1: true +--- + +Simple plugin for adding Facebook like button as a control. diff --git a/docs/_plugins/3rd-party-integration/leaflet-for-drupal.md b/docs/_plugins/3rd-party-integration/leaflet-for-drupal.md new file mode 100644 index 00000000000..c7e54bb4739 --- /dev/null +++ b/docs/_plugins/3rd-party-integration/leaflet-for-drupal.md @@ -0,0 +1,12 @@ +--- +name: Leaflet for Drupal +category: 3rd-party-integration +repo: https://www.drupal.org/project/leaflet +author: Marzee Labs +author-url: https://marzeelabs.org/ +demo: +compatible-v0: +compatible-v1: true +--- + +A Drupal (7.x and 8.x) module to integrate Leaflet maps in your Drupal site. Contains a field formatter to show a map for fields containing geospatial data, Views integration to plot data on a map, and a lightweight and easy to use API. Currently used by over 10.000 sites. diff --git a/docs/_plugins/3rd-party-integration/map-block-leaflet.md b/docs/_plugins/3rd-party-integration/map-block-leaflet.md new file mode 100644 index 00000000000..ceb98cb1ffa --- /dev/null +++ b/docs/_plugins/3rd-party-integration/map-block-leaflet.md @@ -0,0 +1,12 @@ +--- +name: Map Block Leaflet +category: 3rd-party-integration +repo: https://wordpress.org/plugins/map-block-leaflet/ +author: Jesús Olazagoitia +author-url: https://goiblas.com/ +demo: +compatible-v0: +compatible-v1: true +--- + +A Block for the New WordPress Block Editor based on Leaflet, it allow add and custom maps from a visual interface. diff --git a/docs/_plugins/3rd-party-integration/maps-marker-pro.md b/docs/_plugins/3rd-party-integration/maps-marker-pro.md new file mode 100644 index 00000000000..53aa096510a --- /dev/null +++ b/docs/_plugins/3rd-party-integration/maps-marker-pro.md @@ -0,0 +1,12 @@ +--- +name: Maps Marker Pro +category: 3rd-party-integration +repo: https://www.mapsmarker.com/ +author: Robert Harm +author-url: https://www.harm.co.at/ +demo: +compatible-v0: +compatible-v1: true +--- + +A WordPress plugin that enables users to pin, organize and share their favorite places and tracks through their WordPress powered site. diff --git a/docs/_plugins/3rd-party-integration/maptiks.md b/docs/_plugins/3rd-party-integration/maptiks.md new file mode 100644 index 00000000000..b5ad6d39191 --- /dev/null +++ b/docs/_plugins/3rd-party-integration/maptiks.md @@ -0,0 +1,12 @@ +--- +name: Maptiks +category: 3rd-party-integration +repo: https://maptiks.com/ +author: Sparkgeo +author-url: https://sparkgeo.com/ +demo: +compatible-v0: +compatible-v1: true +--- + +Analytics platform for web maps. Track map activities, layer load times, marker clicks, and more! diff --git a/docs/_plugins/3rd-party-integration/wordpress-leaflet-map.md b/docs/_plugins/3rd-party-integration/wordpress-leaflet-map.md new file mode 100644 index 00000000000..3a558a2372f --- /dev/null +++ b/docs/_plugins/3rd-party-integration/wordpress-leaflet-map.md @@ -0,0 +1,12 @@ +--- +name: WordPress Leaflet Map +category: 3rd-party-integration +repo: https://wordpress.org/plugins/leaflet-map/ +author: Benjamin J DeLong +author-url: https://bozdoz.com/projects/leaflet-map +demo: +compatible-v0: +compatible-v1: true +--- + +Interactive and flexible shortcode to create multiple maps in posts and pages, and to add multiple markers on those maps. diff --git a/docs/_plugins/3rd-party-integration/wp-locations-and-areas.md b/docs/_plugins/3rd-party-integration/wp-locations-and-areas.md new file mode 100644 index 00000000000..e32062bf939 --- /dev/null +++ b/docs/_plugins/3rd-party-integration/wp-locations-and-areas.md @@ -0,0 +1,12 @@ +--- +name: Locations and Areas +category: 3rd-party-integration +repo: https://wordpress.org/plugins/locations-and-areas/ +author: 100plugins +author-url: https://www.locations-and-areas.com/?ref=leafletjs.com +demo: +compatible-v0: +compatible-v1: true +--- + +WordPress plugin to showcase widely distributed locations on a single map with additional navigation tabs for regions. The map is based on Leaflet JS and offers you several free map styles. Gutenberg Block included. diff --git a/docs/_plugins/3rd-party-integration/wp-mapit.md b/docs/_plugins/3rd-party-integration/wp-mapit.md new file mode 100644 index 00000000000..6238816df90 --- /dev/null +++ b/docs/_plugins/3rd-party-integration/wp-mapit.md @@ -0,0 +1,12 @@ +--- +name: WP MapIt +category: 3rd-party-integration +repo: http://wp-mapit.phpwebdev.in/ +author: Chandni Patel +author-url: http://phpwebdev.in/ +demo: +compatible-v0: +compatible-v1: true +--- + +Easy to use, WordPress Map plugin based on Open Street Map and Leaflet with custom markers images, descriptions and links. diff --git a/docs/_plugins/3rd-party-integration/wp-open-user-map.md b/docs/_plugins/3rd-party-integration/wp-open-user-map.md new file mode 100644 index 00000000000..ea65b6e8914 --- /dev/null +++ b/docs/_plugins/3rd-party-integration/wp-open-user-map.md @@ -0,0 +1,12 @@ +--- +name: Open User Map +category: 3rd-party-integration +repo: https://wordpress.org/plugins/open-user-map/ +author: 100plugins +author-url: https://www.open-user-map.com/?ref=leafletjs.com +demo: +compatible-v0: +compatible-v1: true +--- + +WordPress plugin to let your visitors add locations directly from the frontend - without registration. They drop a marker on the map and provide some location details. After submit the location proposal will be “pending” and wait for your review approval to get published. diff --git a/docs/_plugins/3rd-party-integration/wptripsummary.md b/docs/_plugins/3rd-party-integration/wptripsummary.md new file mode 100644 index 00000000000..11b24fabb7e --- /dev/null +++ b/docs/_plugins/3rd-party-integration/wptripsummary.md @@ -0,0 +1,12 @@ +--- +name: WP-Trip-Summary +category: 3rd-party-integration +repo: https://github.com/alexboia/WP-Trip-Summary/ +author: Alexandru Boia +author-url: https://wordpress.org/plugins/wp-trip-summary/ +demo: +compatible-v0: +compatible-v1: true +--- + +A WordPress trip summary plugin to help travel bloggers manage and display structured information about their train rides and biking or hiking trips. diff --git a/docs/_plugins/3rd-party-integration/yii2-locator.md b/docs/_plugins/3rd-party-integration/yii2-locator.md new file mode 100644 index 00000000000..e4c08c41998 --- /dev/null +++ b/docs/_plugins/3rd-party-integration/yii2-locator.md @@ -0,0 +1,12 @@ +--- +name: Yii2-locator +category: 3rd-party-integration +repo: https://github.com/sjaakp/yii2-locator +author: Sjaak Priester +author-url: https://github.com/sjaakp +demo: https://sjaakpriester.nl/software/locator +compatible-v0: +compatible-v1: true +--- + +Leaflet widget for Yii2 PHP Framework. Geographical data stored in an ActiveRecord can be displayed and updated on interactive maps. diff --git a/docs/_plugins/area-overlay-selection/bopenleafletareaselection.md b/docs/_plugins/area-overlay-selection/bopenleafletareaselection.md new file mode 100644 index 00000000000..e5077df101d --- /dev/null +++ b/docs/_plugins/area-overlay-selection/bopenleafletareaselection.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-Area-Selection +category: area-overlay-selection +repo: https://github.com/bopen/leaflet-area-selection +author: B-Open +author-url: https://www.bopen.eu/ +demo: https://bopen.github.io/leaflet-area-selection/ +compatible-v0: +compatible-v1: true +--- + +leaflet-area-selection allows to easily select a polygonal area on the map. diff --git a/docs/_plugins/area-overlay-selection/l-control-linestringselect.md b/docs/_plugins/area-overlay-selection/l-control-linestringselect.md new file mode 100644 index 00000000000..010976a307f --- /dev/null +++ b/docs/_plugins/area-overlay-selection/l-control-linestringselect.md @@ -0,0 +1,12 @@ +--- +name: L.Control.LineStringSelect +category: area-overlay-selection +repo: https://github.com/w8r/L.Control.LineStringSelect +author: Alexander Milevski +author-url: https://github.com/w8r +demo: https://milevski.co/L.Control.LineStringSelect/examples/ +compatible-v0: +compatible-v1: true +--- + +Fast LineString(polyline) partial selection tool: select a stretch between two points in a complex path. diff --git a/docs/_plugins/area-overlay-selection/leaflet-areaselect.md b/docs/_plugins/area-overlay-selection/leaflet-areaselect.md new file mode 100644 index 00000000000..773a585330f --- /dev/null +++ b/docs/_plugins/area-overlay-selection/leaflet-areaselect.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.AreaSelect +category: area-overlay-selection +repo: https://github.com/heyman/leaflet-areaselect/ +author: Jonatan Heyman +author-url: https://heyman.info/ +demo: +compatible-v0: +compatible-v1: true +--- + +A fixed positioned, resizable rectangle for selecting an area on the map. diff --git a/docs/_plugins/area-overlay-selection/leaflet-cheaplayerat.md b/docs/_plugins/area-overlay-selection/leaflet-cheaplayerat.md new file mode 100644 index 00000000000..daf6c2501ab --- /dev/null +++ b/docs/_plugins/area-overlay-selection/leaflet-cheaplayerat.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.CheapLayerAt +category: area-overlay-selection +repo: https://github.com/IvanSanchez/Leaflet.CheapLayerAt +author: Iván Sánchez Ortega +author-url: https://github.com/IvanSanchez +demo: http://ivansanchez.github.io/Leaflet.CheapLayerAt/demo.html +compatible-v0: +compatible-v1: true +--- + +Allows querying which layer is under a screen coordinate. diff --git a/docs/_plugins/area-overlay-selection/leaflet-featureselect.md b/docs/_plugins/area-overlay-selection/leaflet-featureselect.md new file mode 100644 index 00000000000..045dd51b0db --- /dev/null +++ b/docs/_plugins/area-overlay-selection/leaflet-featureselect.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.FeatureSelect +category: area-overlay-selection +repo: https://github.com/openplans/Leaflet.FeatureSelect +author: Aaron Ogle +author-url: https://github.com/atogle +demo: +compatible-v0: +compatible-v1: true +--- + +Use a configurable centerpoint marker to select any geometry type from a GeoJSON layer. diff --git a/docs/_plugins/area-overlay-selection/leaflet-geojson-selector.md b/docs/_plugins/area-overlay-selection/leaflet-geojson-selector.md new file mode 100644 index 00000000000..56642915edd --- /dev/null +++ b/docs/_plugins/area-overlay-selection/leaflet-geojson-selector.md @@ -0,0 +1,12 @@ +--- +name: Leaflet GeoJSON Selector +category: area-overlay-selection +repo: https://github.com/stefanocudini/leaflet-geojson-selector +author: Stefano Cudini +author-url: https://opengeo.tech/ +demo: https://opengeo.tech/maps/leaflet-geojson-selector/ +compatible-v0: +compatible-v1: true +--- + +Leaflet Control for selection from GeoJSON feature in an interactive list and map. diff --git a/docs/_plugins/area-overlay-selection/leaflet-selectareafeature.md b/docs/_plugins/area-overlay-selection/leaflet-selectareafeature.md new file mode 100644 index 00000000000..6b3e3d3f048 --- /dev/null +++ b/docs/_plugins/area-overlay-selection/leaflet-selectareafeature.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.SelectAreaFeature +category: area-overlay-selection +repo: https://github.com/sandropibia/Leaflet.SelectAreaFeature/ +author: Sandro Pibia +author-url: https://github.com/sandropibia +demo: +compatible-v0: +compatible-v1: true +--- + +Selecting feature layers on a map by drawing an area. diff --git a/docs/_plugins/area-overlay-selection/leafletlasso.md b/docs/_plugins/area-overlay-selection/leafletlasso.md new file mode 100644 index 00000000000..5dfd377013d --- /dev/null +++ b/docs/_plugins/area-overlay-selection/leafletlasso.md @@ -0,0 +1,12 @@ +--- +name: leaflet-lasso +category: area-overlay-selection +repo: https://github.com/zakjan/leaflet-lasso +author: Jan Zak +author-url: https://github.com/zakjan +demo: https://zakjan.github.io/leaflet-lasso/ +compatible-v0: +compatible-v1: true +--- + +Lasso selection plugin. diff --git a/docs/_plugins/area-overlay-selection/leafletlocationfilter.md b/docs/_plugins/area-overlay-selection/leafletlocationfilter.md new file mode 100644 index 00000000000..f3a71614705 --- /dev/null +++ b/docs/_plugins/area-overlay-selection/leafletlocationfilter.md @@ -0,0 +1,12 @@ +--- +name: leaflet-locationfilter +category: area-overlay-selection +repo: https://github.com/kajic/leaflet-locationfilter/ +author: Robert Kajic +author-url: https://github.com/kajic +demo: +compatible-v0: +compatible-v1: true +--- + +A draggable/resizable rectangle for selecting an area on the map. diff --git a/docs/_plugins/area-overlay-selection/leafletselectpolygons.md b/docs/_plugins/area-overlay-selection/leafletselectpolygons.md new file mode 100644 index 00000000000..bb578005887 --- /dev/null +++ b/docs/_plugins/area-overlay-selection/leafletselectpolygons.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-Select-Polygons +category: area-overlay-selection +repo: https://github.com/olanaso/Leaflet-Select-Polygons +author: Erick S Escalante Olano +author-url: https://github.com/olanaso +demo: https://olanaso.github.io/Leaflet-Select-Polygons/ +compatible-v0: +compatible-v1: true +--- + +Leaflet-Select-Polygons allows the selection of several polygons and also adjusts the base map view. diff --git a/docs/_plugins/area-overlay-selection/leafletshades.md b/docs/_plugins/area-overlay-selection/leafletshades.md new file mode 100644 index 00000000000..b66d0b3d475 --- /dev/null +++ b/docs/_plugins/area-overlay-selection/leafletshades.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-Shades +category: area-overlay-selection +repo: https://github.com/mkong0216/leaflet-shades/ +author: Mandy Kong +author-url: https://github.com/mkong0216 +demo: https://mkong0216.github.io/leaflet-shades/examples/ +compatible-v0: +compatible-v1: true +--- + +A draggable and resizable rectangle for selecting an area on a map and creating a gray overlay in unselected areas. diff --git a/docs/_plugins/basemap-formats/azgsleaflet.md b/docs/_plugins/basemap-formats/azgsleaflet.md new file mode 100644 index 00000000000..e5245d7b86a --- /dev/null +++ b/docs/_plugins/basemap-formats/azgsleaflet.md @@ -0,0 +1,12 @@ +--- +name: azgs-leaflet +category: basemap-formats +repo: https://github.com/azgs/azgs-leaflet +author: AZGS +author-url: https://github.com/azgs +demo: +compatible-v0: +compatible-v1: true +--- + +A set of small plugins for Leaflet, including WFS-GeoJSON layer with filtering, a hover control for GeoJSON, and an Esri tile layer. diff --git a/docs/_plugins/basemap-formats/cartodbleaflet.md b/docs/_plugins/basemap-formats/cartodbleaflet.md new file mode 100644 index 00000000000..0853dd12bff --- /dev/null +++ b/docs/_plugins/basemap-formats/cartodbleaflet.md @@ -0,0 +1,12 @@ +--- +name: cartodb-leaflet +category: basemap-formats +repo: https://github.com/vizzuality/cartodb-leaflet/ +author: Vizzuality +author-url: https://www.vizzuality.com/ +demo: +compatible-v0: +compatible-v1: true +--- + +Official CartoDB plugin for Leaflet. diff --git a/docs/_plugins/basemap-formats/georasterlayer.md b/docs/_plugins/basemap-formats/georasterlayer.md new file mode 100644 index 00000000000..2eceedd42b1 --- /dev/null +++ b/docs/_plugins/basemap-formats/georasterlayer.md @@ -0,0 +1,12 @@ +--- +name: GeoRasterLayer +category: basemap-formats +repo: https://github.com/geotiff/georaster-layer-for-leaflet +author: Daniel J. Dufour +author-url: https://github.com/DanielJDufour +demo: https://geotiff.github.io/georaster-layer-for-leaflet-example/ +compatible-v0: +compatible-v1: true +--- + +Display small and large GeoTIFF files with configurable resolution. Built for simplicity and performance. Integrates with GeoBlaze, a JavaScript raster analysis library. diff --git a/docs/_plugins/basemap-formats/l-tilelayer-wmts.md b/docs/_plugins/basemap-formats/l-tilelayer-wmts.md new file mode 100644 index 00000000000..cfc3eb3512e --- /dev/null +++ b/docs/_plugins/basemap-formats/l-tilelayer-wmts.md @@ -0,0 +1,12 @@ +--- +name: L.TileLayer.WMTS +category: basemap-formats +repo: https://github.com/alcalin/L.TileLayer.WMTS +author: Alexandru Calin +author-url: https://github.com/alcalin +demo: +compatible-v0: +compatible-v1: true +--- + +A simple WMTS Tile Layer plugin for Leaflet. diff --git a/docs/_plugins/basemap-formats/leaflet-bpg.md b/docs/_plugins/basemap-formats/leaflet-bpg.md new file mode 100644 index 00000000000..3a2035d455b --- /dev/null +++ b/docs/_plugins/basemap-formats/leaflet-bpg.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.bpg +category: basemap-formats +repo: https://github.com/balrog-kun/Leaflet.bpg +author: Andrzej Zaborowski +author-url: https://github.com/balrog-kun/ +demo: +compatible-v0: +compatible-v1: true +--- + +TileLayer with .bpg image format decoding. diff --git a/docs/_plugins/basemap-formats/leaflet-canvaslayer-field.md b/docs/_plugins/basemap-formats/leaflet-canvaslayer-field.md new file mode 100644 index 00000000000..a66f64cf38d --- /dev/null +++ b/docs/_plugins/basemap-formats/leaflet-canvaslayer-field.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.CanvasLayer.Field +category: basemap-formats +repo: https://github.com/IHCantabria/Leaflet.CanvasLayer.Field +author: Víctor Velarde +author-url: https://github.com/VictorVelarde +demo: +compatible-v0: +compatible-v1: true +--- + +Loads and styles raster files (geotiff & asciigrid formats). It includes a ScalarField layer (for DTM, temperature...) and VectorFieldAnim (an animated layer for wind, currents...). See the examples diff --git a/docs/_plugins/basemap-formats/leaflet-geojson-encoded.md b/docs/_plugins/basemap-formats/leaflet-geojson-encoded.md new file mode 100644 index 00000000000..287b6c3e7c7 --- /dev/null +++ b/docs/_plugins/basemap-formats/leaflet-geojson-encoded.md @@ -0,0 +1,12 @@ +--- +name: Leaflet GeoJSON Encoded +category: basemap-formats +repo: https://github.com/geobricks/Leaflet.GeoJSON.Encoded +author: Geobricks +author-url: https://github.com/geobricks/ +demo: +compatible-v0: +compatible-v1: true +--- + +Extends the L.GeoJSON layer using Google polyline encoding algorithm, allowing an optimized data transfer. diff --git a/docs/_plugins/basemap-formats/leaflet-nontiledlayer-wcs.md b/docs/_plugins/basemap-formats/leaflet-nontiledlayer-wcs.md new file mode 100644 index 00000000000..b3d4942c1af --- /dev/null +++ b/docs/_plugins/basemap-formats/leaflet-nontiledlayer-wcs.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.NonTiledLayer.WCS +category: basemap-formats +repo: https://github.com/stuartmatthews/Leaflet.NonTiledLayer.WCS +author: Stuart Matthews +author-url: https://github.com/stuartmatthews +demo: https://stuartmatthews.github.io/Leaflet.NonTiledLayer.WCS/ +compatible-v0: +compatible-v1: true +--- + +Display raster data from Web Coverage Services. Rasters can be styled and queried in the client. diff --git a/docs/_plugins/basemap-formats/leaflet-projwmts.md b/docs/_plugins/basemap-formats/leaflet-projwmts.md new file mode 100644 index 00000000000..3f5a43bb104 --- /dev/null +++ b/docs/_plugins/basemap-formats/leaflet-projwmts.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.projwmts +category: basemap-formats +repo: https://github.com/GeoportalPL/leaflet.projwmts +author: Geoportal Poland +author-url: https://github.com/GeoportalPL +demo: https://geoportalpl.github.io/leaflet.projwmts/examples/wmts_services.html +compatible-v0: +compatible-v1: true +--- + +Adding WMTS services (GUGiK Poland). diff --git a/docs/_plugins/basemap-formats/leaflet-tilelayer-mbtiles.md b/docs/_plugins/basemap-formats/leaflet-tilelayer-mbtiles.md new file mode 100644 index 00000000000..0745b98a75a --- /dev/null +++ b/docs/_plugins/basemap-formats/leaflet-tilelayer-mbtiles.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.MBTiles +category: basemap-formats +repo: https://gitlab.com/IvanSanchez/Leaflet.TileLayer.MBTiles +author: Iván Sánchez +author-url: https://github.com/IvanSanchez/ +demo: +compatible-v0: +compatible-v1: true +--- + +Loads .mbtiles tilesets. diff --git a/docs/_plugins/basemap-formats/leaflet-tilelayer-wmts.md b/docs/_plugins/basemap-formats/leaflet-tilelayer-wmts.md new file mode 100644 index 00000000000..59daafb0039 --- /dev/null +++ b/docs/_plugins/basemap-formats/leaflet-tilelayer-wmts.md @@ -0,0 +1,12 @@ +--- +name: leaflet.TileLayer.WMTS +category: basemap-formats +repo: https://github.com/alexandre-melard/leaflet.TileLayer.WMTS +author: Alexandre Melard +author-url: https://github.com/mylen +demo: +compatible-v0: +compatible-v1: true +--- + +Add WMTS (IGN) layering for leaflet. diff --git a/docs/_plugins/basemap-formats/leaflet-wms.md b/docs/_plugins/basemap-formats/leaflet-wms.md new file mode 100644 index 00000000000..04a4d234fab --- /dev/null +++ b/docs/_plugins/basemap-formats/leaflet-wms.md @@ -0,0 +1,12 @@ +--- +name: leaflet.wms +category: basemap-formats +repo: https://github.com/heigeo/leaflet.wms +author: S. Andrew Sheppard +author-url: https://github.com/sheppard/ +demo: +compatible-v0: +compatible-v1: true +--- + +Enhanced WMS support for Leaflet, including single-tile/untiled layers, shared WMS sources, and layer identify via GetFeatureInfo. diff --git a/docs/_plugins/basemap-formats/leaflet2gis.md b/docs/_plugins/basemap-formats/leaflet2gis.md new file mode 100644 index 00000000000..6390440e497 --- /dev/null +++ b/docs/_plugins/basemap-formats/leaflet2gis.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-2gis +category: basemap-formats +repo: https://github.com/emikhalev/leaflet-2gis +author: Eugene Mikhalev +author-url: https://github.com/emikhalev/ +demo: +compatible-v0: +compatible-v1: true +--- + +Adds support for 2GIS tile layer diff --git a/docs/_plugins/basemap-formats/leafletgeotiff.md b/docs/_plugins/basemap-formats/leafletgeotiff.md new file mode 100644 index 00000000000..d51b5a140d1 --- /dev/null +++ b/docs/_plugins/basemap-formats/leafletgeotiff.md @@ -0,0 +1,12 @@ +--- +name: leaflet-geotiff +category: basemap-formats +repo: https://github.com/stuartmatthews/leaflet-geotiff +author: Stuart Matthews +author-url: https://github.com/stuartmatthews +demo: https://stuartmatthews.github.io/leaflet-geotiff/ +compatible-v0: +compatible-v1: true +--- + +Display raster data from geoTIFF files as images or direction arrows. Rasters can be styled and queried in the client. An optional clipping mask can be applied, e.g. to restrict DEMs to land areas. diff --git a/docs/_plugins/basemap-formats/leaflettilejson.md b/docs/_plugins/basemap-formats/leaflettilejson.md new file mode 100644 index 00000000000..7a0783b4ac6 --- /dev/null +++ b/docs/_plugins/basemap-formats/leaflettilejson.md @@ -0,0 +1,12 @@ +--- +name: leaflet-tilejson +category: basemap-formats +repo: https://github.com/kartena/leaflet-tilejson +author: Per Liedman +author-url: https://github.com/perliedman +demo: +compatible-v0: +compatible-v1: true +--- + +Adds support for the TileJSON specification to Leaflet. diff --git a/docs/_plugins/basemap-formats/tilelayer-geojson.md b/docs/_plugins/basemap-formats/tilelayer-geojson.md new file mode 100644 index 00000000000..ba8164ee99f --- /dev/null +++ b/docs/_plugins/basemap-formats/tilelayer-geojson.md @@ -0,0 +1,12 @@ +--- +name: TileLayer.GeoJSON +category: basemap-formats +repo: https://github.com/glenrobertson/leaflet-tilelayer-geojson/ +author: Glen Robertson +author-url: https://github.com/glenrobertson +demo: +compatible-v0: +compatible-v1: true +--- + +A TileLayer for GeoJSON tiles. diff --git a/docs/_plugins/basemap-providers/azure-maps-leaflet-plugin.md b/docs/_plugins/basemap-providers/azure-maps-leaflet-plugin.md new file mode 100644 index 00000000000..6830627e100 --- /dev/null +++ b/docs/_plugins/basemap-providers/azure-maps-leaflet-plugin.md @@ -0,0 +1,12 @@ +--- +name: Azure Maps Leaflet plugin +category: basemap-providers +repo: https://github.com/Azure-Samples/azure-maps-leaflet +author: Ricky Brundritt +author-url: https://github.com/rbrundritt +demo: https://azuremapscodesamples.azurewebsites.net/?search=leaflet +compatible-v0: +compatible-v1: true +--- + +A leafletjs plugin that makes it easy to overlay all the different tile layers available from the Azure Maps. Supports using an Azure Maps subscription key or Azure Active Directory for authentication. diff --git a/docs/_plugins/basemap-providers/bing-maps-layer.md b/docs/_plugins/basemap-providers/bing-maps-layer.md new file mode 100644 index 00000000000..cff202c5201 --- /dev/null +++ b/docs/_plugins/basemap-providers/bing-maps-layer.md @@ -0,0 +1,12 @@ +--- +name: Bing Maps Layer +category: basemap-providers +repo: https://github.com/digidem/leaflet-bing-layer +author: Gregor MacLennan +author-url: https://github.com/gmaclennan +demo: +compatible-v0: false +compatible-v1: true +--- + +Add Bing Maps tiles to your Leaflet Map. Requires Leaflet v1.0.0.beta.2 or later. diff --git a/docs/_plugins/basemap-providers/esri-leaflet.md b/docs/_plugins/basemap-providers/esri-leaflet.md new file mode 100644 index 00000000000..5aec24691fb --- /dev/null +++ b/docs/_plugins/basemap-providers/esri-leaflet.md @@ -0,0 +1,12 @@ +--- +name: Esri Leaflet +category: basemap-providers +repo: https://esri.github.io/esri-leaflet/ +author: Patrick Arlt +author-url: https://github.com/patrickarlt/ +demo: +compatible-v0: +compatible-v1: true +--- + +A set of tools for using ArcGIS services with Leaflet. Support for map services, feature layers, ArcGIS Online tiles and more. diff --git a/docs/_plugins/basemap-providers/l-gridlayer-googlemutant.md b/docs/_plugins/basemap-providers/l-gridlayer-googlemutant.md new file mode 100644 index 00000000000..98469ae79bd --- /dev/null +++ b/docs/_plugins/basemap-providers/l-gridlayer-googlemutant.md @@ -0,0 +1,12 @@ +--- +name: L.GridLayer.GoogleMutant +category: basemap-providers +repo: https://gitlab.com/IvanSanchez/Leaflet.GridLayer.GoogleMutant +author: Iván Sánchez +author-url: https://github.com/IvanSanchez +demo: http://ivansanchez.gitlab.io/Leaflet.GridLayer.GoogleMutant/demo.html +compatible-v0: +compatible-v1: true +--- + +Displays Google maps (with minimal artifacts thanks to a DOM mutation observer technique). diff --git a/docs/_plugins/basemap-providers/l-mapkitmutant.md b/docs/_plugins/basemap-providers/l-mapkitmutant.md new file mode 100644 index 00000000000..a3ec2c0729b --- /dev/null +++ b/docs/_plugins/basemap-providers/l-mapkitmutant.md @@ -0,0 +1,12 @@ +--- +name: L.MapkitMutant +category: basemap-providers +repo: https://gitlab.com/IvanSanchez/Leaflet.MapkitMutant +author: Iván Sánchez +author-url: https://github.com/IvanSanchez +demo: +compatible-v0: +compatible-v1: true +--- + +Displays Apple's MapkitJS basemaps. diff --git a/docs/_plugins/basemap-providers/l-tilelayer-here.md b/docs/_plugins/basemap-providers/l-tilelayer-here.md new file mode 100644 index 00000000000..28d5832e324 --- /dev/null +++ b/docs/_plugins/basemap-providers/l-tilelayer-here.md @@ -0,0 +1,12 @@ +--- +name: L.TileLayer.HERE +category: basemap-providers +repo: https://gitlab.com/IvanSanchez/Leaflet.TileLayer.HERE +author: Iván Sánchez +author-url: https://github.com/IvanSanchez +demo: https://ivansanchez.gitlab.io/Leaflet.TileLayer.HERE/demo.html +compatible-v0: +compatible-v1: true +--- + +Displays map tiles from HERE maps. diff --git a/docs/_plugins/basemap-providers/l-tilelayer-kartverket.md b/docs/_plugins/basemap-providers/l-tilelayer-kartverket.md new file mode 100644 index 00000000000..ef5b0cbf7f9 --- /dev/null +++ b/docs/_plugins/basemap-providers/l-tilelayer-kartverket.md @@ -0,0 +1,12 @@ +--- +name: L.TileLayer.Kartverket +category: basemap-providers +repo: https://github.com/knreise/L.TileLayer.Kartverket +author: Kultur og naturreise +author-url: https://github.com/knreise +demo: +compatible-v0: +compatible-v1: true +--- + +Provides easy setup of the tile layers from Kartverket (The Norwegian Mapping Authority) diff --git a/docs/_plugins/basemap-providers/leaflet-chinesetmsproviders.md b/docs/_plugins/basemap-providers/leaflet-chinesetmsproviders.md new file mode 100644 index 00000000000..0682268d411 --- /dev/null +++ b/docs/_plugins/basemap-providers/leaflet-chinesetmsproviders.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ChineseTmsProviders +category: basemap-providers +repo: https://github.com/htoooth/Leaflet.ChineseTmsProviders +author: Tao Huang +author-url: https://github.com/htoooth/ +demo: +compatible-v0: +compatible-v1: true +--- + +Contains configurations for various Chinese tile providers — TianDiTu, MapABC, GaoDe, etc. diff --git a/docs/_plugins/basemap-providers/leaflet-gibs.md b/docs/_plugins/basemap-providers/leaflet-gibs.md new file mode 100644 index 00000000000..99a47b39268 --- /dev/null +++ b/docs/_plugins/basemap-providers/leaflet-gibs.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GIBS +category: basemap-providers +repo: https://github.com/aparshin/leaflet-GIBS +author: Alexander Parshin +author-url: https://github.com/aparshin +demo: http://aparshin.github.io/leaflet-GIBS/examples/ +compatible-v0: +compatible-v1: true +--- + +NASA EOSDIS GIBS imagery integration. The plugin provides 96 daily updated layers with satellite imagery and science parameters. diff --git a/docs/_plugins/basemap-providers/leaflet-koreantmsproviders.md b/docs/_plugins/basemap-providers/leaflet-koreantmsproviders.md new file mode 100644 index 00000000000..b4d308b1f54 --- /dev/null +++ b/docs/_plugins/basemap-providers/leaflet-koreantmsproviders.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.KoreanTmsProviders +category: basemap-providers +repo: https://github.com/tontita/Leaflet.KoreanTmsProviders +author: Seong Choi +author-url: https://github.com/tontita/ +demo: +compatible-v0: +compatible-v1: true +--- + +Contains configurations for various (South) Korean tile providers — Daum, Naver, VWorld, etc. diff --git a/docs/_plugins/basemap-providers/leaflet-spain-wms.md b/docs/_plugins/basemap-providers/leaflet-spain-wms.md new file mode 100644 index 00000000000..ce2c56133f0 --- /dev/null +++ b/docs/_plugins/basemap-providers/leaflet-spain-wms.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Spain.WMS +category: basemap-providers +repo: https://github.com/sigdeletras/Leaflet.Spain.WMS +author: Patricio Soriano +author-url: https://github.com/sigdeletras +demo: +compatible-v0: +compatible-v1: true +--- + +Provides easy setup for several Web Map Services (WMS) layers for Spain (PNOA, IGN base, Catastro, etc), from Spanish mapping agencies. diff --git a/docs/_plugins/basemap-providers/leaflet-tilelayer-here.md b/docs/_plugins/basemap-providers/leaflet-tilelayer-here.md new file mode 100644 index 00000000000..c4c3a2e920c --- /dev/null +++ b/docs/_plugins/basemap-providers/leaflet-tilelayer-here.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.HERE +category: basemap-providers +repo: https://github.com/wandersoncs/leaflet-tilelayer-here +author: Wanderson Souza +author-url: https://github.com/wandersoncs +demo: +compatible-v0: +compatible-v1: true +--- + +Displays tiles from HERE maps. diff --git a/docs/_plugins/basemap-providers/leaflet-tilelayer-hongkong.md b/docs/_plugins/basemap-providers/leaflet-tilelayer-hongkong.md new file mode 100644 index 00000000000..ccac7ae4240 --- /dev/null +++ b/docs/_plugins/basemap-providers/leaflet-tilelayer-hongkong.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-Tilelayer-Hong-Kong +category: basemap-providers +repo: https://github.com/spaceflighter/leaflet-tilelayer-hongkong +author: spaceflighter +author-url: https://github.com/spaceflighter +demo: +compatible-v0: +compatible-v1: true +--- + +Displays Hong Kong map tiles from Hong Kong GeoData Store provider. diff --git a/docs/_plugins/basemap-providers/leaflet-tilelayer-mierune.md b/docs/_plugins/basemap-providers/leaflet-tilelayer-mierune.md new file mode 100644 index 00000000000..46dd5bde9e9 --- /dev/null +++ b/docs/_plugins/basemap-providers/leaflet-tilelayer-mierune.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.Mierune +category: basemap-providers +repo: https://github.com/MIERUNE/Leaflet.TileLayer.MIERUNE +author: Mierune +author-url: https://github.com/MIERUNE +demo: https://tile.mierune.co.jp/ +compatible-v0: true +compatible-v1: true +--- + +Displays tiles from Mierune map. diff --git a/docs/_plugins/basemap-providers/leaflet-tilelayer-swiss.md b/docs/_plugins/basemap-providers/leaflet-tilelayer-swiss.md new file mode 100644 index 00000000000..3392aec2363 --- /dev/null +++ b/docs/_plugins/basemap-providers/leaflet-tilelayer-swiss.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.Swiss +category: basemap-providers +repo: https://github.com/rkaravia/Leaflet.TileLayer.Swiss +author: Roman Karavia +author-url: https://github.com/rkaravia +demo: https://leaflet-tilelayer-swiss.karavia.ch/ +compatible-v0: +compatible-v1: true +--- + +Displays national maps of Switzerland using map tiles from Swisstopo. diff --git a/docs/_plugins/basemap-providers/leafletproviders.md b/docs/_plugins/basemap-providers/leafletproviders.md new file mode 100644 index 00000000000..c50d1922b5b --- /dev/null +++ b/docs/_plugins/basemap-providers/leafletproviders.md @@ -0,0 +1,12 @@ +--- +name: leaflet-providers +category: basemap-providers +repo: https://github.com/leaflet-extras/leaflet-providers +author: leaflet-extras members +author-url: https://github.com/leaflet-extras +demo: +compatible-v0: +compatible-v1: true +--- + +Contains configurations for various free tile providers — OSM, OpenCycleMap, Stamen, Esri, etc. diff --git a/docs/_plugins/basemap-providers/polarmap-js.md b/docs/_plugins/basemap-providers/polarmap-js.md new file mode 100644 index 00000000000..04066b31481 --- /dev/null +++ b/docs/_plugins/basemap-providers/polarmap-js.md @@ -0,0 +1,12 @@ +--- +name: PolarMap.js +category: basemap-providers +repo: https://github.com/GeoSensorWebLab/polarmap.js +author: GeoSensorWeb Lab +author-url: https://github.com/geosensorweblab +demo: +compatible-v0: +compatible-v1: true +--- + +JavaScript library for displaying tiles from ArcticWebMap, a free tile provider with OSM data in multiple Arctic polar projections. Includes lower-level API for deeper integration with other Leaflet plugins. diff --git a/docs/_plugins/basemap-providers/supermap-leaflet.md b/docs/_plugins/basemap-providers/supermap-leaflet.md new file mode 100644 index 00000000000..6ba4fc30abf --- /dev/null +++ b/docs/_plugins/basemap-providers/supermap-leaflet.md @@ -0,0 +1,12 @@ +--- +name: SuperMap Leaflet +category: basemap-providers +repo: https://supermap.github.io/supermap-leaflet/ +author: SuperMap +author-url: https://github.com/SuperMap +demo: +compatible-v0: +compatible-v1: true +--- + +SuperMap Leaflet is a Leaflet plugins for working with SuperMap service types. Support for SuperMap services, tiles and more. diff --git a/docs/_plugins/bookmarked-pan-zoom/leaflet-bookmarks.md b/docs/_plugins/bookmarked-pan-zoom/leaflet-bookmarks.md new file mode 100644 index 00000000000..43090d55e58 --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leaflet-bookmarks.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Bookmarks +category: bookmarked-pan-zoom +repo: https://github.com/w8r/Leaflet.Bookmarks +author: Alexander Milevski +author-url: https://github.com/w8r/ +demo: +compatible-v0: +compatible-v1: true +--- + +Control for adding and navigating between user-created bookmarks on the map. diff --git a/docs/_plugins/bookmarked-pan-zoom/leaflet-defaultextent.md b/docs/_plugins/bookmarked-pan-zoom/leaflet-defaultextent.md new file mode 100644 index 00000000000..044f38682ab --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leaflet-defaultextent.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.defaultextent +category: bookmarked-pan-zoom +repo: https://github.com/nguyenning/Leaflet.defaultextent +author: Alex Nguyen +author-url: https://github.com/nguyenning +demo: +compatible-v0: +compatible-v1: true +--- + +A control that returns to the original start extent of the map. Similar to the HomeButton widget. diff --git a/docs/_plugins/bookmarked-pan-zoom/leaflet-locationlist.md b/docs/_plugins/bookmarked-pan-zoom/leaflet-locationlist.md new file mode 100644 index 00000000000..79e04359899 --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leaflet-locationlist.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Locationlist +category: bookmarked-pan-zoom +repo: https://github.com/mithron/leaflet.locationlist +author: Ivan Ignatyev +author-url: https://github.com/mithron +demo: +compatible-v0: +compatible-v1: true +--- + +A control to jump between predefined locations and zooms. diff --git a/docs/_plugins/bookmarked-pan-zoom/leaflet-navigation-toolbar.md b/docs/_plugins/bookmarked-pan-zoom/leaflet-navigation-toolbar.md new file mode 100644 index 00000000000..ddbd8d16f68 --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leaflet-navigation-toolbar.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Navigation Toolbar +category: bookmarked-pan-zoom +repo: https://github.com/davidchouse/Leaflet.NavBar +author: David C +author-url: https://github.com/davidchouse +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet control for simple back, forward and home navigation. diff --git a/docs/_plugins/bookmarked-pan-zoom/leaflet-restoreview.md b/docs/_plugins/bookmarked-pan-zoom/leaflet-restoreview.md new file mode 100644 index 00000000000..6e1c78a0e2a --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leaflet-restoreview.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.RestoreView +category: bookmarked-pan-zoom +repo: https://github.com/makinacorpus/Leaflet.RestoreView +author: Mathieu Leplatre +author-url: https://github.com/leplatrem +demo: +compatible-v0: +compatible-v1: true +--- + +Stores and restores map view using localStorage. diff --git a/docs/_plugins/bookmarked-pan-zoom/leaflet-showall.md b/docs/_plugins/bookmarked-pan-zoom/leaflet-showall.md new file mode 100644 index 00000000000..66e67d78318 --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leaflet-showall.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ShowAll +category: bookmarked-pan-zoom +repo: https://github.com/florpor/Leaflet.ShowAll +author: Mor Yariv +author-url: https://github.com/florpor +demo: +compatible-v0: +compatible-v1: true +--- + +A control that can show a predefined extent while saving the current one so it can be jumped back to. diff --git a/docs/_plugins/bookmarked-pan-zoom/leaflet-viewcenter.md b/docs/_plugins/bookmarked-pan-zoom/leaflet-viewcenter.md new file mode 100644 index 00000000000..5cc545b477d --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leaflet-viewcenter.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.viewcenter +category: bookmarked-pan-zoom +repo: https://github.com/pwldp/leaflet.viewcenter +author: Dariusz Pawlak +author-url: https://github.com/pwldp/ +demo: +compatible-v0: +compatible-v1: true +--- + +A simple control that adds a button to change view and zoom to predefined values in options. diff --git a/docs/_plugins/bookmarked-pan-zoom/leaflet-zoomhome.md b/docs/_plugins/bookmarked-pan-zoom/leaflet-zoomhome.md new file mode 100644 index 00000000000..6d659b125d6 --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leaflet-zoomhome.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.zoomhome +category: bookmarked-pan-zoom +repo: https://github.com/torfsen/leaflet.zoomhome +author: Florian Brucker +author-url: https://github.com/torfsen +demo: http://torfsen.github.io/leaflet.zoomhome/ +compatible-v0: +compatible-v1: true +--- + +Zoom control with a home button for resetting the view. diff --git a/docs/_plugins/bookmarked-pan-zoom/leaflethash.md b/docs/_plugins/bookmarked-pan-zoom/leaflethash.md new file mode 100644 index 00000000000..7904f6a3c2f --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leaflethash.md @@ -0,0 +1,12 @@ +--- +name: leaflet-hash +category: bookmarked-pan-zoom +repo: https://github.com/mlevans/leaflet-hash +author: Michael Lawrence Evans +author-url: https://github.com/mlevans +demo: +compatible-v0: +compatible-v1: true +--- + +Plugin for persisting map state and browsing history through the URL hash. diff --git a/docs/_plugins/bookmarked-pan-zoom/leaflethistory.md b/docs/_plugins/bookmarked-pan-zoom/leaflethistory.md new file mode 100644 index 00000000000..f675452ad83 --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leaflethistory.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-History +category: bookmarked-pan-zoom +repo: https://github.com/cscott530/leaflet-history +author: Chris Scott +author-url: https://github.com/cscott530 +demo: +compatible-v0: +compatible-v1: true +--- + +Track history of map movements and zoom locations similar to a browser. diff --git a/docs/_plugins/bookmarked-pan-zoom/leafletviewmeta.md b/docs/_plugins/bookmarked-pan-zoom/leafletviewmeta.md new file mode 100644 index 00000000000..7acdc793d47 --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leafletviewmeta.md @@ -0,0 +1,12 @@ +--- +name: leaflet-view-meta +category: bookmarked-pan-zoom +repo: https://github.com/rwev/leaflet-view-meta +author: rwev +author-url: https://github.com/rwev +demo: +compatible-v0: +compatible-v1: true +--- + +Plugin control that displays and persists map view meta-data, center and boundary coordinates to URL for precise sharing and view reconstruction. diff --git a/docs/_plugins/bookmarked-pan-zoom/leafletzoommin.md b/docs/_plugins/bookmarked-pan-zoom/leafletzoommin.md new file mode 100644 index 00000000000..59bf6c64c5a --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/leafletzoommin.md @@ -0,0 +1,12 @@ +--- +name: leaflet-zoom-min +category: bookmarked-pan-zoom +repo: https://github.com/alanshaw/leaflet-zoom-min/ +author: Alan Shaw +author-url: https://github.com/alanshaw/ +demo: +compatible-v0: +compatible-v1: true +--- + +Adds a button to the zoom control that allows you to zoom to the map minimum zoom level in a single click. diff --git a/docs/_plugins/clustering-decluttering/leaflet-conditionallayer.md b/docs/_plugins/clustering-decluttering/leaflet-conditionallayer.md new file mode 100644 index 00000000000..d094a651f12 --- /dev/null +++ b/docs/_plugins/clustering-decluttering/leaflet-conditionallayer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ConditionalLayer +category: clustering-decluttering +repo: https://github.com/Eclipse1979/leaflet-conditionalLayer +author: EPP +author-url: https://github.com/Eclipse1979 +demo: http://eclipse1979.github.io/Leaflet.ConditionalLayer/example/leaflet-conditionalLayer2.html +compatible-v0: +compatible-v1: true +--- + +A FeatureGroup that does not show any more than a certain amount of markers visible in the viewport. diff --git a/docs/_plugins/clustering-decluttering/leaflet-deflate.md b/docs/_plugins/clustering-decluttering/leaflet-deflate.md new file mode 100644 index 00000000000..83e2d581b59 --- /dev/null +++ b/docs/_plugins/clustering-decluttering/leaflet-deflate.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Deflate +category: clustering-decluttering +repo: https://github.com/oliverroick/Leaflet.Deflate +author: Oliver Roick +author-url: https://github.com/oliverroick +demo: +compatible-v0: +compatible-v1: true +--- + +Deflates lines and polygons to a marker when their screen size becomes too small in lower zoom levels. diff --git a/docs/_plugins/clustering-decluttering/leaflet-featuregroup-subgroup.md b/docs/_plugins/clustering-decluttering/leaflet-featuregroup-subgroup.md new file mode 100644 index 00000000000..c37f36e9918 --- /dev/null +++ b/docs/_plugins/clustering-decluttering/leaflet-featuregroup-subgroup.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.FeatureGroup.SubGroup +category: clustering-decluttering +repo: https://github.com/ghybs/Leaflet.FeatureGroup.SubGroup +author: ghybs +author-url: https://github.com/ghybs +demo: http://ghybs.github.io/Leaflet.FeatureGroup.SubGroup/examples/subGroup-markercluster-controlLayers-realworld.388.html +compatible-v0: +compatible-v1: true +--- + +A simple plugin to create Feature Groups that add their child layers into a parent group. Typical usage is to switch them through L.Control.Layers to dynamically add/remove groups of markers from Leaflet.markercluster. diff --git a/docs/_plugins/clustering-decluttering/leaflet-gridcluster.md b/docs/_plugins/clustering-decluttering/leaflet-gridcluster.md new file mode 100644 index 00000000000..438a0210ee7 --- /dev/null +++ b/docs/_plugins/clustering-decluttering/leaflet-gridcluster.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GridCluster +category: clustering-decluttering +repo: https://github.com/andy-kay/Leaflet.GridCluster +author: Andreas Kiefer +author-url: https://github.com/andy-kay +demo: +compatible-v0: +compatible-v1: true +--- + +Create grid-based clusters in realtime. diff --git a/docs/_plugins/clustering-decluttering/leaflet-layergroup-collision.md b/docs/_plugins/clustering-decluttering/leaflet-layergroup-collision.md new file mode 100644 index 00000000000..27bca406c92 --- /dev/null +++ b/docs/_plugins/clustering-decluttering/leaflet-layergroup-collision.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.LayerGroup.Collision +category: clustering-decluttering +repo: https://github.com/MazeMap/Leaflet.LayerGroup.Collision +author: Iván Sánchez Ortega +author-url: https://github.com/IvanSanchez +demo: +compatible-v0: +compatible-v1: true +--- + +Provides collision detection for groups of markers. Unlike clustering, this takes into account the shape & size of the markers. diff --git a/docs/_plugins/clustering-decluttering/leaflet-markercluster.md b/docs/_plugins/clustering-decluttering/leaflet-markercluster.md new file mode 100644 index 00000000000..cbd0ba5c8fa --- /dev/null +++ b/docs/_plugins/clustering-decluttering/leaflet-markercluster.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.markercluster +category: clustering-decluttering +repo: https://github.com/Leaflet/Leaflet.markercluster +author: Dave Leaver +author-url: https://github.com/danzel +demo: +compatible-v0: +compatible-v1: true +--- + +Beautiful, sophisticated, high performance marker clustering solution with smooth animations and lots of great features. Recommended! diff --git a/docs/_plugins/clustering-decluttering/leaflettooltiplayout.md b/docs/_plugins/clustering-decluttering/leaflettooltiplayout.md new file mode 100644 index 00000000000..1821118f74a --- /dev/null +++ b/docs/_plugins/clustering-decluttering/leaflettooltiplayout.md @@ -0,0 +1,12 @@ +--- +name: leaflet-tooltip-layout +category: clustering-decluttering +repo: https://github.com/ZijingPeng/leaflet-tooltip-layout +author: Zijing Peng +author-url: https://github.com/ZijingPeng +demo: https://zijingpeng.github.io/overlapping-avoided-tooltip/ +compatible-v0: +compatible-v1: true +--- + +A plugin to avoid tooltips overlapping and make it easier to find out the relationship between each tooltip and marker. diff --git a/docs/_plugins/clustering-decluttering/overlapping-marker-spiderfier.md b/docs/_plugins/clustering-decluttering/overlapping-marker-spiderfier.md new file mode 100644 index 00000000000..0f2318e3609 --- /dev/null +++ b/docs/_plugins/clustering-decluttering/overlapping-marker-spiderfier.md @@ -0,0 +1,12 @@ +--- +name: Overlapping Marker Spiderfier +category: clustering-decluttering +repo: https://github.com/jawj/OverlappingMarkerSpiderfier-Leaflet +author: George MacKerron +author-url: http://mackerron.com/ +demo: +compatible-v0: +compatible-v1: true +--- + +Deals with overlapping markers in a Google Earth-inspired way by gracefully springing them apart on click. diff --git a/docs/_plugins/clustering-decluttering/prunecluster.md b/docs/_plugins/clustering-decluttering/prunecluster.md new file mode 100644 index 00000000000..cd786efbe42 --- /dev/null +++ b/docs/_plugins/clustering-decluttering/prunecluster.md @@ -0,0 +1,12 @@ +--- +name: PruneCluster +category: clustering-decluttering +repo: https://github.com/SINTEF-9012/PruneCluster +author: Antoine Pultier +author-url: https://github.com/yellowiscool +demo: +compatible-v0: +compatible-v1: true +--- + +Fast and realtime marker clustering library. diff --git a/docs/_plugins/clustering-decluttering/qcluster.md b/docs/_plugins/clustering-decluttering/qcluster.md new file mode 100644 index 00000000000..93f013e4a28 --- /dev/null +++ b/docs/_plugins/clustering-decluttering/qcluster.md @@ -0,0 +1,12 @@ +--- +name: q-cluster +category: clustering-decluttering +repo: https://github.com/spatialdev/q-cluster +author: Nicholas Hallahan +author-url: https://github.com/hallahan +demo: +compatible-v0: +compatible-v1: true +--- + +Quick point clustering library with D3 categorization. diff --git a/docs/_plugins/data-providers/leaflet-dbpedialayer.md b/docs/_plugins/data-providers/leaflet-dbpedialayer.md new file mode 100644 index 00000000000..9f6cbbc41db --- /dev/null +++ b/docs/_plugins/data-providers/leaflet-dbpedialayer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.dbpediaLayer +category: data-providers +repo: https://github.com/kr1/Leaflet.dbpediaLayer/ +author: Kr1 +author-url: https://github.com/kr1/ +demo: +compatible-v0: +compatible-v1: true +--- + +A layer with Points of interest from Wikipedia - loaded via ajax from DBpedia's SPARQL endpoint. diff --git a/docs/_plugins/data-providers/leaflet-freietonne.md b/docs/_plugins/data-providers/leaflet-freietonne.md new file mode 100644 index 00000000000..bcd281f18f1 --- /dev/null +++ b/docs/_plugins/data-providers/leaflet-freietonne.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.FreieTonne +category: data-providers +repo: https://github.com/facilmap/Leaflet.FreieTonne +author: Candid Dauth +author-url: https://github.com/cdauth +demo: https://unpkg.com/leaflet-freie-tonne/example.html +compatible-v0: +compatible-v1: true +--- + +An overlay with nautical features from FreieTonne. diff --git a/docs/_plugins/data-providers/leaflet-geographphotos.md b/docs/_plugins/data-providers/leaflet-geographphotos.md new file mode 100644 index 00000000000..088b9cb25bb --- /dev/null +++ b/docs/_plugins/data-providers/leaflet-geographphotos.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GeographPhotos +category: data-providers +repo: https://github.com/geograph-project/Leaflet.GeographPhotos +author: Barry Hunter +author-url: https://github.com/barryhunter/ +demo: +compatible-v0: +compatible-v1: true +--- + +Display Geographical-Photos from Geograph Britain and Ireland in an interactive overlay, using their API. diff --git a/docs/_plugins/data-providers/leaflet-overpass-layer.md b/docs/_plugins/data-providers/leaflet-overpass-layer.md new file mode 100644 index 00000000000..61bd98aad18 --- /dev/null +++ b/docs/_plugins/data-providers/leaflet-overpass-layer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Overpass Layer +category: data-providers +repo: https://github.com/GuillaumeAmat/leaflet-overpass-layer +author: Guillaume AMAT +author-url: https://github.com/GuillaumeAmat +demo: +compatible-v0: +compatible-v1: true +--- + +Easily include data from the overpass api. diff --git a/docs/_plugins/data-providers/leaflet-rainviewer.md b/docs/_plugins/data-providers/leaflet-rainviewer.md new file mode 100644 index 00000000000..63100bc7ebd --- /dev/null +++ b/docs/_plugins/data-providers/leaflet-rainviewer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Rainviewer +category: data-providers +repo: https://github.com/mwasil/Leaflet.Rainviewer +author: Marcin Wasilewski +author-url: https://marcinwasilewski.eu/ +demo: https://mwasil.github.io/Leaflet.Rainviewer/demo/ +compatible-v0: +compatible-v1: true +--- + +Plugin for RainViewer radar data API. diff --git a/docs/_plugins/data-providers/leaflet-vector-layers.md b/docs/_plugins/data-providers/leaflet-vector-layers.md new file mode 100644 index 00000000000..488b98020b9 --- /dev/null +++ b/docs/_plugins/data-providers/leaflet-vector-layers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Vector Layers +category: data-providers +repo: http://jasonsanford.github.io/leaflet-vector-layers/ +author: Jason Sanford +author-url: http://geojason.info/ +demo: +compatible-v0: +compatible-v1: true +--- + +Allows to easily create vector layers from a number of geo web services, such as ArcGIS Server, Arc2Earth, GeoIQ, CartoDB and GIS Cloud. diff --git a/docs/_plugins/data-providers/leafletenvironmentallayers.md b/docs/_plugins/data-providers/leafletenvironmentallayers.md new file mode 100644 index 00000000000..7b118e65e6b --- /dev/null +++ b/docs/_plugins/data-providers/leafletenvironmentallayers.md @@ -0,0 +1,12 @@ +--- +name: leaflet-environmental-layers +category: data-providers +repo: https://github.com/publiclab/leaflet-environmental-layers +author: Public Lab +author-url: https://github.com/publiclab +demo: https://publiclab.github.io/leaflet-environmental-layers/example/index.html#3/43.00/-46.26/BL2 +compatible-v0: +compatible-v1: true +--- + +Collection of different environmental map layers in an easy to use Leaflet library. diff --git a/docs/_plugins/data-providers/leafletradar.md b/docs/_plugins/data-providers/leafletradar.md new file mode 100644 index 00000000000..2f9e448d4e2 --- /dev/null +++ b/docs/_plugins/data-providers/leafletradar.md @@ -0,0 +1,12 @@ +--- +name: leaflet-radar +category: data-providers +repo: https://github.com/rwev/leaflet-radar +author: rwev +author-url: https://github.com/rwev/ +demo: +compatible-v0: +compatible-v1: true +--- + +Animated satellite weather radar overlays for Leaflet. diff --git a/docs/_plugins/data-providers/leafletwikipedia.md b/docs/_plugins/data-providers/leafletwikipedia.md new file mode 100644 index 00000000000..7109c375b28 --- /dev/null +++ b/docs/_plugins/data-providers/leafletwikipedia.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-Wikipedia +category: data-providers +repo: https://github.com/MatthewBarker/leaflet-wikipedia +author: Matthew Barker +author-url: https://github.com/MatthewBarker +demo: +compatible-v0: +compatible-v1: true +--- + +A leaflet plugin to display Wikipedia API entries on a map layer. diff --git a/docs/_plugins/data-providers/windyleafletplugin.md b/docs/_plugins/data-providers/windyleafletplugin.md new file mode 100644 index 00000000000..fac40ad3c7a --- /dev/null +++ b/docs/_plugins/data-providers/windyleafletplugin.md @@ -0,0 +1,12 @@ +--- +name: Windy-Leaflet-plugin +category: data-providers +repo: https://github.com/windycom/API +author: Windy.com +author-url: https://www.windy.com/ +demo: +compatible-v0: +compatible-v1: true +--- + +Displays animated weather map on your page using Windy's free API. diff --git a/docs/_plugins/dataviz/geogrid-js.md b/docs/_plugins/dataviz/geogrid-js.md new file mode 100644 index 00000000000..85ef96b114f --- /dev/null +++ b/docs/_plugins/dataviz/geogrid-js.md @@ -0,0 +1,12 @@ +--- +name: geogrid.js +category: dataviz +repo: https://github.com/giscience/geogrid.js +author: F.-B. Mocnik, +author-url: http://www.mocnik-science.net/ +demo: +compatible-v0: +compatible-v1: true +--- + +Displays data aggregated by the ISEA3H discrete global grid system. The data can, e.g., be delivered by using Measures REST (a framework to deliver data aggregated by the grid) or geogrid (a library for handling the grid in case that you want to aggregate data manually). diff --git a/docs/_plugins/dataviz/jquerystorymap.md b/docs/_plugins/dataviz/jquerystorymap.md new file mode 100644 index 00000000000..ed43fb76f29 --- /dev/null +++ b/docs/_plugins/dataviz/jquerystorymap.md @@ -0,0 +1,12 @@ +--- +name: jquery-storymap +category: dataviz +repo: https://github.com/atlefren/storymap +author: Atle Frenvik Sveen +author-url: https://github.com/atlefren +demo: +compatible-v0: +compatible-v1: true +--- + +A jQuery plugin to display several map locations as the user scrolls through paragraphs. diff --git a/docs/_plugins/dataviz/leaflet-canvasflowmaplayer.md b/docs/_plugins/dataviz/leaflet-canvasflowmaplayer.md new file mode 100644 index 00000000000..13f7367116a --- /dev/null +++ b/docs/_plugins/dataviz/leaflet-canvasflowmaplayer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Canvas-Flowmap-Layer +category: dataviz +repo: https://github.com/jwasilgeo/Leaflet.Canvas-Flowmap-Layer +author: Jacob Wasilkowski +author-url: https://github.com/jwasilgeo +demo: +compatible-v0: +compatible-v1: true +--- + +A LeafletJS custom map layer for mapping the flow of objects, ideas, people, etc. with Bezier curves rendered on the HTML canvas. diff --git a/docs/_plugins/dataviz/leaflet-d3svgoverlay.md b/docs/_plugins/dataviz/leaflet-d3svgoverlay.md new file mode 100644 index 00000000000..427fc8def59 --- /dev/null +++ b/docs/_plugins/dataviz/leaflet-d3svgoverlay.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.D3SvgOverlay +category: dataviz +repo: https://github.com/teralytics/Leaflet.D3SvgOverlay +author: Kirill Zhuravlev +author-url: https://github.com/xEviL +demo: +compatible-v0: +compatible-v1: true +--- + +SVG overlay class for using with D3 library. Supports zoom animation and scaling without need to redraw the layer. diff --git a/docs/_plugins/dataviz/leaflet-data-visualization-framework.md b/docs/_plugins/dataviz/leaflet-data-visualization-framework.md new file mode 100644 index 00000000000..598fd31ad2b --- /dev/null +++ b/docs/_plugins/dataviz/leaflet-data-visualization-framework.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Data Visualization Framework +category: dataviz +repo: https://github.com/humangeo/leaflet-dvf +author: Scott Fairgrieve +author-url: https://github.com/sfairgrieve +demo: +compatible-v0: +compatible-v1: true +--- + +New markers, layers, and utility classes for easy thematic mapping and data visualization. diff --git a/docs/_plugins/dataviz/leaflet-for-r.md b/docs/_plugins/dataviz/leaflet-for-r.md new file mode 100644 index 00000000000..d09b50d76de --- /dev/null +++ b/docs/_plugins/dataviz/leaflet-for-r.md @@ -0,0 +1,12 @@ +--- +name: Leaflet for R +category: dataviz +repo: https://github.com/rstudio/leaflet +author: RStudio team +author-url: https://github.com/rstudio/ +demo: +compatible-v0: +compatible-v1: true +--- + +Allows using Leaflet from within R programs, a programming language popular for statistical analysis and data mining. diff --git a/docs/_plugins/dataviz/leaflet-glify-layer.md b/docs/_plugins/dataviz/leaflet-glify-layer.md new file mode 100644 index 00000000000..f2f2dcd3ab3 --- /dev/null +++ b/docs/_plugins/dataviz/leaflet-glify-layer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.glify.layer +category: dataviz +repo: https://github.com/onaci/Leaflet.glify.layer +author: onaci +author-url: https://github.com/onaci +demo: https://onaci.github.io/Leaflet.glify.layer/ +compatible-v0: +compatible-v1: true +--- + +Add-on for the Leaflet.glify plugin to provide more leaflet-idiomatic bindings. Provides fast webgl rendering for GeoJSON FeatureCollections (currently limited to polygons, lines and points). diff --git a/docs/_plugins/dataviz/leaflet-glify.md b/docs/_plugins/dataviz/leaflet-glify.md new file mode 100644 index 00000000000..a14b87a342c --- /dev/null +++ b/docs/_plugins/dataviz/leaflet-glify.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.glify +category: dataviz +repo: https://github.com/robertleeplummerjr/Leaflet.glify +author: robertleeplummerjr +author-url: https://github.com/robertleeplummerjr +demo: https://robertleeplummerjr.github.io/Leaflet.glify/ +compatible-v0: +compatible-v1: true +--- + +Fast rendering for large (+100MB) GeoJSON datasets with WebGL. diff --git a/docs/_plugins/dataviz/leaflet-migrationlayer.md b/docs/_plugins/dataviz/leaflet-migrationlayer.md new file mode 100644 index 00000000000..39ab21a529c --- /dev/null +++ b/docs/_plugins/dataviz/leaflet-migrationlayer.md @@ -0,0 +1,12 @@ +--- +name: leaflet.migrationLayer +category: dataviz +repo: https://github.com/lit-forest/leaflet.migrationLayer +author: Sylvenas +author-url: https://github.com/react-map +demo: https://lycheelin.github.io/leaflet.migrationLayer/ +compatible-v0: +compatible-v1: true +--- + +leaflet.migrationLayer is used to show migration data such as population, flight, vehicle, traffic and so on. Data visualization on map. diff --git a/docs/_plugins/dataviz/leaflet-pixioverlay.md b/docs/_plugins/dataviz/leaflet-pixioverlay.md new file mode 100644 index 00000000000..42bf94c6b3f --- /dev/null +++ b/docs/_plugins/dataviz/leaflet-pixioverlay.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.PixiOverlay +category: dataviz +repo: https://github.com/manubb/Leaflet.PixiOverlay +author: Manuel Baclet +author-url: https://github.com/manubb +demo: https://manubb.github.io/Leaflet.PixiOverlay/demo.html +compatible-v0: +compatible-v1: true +--- + +A Leaflet overlay class for drawing and animating with Pixi.js. diff --git a/docs/_plugins/dataviz/leaflet-quadtree.md b/docs/_plugins/dataviz/leaflet-quadtree.md new file mode 100644 index 00000000000..f5d958cdba2 --- /dev/null +++ b/docs/_plugins/dataviz/leaflet-quadtree.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Quadtree +category: dataviz +repo: https://ibesora.github.io/Leaflet.Quadtree/ +author: ibesora +author-url: https://github.com/ibesora +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet.Quadtree is used to retrieve visible data inside given bounds diff --git a/docs/_plugins/dataviz/leafletecharts.md b/docs/_plugins/dataviz/leafletecharts.md new file mode 100644 index 00000000000..9a4cb452811 --- /dev/null +++ b/docs/_plugins/dataviz/leafletecharts.md @@ -0,0 +1,12 @@ +--- +name: leaflet-echarts +category: dataviz +repo: https://github.com/wandergis/leaflet-echarts +author: wandergis +author-url: https://github.com/wandergis +demo: +compatible-v0: +compatible-v1: true +--- + +A plugin for Leaflet to load echarts map and make big data visualization easier. diff --git a/docs/_plugins/dataviz/leafletpartition.md b/docs/_plugins/dataviz/leafletpartition.md new file mode 100644 index 00000000000..36bc4184930 --- /dev/null +++ b/docs/_plugins/dataviz/leafletpartition.md @@ -0,0 +1,12 @@ +--- +name: leaflet-partition +category: dataviz +repo: https://github.com/locknono/leaflet-partition +author: locknono +author-url: https://github.com/locknono +demo: https://locknono.github.io/leaflet-partition/ +compatible-v0: +compatible-v1: true +--- + +Divide the area into parts in different ways such as voronoi(triangulation) and hexagonal tiling. diff --git a/docs/_plugins/dataviz/leafletvelocity.md b/docs/_plugins/dataviz/leafletvelocity.md new file mode 100644 index 00000000000..7644219a566 --- /dev/null +++ b/docs/_plugins/dataviz/leafletvelocity.md @@ -0,0 +1,12 @@ +--- +name: leaflet-velocity +category: dataviz +repo: https://github.com/onaci/leaflet-velocity +author: Dan Wild +author-url: https://github.com/danwild +demo: https://onaci.github.io/leaflet-velocity/ +compatible-v0: +compatible-v1: true +--- + +Visualise velocity layers with leaflet. diff --git a/docs/_plugins/dataviz/mapboxglleaflet.md b/docs/_plugins/dataviz/mapboxglleaflet.md new file mode 100644 index 00000000000..1a17b72a5cb --- /dev/null +++ b/docs/_plugins/dataviz/mapboxglleaflet.md @@ -0,0 +1,12 @@ +--- +name: mapbox-gl-leaflet +category: dataviz +repo: https://github.com/mapbox/mapbox-gl-leaflet +author: Tom MacWright +author-url: https://github.com/tmcw +demo: +compatible-v0: +compatible-v1: true +--- + +Binding from Mapbox GL JS to the Leaflet API diff --git a/docs/_plugins/dataviz/raphaellayer.md b/docs/_plugins/dataviz/raphaellayer.md new file mode 100644 index 00000000000..f57559c8bb6 --- /dev/null +++ b/docs/_plugins/dataviz/raphaellayer.md @@ -0,0 +1,12 @@ +--- +name: RaphaelLayer +category: dataviz +repo: https://github.com/dynmeth/RaphaelLayer +author: Dynamic Methods +author-url: https://github.com/dynmeth +demo: +compatible-v0: +compatible-v1: true +--- + +Allows you to use Raphael as a layer on a Leaflet map for advanced animations and visualizations. diff --git a/docs/_plugins/dynamic-custom-data-loading/leaflet-ajax.md b/docs/_plugins/dynamic-custom-data-loading/leaflet-ajax.md new file mode 100644 index 00000000000..cf628c2004b --- /dev/null +++ b/docs/_plugins/dynamic-custom-data-loading/leaflet-ajax.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Ajax +category: dynamic-custom-data-loading +repo: https://github.com/calvinmetcalf/leaflet-ajax +author: Calvin Metcalf +author-url: https://github.com/calvinmetcalf/ +demo: +compatible-v0: +compatible-v1: true +--- + +Add GeoJSON data via ajax or jsonp. diff --git a/docs/_plugins/dynamic-custom-data-loading/leaflet-geosse.md b/docs/_plugins/dynamic-custom-data-loading/leaflet-geosse.md new file mode 100644 index 00000000000..e87dde88cf9 --- /dev/null +++ b/docs/_plugins/dynamic-custom-data-loading/leaflet-geosse.md @@ -0,0 +1,12 @@ +--- +name: Leaflet GeoSSE +category: dynamic-custom-data-loading +repo: https://github.com/ATran31/Leaflet-GeoSSE +author: An Tran +author-url: https://github.com/ATran31/ +demo: +compatible-v0: +compatible-v1: true +--- + +Add realtime data to a Leaflet map using server sent events. diff --git a/docs/_plugins/dynamic-custom-data-loading/leaflet-indoor.md b/docs/_plugins/dynamic-custom-data-loading/leaflet-indoor.md new file mode 100644 index 00000000000..a9229bfc6a1 --- /dev/null +++ b/docs/_plugins/dynamic-custom-data-loading/leaflet-indoor.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Indoor +category: dynamic-custom-data-loading +repo: https://github.com/cbaines/leaflet-indoor +author: Christopher Baines +author-url: https://github.com/cbaines +demo: +compatible-v0: +compatible-v1: true +--- + +Create indoor maps. diff --git a/docs/_plugins/dynamic-custom-data-loading/leaflet-liveupdate.md b/docs/_plugins/dynamic-custom-data-loading/leaflet-liveupdate.md new file mode 100644 index 00000000000..2002b85de4e --- /dev/null +++ b/docs/_plugins/dynamic-custom-data-loading/leaflet-liveupdate.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Liveupdate +category: dynamic-custom-data-loading +repo: https://github.com/tinuzz/leaflet-liveupdate +author: Martijn Grendelman +author-url: https://github.com/tinuzz/ +demo: https://www.grendelman.net/leaflet/ +compatible-v0: +compatible-v1: true +--- + +Periodically ('live') update something on a map. diff --git a/docs/_plugins/dynamic-custom-data-loading/leaflet-mytrack.md b/docs/_plugins/dynamic-custom-data-loading/leaflet-mytrack.md new file mode 100644 index 00000000000..c3733bafb78 --- /dev/null +++ b/docs/_plugins/dynamic-custom-data-loading/leaflet-mytrack.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.mytrack +category: dynamic-custom-data-loading +repo: https://github.com/dj0001/Leaflet.mytrack +author: DJ +author-url: https://github.com/dj0001 +demo: https://dj0001.github.io/Leaflet.mytrack/ +compatible-v0: +compatible-v1: true +--- + +Track my way on a map and download it. diff --git a/docs/_plugins/dynamic-custom-data-loading/leaflet-pouch.md b/docs/_plugins/dynamic-custom-data-loading/leaflet-pouch.md new file mode 100644 index 00000000000..8f5d60380d3 --- /dev/null +++ b/docs/_plugins/dynamic-custom-data-loading/leaflet-pouch.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Pouch +category: dynamic-custom-data-loading +repo: https://github.com/calvinmetcalf/leaflet.pouch +author: Calvin Metcalf +author-url: https://github.com/calvinmetcalf/ +demo: +compatible-v0: +compatible-v1: true +--- + +Use PouchDB to sync CouchDB data to local storage (indexedDB), to just add couchDB data or as just a less confusing implementation of indexedDB. diff --git a/docs/_plugins/dynamic-custom-data-loading/leaflet-realtime.md b/docs/_plugins/dynamic-custom-data-loading/leaflet-realtime.md new file mode 100644 index 00000000000..07876f9e348 --- /dev/null +++ b/docs/_plugins/dynamic-custom-data-loading/leaflet-realtime.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Realtime +category: dynamic-custom-data-loading +repo: https://github.com/perliedman/leaflet-realtime +author: Per Liedman +author-url: https://github.com/perliedman/ +demo: +compatible-v0: +compatible-v1: true +--- + +Put realtime data on a Leaflet map: live tracking GPS units, sensor data or just about anything. diff --git a/docs/_plugins/dynamic-custom-data-loading/leaflet-ugeojson.md b/docs/_plugins/dynamic-custom-data-loading/leaflet-ugeojson.md new file mode 100644 index 00000000000..cba9a9da938 --- /dev/null +++ b/docs/_plugins/dynamic-custom-data-loading/leaflet-ugeojson.md @@ -0,0 +1,12 @@ +--- +name: Leaflet uGeoJSON +category: dynamic-custom-data-loading +repo: https://github.com/BenjaminVadant/leaflet-ugeojson +author: Benjamin VADANT +author-url: https://github.com/BenjaminVadant/ +demo: +compatible-v0: +compatible-v1: true +--- + +Add an auto updating GeoJSON data Layer via ajax post requests. diff --git a/docs/_plugins/edit-geometries/l-geoman.md b/docs/_plugins/edit-geometries/l-geoman.md new file mode 100644 index 00000000000..01049d0f3df --- /dev/null +++ b/docs/_plugins/edit-geometries/l-geoman.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-Geoman +category: edit-geometries +repo: https://github.com/geoman-io/leaflet-geoman +author: Sumit Kumar +author-url: https://github.com/codeofsumit +demo: https://geoman.io/leaflet-geoman +compatible-v0: false +compatible-v1: true +--- + +Geometry Management for Leaflet 1.0 and higher. Draw, Edit, Drag, Cut, Rotate, Split, Scale, Measure, Snap and Pin Layers like Markers, CircleMarkers, Polylines, Polygons, Circles, Rectangles, ImageOverlays, LayerGroups, GeoJSON, MultiLineStrings and MultiPolygons. Supports holes in polygons, canvas mode and more. diff --git a/docs/_plugins/edit-geometries/leaflet-clipper.md b/docs/_plugins/edit-geometries/leaflet-clipper.md new file mode 100644 index 00000000000..d3edfa2c31a --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-clipper.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Clipper +category: edit-geometries +repo: https://github.com/willfarrell/Leaflet.Clipper +author: will Farrell +author-url: https://github.com/willfarrell +demo: https://willfarrell.github.io/Leaflet.Clipper/ +compatible-v0: +compatible-v1: true +--- + +Allows Union, Difference, Xor, and Intersection operations on two polygons. diff --git a/docs/_plugins/edit-geometries/leaflet-control-paintpolygon.md b/docs/_plugins/edit-geometries/leaflet-control-paintpolygon.md new file mode 100644 index 00000000000..424e16add1a --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-control-paintpolygon.md @@ -0,0 +1,12 @@ +--- +name: L.Control.PaintPolygon +category: edit-geometries +repo: https://github.com/tcoupin/leaflet-paintpolygon +author: Thibault Coupin +author-url: https://github.com/tcoupin +demo: +compatible-v0: +compatible-v1: true +--- + +Draw yours polygons with a circle brush like Paint[brush]. Includes turf.js dependencies. diff --git a/docs/_plugins/edit-geometries/leaflet-draggablelines.md b/docs/_plugins/edit-geometries/leaflet-draggablelines.md new file mode 100644 index 00000000000..6aa5ba5886a --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-draggablelines.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.DraggableLines +category: edit-geometries +repo: https://github.com/FacilMap/Leaflet.DraggableLines +author: Candid Dauth +author-url: https://github.com/cdauth/ +demo: https://unpkg.com/leaflet-draggable-lines/example.html +compatible-v0: +compatible-v1: true +--- + +Add/move/remove points on routes, lines and polygons by drag&drop. diff --git a/docs/_plugins/edit-geometries/leaflet-draw.md b/docs/_plugins/edit-geometries/leaflet-draw.md new file mode 100644 index 00000000000..f9b7546c6cc --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-draw.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.draw +category: edit-geometries +repo: https://github.com/Leaflet/Leaflet.draw +author: Jacob Toye +author-url: https://github.com/jacobtoye +demo: +compatible-v0: +compatible-v1: true +--- + +Enables drawing features like polylines, polygons, rectangles, circles and markers through a very nice user-friendly interface with icons and hints. diff --git a/docs/_plugins/edit-geometries/leaflet-editable-polyline.md b/docs/_plugins/edit-geometries/leaflet-editable-polyline.md new file mode 100644 index 00000000000..4d2bfa83444 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-editable-polyline.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Editable.Polyline +category: edit-geometries +repo: https://github.com/tkrajina/leaflet-editable-polyline +author: Tomo Krajina +author-url: https://github.com/tkrajina +demo: +compatible-v0: +compatible-v1: true +--- + +Editable polylines: move existing points, add new points and split polylines. diff --git a/docs/_plugins/edit-geometries/leaflet-editable.md b/docs/_plugins/edit-geometries/leaflet-editable.md new file mode 100644 index 00000000000..83898373329 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-editable.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Editable +category: edit-geometries +repo: https://github.com/Leaflet/Leaflet.Editable +author: Yohan Boniface +author-url: https://yohanboniface.me/ +demo: +compatible-v0: +compatible-v1: true +--- + +Lightweight fully customisable and controllable drawing/editing plugin. diff --git a/docs/_plugins/edit-geometries/leaflet-editablehandlers.md b/docs/_plugins/edit-geometries/leaflet-editablehandlers.md new file mode 100644 index 00000000000..cf41a2713b8 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-editablehandlers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.EditableHandlers +category: edit-geometries +repo: https://github.com/kartena/Leaflet.EditableHandlers +author: Kartena +author-url: http://www.kartena.se/index.html +demo: +compatible-v0: +compatible-v1: true +--- + +A set of plugins that includes circle editing, measuring tool, and label for polygon sides. diff --git a/docs/_plugins/edit-geometries/leaflet-freedraw.md b/docs/_plugins/edit-geometries/leaflet-freedraw.md new file mode 100644 index 00000000000..56593437ef5 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-freedraw.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.FreeDraw +category: edit-geometries +repo: https://github.com/Wildhoney/Leaflet.FreeDraw +author: Wildhoney +author-url: https://github.com/Wildhoney +demo: +compatible-v0: +compatible-v1: true +--- + +Zoopla inspired freehand polygon creation using Leaflet.js and D3. diff --git a/docs/_plugins/edit-geometries/leaflet-illustrate.md b/docs/_plugins/edit-geometries/leaflet-illustrate.md new file mode 100644 index 00000000000..ae8adb279d2 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-illustrate.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Illustrate +category: edit-geometries +repo: https://github.com/justinmanley/Leaflet.Illustrate +author: Justin Manley +author-url: https://github.com/manleyjster +demo: https://justinmanley.github.io/Leaflet.Illustrate/examples/0.0.2/simple/ +compatible-v0: true +compatible-v1: false +--- + +Extension for Leaflet.draw enabling users to type annotations directly on maps. diff --git a/docs/_plugins/edit-geometries/leaflet-mappaint.md b/docs/_plugins/edit-geometries/leaflet-mappaint.md new file mode 100644 index 00000000000..ecbc894534c --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-mappaint.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MapPaint +category: edit-geometries +repo: https://github.com/SINTEF-9012/Leaflet.MapPaint +author: Antoine Pultier +author-url: https://github.com/yellowiscool +demo: +compatible-v0: +compatible-v1: true +--- + +Bitmap painting plugin designed for touch devices. diff --git a/docs/_plugins/edit-geometries/leaflet-path-drag.md b/docs/_plugins/edit-geometries/leaflet-path-drag.md new file mode 100644 index 00000000000..7a499ee14f8 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-path-drag.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Path.Drag +category: edit-geometries +repo: https://github.com/w8r/Leaflet.Path.Drag +author: Alexander Milevski +author-url: https://github.com/w8r/ +demo: https://milevski.co/Leaflet.Path.Drag +compatible-v0: +compatible-v1: true +--- + +Drag handler and interaction for polygons and polylines. diff --git a/docs/_plugins/edit-geometries/leaflet-path-transform.md b/docs/_plugins/edit-geometries/leaflet-path-transform.md new file mode 100644 index 00000000000..82e98ab6b2b --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-path-transform.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Path.Transform +category: edit-geometries +repo: https://github.com/w8r/Leaflet.Path.Transform +author: Alexander Milevski +author-url: https://github.com/w8r/ +demo: https://milevski.co/Leaflet.Path.Transform +compatible-v0: +compatible-v1: true +--- + +Scale & rotate handler and interaction for polygons and polylines. diff --git a/docs/_plugins/edit-geometries/leaflet-pather.md b/docs/_plugins/edit-geometries/leaflet-pather.md new file mode 100644 index 00000000000..ca1a28d8084 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-pather.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Pather +category: edit-geometries +repo: https://github.com/Wildhoney/L.Pather +author: Wildhoney +author-url: https://github.com/Wildhoney +demo: +compatible-v0: +compatible-v1: true +--- + +L.Pather is a freehand polyline creator that simplifies the polyline for mutability. Requires D3 support. diff --git a/docs/_plugins/edit-geometries/leaflet-pin.md b/docs/_plugins/edit-geometries/leaflet-pin.md new file mode 100644 index 00000000000..28b3e9281d5 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-pin.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Pin +category: edit-geometries +repo: https://github.com/kklimczak/Leaflet.Pin +author: Konrad Klimczak +author-url: https://github.com/kklimczak +demo: +compatible-v0: +compatible-v1: true +--- + +Enable attaching of markers to other layers during draw or edit features with Leaflet.Draw. diff --git a/docs/_plugins/edit-geometries/leaflet-plotter.md b/docs/_plugins/edit-geometries/leaflet-plotter.md new file mode 100644 index 00000000000..49c61936628 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-plotter.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.plotter +category: edit-geometries +repo: https://github.com/scripter-co/leaflet-plotter +author: Nathan Mahdavi +author-url: https://github.com/scripter-co +demo: +compatible-v0: +compatible-v1: true +--- + +leaflet-plotter allows you to create routes using a leaflet powered map. You can click on the mid-points to create a new, draggable point. diff --git a/docs/_plugins/edit-geometries/leaflet-segmentedit.md b/docs/_plugins/edit-geometries/leaflet-segmentedit.md new file mode 100644 index 00000000000..a69aa7db7e3 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-segmentedit.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.SegmentEdit +category: edit-geometries +repo: https://github.com/Lemaf/leaflet-polyline-segment-edit +author: Lemaf +author-url: https://github.com/Lemaf +demo: +compatible-v0: +compatible-v1: true +--- + +An extension to Leaflet.draw to allow editing large polylines one chunk at the time. diff --git a/docs/_plugins/edit-geometries/leaflet-simplemarkers.md b/docs/_plugins/edit-geometries/leaflet-simplemarkers.md new file mode 100644 index 00000000000..d40738bff69 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-simplemarkers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.SimpleMarkers +category: edit-geometries +repo: https://github.com/jdomingu/Leaflet.SimpleMarkers +author: Jared Dominguez +author-url: https://github.com/jdomingu +demo: +compatible-v0: +compatible-v1: true +--- + +A light-weight Leaflet plugin for adding and deleting markers. diff --git a/docs/_plugins/edit-geometries/leaflet-snap.md b/docs/_plugins/edit-geometries/leaflet-snap.md new file mode 100644 index 00000000000..16b2bbb3ec8 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-snap.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Snap +category: edit-geometries +repo: https://github.com/makinacorpus/Leaflet.Snap +author: Mathieu Leplatre +author-url: https://github.com/leplatrem +demo: +compatible-v0: +compatible-v1: true +--- + +Enables snapping of draggable markers to polylines and other layers. diff --git a/docs/_plugins/edit-geometries/leaflet-storage.md b/docs/_plugins/edit-geometries/leaflet-storage.md new file mode 100644 index 00000000000..61d4f4ee7fe --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-storage.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Storage +category: edit-geometries +repo: https://github.com/umap-project/Leaflet.Storage +author: Yohan Boniface +author-url: https://yohanboniface.me/ +demo: +compatible-v0: +compatible-v1: true +--- + +Create/update/delete Map, Marker, Polygon, Polyline... and expose them for backend storage with an API. diff --git a/docs/_plugins/edit-geometries/leaflet-styleeditor.md b/docs/_plugins/edit-geometries/leaflet-styleeditor.md new file mode 100644 index 00000000000..8563a517a33 --- /dev/null +++ b/docs/_plugins/edit-geometries/leaflet-styleeditor.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.StyleEditor +category: edit-geometries +repo: https://github.com/dwilhelm89/Leaflet.StyleEditor +author: Dennis Wilhelm +author-url: https://github.com/dwilhelm89 +demo: +compatible-v0: +compatible-v1: true +--- + +Enables editing the styles of features (lines, polygons, etc) and markers with a GUI. diff --git a/docs/_plugins/edit-geometries/leafletcraft.md b/docs/_plugins/edit-geometries/leafletcraft.md new file mode 100644 index 00000000000..60e87537426 --- /dev/null +++ b/docs/_plugins/edit-geometries/leafletcraft.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-Craft +category: edit-geometries +repo: https://github.com/sagarpreet-chadha/Leaflet-Craft +author: Sagarpreet Chadha +author-url: https://github.com/sagarpreet-chadha +demo: +compatible-v0: +compatible-v1: true +--- + +Extends Leaflet.FreeDraw and gives extended features like Undo-Redo, deleting markers,dynamic area calculation of polygons ,various hooks/events and in-build control bars, etc. diff --git a/docs/_plugins/events/l-draggableenhancer.md b/docs/_plugins/events/l-draggableenhancer.md new file mode 100644 index 00000000000..68536458738 --- /dev/null +++ b/docs/_plugins/events/l-draggableenhancer.md @@ -0,0 +1,12 @@ +--- +name: L.DraggableEnhancer +category: events +repo: https://github.com/idawave/Leaflet.DraggableEnhancer +author: Vincent Dechandon +author-url: https://github.com/idawave +demo: +compatible-v0: +compatible-v1: true +--- + +Modify the default L.Draggable handler (responsible for map panning, ...) to make it work properly if one of the map container's parents has predefined handlers like "event.stopPropagation()' attached to a "mousemove" event for example. diff --git a/docs/_plugins/events/l-sleep.md b/docs/_plugins/events/l-sleep.md new file mode 100644 index 00000000000..e951a874b77 --- /dev/null +++ b/docs/_plugins/events/l-sleep.md @@ -0,0 +1,12 @@ +--- +name: L.Sleep +category: events +repo: https://github.com/CliffCloud/Leaflet.Sleep +author: atstp +author-url: https://github.com/atstp +demo: https://cliffcloud.github.io/Leaflet.Sleep/ +compatible-v0: +compatible-v1: true +--- + +Avoid unwanted scroll capturing. diff --git a/docs/_plugins/events/l-spotlight.md b/docs/_plugins/events/l-spotlight.md new file mode 100644 index 00000000000..d573fff935b --- /dev/null +++ b/docs/_plugins/events/l-spotlight.md @@ -0,0 +1,12 @@ +--- +name: L.Spotlight +category: events +repo: https://github.com/iboates/leaflet-spotlight +author: Isaac Boates +author-url: https://github.com/iboates +demo: +compatible-v0: +compatible-v1: true +--- + +Dynamically highlight features near the mouse cursor with a customizable shape diff --git a/docs/_plugins/events/leaflet-almostover.md b/docs/_plugins/events/leaflet-almostover.md new file mode 100644 index 00000000000..6b1418c8cd7 --- /dev/null +++ b/docs/_plugins/events/leaflet-almostover.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.AlmostOver +category: events +repo: https://github.com/makinacorpus/Leaflet.AlmostOver +author: Mathieu Leplatre +author-url: https://github.com/makinacorpus/ +demo: +compatible-v0: +compatible-v1: true +--- + +Trigger mouse events when cursor is "almost" over a layer. diff --git a/docs/_plugins/events/leaflet-clicktolerance.md b/docs/_plugins/events/leaflet-clicktolerance.md new file mode 100644 index 00000000000..10e8016f1de --- /dev/null +++ b/docs/_plugins/events/leaflet-clicktolerance.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ClickTolerance +category: events +repo: https://github.com/geoloep/Leaflet.ClickTolerance +author: Geoloep +author-url: https://github.com/geoloep +demo: +compatible-v0: +compatible-v1: true +--- + +This plugin allows you to increase the click tolerance of canvas powered layers, making it possible to increase the clickable area of vector layers beyond their visible extent. Useful when your features are difficult to click otherwise. diff --git a/docs/_plugins/events/leaflet-controlledbounds.md b/docs/_plugins/events/leaflet-controlledbounds.md new file mode 100644 index 00000000000..600372fff21 --- /dev/null +++ b/docs/_plugins/events/leaflet-controlledbounds.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ControlledBounds +category: events +repo: https://github.com/MazeMap/Leaflet.ControlledBounds +author: Iván Sánchez Ortega +author-url: https://github.com/IvanSanchez +demo: +compatible-v0: +compatible-v1: true +--- + +Inspired by Leaflet-active-area, automatically detects the largest area of the map not covered by any map controls and applies setView, fitBounds, setZoom, getBounds to that area. diff --git a/docs/_plugins/events/leaflet-gesturehandling.md b/docs/_plugins/events/leaflet-gesturehandling.md new file mode 100644 index 00000000000..00f6c4bc570 --- /dev/null +++ b/docs/_plugins/events/leaflet-gesturehandling.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GestureHandling +category: events +repo: https://github.com/elmarquis/Leaflet.GestureHandling/ +author: Andy Marquis +author-url: https://github.com/elmarquis +demo: https://elmarquis.github.io/Leaflet.GestureHandling/examples/ +compatible-v0: +compatible-v1: true +--- + +Brings the basic functionality of Google Maps Gesture Handling into Leaflet. Prevents users from getting trapped on the map when scrolling a long page. diff --git a/docs/_plugins/events/leaflet-overintent.md b/docs/_plugins/events/leaflet-overintent.md new file mode 100644 index 00000000000..7ac9d741b31 --- /dev/null +++ b/docs/_plugins/events/leaflet-overintent.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.OverIntent +category: events +repo: https://github.com/makinacorpus/Leaflet.OverIntent +author: Mathieu Leplatre +author-url: https://github.com/makinacorpus/ +demo: +compatible-v0: +compatible-v1: true +--- + +Adds a new event ``mouseintent``, that differs from ``mouseover`` since it reflects user intentions to aim a particular layer. diff --git a/docs/_plugins/events/leaflet-touch-helper.md b/docs/_plugins/events/leaflet-touch-helper.md new file mode 100644 index 00000000000..bebae684508 --- /dev/null +++ b/docs/_plugins/events/leaflet-touch-helper.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Touch Helper +category: events +repo: https://github.com/perliedman/leaflet-touch-helper +author: Per Liedman +author-url: https://github.com/perliedman +demo: +compatible-v0: +compatible-v1: true +--- + +Makes it easy to touch vector overlays with thick fingers on a small display by adding a transparent, larger touch surface diff --git a/docs/_plugins/events/leaflet-visualclick.md b/docs/_plugins/events/leaflet-visualclick.md new file mode 100644 index 00000000000..ac7b2904834 --- /dev/null +++ b/docs/_plugins/events/leaflet-visualclick.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.VisualClick +category: events +repo: https://github.com/MazeMap/Leaflet.VisualClick +author: Dag Jomar Mersland +author-url: https://github.com/dagjomar +demo: https://github.com/MazeMap/Leaflet.VisualClick/ +compatible-v0: false +compatible-v1: true +--- + +Adds visual feedback when user clicks/taps the map. Useful when further action is delayed by server requests, or implementation of Leaflet.singleclick. Only tested with Leaflet 1.0.0-beta1. diff --git a/docs/_plugins/events/leafletactivearea.md b/docs/_plugins/events/leafletactivearea.md new file mode 100644 index 00000000000..b06aea9a379 --- /dev/null +++ b/docs/_plugins/events/leafletactivearea.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-active-area +category: events +repo: https://github.com/Mappy/Leaflet-active-area +author: Mappy +author-url: https://github.com/Mappy +demo: +compatible-v0: +compatible-v1: true +--- + +This plugin allows you to use a smaller portion of the map as an active area. All positioning methods (setView, fitBounds, setZoom) will be applied on this portion instead of the all map. diff --git a/docs/_plugins/events/singleclick.md b/docs/_plugins/events/singleclick.md new file mode 100644 index 00000000000..2196e75d704 --- /dev/null +++ b/docs/_plugins/events/singleclick.md @@ -0,0 +1,12 @@ +--- +name: singleclick +category: events +repo: https://github.com/MazeMap/Leaflet.singleclick +author: Iván Sánchez Ortega +author-url: https://github.com/IvanSanchez +demo: https://mazemap.github.io/Leaflet.singleclick/ +compatible-v0: false +compatible-v1: true +--- + +Extend L.Evented to fire a singleclick event. Compatible with Leaflet 1.0.0-beta1 and greater only. diff --git a/docs/_plugins/frameworks-build-systems/angular-leaflet-directive.md b/docs/_plugins/frameworks-build-systems/angular-leaflet-directive.md new file mode 100644 index 00000000000..0524c4115a2 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/angular-leaflet-directive.md @@ -0,0 +1,12 @@ +--- +name: Angular Leaflet directive +category: frameworks-build-systems +repo: https://github.com/tombatossals/angular-leaflet-directive +author: David Rubert +author-url: https://github.com/tombatossals +demo: +compatible-v0: +compatible-v1: true +--- + +Integrate Leaflet in applications made with the AngularJS web framework. diff --git a/docs/_plugins/frameworks-build-systems/emberleaflet.md b/docs/_plugins/frameworks-build-systems/emberleaflet.md new file mode 100644 index 00000000000..9c8fd9c3c44 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/emberleaflet.md @@ -0,0 +1,12 @@ +--- +name: ember-leaflet +category: frameworks-build-systems +repo: https://miguelcobain.github.io/ember-leaflet/ +author: Miguel Andrade +author-url: https://github.com/miguelcobain +demo: +compatible-v0: +compatible-v1: true +--- + +Easy and declarative mapping for Ember.js using Leaflet. diff --git a/docs/_plugins/frameworks-build-systems/famousmap.md b/docs/_plugins/frameworks-build-systems/famousmap.md new file mode 100644 index 00000000000..f632c757621 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/famousmap.md @@ -0,0 +1,12 @@ +--- +name: famous-map +category: frameworks-build-systems +repo: https://github.com/IjzerenHein/famous-map +author: Hein Rutjes +author-url: http://www.gloey.nl/ +demo: +compatible-v0: +compatible-v1: true +--- + +Integrate Leaflet in applications made with the famo.us web framework. diff --git a/docs/_plugins/frameworks-build-systems/gwtyleaflet.md b/docs/_plugins/frameworks-build-systems/gwtyleaflet.md new file mode 100644 index 00000000000..58d2d87b011 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/gwtyleaflet.md @@ -0,0 +1,12 @@ +--- +name: gwty-leaflet +category: frameworks-build-systems +repo: https://github.com/gwidgets/gwty-leaflet +author: Zakaria Amine +author-url: https://github.com/zak905 +demo: +compatible-v0: +compatible-v1: true +--- + +A Java/GWT JsInterop wrapper for Leaflet. It allows using Leaflet in Java the same way as from a javascript script. diff --git a/docs/_plugins/frameworks-build-systems/jsf2leaf.md b/docs/_plugins/frameworks-build-systems/jsf2leaf.md new file mode 100644 index 00000000000..29ecb0bde87 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/jsf2leaf.md @@ -0,0 +1,12 @@ +--- +name: JSF2Leaf +category: frameworks-build-systems +repo: https://github.com/themrleon/JSF2Leaf +author: Leonardo Ciocari +author-url: https://github.com/themrleon +demo: +compatible-v0: +compatible-v1: true +--- + +A JavaServer Faces wrapper for Leaflet. diff --git a/docs/_plugins/frameworks-build-systems/l-control-bootstrapmodal.md b/docs/_plugins/frameworks-build-systems/l-control-bootstrapmodal.md new file mode 100644 index 00000000000..95c8450689b --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/l-control-bootstrapmodal.md @@ -0,0 +1,12 @@ +--- +name: L.Control.BootstrapModal +category: frameworks-build-systems +repo: https://github.com/gregallensworth/L.Control.BootstrapModal +author: Greg Allensworth +author-url: https://github.com/gregallensworth +demo: +compatible-v0: +compatible-v1: true +--- + +Trigger a Bootstrap modal using an on-map control. diff --git a/docs/_plugins/frameworks-build-systems/l-control-jquerydialog.md b/docs/_plugins/frameworks-build-systems/l-control-jquerydialog.md new file mode 100644 index 00000000000..ac7e28daeec --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/l-control-jquerydialog.md @@ -0,0 +1,12 @@ +--- +name: L.Control.jQueryDialog +category: frameworks-build-systems +repo: https://github.com/gregallensworth/L.Control.jQueryDialog +author: Greg Allensworth +author-url: https://github.com/gregallensworth +demo: +compatible-v0: +compatible-v1: true +--- + +Trigger a jQuery UI dialog/modal using an on-map control. diff --git a/docs/_plugins/frameworks-build-systems/leaflet-control-angular.md b/docs/_plugins/frameworks-build-systems/leaflet-control-angular.md new file mode 100644 index 00000000000..1aaf2339d84 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leaflet-control-angular.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Control Angular +category: frameworks-build-systems +repo: https://github.com/grantHarris/leaflet-control-angular +author: Grant Harris +author-url: https://github.com/grantHarris +demo: +compatible-v0: +compatible-v1: true +--- + +Insert and use Angularized HTML code in your Leaflet map as a Leaflet control. diff --git a/docs/_plugins/frameworks-build-systems/leaflet-css.md b/docs/_plugins/frameworks-build-systems/leaflet-css.md new file mode 100644 index 00000000000..2a0ff253bd3 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leaflet-css.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.CSS +category: frameworks-build-systems +repo: https://github.com/leaflet-extras/leaflet.css +author: Calvin Metcalf +author-url: https://github.com/calvinmetcalf +demo: +compatible-v0: +compatible-v1: true +--- + +Add the main Leaflet CSS files (or any css) from within JavaScript, be gone conditional comments. diff --git a/docs/_plugins/frameworks-build-systems/leaflet-i18n.md b/docs/_plugins/frameworks-build-systems/leaflet-i18n.md new file mode 100644 index 00000000000..466cf14b261 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leaflet-i18n.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.i18n +category: frameworks-build-systems +repo: https://github.com/yohanboniface/Leaflet.i18n +author: Yohan Boniface +author-url: https://yohanboniface.me/ +demo: +compatible-v0: +compatible-v1: true +--- + +Internationalization for Leaflet plugins. diff --git a/docs/_plugins/frameworks-build-systems/leaflet-jsf.md b/docs/_plugins/frameworks-build-systems/leaflet-jsf.md new file mode 100644 index 00000000000..a891a6c8c50 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leaflet-jsf.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.jsf +category: frameworks-build-systems +repo: https://bitbucket.org/terrayazilim/leaflet.jsf +author: Terra SI LLC. +author-url: http://terrayazilim.com.tr/ +demo: +compatible-v0: +compatible-v1: true +--- + +Comprehensive Java Server Faces(JSF) Component/Wrapper for Leaflet. diff --git a/docs/_plugins/frameworks-build-systems/leaflet-layerconfig.md b/docs/_plugins/frameworks-build-systems/leaflet-layerconfig.md new file mode 100644 index 00000000000..e7d5859887a --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leaflet-layerconfig.md @@ -0,0 +1,12 @@ +--- +name: Leaflet LayerConfig +category: frameworks-build-systems +repo: https://github.com/Norkart/Leaflet-LayerConfig +author: Alexander Nossum +author-url: https://github.com/alexanno +demo: +compatible-v0: +compatible-v1: true +--- + +Provide a json file or service response with a configuration of layers and markers to automatically set up a Leaflet client. diff --git a/docs/_plugins/frameworks-build-systems/leaflet-map-builder.md b/docs/_plugins/frameworks-build-systems/leaflet-map-builder.md new file mode 100644 index 00000000000..73900c9a332 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leaflet-map-builder.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Map Builder +category: frameworks-build-systems +repo: https://github.com/gherardovarando/leaflet-map-builder +author: Gherardo Varando +author-url: https://github.com/gherardovarando +demo: https://gherardovarando.github.io/leaflet-map-builder/ +compatible-v0: +compatible-v1: true +--- + +It populates a leaflet map from a configuration object, can also creates zoom, layers, attribution draw controls. diff --git a/docs/_plugins/frameworks-build-systems/leaflet-map-component.md b/docs/_plugins/frameworks-build-systems/leaflet-map-component.md new file mode 100644 index 00000000000..f30886a74b1 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leaflet-map-component.md @@ -0,0 +1,12 @@ +--- +name: Leaflet map component +category: frameworks-build-systems +repo: https://github.com/prtksxna/leaflet-map-component +author: Prateek Saxena +author-url: https://github.com/prtksxna +demo: +compatible-v0: +compatible-v1: true +--- + +Integrate Leaflet in applications made with the Polymer 0.5 web framework. diff --git a/docs/_plugins/frameworks-build-systems/leaflet-popup-angular.md b/docs/_plugins/frameworks-build-systems/leaflet-popup-angular.md new file mode 100644 index 00000000000..3075b4b6cc6 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leaflet-popup-angular.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Popup Angular +category: frameworks-build-systems +repo: https://github.com/grantHarris/leaflet-popup-angular +author: Grant Harris +author-url: https://github.com/grantHarris +demo: +compatible-v0: +compatible-v1: true +--- + +Use AngularJS in your Leaflet popups. Extends the built-in L.popup. diff --git a/docs/_plugins/frameworks-build-systems/leaflet-yeoman-generator.md b/docs/_plugins/frameworks-build-systems/leaflet-yeoman-generator.md new file mode 100644 index 00000000000..5b2593976d9 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leaflet-yeoman-generator.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Yeoman Generator +category: frameworks-build-systems +repo: https://github.com/moklick/generator-leaflet +author: Moritz Klack +author-url: https://github.com/moklick +demo: +compatible-v0: +compatible-v1: true +--- + +Yeoman generator that scaffolds out a basic Leaflet map application. diff --git a/docs/_plugins/frameworks-build-systems/leaflet-zoomlevel-css-class.md b/docs/_plugins/frameworks-build-systems/leaflet-zoomlevel-css-class.md new file mode 100644 index 00000000000..cb49243f3b0 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leaflet-zoomlevel-css-class.md @@ -0,0 +1,12 @@ +--- +name: Leaflet ZoomLevel CSS Class +category: frameworks-build-systems +repo: https://github.com/dagjomar/Leaflet.ZoomCSS +author: Dag Jomar Mersland +author-url: https://github.com/dagjomar +demo: +compatible-v0: +compatible-v1: true +--- + +Add zoom level css class to map element for easy style updates based on zoom levels diff --git a/docs/_plugins/frameworks-build-systems/leafletdefaulticoncompatibility.md b/docs/_plugins/frameworks-build-systems/leafletdefaulticoncompatibility.md new file mode 100644 index 00000000000..68bb8cf9f69 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leafletdefaulticoncompatibility.md @@ -0,0 +1,12 @@ +--- +name: leaflet-defaulticon-compatibility +category: frameworks-build-systems +repo: https://github.com/ghybs/leaflet-defaulticon-compatibility +author: ghybs +author-url: https://github.com/ghybs +demo: https://ghybs.github.io/leaflet-defaulticon-compatibility/webpack-demo.html +compatible-v0: +compatible-v1: true +--- + +Retrieve all Leaflet Default Icon options from CSS, in particular all icon images URL's, to improve compatibility with bundlers and frameworks that modify URL's in CSS. In particular for webpack (with style-, css-, file- and url-loader's), Rails Asset Pipeline and Django pipeline. Should solve all use cases linked to issue Leaflet/Leaflet #4968. Demo with webpack (and without this plugin). diff --git a/docs/_plugins/frameworks-build-systems/leafletgeoserverrequest.md b/docs/_plugins/frameworks-build-systems/leafletgeoserverrequest.md new file mode 100644 index 00000000000..5f0cd9caa92 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leafletgeoserverrequest.md @@ -0,0 +1,12 @@ +--- +name: leaflet-geoserver-request +category: frameworks-build-systems +repo: https://github.com/iamtekson/leaflet-geoserver-request +author: Iamtekson +author-url: https://github.com/iamtekson +demo: https://iamtekson.github.io/leaflet-geoserver-request/examples/maps.html +compatible-v0: +compatible-v1: true +--- + +Basic geoserver requests in leaflet. Currently supports wms, wfs, legend, wmsImage request on the leaflet. diff --git a/docs/_plugins/frameworks-build-systems/leafletmap.md b/docs/_plugins/frameworks-build-systems/leafletmap.md new file mode 100644 index 00000000000..e23718318f6 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leafletmap.md @@ -0,0 +1,12 @@ +--- +name: leaflet-map +category: frameworks-build-systems +repo: https://github.com/leaflet-extras/leaflet-map +author: Hendrik Brummermann +author-url: https://github.com/nhnb +demo: +compatible-v0: +compatible-v1: true +--- + +Integrate Leaflet in applications made with the Polymer >= 1.0 web component framework. diff --git a/docs/_plugins/frameworks-build-systems/leafletrails-gem.md b/docs/_plugins/frameworks-build-systems/leafletrails-gem.md new file mode 100644 index 00000000000..0652e7d80d8 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/leafletrails-gem.md @@ -0,0 +1,12 @@ +--- +name: leaflet-rails gem +category: frameworks-build-systems +repo: https://github.com/axyjo/leaflet-rails +author: Akshay Joshi +author-url: https://github.com/axyjo +demo: +compatible-v0: +compatible-v1: true +--- + +This gem provides the leaflet.js map display library for your Rails 5 application. leaflet-rails on RubyGems diff --git a/docs/_plugins/frameworks-build-systems/meteorleaflet.md b/docs/_plugins/frameworks-build-systems/meteorleaflet.md new file mode 100644 index 00000000000..01eb3c5a4c7 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/meteorleaflet.md @@ -0,0 +1,12 @@ +--- +name: meteor-leaflet +category: frameworks-build-systems +repo: https://github.com/bevanhunt/meteor-leaflet +author: Bevan Hunt +author-url: https://github.com/bevanhunt +demo: +compatible-v0: +compatible-v1: true +--- + +Provides a Meteor package to quickly build real-time cross-platform map apps. diff --git a/docs/_plugins/frameworks-build-systems/ngxleaflet.md b/docs/_plugins/frameworks-build-systems/ngxleaflet.md new file mode 100644 index 00000000000..d43115f71f8 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/ngxleaflet.md @@ -0,0 +1,12 @@ +--- +name: ngx-leaflet +category: frameworks-build-systems +repo: https://github.com/Asymmetrik/ngx-leaflet +author: Asymmetrik, Ltd. +author-url: https://asymmetrik.com/ +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet components and extensions for Angular.io. diff --git a/docs/_plugins/frameworks-build-systems/reactleaflet.md b/docs/_plugins/frameworks-build-systems/reactleaflet.md new file mode 100644 index 00000000000..d8f1955c785 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/reactleaflet.md @@ -0,0 +1,12 @@ +--- +name: react-leaflet +category: frameworks-build-systems +repo: https://github.com/PaulLeCam/react-leaflet +author: Paul Le Cam +author-url: http://paullecam.github.io/ +demo: +compatible-v0: +compatible-v1: true +--- + +React components for Leaflet maps. diff --git a/docs/_plugins/frameworks-build-systems/tiny-leaflet-directive.md b/docs/_plugins/frameworks-build-systems/tiny-leaflet-directive.md new file mode 100644 index 00000000000..a1e3826d745 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/tiny-leaflet-directive.md @@ -0,0 +1,12 @@ +--- +name: Tiny Leaflet Directive +category: frameworks-build-systems +repo: https://github.com/CleverMaps/tiny-leaflet-directive +author: Martin Tesař +author-url: https://github.com/mattesCZ +demo: +compatible-v0: +compatible-v1: true +--- + +Tiny LeafletJS map directive for your AngularJS apps. diff --git a/docs/_plugins/frameworks-build-systems/vleaflet.md b/docs/_plugins/frameworks-build-systems/vleaflet.md new file mode 100644 index 00000000000..aef2aff1aa9 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/vleaflet.md @@ -0,0 +1,12 @@ +--- +name: V-Leaflet +category: frameworks-build-systems +repo: https://github.com/mstahv/v-leaflet +author: Matti Tahvonen +author-url: https://github.com/mstahv +demo: +compatible-v0: +compatible-v1: true +--- + +Use Leaflet as a component for the Vaadin Java/HTML framework. diff --git a/docs/_plugins/frameworks-build-systems/vue2leaflet.md b/docs/_plugins/frameworks-build-systems/vue2leaflet.md new file mode 100644 index 00000000000..486a62d0b2c --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/vue2leaflet.md @@ -0,0 +1,12 @@ +--- +name: Vue2Leaflet +category: frameworks-build-systems +repo: https://github.com/vue-leaflet/Vue2Leaflet +author: Mickaël KoRiGaN +author-url: https://github.com/KoRiGaN +demo: +compatible-v0: +compatible-v1: true +--- + +Vue2Leaflet is a JavaScript library for the Vue.js framework that wraps Leaflet, making it easy to create reactive maps. diff --git a/docs/_plugins/frameworks-build-systems/yaga-leafletng2.md b/docs/_plugins/frameworks-build-systems/yaga-leafletng2.md new file mode 100644 index 00000000000..0917832aa11 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/yaga-leafletng2.md @@ -0,0 +1,12 @@ +--- +name: YAGA leaflet-ng2 +category: frameworks-build-systems +repo: https://github.com/yagajs/leaflet-ng2 +author: YAGA Development Team +author-url: https://github.com/yagajs +demo: +compatible-v0: +compatible-v1: true +--- + +Granular integration into Angular2/4. diff --git a/docs/_plugins/fullscreen-controls/leaflet-fullscreen.md b/docs/_plugins/fullscreen-controls/leaflet-fullscreen.md new file mode 100644 index 00000000000..369247a2881 --- /dev/null +++ b/docs/_plugins/fullscreen-controls/leaflet-fullscreen.md @@ -0,0 +1,12 @@ +--- +name: leaflet.fullscreen +category: fullscreen-controls +repo: https://github.com/brunob/leaflet.fullscreen +author: Bruno B +author-url: https://github.com/brunob/ +demo: +compatible-v0: +compatible-v1: true +--- + +Another fullscreen button control but for modern browsers, using HTML5 Fullscreen API. diff --git a/docs/_plugins/fullscreen-controls/leaflet-zoomfs.md b/docs/_plugins/fullscreen-controls/leaflet-zoomfs.md new file mode 100644 index 00000000000..5dd3ca6eb02 --- /dev/null +++ b/docs/_plugins/fullscreen-controls/leaflet-zoomfs.md @@ -0,0 +1,12 @@ +--- +name: leaflet.zoomfs +category: fullscreen-controls +repo: https://github.com/elidupuis/leaflet.zoomfs +author: Eli Dupuis +author-url: https://github.com/elidupuis +demo: +compatible-v0: +compatible-v1: true +--- + +A fullscreen button control. diff --git a/docs/_plugins/geocoding/esri-leaflet-geocoder.md b/docs/_plugins/geocoding/esri-leaflet-geocoder.md new file mode 100644 index 00000000000..c019e55b180 --- /dev/null +++ b/docs/_plugins/geocoding/esri-leaflet-geocoder.md @@ -0,0 +1,12 @@ +--- +name: Esri Leaflet Geocoder +category: geocoding +repo: https://github.com/Esri/esri-leaflet-geocoder +author: Patrick Arlt +author-url: https://github.com/patrickarlt/ +demo: +compatible-v0: +compatible-v1: true +--- + +A geocoding control with suggestions powered by the ArcGIS Online geocoder. diff --git a/docs/_plugins/geocoding/l-highlight.md b/docs/_plugins/geocoding/l-highlight.md new file mode 100644 index 00000000000..ec662a152ac --- /dev/null +++ b/docs/_plugins/geocoding/l-highlight.md @@ -0,0 +1,12 @@ +--- +name: L.Highlight +category: geocoding +repo: https://github.com/mmaciejkowalski/L.Highlight +author: Maciej Kowalski +author-url: https://github.com/mmaciejkowalski +demo: +compatible-v0: +compatible-v1: true +--- + +A plugin that adds the ability to quick highlighting streets and areas using Nominatim. diff --git a/docs/_plugins/geocoding/leaflet-autocomplete.md b/docs/_plugins/geocoding/leaflet-autocomplete.md new file mode 100644 index 00000000000..3e952965b82 --- /dev/null +++ b/docs/_plugins/geocoding/leaflet-autocomplete.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Autocomplete +category: geocoding +repo: https://github.com/tomik23/Leaflet.Autocomplete +author: Grzegorz Tomicki +author-url: https://github.com/tomik23 +demo: https://tomik23.github.io/Leaflet.Autocomplete/ +compatible-v0: +compatible-v1: true +--- + +Leaflet.Autocomplete is to expand the autosugestion plugin with the ability to geocode and show data on the map in the way you think you need. The DEMO is based on the use of OpenstreetMap Nominatim to locate places by address. Accessible, with full support for ARIA attributes and keyboard interactions. diff --git a/docs/_plugins/geocoding/leaflet-control-bing-geocoder.md b/docs/_plugins/geocoding/leaflet-control-bing-geocoder.md new file mode 100644 index 00000000000..a9d81ba7439 --- /dev/null +++ b/docs/_plugins/geocoding/leaflet-control-bing-geocoder.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Control Bing Geocoder +category: geocoding +repo: https://github.com/sa3m/leaflet-control-bing-geocoder +author: Samuel Piquet +author-url: https://github.com/sa3m +demo: +compatible-v0: +compatible-v1: true +--- + +A simple geocoder control that uses Bing to locate places. diff --git a/docs/_plugins/geocoding/leaflet-control-geocoder.md b/docs/_plugins/geocoding/leaflet-control-geocoder.md new file mode 100644 index 00000000000..bfa6b92323f --- /dev/null +++ b/docs/_plugins/geocoding/leaflet-control-geocoder.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Control Geocoder +category: geocoding +repo: https://github.com/perliedman/leaflet-control-geocoder +author: Per Liedman +author-url: https://github.com/perliedman +demo: +compatible-v0: +compatible-v1: true +--- + +A clean and extensible control for both geocoding and reverse geocoding. Builtin support for Nominatim, Bing, MapQuest, Mapbox, What3Words, Google and Photon. Easy to extend to other providers. diff --git a/docs/_plugins/geocoding/leaflet-control-osm-geocoder.md b/docs/_plugins/geocoding/leaflet-control-osm-geocoder.md new file mode 100644 index 00000000000..58e77a7f2b3 --- /dev/null +++ b/docs/_plugins/geocoding/leaflet-control-osm-geocoder.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Control OSM Geocoder +category: geocoding +repo: https://github.com/k4r573n/leaflet-control-osm-geocoder +author: Karsten Hinz +author-url: https://github.com/k4r573n +demo: +compatible-v0: +compatible-v1: true +--- + +A simple geocoder that uses OpenstreetMap Nominatim to locate places by address. diff --git a/docs/_plugins/geocoding/leaflet-geoip-locator.md b/docs/_plugins/geocoding/leaflet-geoip-locator.md new file mode 100644 index 00000000000..41346e806a0 --- /dev/null +++ b/docs/_plugins/geocoding/leaflet-geoip-locator.md @@ -0,0 +1,12 @@ +--- +name: Leaflet GeoIP Locator +category: geocoding +repo: https://github.com/jakubdostal/leaflet-geoip +author: Jakub Dostal +author-url: https://github.com/jakubdostal +demo: +compatible-v0: +compatible-v1: true +--- + +A simple plugin that allows finding the approximate location of IP addresses and map centering on said location. diff --git a/docs/_plugins/geocoding/leaflet-geonames.md b/docs/_plugins/geocoding/leaflet-geonames.md new file mode 100644 index 00000000000..2b360149840 --- /dev/null +++ b/docs/_plugins/geocoding/leaflet-geonames.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Geonames +category: geocoding +repo: https://github.com/consbio/Leaflet.Geonames +author: Brendan Ward +author-url: https://github.com/brendan-ward +demo: https://consbio.github.io/Leaflet.Geonames/ +compatible-v0: +compatible-v1: true +--- + +A lightweight geocoding control powered by GeoNames. diff --git a/docs/_plugins/geocoding/leaflet-geosearch.md b/docs/_plugins/geocoding/leaflet-geosearch.md new file mode 100644 index 00000000000..341d7e70af9 --- /dev/null +++ b/docs/_plugins/geocoding/leaflet-geosearch.md @@ -0,0 +1,12 @@ +--- +name: Leaflet GeoSearch +category: geocoding +repo: https://github.com/smeijer/leaflet-geosearch +author: Stephan Meijer +author-url: https://github.com/smeijer +demo: +compatible-v0: +compatible-v1: true +--- + +Small geocoding plugin that brings address searching/lookup (aka geosearching) to Leaflet.
      Comes with support for Google, OpenStreetMap Nominatim, Bing, Esri and Nokia. Easily extensible. diff --git a/docs/_plugins/geocoding/leaflet-locationiq-geocoder.md b/docs/_plugins/geocoding/leaflet-locationiq-geocoder.md new file mode 100644 index 00000000000..36a603c8465 --- /dev/null +++ b/docs/_plugins/geocoding/leaflet-locationiq-geocoder.md @@ -0,0 +1,12 @@ +--- +name: Leaflet LocationIQ Geocoder +category: geocoding +repo: https://github.com/location-iq/leaflet-geocoder +author: LocationIQ +author-url: https://github.com/location-iq +demo: +compatible-v0: +compatible-v1: true +--- + +A plugin that adds the ability to search (geocode) a Leaflet-powered map using LocationIQ. diff --git a/docs/_plugins/geocoding/leaflet-opencage-search.md b/docs/_plugins/geocoding/leaflet-opencage-search.md new file mode 100644 index 00000000000..57df0a8b75e --- /dev/null +++ b/docs/_plugins/geocoding/leaflet-opencage-search.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.OpenCage.Search +category: geocoding +repo: https://github.com/OpenCageData/leaflet-opencage-search +author: OpenCage +author-url: https://github.com/opencagedata +demo: +compatible-v0: +compatible-v1: true +--- + +A search plugin plugin that uses OpenCage's geocoding API. diff --git a/docs/_plugins/geocoding/leaflet-search.md b/docs/_plugins/geocoding/leaflet-search.md new file mode 100644 index 00000000000..2f67cf50c3d --- /dev/null +++ b/docs/_plugins/geocoding/leaflet-search.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-search +category: geocoding +repo: https://github.com/sjaakp/leaflet-search +author: Sjaak Priester +author-url: https://github.com/sjaakp +demo: https://sjaakpriester.nl/software/leaflet-search +compatible-v0: +compatible-v1: true +--- + +A Search Control with autocomplete/suggest capabilities. Supports Nominatim, GeoNames, Here, TomTom, and Kadaster (Netherlands). diff --git a/docs/_plugins/geocoding/pelias-leaflet-plugin.md b/docs/_plugins/geocoding/pelias-leaflet-plugin.md new file mode 100644 index 00000000000..f573eda18b4 --- /dev/null +++ b/docs/_plugins/geocoding/pelias-leaflet-plugin.md @@ -0,0 +1,12 @@ +--- +name: Pelias Leaflet Plugin +category: geocoding +repo: https://github.com/pelias/leaflet-plugin +author: Lou Huang +author-url: https://github.com/louh +demo: https://pelias.github.io/leaflet-plugin/ +compatible-v0: +compatible-v1: true +--- + +A geocoding control using Geocode Earth or any hosted service powered by the Pelias Geocoder API. diff --git a/docs/_plugins/geolocation/geolet.md b/docs/_plugins/geolocation/geolet.md new file mode 100644 index 00000000000..2e7ef852a23 --- /dev/null +++ b/docs/_plugins/geolocation/geolet.md @@ -0,0 +1,12 @@ +--- +name: Geolet +category: geolocation +repo: https://github.com/rhlt/leaflet-geolet +author: Ruben Holthuijsen +author-url: https://github.com/rhlt/ +demo: +compatible-v0: +compatible-v1: true +--- + +A simple but highly customizable geolocation plugin for Leaflet diff --git a/docs/_plugins/geolocation/l-locationshare.md b/docs/_plugins/geolocation/l-locationshare.md new file mode 100644 index 00000000000..545175b8e56 --- /dev/null +++ b/docs/_plugins/geolocation/l-locationshare.md @@ -0,0 +1,12 @@ +--- +name: L.LocationShare +category: geolocation +repo: https://github.com/CliffCloud/Leaflet.LocationShare +author: atstp +author-url: https://github.com/atstp +demo: https://cliffcloud.github.io/Leaflet.LocationShare/ +compatible-v0: +compatible-v1: true +--- + +Allow users to send and receive a marker with a message. diff --git a/docs/_plugins/geolocation/leaflet-accurateposition.md b/docs/_plugins/geolocation/leaflet-accurateposition.md new file mode 100644 index 00000000000..c7a0092a65d --- /dev/null +++ b/docs/_plugins/geolocation/leaflet-accurateposition.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.AccuratePosition +category: geolocation +repo: https://github.com/M165437/Leaflet.AccuratePosition +author: Michael Schmidt-Voigt +author-url: https://github.com/M165437 +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet.AccuratePosition aims to provide a desired device location accuracy. diff --git a/docs/_plugins/geolocation/leaflet-control-compass.md b/docs/_plugins/geolocation/leaflet-control-compass.md new file mode 100644 index 00000000000..303cb5492a0 --- /dev/null +++ b/docs/_plugins/geolocation/leaflet-control-compass.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Control Compass +category: geolocation +repo: https://github.com/stefanocudini/leaflet-compass +author: Stefano Cudini +author-url: https://opengeo.tech/ +demo: +compatible-v0: +compatible-v1: true +--- + +A leaflet control plugin to build a simple rotating compass diff --git a/docs/_plugins/geolocation/leaflet-locate.md b/docs/_plugins/geolocation/leaflet-locate.md new file mode 100644 index 00000000000..783ebe20411 --- /dev/null +++ b/docs/_plugins/geolocation/leaflet-locate.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Locate +category: geolocation +repo: https://github.com/domoritz/leaflet-locatecontrol +author: Dominik Moritz +author-url: https://github.com/domoritz +demo: +compatible-v0: +compatible-v1: true +--- + +A customizable locate control. diff --git a/docs/_plugins/geoprocessing/arc-js.md b/docs/_plugins/geoprocessing/arc-js.md new file mode 100644 index 00000000000..371b9393370 --- /dev/null +++ b/docs/_plugins/geoprocessing/arc-js.md @@ -0,0 +1,12 @@ +--- +name: arc.js +category: geoprocessing +repo: https://github.com/springmeyer/arc.js +author: Dane Springmeyer +author-url: https://github.com/springmeyer +demo: +compatible-v0: +compatible-v1: true +--- + +A JS library for drawing great circle routes that can be used with Leaflet. diff --git a/docs/_plugins/geoprocessing/greinerhormann.md b/docs/_plugins/geoprocessing/greinerhormann.md new file mode 100644 index 00000000000..d9030c25b15 --- /dev/null +++ b/docs/_plugins/geoprocessing/greinerhormann.md @@ -0,0 +1,12 @@ +--- +name: Greiner-Hormann +category: geoprocessing +repo: https://github.com/w8r/GreinerHormann +author: Alexander Milevski +author-url: https://github.com/w8r +demo: +compatible-v0: +compatible-v1: true +--- + +Greiner-Hormann algorithm for polygon clipping and binary operations, adapted for use with Leaflet. diff --git a/docs/_plugins/geoprocessing/leaflet-antimeridian.md b/docs/_plugins/geoprocessing/leaflet-antimeridian.md new file mode 100644 index 00000000000..08ef6b75f2e --- /dev/null +++ b/docs/_plugins/geoprocessing/leaflet-antimeridian.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Antimeridian +category: geoprocessing +repo: https://github.com/briannaAndCo/Leaflet.Antimeridian +author: Brianna Landon +author-url: https://github.com/briannaAndCo +demo: https://briannaandco.github.io/Leaflet.Antimeridian/ +compatible-v0: +compatible-v1: true +--- + +A plugin to allow polygons and polylines to naturally draw across the Antimeridian (or the International Date Line) instead of always wrapping across the Greenwich meridian. diff --git a/docs/_plugins/geoprocessing/leaflet-buffer.md b/docs/_plugins/geoprocessing/leaflet-buffer.md new file mode 100644 index 00000000000..cf33a129a6a --- /dev/null +++ b/docs/_plugins/geoprocessing/leaflet-buffer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.buffer +category: geoprocessing +repo: https://github.com/skeate/Leaflet.buffer +author: Jonathan Skeate +author-url: https://github.com/skeate +demo: +compatible-v0: +compatible-v1: true +--- + +Enables buffering of shapes drawn with Leaflet.draw. diff --git a/docs/_plugins/geoprocessing/leaflet-geometryutil.md b/docs/_plugins/geoprocessing/leaflet-geometryutil.md new file mode 100644 index 00000000000..a380c941254 --- /dev/null +++ b/docs/_plugins/geoprocessing/leaflet-geometryutil.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GeometryUtil +category: geoprocessing +repo: https://github.com/makinacorpus/Leaflet.GeometryUtil +author: Benjamin Becquet +author-url: https://github.com/bbecquet +demo: +compatible-v0: +compatible-v1: true +--- + +A collection of utilities for Leaflet geometries (linear referencing, etc.) diff --git a/docs/_plugins/geoprocessing/leaflet-layerindex.md b/docs/_plugins/geoprocessing/leaflet-layerindex.md new file mode 100644 index 00000000000..c3f700b362f --- /dev/null +++ b/docs/_plugins/geoprocessing/leaflet-layerindex.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.LayerIndex +category: geoprocessing +repo: https://github.com/makinacorpus/Leaflet.LayerIndex +author: Mathieu Leplatre +author-url: https://github.com/leplatrem +demo: +compatible-v0: +compatible-v1: true +--- + +An efficient spatial index for features and layers, using RTree.js. diff --git a/docs/_plugins/geoprocessing/leaflet-utm.md b/docs/_plugins/geoprocessing/leaflet-utm.md new file mode 100644 index 00000000000..cad1a3adece --- /dev/null +++ b/docs/_plugins/geoprocessing/leaflet-utm.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.UTM +category: geoprocessing +repo: https://github.com/jjimenezshaw/Leaflet.UTM +author: Javier Jimenez Shaw +author-url: https://github.com/jjimenezshaw/ +demo: https://jjimenezshaw.github.io/Leaflet.UTM/examples/input.html +compatible-v0: +compatible-v1: true +--- + +A simple way to convert L.LatLng into UTM (WGS84) and vice versa. UTM string format easily configurable. It does not depend on any other plugin or 3rd party. diff --git a/docs/_plugins/geoprocessing/leafletpip.md b/docs/_plugins/geoprocessing/leafletpip.md new file mode 100644 index 00000000000..32ab95a5f71 --- /dev/null +++ b/docs/_plugins/geoprocessing/leafletpip.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-pip +category: geoprocessing +repo: https://github.com/mapbox/leaflet-pip +author: Tom MacWright +author-url: https://github.com/tmcw +demo: +compatible-v0: +compatible-v1: true +--- + +Simple point in polygon calculation using point-in-polygon. diff --git a/docs/_plugins/geoprocessing/leafletspatialprefixtree.md b/docs/_plugins/geoprocessing/leafletspatialprefixtree.md new file mode 100644 index 00000000000..8796edfb0b3 --- /dev/null +++ b/docs/_plugins/geoprocessing/leafletspatialprefixtree.md @@ -0,0 +1,12 @@ +--- +name: leaflet-spatial-prefix-tree +category: geoprocessing +repo: https://github.com/missinglink/leaflet-spatial-prefix-tree +author: Mapzen +author-url: https://mapzen.com/ +demo: http://mapzen.github.io/leaflet-spatial-prefix-tree/ +compatible-v0: +compatible-v1: true +--- + +Leaflet plugin for visualizing spatial prefix trees, quadtree and geohash. diff --git a/docs/_plugins/geoprocessing/proj4leaflet.md b/docs/_plugins/geoprocessing/proj4leaflet.md new file mode 100644 index 00000000000..2e8d6174051 --- /dev/null +++ b/docs/_plugins/geoprocessing/proj4leaflet.md @@ -0,0 +1,12 @@ +--- +name: Proj4Leaflet +category: geoprocessing +repo: https://github.com/kartena/Proj4Leaflet +author: Kartena +author-url: http://www.kartena.se/index.html +demo: +compatible-v0: +compatible-v1: true +--- + +Proj4js integration plugin, allowing you to use all kinds of weird projections in Leaflet. diff --git a/docs/_plugins/heatmaps/heatcanvas.md b/docs/_plugins/heatmaps/heatcanvas.md new file mode 100644 index 00000000000..a9a0c1d2668 --- /dev/null +++ b/docs/_plugins/heatmaps/heatcanvas.md @@ -0,0 +1,12 @@ +--- +name: HeatCanvas +category: heatmaps +repo: https://github.com/sunng87/heatcanvas +author: Sun Ning +author-url: https://github.com/sunng87 +demo: +compatible-v0: +compatible-v1: true +--- + +Simple heatmap api based on HTML5 canvas. diff --git a/docs/_plugins/heatmaps/heatmap-js.md b/docs/_plugins/heatmaps/heatmap-js.md new file mode 100644 index 00000000000..6b3d6b9258c --- /dev/null +++ b/docs/_plugins/heatmaps/heatmap-js.md @@ -0,0 +1,12 @@ +--- +name: heatmap.js +category: heatmaps +repo: https://www.patrick-wied.at/static/heatmapjs/example-heatmap-leaflet.html +author: Patrick Wied +author-url: https://github.com/pa7 +demo: +compatible-v0: +compatible-v1: true +--- + +JavaScript Library for HTML5 canvas based heatmaps. Its Leaflet layer implementation supports large datasets because it is tile based and uses a quadtree index to store the data. diff --git a/docs/_plugins/heatmaps/leaflet-divheatmap.md b/docs/_plugins/heatmaps/leaflet-divheatmap.md new file mode 100644 index 00000000000..b47d89ffd61 --- /dev/null +++ b/docs/_plugins/heatmaps/leaflet-divheatmap.md @@ -0,0 +1,12 @@ +--- +name: Leaflet divHeatmap +category: heatmaps +repo: https://github.com/danielepiccone/leaflet-div-heatmap +author: Daniele Piccone +author-url: https://github.com/dpiccone +demo: +compatible-v0: +compatible-v1: true +--- + +Lightweight and versatile heatmap layer based on CSS3 and divIcons diff --git a/docs/_plugins/heatmaps/leaflet-heat.md b/docs/_plugins/heatmaps/leaflet-heat.md new file mode 100644 index 00000000000..7c11ed90e21 --- /dev/null +++ b/docs/_plugins/heatmaps/leaflet-heat.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.heat +category: heatmaps +repo: https://github.com/Leaflet/Leaflet.heat +author: Vladimir Agafonkin +author-url: https://github.com/mourner +demo: https://leaflet.github.io/Leaflet.heat/demo/ +compatible-v0: +compatible-v1: true +--- + +A tiny, simple and fast Leaflet heatmap plugin. Uses simpleheat under the hood, additionally clustering points into a grid for performance. diff --git a/docs/_plugins/heatmaps/leaflet-smoothpolygons.md b/docs/_plugins/heatmaps/leaflet-smoothpolygons.md new file mode 100644 index 00000000000..d4c2b71908a --- /dev/null +++ b/docs/_plugins/heatmaps/leaflet-smoothpolygons.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.SmoothPolygons +category: heatmaps +repo: https://github.com/sanchezweezer/Leaflet.SmoothPolygons +author: Sanchez Weezer +author-url: https://github.com/sanchezweezer +demo: https://sanchezweezer.github.io/Leaflet.SmoothPolygons/docs/ +compatible-v0: +compatible-v1: true +--- + +Uses [paperJS](http://paperjs.org/) under the hood to draw paths on canvas. diff --git a/docs/_plugins/heatmaps/leafletsolrheatmap.md b/docs/_plugins/heatmaps/leafletsolrheatmap.md new file mode 100644 index 00000000000..51e66e3bcae --- /dev/null +++ b/docs/_plugins/heatmaps/leafletsolrheatmap.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-Solr-Heatmap +category: heatmaps +repo: https://github.com/mejackreed/leaflet-solr-heatmap +author: Jack Reed +author-url: https://github.com/mejackreed +demo: +compatible-v0: +compatible-v1: true +--- + +A Leaflet plugin for rendering heatmaps and clusters from Solr's Heatmap Faceting. High performance for millions of points or polygons. diff --git a/docs/_plugins/heatmaps/maskcanvas.md b/docs/_plugins/heatmaps/maskcanvas.md new file mode 100644 index 00000000000..a814cfede9a --- /dev/null +++ b/docs/_plugins/heatmaps/maskcanvas.md @@ -0,0 +1,12 @@ +--- +name: MaskCanvas +category: heatmaps +repo: https://github.com/domoritz/leaflet-maskcanvas +author: Dominik Moritz +author-url: https://github.com/domoritz +demo: +compatible-v0: +compatible-v1: true +--- + +Canvas layer that can be used to visualize coverage. diff --git a/docs/_plugins/heatmaps/webgl-heatmap.md b/docs/_plugins/heatmaps/webgl-heatmap.md new file mode 100644 index 00000000000..a7817256bf3 --- /dev/null +++ b/docs/_plugins/heatmaps/webgl-heatmap.md @@ -0,0 +1,12 @@ +--- +name: WebGL Heatmap +category: heatmaps +repo: http://ursudio.com/webgl-heatmap-leaflet/ +author: Benjamin J DeLong +author-url: http://ursudio.com/webgl-heatmap-leaflet/ +demo: +compatible-v0: +compatible-v1: true +--- + +High performance Javascript heatmap plugin using WebGL. diff --git a/docs/_plugins/interactive-pan-zoom/l-control-zoombar.md b/docs/_plugins/interactive-pan-zoom/l-control-zoombar.md new file mode 100644 index 00000000000..6989215a98d --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/l-control-zoombar.md @@ -0,0 +1,12 @@ +--- +name: L.Control.ZoomBar +category: interactive-pan-zoom +repo: https://github.com/elrobis/L.Control.ZoomBar +author: Elijah Robison +author-url: http://cartometric.com/blog/ +demo: https://elrobis.github.io/L.Control.ZoomBar/ +compatible-v0: +compatible-v1: true +--- + +An extended version of Leaflet's native Zoom control with Home and Zoom-to-Area buttons. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-borderpan.md b/docs/_plugins/interactive-pan-zoom/leaflet-borderpan.md new file mode 100644 index 00000000000..0b25f2839f2 --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-borderpan.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.BorderPan +category: interactive-pan-zoom +repo: https://github.com/slara/Leaflet.BorderPan +author: Sebastián Lara +author-url: https://github.com/slara +demo: +compatible-v0: +compatible-v1: true +--- + +A Leaflet plugin to pan by clicking on map borders. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-boxzoom.md b/docs/_plugins/interactive-pan-zoom/leaflet-boxzoom.md new file mode 100644 index 00000000000..f85a0c38082 --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-boxzoom.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.BoxZoom +category: interactive-pan-zoom +repo: https://github.com/gregallensworth/L.Control.BoxZoom +author: Greg Allensworth +author-url: https://github.com/gregallensworth/L.Control.BoxZoom +demo: +compatible-v0: +compatible-v1: true +--- + +A visible, clickable control to perform a box zoom. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-doublerightclickzoom.md b/docs/_plugins/interactive-pan-zoom/leaflet-doublerightclickzoom.md new file mode 100644 index 00000000000..4308b7d8f7a --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-doublerightclickzoom.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.DoubleRightClickZoom +category: interactive-pan-zoom +repo: https://github.com/GhostGroup/Leaflet.DoubleRightClickZoom +author: Mike O'Toole +author-url: https://github.com/mikeotoole/ +demo: +compatible-v0: +compatible-v1: true +--- + +Interaction handler enabling zooming out with double right click. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-doubletouchdragzoom.md b/docs/_plugins/interactive-pan-zoom/leaflet-doubletouchdragzoom.md new file mode 100644 index 00000000000..a54773fe74d --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-doubletouchdragzoom.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.DoubleTouchDragZoom +category: interactive-pan-zoom +repo: https://github.com/petoc/Leaflet.DoubleTouchDragZoom +author: Peter C +author-url: https://github.com/petoc +demo: https://petoc.github.io/Leaflet.DoubleTouchDragZoom/example/ +compatible-v0: +compatible-v1: true +--- + +Plugin for one finger zoom. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-gamecontroller.md b/docs/_plugins/interactive-pan-zoom/leaflet-gamecontroller.md new file mode 100644 index 00000000000..a80a7b51032 --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-gamecontroller.md @@ -0,0 +1,12 @@ +--- +name: Leaflet GameController +category: interactive-pan-zoom +repo: https://github.com/SINTEF-9012/Leaflet.GameController +author: Antoine Pultier +author-url: https://github.com/yellowiscool +demo: +compatible-v0: +compatible-v1: true +--- + +Interaction handler providing support for gamepads. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-limitzoom.md b/docs/_plugins/interactive-pan-zoom/leaflet-limitzoom.md new file mode 100644 index 00000000000..746bb93e8ae --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-limitzoom.md @@ -0,0 +1,12 @@ +--- +name: Leaflet LimitZoom +category: interactive-pan-zoom +repo: https://github.com/Zverik/Leaflet.LimitZoom +author: Ilya Zverev +author-url: https://github.com/zverik +demo: +compatible-v0: +compatible-v1: true +--- + +Plugins to limit available zoom levels to a given list, either by restricting zooming or by interpolating tiles. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-pancontrol.md b/docs/_plugins/interactive-pan-zoom/leaflet-pancontrol.md new file mode 100644 index 00000000000..6b4103ec42e --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-pancontrol.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Pancontrol +category: interactive-pan-zoom +repo: https://github.com/kartena/Leaflet.Pancontrol/ +author: Kartena +author-url: http://www.kartena.se/index.html +demo: +compatible-v0: +compatible-v1: true +--- + +A simple panning control. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-twofingerzoom.md b/docs/_plugins/interactive-pan-zoom/leaflet-twofingerzoom.md new file mode 100644 index 00000000000..b2c4f5fd4b7 --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-twofingerzoom.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.twofingerZoom +category: interactive-pan-zoom +repo: https://github.com/aratcliffe/Leaflet.twofingerzoom +author: Adam Ratcliffe +author-url: https://github.com/aratcliffe/ +demo: +compatible-v0: +compatible-v1: true +--- + +Interaction handler for touch devices enabling zooming out with a two finger tap. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-zoombox.md b/docs/_plugins/interactive-pan-zoom/leaflet-zoombox.md new file mode 100644 index 00000000000..cb648b93e84 --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-zoombox.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ZoomBox +category: interactive-pan-zoom +repo: https://github.com/consbio/Leaflet.ZoomBox +author: Brendan Ward +author-url: https://github.com/brendan-ward +demo: https://consbio.github.io/Leaflet.ZoomBox/ +compatible-v0: +compatible-v1: true +--- + +A lightweight zoom box control: draw a box around the area you want to zoom to. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-zoominfo.md b/docs/_plugins/interactive-pan-zoom/leaflet-zoominfo.md new file mode 100644 index 00000000000..c720d925d23 --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-zoominfo.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.zoominfo +category: interactive-pan-zoom +repo: https://github.com/flaviocarmo/Leaflet.zoominfo/ +author: Flávio Carmo +author-url: https://github.com/flaviocarmo +demo: +compatible-v0: +compatible-v1: true +--- + +A zoom control which displays the current zoom level. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-zoomlabel.md b/docs/_plugins/interactive-pan-zoom/leaflet-zoomlabel.md new file mode 100644 index 00000000000..3dd23f5e403 --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-zoomlabel.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ZoomLabel +category: interactive-pan-zoom +repo: https://github.com/unbam/Leaflet.ZoomLabel +author: Masashi Takeshita +author-url: https://github.com/unbam +demo: +compatible-v0: +compatible-v1: true +--- + +A simple zoom label control. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-zoompanel.md b/docs/_plugins/interactive-pan-zoom/leaflet-zoompanel.md new file mode 100644 index 00000000000..ee8e0b75001 --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-zoompanel.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ZoomPanel +category: interactive-pan-zoom +repo: https://github.com/will4906/leaflet.zoompanel +author: Shuhua Huang +author-url: https://github.com/will4906/ +demo: https://will4906.github.io/leaflet-zoompanel/ +compatible-v0: +compatible-v1: true +--- + +A Zoom Control Panel Of Leaflet. diff --git a/docs/_plugins/interactive-pan-zoom/leaflet-zoomslider.md b/docs/_plugins/interactive-pan-zoom/leaflet-zoomslider.md new file mode 100644 index 00000000000..bcfbe1ffac6 --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/leaflet-zoomslider.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.zoomslider +category: interactive-pan-zoom +repo: https://github.com/kartena/Leaflet.zoomslider/ +author: Kartena +author-url: http://www.kartena.se/index.html +demo: +compatible-v0: +compatible-v1: true +--- + +A zoom slider control. diff --git a/docs/_plugins/layer-switching-controls/leaflet-activelayers.md b/docs/_plugins/layer-switching-controls/leaflet-activelayers.md new file mode 100644 index 00000000000..2856ab72382 --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-activelayers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ActiveLayers +category: layer-switching-controls +repo: https://github.com/vogdb/Leaflet.ActiveLayers +author: vogdb +author-url: https://github.com/vogdb +demo: +compatible-v0: +compatible-v1: true +--- + +Adds new L.Control.ActiveLayers with functionality to get currently active layers on the map. diff --git a/docs/_plugins/layer-switching-controls/leaflet-autolayers.md b/docs/_plugins/layer-switching-controls/leaflet-autolayers.md new file mode 100644 index 00000000000..58356d01e54 --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-autolayers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.AutoLayers +category: layer-switching-controls +repo: https://github.com/aebadirad/Leaflet.AutoLayers +author: Alex Ebadirad +author-url: https://github.com/aebadirad +demo: +compatible-v0: +compatible-v1: true +--- + +Automatically pull layers from multiple mapservers and organize/search them with user controlled overlay zIndex management. diff --git a/docs/_plugins/layer-switching-controls/leaflet-basemaps.md b/docs/_plugins/layer-switching-controls/leaflet-basemaps.md new file mode 100644 index 00000000000..c2acf51fce2 --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-basemaps.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Basemaps +category: layer-switching-controls +repo: https://github.com/consbio/Leaflet.Basemaps +author: Brendan Ward +author-url: https://github.com/brendan-ward +demo: +compatible-v0: +compatible-v1: true +--- + +A basemap chooser with a preview image from the tile stack. Example diff --git a/docs/_plugins/layer-switching-controls/leaflet-categorized-layers.md b/docs/_plugins/layer-switching-controls/leaflet-categorized-layers.md new file mode 100644 index 00000000000..4f00db88966 --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-categorized-layers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Categorized Layers +category: layer-switching-controls +repo: https://github.com/robbiet480/leaflet-categorized-layers +author: Robbie Trencheny +author-url: https://robbies.domains +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet Control Layers extended for groups of categorized layers diff --git a/docs/_plugins/layer-switching-controls/leaflet-control-appearance.md b/docs/_plugins/layer-switching-controls/leaflet-control-appearance.md new file mode 100644 index 00000000000..a741f9fd18e --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-control-appearance.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Control.Appearance +category: layer-switching-controls +repo: https://github.com/Kanahiro/Leaflet.Control.Appearance +author: Kanahiro Iguchi +author-url: https://www.labo288.site/ +demo: +compatible-v0: +compatible-v1: true +--- + +Extend of Control.Layers, can control Appearances of Layers - color, opacity and able to remove a overlay layer. diff --git a/docs/_plugins/layer-switching-controls/leaflet-control-layers-tree.md b/docs/_plugins/layer-switching-controls/leaflet-control-layers-tree.md new file mode 100644 index 00000000000..757477fedac --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-control-layers-tree.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Control.Layers.Tree +category: layer-switching-controls +repo: https://github.com/jjimenezshaw/Leaflet.Control.Layers.Tree +author: Javier Jimenez Shaw +author-url: https://github.com/jjimenezshaw/ +demo: https://jjimenezshaw.github.io/Leaflet.Control.Layers.Tree/examples/ +compatible-v0: +compatible-v1: true +--- + +L.Control.Layers extension that supports a Tree structure, both for base and overlay layers. Simple and highly configurable. diff --git a/docs/_plugins/layer-switching-controls/leaflet-control-order-layers.md b/docs/_plugins/layer-switching-controls/leaflet-control-order-layers.md new file mode 100644 index 00000000000..6dbaa4e9063 --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-control-order-layers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Control Order Layers +category: layer-switching-controls +repo: http://elesdoar.github.io/leaflet-control-orderlayers/ +author: Michael Salgado +author-url: https://github.com/elesdoar/ +demo: +compatible-v0: +compatible-v1: true +--- + +Adds the ability to change overlay order in the layers control. diff --git a/docs/_plugins/layer-switching-controls/leaflet-groupedlayercontrol.md b/docs/_plugins/layer-switching-controls/leaflet-groupedlayercontrol.md new file mode 100644 index 00000000000..84cd9520801 --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-groupedlayercontrol.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GroupedLayerControl +category: layer-switching-controls +repo: https://github.com/ismyrnow/leaflet-groupedlayercontrol +author: Ishmael Smyrnow +author-url: https://github.com/ismyrnow +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet layer control with support for grouping overlays together. diff --git a/docs/_plugins/layer-switching-controls/leaflet-layertreeplugin.md b/docs/_plugins/layer-switching-controls/leaflet-layertreeplugin.md new file mode 100644 index 00000000000..98622279d54 --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-layertreeplugin.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.LayerTreePlugin +category: layer-switching-controls +repo: https://github.com/bambrikii/leaflet-layer-tree-plugin +author: Alexander Arakelyan +author-url: https://github.com/bambrikii +demo: https://rawgit.com/bambrikii/leaflet-layer-tree-plugin/master/examples/basic-example.htm +compatible-v0: +compatible-v1: true +--- + +Leaflet control allows to switch layers on and off, display them in a tree-like way. diff --git a/docs/_plugins/layer-switching-controls/leaflet-panel-layers.md b/docs/_plugins/layer-switching-controls/leaflet-panel-layers.md new file mode 100644 index 00000000000..a52cfd49d46 --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-panel-layers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Panel Layers +category: layer-switching-controls +repo: https://github.com/stefanocudini/leaflet-panel-layers +author: Stefano Cudini +author-url: https://opengeo.tech/ +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet Control Layers extended for group of layers and icons legend diff --git a/docs/_plugins/layer-switching-controls/leaflet-selectlayers.md b/docs/_plugins/layer-switching-controls/leaflet-selectlayers.md new file mode 100644 index 00000000000..fae2474b004 --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-selectlayers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.SelectLayers +category: layer-switching-controls +repo: https://github.com/vogdb/SelectLayersControl +author: vogdb +author-url: https://github.com/vogdb +demo: +compatible-v0: +compatible-v1: true +--- + +a Leaflet plugin which adds new control to switch between different layers on the map. New control replaces L.Control.Layers radio button panel with select tag. diff --git a/docs/_plugins/layer-switching-controls/leaflet-styledlayercontrol.md b/docs/_plugins/layer-switching-controls/leaflet-styledlayercontrol.md new file mode 100644 index 00000000000..22cbc9e8e75 --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-styledlayercontrol.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.StyledLayerControl +category: layer-switching-controls +repo: https://github.com/davicustodio/Leaflet.StyledLayerControl +author: Davi Custodio +author-url: https://github.com/davicustodio +demo: +compatible-v0: +compatible-v1: true +--- + +A Leaflet plugin that implements the management and control of layers by organization into categories or groups. diff --git a/docs/_plugins/layer-switching-controls/leaflet-uniformcontrol.md b/docs/_plugins/layer-switching-controls/leaflet-uniformcontrol.md new file mode 100644 index 00000000000..0bfb8b5694f --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leaflet-uniformcontrol.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.UniformControl +category: layer-switching-controls +repo: https://github.com/chriscalip/L.UniformControl +author: Chris Calip +author-url: https://github.com/chriscalip +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet layer control with stylable checkboxes and radio buttons. diff --git a/docs/_plugins/layer-switching-controls/leafleticonlayers.md b/docs/_plugins/layer-switching-controls/leafleticonlayers.md new file mode 100644 index 00000000000..853e1a11668 --- /dev/null +++ b/docs/_plugins/layer-switching-controls/leafleticonlayers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-IconLayers +category: layer-switching-controls +repo: https://github.com/ScanEx/Leaflet-IconLayers +author: Alexander Zverev +author-url: https://github.com/zverev +demo: http://scanex.github.io/Leaflet-IconLayers/examples/ +compatible-v0: +compatible-v1: true +--- + +Leaflet control that displays base layers as small icons. diff --git a/docs/_plugins/markers-renderers/l-donut.md b/docs/_plugins/markers-renderers/l-donut.md new file mode 100644 index 00000000000..554b1fc4479 --- /dev/null +++ b/docs/_plugins/markers-renderers/l-donut.md @@ -0,0 +1,12 @@ +--- +name: L.Donut +category: markers-renderers +repo: https://github.com/Falke-Design/L.Donut +author: Falke-Design +author-url: https://github.com/Falke-Design/ +demo: https://falke-design.github.io/L.Donut/ +compatible-v0: +compatible-v1: true +--- + +Extension of L.Circle which allows to define a outer and inner radius. diff --git a/docs/_plugins/markers-renderers/leaflet-arc.md b/docs/_plugins/markers-renderers/leaflet-arc.md new file mode 100644 index 00000000000..f892bcb0ec5 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-arc.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Arc +category: markers-renderers +repo: https://github.com/MAD-GooZe/Leaflet.Arc +author: Alexey Gusev +author-url: https://github.com/MAD-GooZe +demo: +compatible-v0: +compatible-v1: true +--- + +This plugin adds L.Polyline.Arc function which wraps arc.js functionality for creation of Great Cirlce arcs. diff --git a/docs/_plugins/markers-renderers/leaflet-arrowcircle.md b/docs/_plugins/markers-renderers/leaflet-arrowcircle.md new file mode 100644 index 00000000000..7b1486d0486 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-arrowcircle.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ArrowCircle +category: markers-renderers +repo: https://github.com/coyotesqrl/Leaflet.ArrowCircle +author: R.A. Porter +author-url: https://github.com/coyotesqrl/ +demo: +compatible-v0: +compatible-v1: true +--- + +A Marker extension to display circles with directional arrows. diff --git a/docs/_plugins/markers-renderers/leaflet-awesomemarkers.md b/docs/_plugins/markers-renderers/leaflet-awesomemarkers.md new file mode 100644 index 00000000000..770d126ae88 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-awesomemarkers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Awesome-Markers +category: markers-renderers +repo: https://github.com/lennardv2/Leaflet.awesome-markers +author: Lennard Voogdt +author-url: https://lennardvoogdt.nl/ +demo: +compatible-v0: +compatible-v1: true +--- + +Colorful, iconic & retina-proof markers based on the Font Awesome icons/Twitter Bootstrap icons diff --git a/docs/_plugins/markers-renderers/leaflet-beautifymarkers.md b/docs/_plugins/markers-renderers/leaflet-beautifymarkers.md new file mode 100644 index 00000000000..cb36ec3db0d --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-beautifymarkers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.BeautifyMarkers +category: markers-renderers +repo: https://github.com/masajid390/BeautifyMarker +author: Muhammad Arslan Sajid +author-url: https://github.com/masajid390 +demo: +compatible-v0: +compatible-v1: true +--- + +Lightweight plugin that adds colorful iconic markers without image and gives full control of style to end user (i.e. Unlimited colors and CSS styling). diff --git a/docs/_plugins/markers-renderers/leaflet-bezier.md b/docs/_plugins/markers-renderers/leaflet-bezier.md new file mode 100644 index 00000000000..fbe84b24a78 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-bezier.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.bezier +category: markers-renderers +repo: https://github.com/lifeeka/leaflet.bezier +author: Supun Praneeth +author-url: https://github.com/spmsupun +demo: +compatible-v0: +compatible-v1: true +--- + +Draws a Bézier line between two points with an animated flight object. diff --git a/docs/_plugins/markers-renderers/leaflet-boatmarker.md b/docs/_plugins/markers-renderers/leaflet-boatmarker.md new file mode 100644 index 00000000000..aadc6a6e475 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-boatmarker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.BoatMarker +category: markers-renderers +repo: https://github.com/thomasbrueggemann/leaflet.boatmarker +author: Thomas Brüggemann +author-url: https://github.com/thomasbrueggemann +demo: http://thomasbrueggemann.github.io/leaflet.boatmarker/ +compatible-v0: +compatible-v1: true +--- + +A boat marker using HTML Canvas for displaying yachts and sailboats with heading and optional wind information. diff --git a/docs/_plugins/markers-renderers/leaflet-canvasmarkers.md b/docs/_plugins/markers-renderers/leaflet-canvasmarkers.md new file mode 100644 index 00000000000..50e5b3029b4 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-canvasmarkers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Canvas-Markers +category: markers-renderers +repo: https://github.com/eJuke/Leaflet.Canvas-Markers +author: Evgeniy Voynov +author-url: https://github.com/eJuke +demo: +compatible-v0: +compatible-v1: true +--- + +Displays markers on canvas instead of DOM. diff --git a/docs/_plugins/markers-renderers/leaflet-centermarker.md b/docs/_plugins/markers-renderers/leaflet-centermarker.md new file mode 100644 index 00000000000..57fb736c869 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-centermarker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.CenterMarker +category: markers-renderers +repo: https://github.com/heyman/leaflet-centermarker +author: Jonatan Heyman +author-url: https://heyman.info/ +demo: +compatible-v0: +compatible-v1: true +--- + +Marker that is kept fixed to the center of the map when the map is panned by dragging. Can be seen in action on What is my adress? diff --git a/docs/_plugins/markers-renderers/leaflet-curve.md b/docs/_plugins/markers-renderers/leaflet-curve.md new file mode 100644 index 00000000000..7c2521572aa --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-curve.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.curve +category: markers-renderers +repo: https://github.com/elfalem/Leaflet.curve +author: elfalem +author-url: https://github.com/elfalem +demo: http://elfalem.github.io/Leaflet.curve/ +compatible-v0: +compatible-v1: true +--- + +A Leaflet plugin for drawing Bézier curves and other complex shapes. diff --git a/docs/_plugins/markers-renderers/leaflet-customlayer.md b/docs/_plugins/markers-renderers/leaflet-customlayer.md new file mode 100644 index 00000000000..04ade4c10cd --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-customlayer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.CustomLayer +category: markers-renderers +repo: https://github.com/iDerekLi/Leaflet.CustomLayer +author: Derek Li +author-url: https://github.com/iDerekLi/ +demo: +compatible-v0: +compatible-v1: true +--- + +A Leaflet plugin L.CustomLayer - fully custom Layer. diff --git a/docs/_plugins/markers-renderers/leaflet-edgemarker.md b/docs/_plugins/markers-renderers/leaflet-edgemarker.md new file mode 100644 index 00000000000..9350a39b910 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-edgemarker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.EdgeMarker +category: markers-renderers +repo: https://github.com/ubergesundheit/Leaflet.EdgeMarker +author: Gerald Pape +author-url: https://github.com/ubergesundheit +demo: +compatible-v0: +compatible-v1: true +--- + +Plugin to indicate the existence of Features outside of the current view. diff --git a/docs/_plugins/markers-renderers/leaflet-ellipse.md b/docs/_plugins/markers-renderers/leaflet-ellipse.md new file mode 100644 index 00000000000..3fcc3b11662 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-ellipse.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ellipse +category: markers-renderers +repo: https://github.com/jdfergason/Leaflet.Ellipse +author: JD Fergason +author-url: https://github.com/jdfergason +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet.ellipse place ellipses on map by specifying center point, semi-major axis, semi-minor axis, and tilt degrees from west. diff --git a/docs/_plugins/markers-renderers/leaflet-extramarkers.md b/docs/_plugins/markers-renderers/leaflet-extramarkers.md new file mode 100644 index 00000000000..b7c54d167e5 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-extramarkers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Extra-Markers +category: markers-renderers +repo: https://github.com/coryasilva/Leaflet.ExtraMarkers +author: Cory Silva +author-url: https://www.corysilva.com/ +demo: +compatible-v0: +compatible-v1: true +--- + +Shameless copy of Awesome-Markers with more shapes, colors and semantic-ui support diff --git a/docs/_plugins/markers-renderers/leaflet-geodesic.md b/docs/_plugins/markers-renderers/leaflet-geodesic.md new file mode 100644 index 00000000000..f8c2d7302d9 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-geodesic.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Geodesic +category: markers-renderers +repo: https://github.com/henrythasler/Leaflet.Geodesic +author: Henry Thasler +author-url: https://github.com/henrythasler +demo: https://blog.cyclemap.link/Leaflet.Geodesic/complex-interactive.html +compatible-v0: +compatible-v1: true +--- + +Draw geodesic lines and circles. A geodesic line is the shortest path between two given points on the earth surface. It uses Vincenty's formulae for highest precision and distance calculation. Written in Typescript and available via CDN. diff --git a/docs/_plugins/markers-renderers/leaflet-geojsoncss.md b/docs/_plugins/markers-renderers/leaflet-geojsoncss.md new file mode 100644 index 00000000000..53ce80777d5 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-geojsoncss.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.geojsonCSS +category: markers-renderers +repo: https://github.com/albburtsev/Leaflet.geojsonCSS +author: Alexander Burtsev +author-url: https://github.com/albburtsev/ +demo: +compatible-v0: +compatible-v1: true +--- + +Geojson CSS implementation for Leaflet. diff --git a/docs/_plugins/markers-renderers/leaflet-geotagphoto.md b/docs/_plugins/markers-renderers/leaflet-geotagphoto.md new file mode 100644 index 00000000000..3de920dc228 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-geotagphoto.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GeotagPhoto +category: markers-renderers +repo: https://github.com/nypl-spacetime/Leaflet.GeotagPhoto +author: Bert Spaan +author-url: https://github.com/bertspaan +demo: http://spacetime.nypl.org/Leaflet.GeotagPhoto/examples/camera.html +compatible-v0: +compatible-v1: true +--- + +Plugin for photo geotagging, with two modes: camera and crosshair. diff --git a/docs/_plugins/markers-renderers/leaflet-glmarkers.md b/docs/_plugins/markers-renderers/leaflet-glmarkers.md new file mode 100644 index 00000000000..4fdbf92d1fb --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-glmarkers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GLMarkers +category: markers-renderers +repo: https://gitlab.com/IvanSanchez/Leaflet.GLMarkers +author: Iván Sánchez Ortega +author-url: https://gitlab.com/IvanSanchez +demo: http://https//ivansanchez.gitlab.io/Leaflet.GLMarkers/demo/repl.html +compatible-v0: +compatible-v1: true +--- + +Display thousands of markers with custom WebGL shaders, optionally animated. diff --git a/docs/_plugins/markers-renderers/leaflet-greatcircle.md b/docs/_plugins/markers-renderers/leaflet-greatcircle.md new file mode 100644 index 00000000000..2574363f064 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-greatcircle.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.greatCircle +category: markers-renderers +repo: https://github.com/nuclearsecrecy/Leaflet.greatCircle +author: Alex Wellerstein +author-url: https://github.com/nuclearsecrecy/ +demo: https://nuclearsecrecy.github.io/Leaflet.greatCircle/example/ +compatible-v0: +compatible-v1: true +--- + +A wrapper class for the Leaflet.js Polygon object that draws true "great circles" (showing true geodesic, spherical paths) that wrap around the Earth. diff --git a/docs/_plugins/markers-renderers/leaflet-highlightablelayers.md b/docs/_plugins/markers-renderers/leaflet-highlightablelayers.md new file mode 100644 index 00000000000..e5c4b24a19b --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-highlightablelayers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.HighlightableLayers +category: markers-renderers +repo: https://github.com/FacilMap/Leaflet.HighlightableLayers +author: Candid Dauth +author-url: https://github.com/cdauth/ +demo: https://unpkg.com/leaflet-highlightable-layers/example.html +compatible-v0: +compatible-v1: true +--- + +Highlight Leaflet lines and polygons by adding a border and raising them above others. Add a transparent border to increase the tolerance for mouse/touch interactions. diff --git a/docs/_plugins/markers-renderers/leaflet-icon-glyph.md b/docs/_plugins/markers-renderers/leaflet-icon-glyph.md new file mode 100644 index 00000000000..eb720e850f9 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-icon-glyph.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Icon.Glyph +category: markers-renderers +repo: https://github.com/Leaflet/Leaflet.Icon.Glyph +author: Iván Sánchez Ortega +author-url: https://github.com/IvanSanchez +demo: https://leaflet.github.io/Leaflet.Icon.Glyph/demo.html +compatible-v0: +compatible-v1: true +--- + +Use icon font glyphs in your markers (from Font Awesome, Material Design Icons, Glyphicons, Metro UI icons, Elusive, and other icon fonts). diff --git a/docs/_plugins/markers-renderers/leaflet-label.md b/docs/_plugins/markers-renderers/leaflet-label.md new file mode 100644 index 00000000000..94969198f9e --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-label.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.label +category: markers-renderers +repo: https://github.com/Leaflet/Leaflet.label +author: Jacob Toye +author-url: https://github.com/jacobtoye +demo: +compatible-v0: +compatible-v1: true +--- + +Adds text labels to map markers and vector layers. diff --git a/docs/_plugins/markers-renderers/leaflet-labeltextcollision.md b/docs/_plugins/markers-renderers/leaflet-labeltextcollision.md new file mode 100644 index 00000000000..5ead6e94ba8 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-labeltextcollision.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.LabelTextCollision +category: markers-renderers +repo: https://github.com/yakitoritabetai/Leaflet.LabelTextCollision +author: Kenta Hakoishi +author-url: https://github.com/yakitoritabetai +demo: https://yakitoritabetai.github.io/Leaflet.LabelTextCollision/ +compatible-v0: +compatible-v1: true +--- + +Displays labels on paths (polylines, polygons, circles) avoiding label collision. diff --git a/docs/_plugins/markers-renderers/leaflet-lineextremities.md b/docs/_plugins/markers-renderers/leaflet-lineextremities.md new file mode 100644 index 00000000000..cb4f43900bf --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-lineextremities.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.LineExtremities +category: markers-renderers +repo: https://github.com/makinacorpus/Leaflet.LineExtremities +author: Frédéric Bonifas +author-url: https://github.com/fredericbonifas +demo: +compatible-v0: +compatible-v1: true +--- + +Show symbols at the extremities of polylines, using SVG markers. diff --git a/docs/_plugins/markers-renderers/leaflet-magicmarker.md b/docs/_plugins/markers-renderers/leaflet-magicmarker.md new file mode 100644 index 00000000000..8994bc47ce6 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-magicmarker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.magicMarker +category: markers-renderers +repo: https://github.com/lit-forest/leaflet.magicMarker +author: Sylvenas +author-url: https://github.com/react-map +demo: +compatible-v0: +compatible-v1: true +--- + +Adding magical animation effect to a marker while loading. diff --git a/docs/_plugins/markers-renderers/leaflet-makimarkers.md b/docs/_plugins/markers-renderers/leaflet-makimarkers.md new file mode 100644 index 00000000000..e533e482ef7 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-makimarkers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MakiMarkers +category: markers-renderers +repo: https://github.com/jseppi/Leaflet.MakiMarkers +author: James Seppi +author-url: https://github.com/jseppi +demo: +compatible-v0: +compatible-v1: true +--- + +Create markers using Maki Icons from MapBox. diff --git a/docs/_plugins/markers-renderers/leaflet-marker-highlight.md b/docs/_plugins/markers-renderers/leaflet-marker-highlight.md new file mode 100644 index 00000000000..0b320067be3 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-marker-highlight.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Marker.Highlight +category: markers-renderers +repo: https://github.com/brandonxiang/leaflet.marker.highlight +author: Brandon Xiang +author-url: https://github.com/brandonxiang +demo: https://brandonxiang.github.io/leaflet.marker.highlight/examples/ +compatible-v0: +compatible-v1: true +--- + +Adding highlight performance for L.marker. diff --git a/docs/_plugins/markers-renderers/leaflet-marker-stack.md b/docs/_plugins/markers-renderers/leaflet-marker-stack.md new file mode 100644 index 00000000000..84822c72819 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-marker-stack.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Marker.Stack +category: markers-renderers +repo: https://github.com/IvanSanchez/Leaflet.Marker.Stack +author: Iván Sánchez +author-url: https://github.com/IvanSanchez +demo: http://ivansanchez.github.io/Leaflet.Marker.Stack/demos/color_ramps.html +compatible-v0: +compatible-v1: true +--- + +A pure Leaflet implementation of CartoDB's "stacked chips" symbolizer. diff --git a/docs/_plugins/markers-renderers/leaflet-orientedmarker.md b/docs/_plugins/markers-renderers/leaflet-orientedmarker.md new file mode 100644 index 00000000000..035e0062e36 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-orientedmarker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.orientedMarker +category: markers-renderers +repo: https://github.com/jekuno/leaflet.orientedMarker +author: jekuno +author-url: https://github.com/jekuno +demo: +compatible-v0: true +compatible-v1: false +--- + +Allows to manage orientation of markers dynamically. diff --git a/docs/_plugins/markers-renderers/leaflet-parallaxmarker.md b/docs/_plugins/markers-renderers/leaflet-parallaxmarker.md new file mode 100644 index 00000000000..dad946c96ed --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-parallaxmarker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ParallaxMarker +category: markers-renderers +repo: https://github.com/dagjomar/Leaflet.ParallaxMarker +author: Dag Jomar Mersland +author-url: https://github.com/dagjomar/ +demo: https://dagjomar.github.io/Leaflet.ParallaxMarker/ +compatible-v0: +compatible-v1: true +--- + +Add markers that moves with a parallax-effect relative to the map when panning. diff --git a/docs/_plugins/markers-renderers/leaflet-pattern.md b/docs/_plugins/markers-renderers/leaflet-pattern.md new file mode 100644 index 00000000000..76405b5ffcd --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-pattern.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.pattern +category: markers-renderers +repo: https://github.com/teastman/Leaflet.pattern +author: Tyler Eastman +author-url: https://github.com/teastman +demo: +compatible-v0: +compatible-v1: true +--- + +Add support for pattern fills on Paths. diff --git a/docs/_plugins/markers-renderers/leaflet-photo.md b/docs/_plugins/markers-renderers/leaflet-photo.md new file mode 100644 index 00000000000..52df2b2f3f4 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-photo.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Photo +category: markers-renderers +repo: https://github.com/turban/Leaflet.Photo +author: Bjørn Sandvik +author-url: https://github.com/turban +demo: http://turban.github.io/Leaflet.Photo/examples/picasa.html +compatible-v0: +compatible-v1: true +--- + +Plugin to show geotagged photos on a Leaflet map. diff --git a/docs/_plugins/markers-renderers/leaflet-polyline-offset.md b/docs/_plugins/markers-renderers/leaflet-polyline-offset.md new file mode 100644 index 00000000000..64201b6de83 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-polyline-offset.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Polyline Offset +category: markers-renderers +repo: https://github.com/bbecquet/Leaflet.PolylineOffset +author: Benjamin Becquet +author-url: https://github.com/bbecquet +demo: http://bbecquet.github.io/Leaflet.PolylineOffset/examples/example.html +compatible-v0: +compatible-v1: true +--- + +Adds to L.Polyline the ability to be shifted with a relative pixel offset, without modifying its actual LatLngs. The offset value can be either negative or positive, for left- or right-side offset, and remains constant across zoom levels. diff --git a/docs/_plugins/markers-renderers/leaflet-polylinedecorator.md b/docs/_plugins/markers-renderers/leaflet-polylinedecorator.md new file mode 100644 index 00000000000..b12b309e63c --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-polylinedecorator.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.PolylineDecorator +category: markers-renderers +repo: https://github.com/bbecquet/Leaflet.PolylineDecorator +author: Benjamin Becquet +author-url: https://github.com/bbecquet +demo: +compatible-v0: +compatible-v1: true +--- + +Allows you to draw patterns (like dashes, arrows or evenly spaced Markers) along Polylines or coordinate paths. diff --git a/docs/_plugins/markers-renderers/leaflet-repeatedmarkers.md b/docs/_plugins/markers-renderers/leaflet-repeatedmarkers.md new file mode 100644 index 00000000000..58c43892516 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-repeatedmarkers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.RepeatedMarkers +category: markers-renderers +repo: https://gitlab.com/IvanSanchez/Leaflet.RepeatedMarkers +author: Iván Sánchez +author-url: https://github.com/IvanSanchez +demo: https://ivansanchez.gitlab.io/Leaflet.RepeatedMarkers/demo.html +compatible-v0: +compatible-v1: true +--- + +Displays markers when wrapping around the globe, once every 360 degrees of longitude. diff --git a/docs/_plugins/markers-renderers/leaflet-river.md b/docs/_plugins/markers-renderers/leaflet-river.md new file mode 100644 index 00000000000..2be9dc77b6d --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-river.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.River +category: markers-renderers +repo: https://github.com/ggolikov/Leaflet.River +author: Grigory Golikov +author-url: https://github.com/ggolikov +demo: https://ggolikov.github.io/Leaflet.River/ +compatible-v0: +compatible-v1: true +--- + +Draw lines with different width (like rivers) on a map. Useful when you want to show how rivers 'flow' on the map. diff --git a/docs/_plugins/markers-renderers/leaflet-rotated-marker.md b/docs/_plugins/markers-renderers/leaflet-rotated-marker.md new file mode 100644 index 00000000000..003e7031eda --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-rotated-marker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Rotated Marker +category: markers-renderers +repo: https://github.com/bbecquet/Leaflet.RotatedMarker +author: Benjamin Becquet +author-url: https://github.com/bbecquet +demo: http://bbecquet.github.io/Leaflet.RotatedMarker/example.html +compatible-v0: +compatible-v1: true +--- + +Enables rotation of marker icons in Leaflet. diff --git a/docs/_plugins/markers-renderers/leaflet-roughcanvas.md b/docs/_plugins/markers-renderers/leaflet-roughcanvas.md new file mode 100644 index 00000000000..fa6a8ccd39f --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-roughcanvas.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.RoughCanvas +category: markers-renderers +repo: https://github.com/zhuang-hao-ming/Leaflet.RoughCanvas +author: haoming +author-url: https://github.com/zhuang-hao-ming/ +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet.RoughCanvas renders hand-drawn, sketch style vector map (polyline, polygon, geojson). diff --git a/docs/_plugins/markers-renderers/leaflet-speechbubble.md b/docs/_plugins/markers-renderers/leaflet-speechbubble.md new file mode 100644 index 00000000000..53182a0ad84 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-speechbubble.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.SpeechBubble +category: markers-renderers +repo: https://github.com/sybri/Leaflet.SpeechBubble/ +author: Sylvain BRISSY +author-url: https://github.com/sybri +demo: https://sybri.github.io/demo/Leaflet.SpeechBubble/demo.html +compatible-v0: +compatible-v1: true +--- + +Popup a speech bubble with the arrow that follow points, layer, markers, etc. diff --git a/docs/_plugins/markers-renderers/leaflet-sprite.md b/docs/_plugins/markers-renderers/leaflet-sprite.md new file mode 100644 index 00000000000..a416215c2ba --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-sprite.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Sprite +category: markers-renderers +repo: https://github.com/leaflet-extras/leaflet.sprite +author: Calvin Metcalf +author-url: https://github.com/calvinmetcalf +demo: +compatible-v0: +compatible-v1: true +--- + +Use sprite based icons in your markers. diff --git a/docs/_plugins/markers-renderers/leaflet-streetlabels.md b/docs/_plugins/markers-renderers/leaflet-streetlabels.md new file mode 100644 index 00000000000..6aaadebc772 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-streetlabels.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.streetlabels +category: markers-renderers +repo: https://github.com/3mapslab/Leaflet.streetlabels +author: 3Maps +author-url: https://github.com/3mapslab +demo: https://3mapslab.github.io/Leaflet.streetlabels/ +compatible-v0: +compatible-v1: true +--- + +A Leaflet plugin to show labels following the paths of polylines. An extension of yakitoritabetai Leaflet.LabelTextCollision. diff --git a/docs/_plugins/markers-renderers/leaflet-svgshapemarkers.md b/docs/_plugins/markers-renderers/leaflet-svgshapemarkers.md new file mode 100644 index 00000000000..8e3b01cd3f5 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-svgshapemarkers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.SvgShapeMarkers +category: markers-renderers +repo: https://github.com/rowanwins/Leaflet.SvgShapeMarkers +author: Rowan Winsemius +author-url: https://github.com/rowanwins/ +demo: +compatible-v0: +compatible-v1: true +--- + +Adds support for additional SVG marker types such as triangles, diamonds and squares. diff --git a/docs/_plugins/markers-renderers/leaflet-swoopy.md b/docs/_plugins/markers-renderers/leaflet-swoopy.md new file mode 100644 index 00000000000..746593dd0a0 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-swoopy.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Swoopy +category: markers-renderers +repo: https://wbkd.github.io/leaflet-swoopy/ +author: webkid +author-url: https://webkid.io/ +demo: +compatible-v0: +compatible-v1: true +--- + +A plugin for creating customizable swoopy arrow annotations. diff --git a/docs/_plugins/markers-renderers/leaflet-textpath.md b/docs/_plugins/markers-renderers/leaflet-textpath.md new file mode 100644 index 00000000000..db37e1309ad --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-textpath.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TextPath +category: markers-renderers +repo: https://github.com/makinacorpus/Leaflet.TextPath +author: Mathieu Leplatre +author-url: https://github.com/leplatrem +demo: +compatible-v0: +compatible-v1: true +--- + +Allows you to draw text along Polylines. diff --git a/docs/_plugins/markers-renderers/leaflet-truesize.md b/docs/_plugins/markers-renderers/leaflet-truesize.md new file mode 100644 index 00000000000..5dbd419a5bb --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-truesize.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Truesize +category: markers-renderers +repo: https://wbkd.github.io/leaflet-truesize/ +author: webkid +author-url: https://webkid.io/ +demo: +compatible-v0: +compatible-v1: true +--- + +A plugin for creating projection aware draggable polygons and polylines. diff --git a/docs/_plugins/markers-renderers/leaflet-vectormarkers.md b/docs/_plugins/markers-renderers/leaflet-vectormarkers.md new file mode 100644 index 00000000000..6dbabb5b342 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-vectormarkers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.VectorMarkers +category: markers-renderers +repo: https://github.com/hiasinho/Leaflet.vector-markers +author: Mathias Schneider +author-url: https://github.com/hiasinho +demo: +compatible-v0: +compatible-v1: true +--- + +Vector SVG markers for Leaflet, with an option for Font Awesome/Twitter Bootstrap icons. diff --git a/docs/_plugins/markers-renderers/leaflet-viewpoint.md b/docs/_plugins/markers-renderers/leaflet-viewpoint.md new file mode 100644 index 00000000000..6c9e53964ff --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-viewpoint.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Viewpoint +category: markers-renderers +repo: https://github.com/ggolikov/Leaflet.Viewpoint +author: Grigory Golikov +author-url: https://github.com/ggolikov +demo: https://ggolikov.github.io/Leaflet.Viewpoint/example/ +compatible-v0: +compatible-v1: true +--- + +Displays circleMarker with multiple directions. Useful to show photos taken from one point. diff --git a/docs/_plugins/markers-renderers/leafletaistracksymbol.md b/docs/_plugins/markers-renderers/leafletaistracksymbol.md new file mode 100644 index 00000000000..568a1cf1f6b --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletaistracksymbol.md @@ -0,0 +1,12 @@ +--- +name: leaflet-ais-tracksymbol +category: markers-renderers +repo: https://github.com/PowerPan/leaflet-ais-tracksymbol +author: Johannes Rudolph +author-url: https://github.com/powerpan +demo: +compatible-v0: +compatible-v1: true +--- + +AIS Extension for leaflet-tracksymbol It displays AIS Contacts on the Map. diff --git a/docs/_plugins/markers-renderers/leafletaistracksymbolsearch.md b/docs/_plugins/markers-renderers/leafletaistracksymbolsearch.md new file mode 100644 index 00000000000..68d4bdb0b14 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletaistracksymbolsearch.md @@ -0,0 +1,12 @@ +--- +name: leaflet-ais-tracksymbol-search +category: markers-renderers +repo: https://github.com/PowerPan/leaflet-ais-tracksymbol-search +author: Johannes Rudolph +author-url: https://github.com/powerpan +demo: +compatible-v0: +compatible-v1: true +--- + +Adds a Search Box for your Leaflet Map and Your [leaflet-ais-trackymbol](https://github.com/PowerPan/leaflet-ais-tracksymbol) diff --git a/docs/_plugins/markers-renderers/leafletarrowheads.md b/docs/_plugins/markers-renderers/leafletarrowheads.md new file mode 100644 index 00000000000..356c5c0d1d0 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletarrowheads.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-arrowheads +category: markers-renderers +repo: https://github.com/slutske22/leaflet-arrowheads +author: Slutske22 +author-url: https://github.com/slutske22 +demo: +compatible-v0: +compatible-v1: true +--- + +Allows user to quickly draw arrowheads on polylines for vector visualization. diff --git a/docs/_plugins/markers-renderers/leafletchoropleth.md b/docs/_plugins/markers-renderers/leafletchoropleth.md new file mode 100644 index 00000000000..1c5db1124c8 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletchoropleth.md @@ -0,0 +1,12 @@ +--- +name: leaflet-choropleth +category: markers-renderers +repo: https://github.com/timwis/leaflet-choropleth +author: Tim Wisniewski +author-url: https://timwis.com/ +demo: https://timwis.com/leaflet-choropleth/examples/basic/ +compatible-v0: +compatible-v1: true +--- + +Extends L.geoJson to add a choropleth visualization (color scale based on value). diff --git a/docs/_plugins/markers-renderers/leafletcorridor.md b/docs/_plugins/markers-renderers/leafletcorridor.md new file mode 100644 index 00000000000..195fe2beb1e --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletcorridor.md @@ -0,0 +1,12 @@ +--- +name: leaflet-corridor +category: markers-renderers +repo: https://github.com/mikhailshilkov/leaflet-corridor +author: Mikhail Shilkov +author-url: https://github.com/mikhailshilkov +demo: https://mikhail.io/demos/leaflet-corridor/ +compatible-v0: +compatible-v1: true +--- + +Renders a polyline with width fixed in meters, not in pixels. Adjusts width depending on zoom level. diff --git a/docs/_plugins/markers-renderers/leafletdistancemarkers.md b/docs/_plugins/markers-renderers/leafletdistancemarkers.md new file mode 100644 index 00000000000..789b4bce4e6 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletdistancemarkers.md @@ -0,0 +1,12 @@ +--- +name: leaflet-distance-markers +category: markers-renderers +repo: https://github.com/adoroszlai/leaflet-distance-markers +author: Doroszlai, Attila +author-url: https://github.com/adoroszlai +demo: http://adoroszlai.github.io/leaflet-distance-markers/ +compatible-v0: +compatible-v1: true +--- + +Allows displaying markers along a route (L.Polyline) at equivalent distances (eg. one per mile). diff --git a/docs/_plugins/markers-renderers/leafleticonpulse.md b/docs/_plugins/markers-renderers/leafleticonpulse.md new file mode 100644 index 00000000000..c0655b5ff45 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafleticonpulse.md @@ -0,0 +1,12 @@ +--- +name: leaflet-icon-pulse +category: markers-renderers +repo: https://github.com/mapshakers/leaflet-icon-pulse +author: mapshakers +author-url: https://github.com/mapshakers +demo: +compatible-v0: +compatible-v1: true +--- + +Renders pulsing icon using CSS3. It can be used for location marker. diff --git a/docs/_plugins/markers-renderers/leafletlabeledcircle.md b/docs/_plugins/markers-renderers/leafletlabeledcircle.md new file mode 100644 index 00000000000..1c4141a917f --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletlabeledcircle.md @@ -0,0 +1,12 @@ +--- +name: leaflet-labeled-circle +category: markers-renderers +repo: https://github.com/w8r/leaflet-labeled-circle +author: Alexander Milevski +author-url: https://github.com/w8r/ +demo: https://milevski.co/leaflet-labeled-circle/demo/ +compatible-v0: +compatible-v1: true +--- + +Special type of SVG marker with a label inside and draggable around the anchor point. diff --git a/docs/_plugins/markers-renderers/leafletlayervisibility.md b/docs/_plugins/markers-renderers/leafletlayervisibility.md new file mode 100644 index 00000000000..135e03f5008 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletlayervisibility.md @@ -0,0 +1,12 @@ +--- +name: leaflet-layervisibility +category: markers-renderers +repo: https://github.com/phloose/leaflet-layervisibility +author: Philipp Loose +author-url: https://github.com/phloose/ +demo: +compatible-v0: +compatible-v1: true +--- + +Extends L.Layer and L.LayerGroup with methods to hide/show layers without removing/re-adding them. diff --git a/docs/_plugins/markers-renderers/leafletmapkeyicon.md b/docs/_plugins/markers-renderers/leafletmapkeyicon.md new file mode 100644 index 00000000000..219b243f85c --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletmapkeyicon.md @@ -0,0 +1,12 @@ +--- +name: leaflet-mapkey-icon +category: markers-renderers +repo: https://github.com/mapshakers/leaflet-mapkey-icon +author: mapshakers +author-url: https://github.com/mapshakers +demo: +compatible-v0: +compatible-v1: true +--- + +Set of cartographic font icons based on mapkeyicons. diff --git a/docs/_plugins/markers-renderers/leafletmarkerdirection.md b/docs/_plugins/markers-renderers/leafletmarkerdirection.md new file mode 100644 index 00000000000..11f039eb58a --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletmarkerdirection.md @@ -0,0 +1,12 @@ +--- +name: leaflet-marker-direction +category: markers-renderers +repo: https://github.com/JackZouShao/leaflet-marker-direction +author: Jack Zou +author-url: https://github.com/JackZouShao +demo: https://jackzoushao.github.io/leaflet-marker-direction/examples/marker-direction.html +compatible-v0: +compatible-v1: true +--- + +display the path and the direction of the marker. diff --git a/docs/_plugins/markers-renderers/leafletplacegroupspicker.md b/docs/_plugins/markers-renderers/leafletplacegroupspicker.md new file mode 100644 index 00000000000..f05a450cb7e --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletplacegroupspicker.md @@ -0,0 +1,12 @@ +--- +name: leaflet-place-groups-picker +category: markers-renderers +repo: https://github.com/damianc/leaflet-place-groups-picker +author: damianc +author-url: https://github.com/damianc +demo: +compatible-v0: +compatible-v1: true +--- + +Plugin for the Leaflet maps that allows grouping places in groups whose visibility can be toggled. diff --git a/docs/_plugins/markers-renderers/leafletpolycolor.md b/docs/_plugins/markers-renderers/leafletpolycolor.md new file mode 100644 index 00000000000..51b9e403a88 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletpolycolor.md @@ -0,0 +1,12 @@ +--- +name: leaflet-polycolor +category: markers-renderers +repo: https://github.com/Oliv/leaflet-polycolor +author: Olivier Gasc +author-url: https://github.com/Oliv +demo: https://oliv.github.io/leaflet-polycolor/ +compatible-v0: +compatible-v1: true +--- + +Color each polyline segment. diff --git a/docs/_plugins/markers-renderers/leafletpolygon-fillpattern.md b/docs/_plugins/markers-renderers/leafletpolygon-fillpattern.md new file mode 100644 index 00000000000..836a358b251 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletpolygon-fillpattern.md @@ -0,0 +1,12 @@ +--- +name: leaflet-polygon.fillPattern +category: markers-renderers +repo: https://github.com/cloudybay/leaflet-polygon-fillPattern +author: CloudyBay +author-url: https://github.com/cloudybay/ +demo: http://lwsu.github.io/leaflet-polygon-fillPattern/example/ +compatible-v0: +compatible-v1: true +--- + +Extend the Polygon Object to fill SVG Path element with an image pattern. diff --git a/docs/_plugins/markers-renderers/leafletsemicircle.md b/docs/_plugins/markers-renderers/leafletsemicircle.md new file mode 100644 index 00000000000..905c2317559 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletsemicircle.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-semicircle +category: markers-renderers +repo: https://github.com/jieter/Leaflet-semicircle +author: Jieter +author-url: https://github.com/jieter +demo: +compatible-v0: +compatible-v1: true +--- + +Adds functionality to L.Circle to draw semicircles. diff --git a/docs/_plugins/markers-renderers/leafletsimplestyle.md b/docs/_plugins/markers-renderers/leafletsimplestyle.md new file mode 100644 index 00000000000..1033f1f2072 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletsimplestyle.md @@ -0,0 +1,12 @@ +--- +name: leaflet-simplestyle +category: markers-renderers +repo: https://github.com/rowanwins/leaflet-simplestyle +author: Rowan Winsemius +author-url: https://github.com/rowanwins/ +demo: +compatible-v0: +compatible-v1: true +--- + +Extends L.geoJSON to support the simple style spec. diff --git a/docs/_plugins/markers-renderers/leafletsvgicon.md b/docs/_plugins/markers-renderers/leafletsvgicon.md new file mode 100644 index 00000000000..7e2d3e300e0 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletsvgicon.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-SVGIcon +category: markers-renderers +repo: https://github.com/iatkin/leaflet-svgicon +author: Ilya Atkin +author-url: https://github.com/iatkin +demo: http://iatkin.github.io/leaflet-svgicon/ +compatible-v0: +compatible-v1: true +--- + +A simple and customizable SVG icon with no external dependencies. Also included is a convenience Marker class and two example subclasses. diff --git a/docs/_plugins/markers-renderers/leaflettracksymbol.md b/docs/_plugins/markers-renderers/leaflettracksymbol.md new file mode 100644 index 00000000000..cffb800180a --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflettracksymbol.md @@ -0,0 +1,12 @@ +--- +name: leaflet-tracksymbol +category: markers-renderers +repo: https://github.com/lethexa/leaflet-tracksymbol +author: Tim Leerhoff +author-url: https://github.com/lethexa +demo: +compatible-v0: +compatible-v1: true +--- + +This marker provides a tracksymbol with orientation, velocity-vector and configurable shape. diff --git a/docs/_plugins/markers-renderers/leafletusermarker.md b/docs/_plugins/markers-renderers/leafletusermarker.md new file mode 100644 index 00000000000..f6afcfe36d5 --- /dev/null +++ b/docs/_plugins/markers-renderers/leafletusermarker.md @@ -0,0 +1,12 @@ +--- +name: leaflet-usermarker +category: markers-renderers +repo: https://github.com/heyman/leaflet-usermarker +author: Jonatan Heyman +author-url: https://heyman.info/ +demo: +compatible-v0: +compatible-v1: true +--- + +Plugin for plotting a marker representing a user - or multiple users - on a map, with support for drawing an accuracy circle. Can be seen in action on Longitude.me. diff --git a/docs/_plugins/markers-renderers/osm-buildings.md b/docs/_plugins/markers-renderers/osm-buildings.md new file mode 100644 index 00000000000..1b3bb15d0b4 --- /dev/null +++ b/docs/_plugins/markers-renderers/osm-buildings.md @@ -0,0 +1,12 @@ +--- +name: OSM Buildings +category: markers-renderers +repo: https://osmbuildings.org/ +author: Jan Marsch +author-url: https://github.com/kekscom/ +demo: +compatible-v0: +compatible-v1: true +--- + +Amazing JS library for visualizing 3D OSM building geometry on top of Leaflet. diff --git a/docs/_plugins/measurement/leaflet-linearmeasurement.md b/docs/_plugins/measurement/leaflet-linearmeasurement.md new file mode 100644 index 00000000000..c9b83060dca --- /dev/null +++ b/docs/_plugins/measurement/leaflet-linearmeasurement.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.LinearMeasurement +category: measurement +repo: https://github.com/NLTGit/Leaflet.LinearMeasurement +author: New Light Technologies +author-url: https://newlighttechnologies.com/ +demo: https://nltgit.github.io/Leaflet.LinearMeasurement/ +compatible-v0: +compatible-v1: true +--- + +Leaflet Linear Measurement plugin that creates polylines with incremental measures along the path. diff --git a/docs/_plugins/measurement/leaflet-measure-path.md b/docs/_plugins/measurement/leaflet-measure-path.md new file mode 100644 index 00000000000..eedce3c54fa --- /dev/null +++ b/docs/_plugins/measurement/leaflet-measure-path.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Measure Path +category: measurement +repo: https://github.com/ProminentEdge/leaflet-measure-path +author: Per Liedman +author-url: https://github.com/perliedman +demo: https://prominentedge.com/leaflet-measure-path/ +compatible-v0: +compatible-v1: true +--- + +Show measurements on paths; polylines, polygons and circles currently supported. diff --git a/docs/_plugins/measurement/leaflet-measureareacontrol.md b/docs/_plugins/measurement/leaflet-measureareacontrol.md new file mode 100644 index 00000000000..f94ddf7444b --- /dev/null +++ b/docs/_plugins/measurement/leaflet-measureareacontrol.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MeasureAreaControl +category: measurement +repo: https://github.com/zvaraondrej/Leaflet.MeasureAreaControl +author: Ondrej Zvara +author-url: https://github.com/zvaraondrej +demo: +compatible-v0: +compatible-v1: true +--- + +Control for measuring element's area. diff --git a/docs/_plugins/measurement/leaflet-measurecontrol.md b/docs/_plugins/measurement/leaflet-measurecontrol.md new file mode 100644 index 00000000000..040173a57f7 --- /dev/null +++ b/docs/_plugins/measurement/leaflet-measurecontrol.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MeasureControl +category: measurement +repo: https://github.com/makinacorpus/Leaflet.MeasureControl +author: Makina Corpus +author-url: https://github.com/makinacorpus/ +demo: +compatible-v0: +compatible-v1: true +--- + +A simple tool to measure distances on maps (*relies on Leaflet.Draw*). diff --git a/docs/_plugins/measurement/leaflet-nauticscale.md b/docs/_plugins/measurement/leaflet-nauticscale.md new file mode 100644 index 00000000000..09d075b2fff --- /dev/null +++ b/docs/_plugins/measurement/leaflet-nauticscale.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.nauticscale +category: measurement +repo: https://github.com/PowerPan/leaflet.nauticscale +author: Johannes Rudolph +author-url: https://github.com/PowerPan +demo: +compatible-v0: +compatible-v1: true +--- + +Display a Nauticscale on Leaflet maps diff --git a/docs/_plugins/measurement/leaflet-polylinemeasure.md b/docs/_plugins/measurement/leaflet-polylinemeasure.md new file mode 100644 index 00000000000..c4bc56f3f80 --- /dev/null +++ b/docs/_plugins/measurement/leaflet-polylinemeasure.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.PolylineMeasure +category: measurement +repo: https://github.com/ppete2/Leaflet.PolylineMeasure +author: PPete +author-url: https://github.com/ppete2 +demo: https://ppete2.github.io/Leaflet.PolylineMeasure/demo1.html +compatible-v0: +compatible-v1: true +--- + +Measure great-circle distances of simple lines as well as of complex polylines. diff --git a/docs/_plugins/measurement/leaflet-scalefactor.md b/docs/_plugins/measurement/leaflet-scalefactor.md new file mode 100644 index 00000000000..46976b765ff --- /dev/null +++ b/docs/_plugins/measurement/leaflet-scalefactor.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ScaleFactor +category: measurement +repo: https://github.com/MarcChasse/leaflet.ScaleFactor +author: Marc Chasse +author-url: https://github.com/MarcChasse +demo: https://marcchasse.github.io/leaflet.ScaleFactor/ +compatible-v0: +compatible-v1: true +--- + +Display a Scale Factor (e.g. 1:50,000) for Leaflet maps. diff --git a/docs/_plugins/measurement/leafletgraphicscale.md b/docs/_plugins/measurement/leafletgraphicscale.md new file mode 100644 index 00000000000..e7b9275a5c4 --- /dev/null +++ b/docs/_plugins/measurement/leafletgraphicscale.md @@ -0,0 +1,12 @@ +--- +name: leaflet-graphicscale +category: measurement +repo: https://github.com/nerik/leaflet-graphicscale +author: Erik Escoffier +author-url: https://github.com/nerik +demo: http://nerik.github.io/leaflet-graphicscale/demo/ +compatible-v0: +compatible-v1: true +--- + +Animated graphic scale control. diff --git a/docs/_plugins/measurement/leafletmeasure.md b/docs/_plugins/measurement/leafletmeasure.md new file mode 100644 index 00000000000..058eeb8b14f --- /dev/null +++ b/docs/_plugins/measurement/leafletmeasure.md @@ -0,0 +1,12 @@ +--- +name: leaflet-measure +category: measurement +repo: https://github.com/ljagis/leaflet-measure +author: LJA GIS +author-url: https://github.com/ljagis +demo: +compatible-v0: +compatible-v1: true +--- + +Coordinate, linear, and area measure control for Leaflet maps diff --git a/docs/_plugins/measurement/leafletreticle.md b/docs/_plugins/measurement/leafletreticle.md new file mode 100644 index 00000000000..6e27e28b1fd --- /dev/null +++ b/docs/_plugins/measurement/leafletreticle.md @@ -0,0 +1,12 @@ +--- +name: leaflet-reticle +category: measurement +repo: https://github.com/rwev/leaflet-reticle +author: rwev +author-url: https://github.com/rwev +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet control adding a centering reticle consisting of independently calculated latitude and longitude scales. diff --git a/docs/_plugins/measurement/leafletruler.md b/docs/_plugins/measurement/leafletruler.md new file mode 100644 index 00000000000..3890960d7d7 --- /dev/null +++ b/docs/_plugins/measurement/leafletruler.md @@ -0,0 +1,12 @@ +--- +name: leaflet-ruler +category: measurement +repo: https://github.com/gokertanrisever/leaflet-ruler +author: Goker Tanrisever +author-url: https://github.com/gokertanrisever +demo: https://gokertanrisever.github.io/leaflet-ruler/ +compatible-v0: +compatible-v1: true +--- + +A simple leaflet plugin to measure true bearing and distance between clicked points. diff --git a/docs/_plugins/minimaps-synced-maps/leaflet-globeminimap.md b/docs/_plugins/minimaps-synced-maps/leaflet-globeminimap.md new file mode 100644 index 00000000000..83d76b2b19a --- /dev/null +++ b/docs/_plugins/minimaps-synced-maps/leaflet-globeminimap.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GlobeMiniMap +category: minimaps-synced-maps +repo: https://github.com/chriswhong/leaflet-globeminimap/ +author: Chris Whong +author-url: https://github.com/chriswhong +demo: http://chriswhong.github.io/leaflet-globeminimap/example/ +compatible-v0: +compatible-v1: true +--- + +Simple minimap control that places a 3D Globe in the corner of your map, centered on the same location as the main map. diff --git a/docs/_plugins/minimaps-synced-maps/leaflet-layerscontrolminimap.md b/docs/_plugins/minimaps-synced-maps/leaflet-layerscontrolminimap.md new file mode 100644 index 00000000000..fe9b7f35491 --- /dev/null +++ b/docs/_plugins/minimaps-synced-maps/leaflet-layerscontrolminimap.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.layerscontrol-minimap +category: minimaps-synced-maps +repo: https://github.com/jieter/Leaflet.layerscontrol-minimap +author: Jieter +author-url: https://github.com/jieter +demo: +compatible-v0: +compatible-v1: true +--- + +Extends the default Leaflet layers control with synced minimaps. diff --git a/docs/_plugins/minimaps-synced-maps/leaflet-magnifyingglass.md b/docs/_plugins/minimaps-synced-maps/leaflet-magnifyingglass.md new file mode 100644 index 00000000000..4f549a4cf81 --- /dev/null +++ b/docs/_plugins/minimaps-synced-maps/leaflet-magnifyingglass.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MagnifyingGlass +category: minimaps-synced-maps +repo: https://github.com/bbecquet/Leaflet.MagnifyingGlass +author: Benjamin Becquet +author-url: https://github.com/bbecquet/ +demo: +compatible-v0: +compatible-v1: true +--- + +Allows you to display a small portion of the map at another zoom level, either at a fixed position or linked to the mouse movement, for a magnifying glass effect. diff --git a/docs/_plugins/minimaps-synced-maps/leaflet-minimap.md b/docs/_plugins/minimaps-synced-maps/leaflet-minimap.md new file mode 100644 index 00000000000..f94f477156f --- /dev/null +++ b/docs/_plugins/minimaps-synced-maps/leaflet-minimap.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MiniMap +category: minimaps-synced-maps +repo: https://github.com/Norkart/Leaflet-MiniMap +author: Robert Nordan +author-url: https://github.com/robpvn +demo: +compatible-v0: +compatible-v1: true +--- + +A small minimap showing the map at a different scale to aid navigation. diff --git a/docs/_plugins/minimaps-synced-maps/leaflet-sync.md b/docs/_plugins/minimaps-synced-maps/leaflet-sync.md new file mode 100644 index 00000000000..ead22989a45 --- /dev/null +++ b/docs/_plugins/minimaps-synced-maps/leaflet-sync.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Sync +category: minimaps-synced-maps +repo: https://github.com/jieter/Leaflet.Sync +author: Bjørn Sandvik +author-url: https://github.com/turban +demo: +compatible-v0: +compatible-v1: true +--- + +Synchronized view of two maps. diff --git a/docs/_plugins/minimaps-synced-maps/leafletclonelayer.md b/docs/_plugins/minimaps-synced-maps/leafletclonelayer.md new file mode 100644 index 00000000000..0d56cb5fcc8 --- /dev/null +++ b/docs/_plugins/minimaps-synced-maps/leafletclonelayer.md @@ -0,0 +1,12 @@ +--- +name: leaflet-clonelayer +category: minimaps-synced-maps +repo: https://github.com/jieter/leaflet-clonelayer +author: Jieter +author-url: https://github.com/jieter +demo: +compatible-v0: +compatible-v1: true +--- + +Clone Leaflet layers to allow reuse across different maps in the same runtime. diff --git a/docs/_plugins/mouse-coordinates/leaflet-coordinates-control.md b/docs/_plugins/mouse-coordinates/leaflet-coordinates-control.md new file mode 100644 index 00000000000..35e67b3f2f9 --- /dev/null +++ b/docs/_plugins/mouse-coordinates/leaflet-coordinates-control.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Coordinates Control +category: mouse-coordinates +repo: https://github.com/zimmicz/Leaflet-Coordinates-Control +author: Michal Zimmermann +author-url: https://github.com/zimmicz +demo: +compatible-v0: +compatible-v1: true +--- + +Captures mouseclick and displays its coordinates with easy way to copy them. diff --git a/docs/_plugins/mouse-coordinates/leaflet-coordinates.md b/docs/_plugins/mouse-coordinates/leaflet-coordinates.md new file mode 100644 index 00000000000..279b57ae894 --- /dev/null +++ b/docs/_plugins/mouse-coordinates/leaflet-coordinates.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Coordinates +category: mouse-coordinates +repo: https://github.com/MrMufflon/Leaflet.Coordinates +author: Felix Bache +author-url: https://github.com/MrMufflon +demo: +compatible-v0: +compatible-v1: true +--- + +A simple Leaflet plugin viewing the mouse LatLng-coordinates. Also views a marker with coordinate popup on userinput. diff --git a/docs/_plugins/mouse-coordinates/leaflet-coordprojection.md b/docs/_plugins/mouse-coordinates/leaflet-coordprojection.md new file mode 100644 index 00000000000..15bb0be94c4 --- /dev/null +++ b/docs/_plugins/mouse-coordinates/leaflet-coordprojection.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.CoordProjection +category: mouse-coordinates +repo: https://github.com/edihasaj/leaflet-coord-projection +author: Edi Hasaj +author-url: https://github.com/edihasaj +demo: https://edihasaj.github.io/leaflet-coord-projection/ +compatible-v0: +compatible-v1: true +--- + +Shows coordinates on mouse move and displays it based on given projection. diff --git a/docs/_plugins/mouse-coordinates/leaflet-copy-coordinates-control.md b/docs/_plugins/mouse-coordinates/leaflet-copy-coordinates-control.md new file mode 100644 index 00000000000..c12d8d9fcc0 --- /dev/null +++ b/docs/_plugins/mouse-coordinates/leaflet-copy-coordinates-control.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Copy Coordinates Control +category: mouse-coordinates +repo: https://github.com/tinjaw/Leaflet-Copy-Coordinates-Control +author: Chaim Krause +author-url: https://github.com/tinjaw +demo: +compatible-v0: +compatible-v1: true +--- + +Works with Leaflet to capture mouseclicks on a map and display the associated coordinates with an easy way to copy them. (Derived from original work by zimmicz. Forked mainly to provide npm functionality.) diff --git a/docs/_plugins/mouse-coordinates/leaflet-location-picker.md b/docs/_plugins/mouse-coordinates/leaflet-location-picker.md new file mode 100644 index 00000000000..754e778b803 --- /dev/null +++ b/docs/_plugins/mouse-coordinates/leaflet-location-picker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Location Picker +category: mouse-coordinates +repo: https://github.com/stefanocudini/leaflet-locationpicker +author: Stefano Cudini +author-url: https://opengeo.tech/ +demo: https://opengeo.tech/maps/leaflet-locationpicker/ +compatible-v0: +compatible-v1: true +--- + +Simple location picker with mini Leaflet map. diff --git a/docs/_plugins/mouse-coordinates/leaflet-mapcentercoord.md b/docs/_plugins/mouse-coordinates/leaflet-mapcentercoord.md new file mode 100644 index 00000000000..af02067fd7b --- /dev/null +++ b/docs/_plugins/mouse-coordinates/leaflet-mapcentercoord.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MapCenterCoord +category: mouse-coordinates +repo: https://github.com/xguaita/Leaflet.MapCenterCoord +author: Xisco Guaita +author-url: https://github.com/xguaita +demo: http://xguaita.github.io/Leaflet.MapCenterCoord/ +compatible-v0: +compatible-v1: true +--- + +A Leaflet control to display the coordinates of the map center, especially useful on touch/mobile devices. diff --git a/docs/_plugins/mouse-coordinates/leaflet-mapcodes.md b/docs/_plugins/mouse-coordinates/leaflet-mapcodes.md new file mode 100644 index 00000000000..ace39514f7c --- /dev/null +++ b/docs/_plugins/mouse-coordinates/leaflet-mapcodes.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Mapcodes +category: mouse-coordinates +repo: https://github.com/matlads/Leaflet.Mapcodes +author: Martin Atukunda +author-url: https://github.com/matlads +demo: http://matlads.github.io/Leaflet.Mapcodes/ +compatible-v0: +compatible-v1: true +--- + +Displays the Mapcode of the mouse pointer on mouse move. diff --git a/docs/_plugins/mouse-coordinates/leaflet-mousecoordinates.md b/docs/_plugins/mouse-coordinates/leaflet-mousecoordinates.md new file mode 100644 index 00000000000..49e41671be2 --- /dev/null +++ b/docs/_plugins/mouse-coordinates/leaflet-mousecoordinates.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.mouseCoordinates +category: mouse-coordinates +repo: https://github.com/PowerPan/leaflet.mouseCoordinate +author: Johannes Rudolph +author-url: https://github.com/PowerPan +demo: +compatible-v0: +compatible-v1: true +--- + +Displays the mouse coordinate in a box. Multiple formats are possible: GPS, UTM, UTMREF / MGRS, QTH diff --git a/docs/_plugins/mouse-coordinates/leaflet-mouseposition-ts.md b/docs/_plugins/mouse-coordinates/leaflet-mouseposition-ts.md new file mode 100644 index 00000000000..75a070baecf --- /dev/null +++ b/docs/_plugins/mouse-coordinates/leaflet-mouseposition-ts.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MousePosition.ts +category: mouse-coordinates +repo: https://github.com/YUUKIToriyama/Leaflet.MousePosition.ts +author: Yuuki Toriyama +author-url: https://github.com/YUUKIToriyama +demo: https://yuukitoriyama.github.io/Leaflet.MousePosition.ts/ +compatible-v0: +compatible-v1: true +--- + +A fully custmizable coordinate viewer written in TypeScript. You can change how this plugin looks by creating a custom component with JSX. diff --git a/docs/_plugins/mouse-coordinates/leaflet-mouseposition.md b/docs/_plugins/mouse-coordinates/leaflet-mouseposition.md new file mode 100644 index 00000000000..164c96ad0b8 --- /dev/null +++ b/docs/_plugins/mouse-coordinates/leaflet-mouseposition.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MousePosition +category: mouse-coordinates +repo: https://github.com/ardhi/Leaflet.MousePosition +author: Ardhi Lukianto +author-url: https://github.com/ardhi +demo: +compatible-v0: +compatible-v1: true +--- + +A simple MousePosition control that displays geographic coordinates of the mouse pointer, as it is moved about the map diff --git a/docs/_plugins/mouse-coordinates/leaflet-naccoordinates.md b/docs/_plugins/mouse-coordinates/leaflet-naccoordinates.md new file mode 100644 index 00000000000..371fa2409da --- /dev/null +++ b/docs/_plugins/mouse-coordinates/leaflet-naccoordinates.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.NACCoordinates +category: mouse-coordinates +repo: https://github.com/mahmoodvcs/Leaflet.NACCoordinates +author: Mahmood Dehghan +author-url: https://github.com/mahmoodvcs +demo: +compatible-v0: +compatible-v1: true +--- + +Displays NAC coordinate of the mouse pointer on mouse move. diff --git a/docs/_plugins/non-map-base-layers/leaflet-tilelayer-iip.md b/docs/_plugins/non-map-base-layers/leaflet-tilelayer-iip.md new file mode 100644 index 00000000000..0d35ad9c270 --- /dev/null +++ b/docs/_plugins/non-map-base-layers/leaflet-tilelayer-iip.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.IIP +category: non-map-base-layers +repo: https://github.com/astromatic/Leaflet.TileLayer.IIP +author: Emmanuel Bertin +author-url: https://github.com/ebertin +demo: +compatible-v0: +compatible-v1: true +--- + +Add support for IIPImage layers in Leaflet. diff --git a/docs/_plugins/non-map-base-layers/leafletfractal.md b/docs/_plugins/non-map-base-layers/leafletfractal.md new file mode 100644 index 00000000000..650fccd22e9 --- /dev/null +++ b/docs/_plugins/non-map-base-layers/leafletfractal.md @@ -0,0 +1,12 @@ +--- +name: leaflet-fractal +category: non-map-base-layers +repo: https://github.com/aparshin/leaflet-fractal +author: Alexander Parshin +author-url: https://github.com/aparshin +demo: http://aparshin.github.io/leaflet-fractal/ +compatible-v0: +compatible-v1: true +--- + +Renders some fractals (Mandelbrot set, Julia set and some others) using 2D canvas diff --git a/docs/_plugins/non-map-base-layers/leafletiiif.md b/docs/_plugins/non-map-base-layers/leafletiiif.md new file mode 100644 index 00000000000..13bde211785 --- /dev/null +++ b/docs/_plugins/non-map-base-layers/leafletiiif.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-IIIF +category: non-map-base-layers +repo: https://github.com/mejackreed/Leaflet-IIIF +author: Jack Reed +author-url: https://github.com/mejackreed +demo: http://mejackreed.github.io/Leaflet-IIIF/examples/example.html +compatible-v0: +compatible-v1: true +--- + +A IIIF (International Image Interoperability Framework) viewer for Leaflet. diff --git a/docs/_plugins/non-map-base-layers/leafletrastercoords.md b/docs/_plugins/non-map-base-layers/leafletrastercoords.md new file mode 100644 index 00000000000..d7527d531ae --- /dev/null +++ b/docs/_plugins/non-map-base-layers/leafletrastercoords.md @@ -0,0 +1,12 @@ +--- +name: leaflet-rastercoords +category: non-map-base-layers +repo: https://github.com/commenthol/leaflet-rastercoords +author: Commenthol +author-url: https://github.com/commenthol +demo: https://commenthol.github.io/leaflet-rastercoords/ +compatible-v0: +compatible-v1: true +--- + +Renders large tiled images generated with gdal2tiles-leaflet. Image raster coordinates can be used to set markers, etc. diff --git a/docs/_plugins/non-map-base-layers/tilelayer-deepzoom.md b/docs/_plugins/non-map-base-layers/tilelayer-deepzoom.md new file mode 100644 index 00000000000..cfcc92cb85d --- /dev/null +++ b/docs/_plugins/non-map-base-layers/tilelayer-deepzoom.md @@ -0,0 +1,12 @@ +--- +name: TileLayer.DeepZoom +category: non-map-base-layers +repo: https://github.com/alfarisi/leaflet-deepzoom +author: Al Farisi +author-url: https://github.com/alfarisi +demo: +compatible-v0: +compatible-v1: true +--- + +A TileLayer for DeepZoom images. diff --git a/docs/_plugins/non-map-base-layers/tilelayer-gigapan.md b/docs/_plugins/non-map-base-layers/tilelayer-gigapan.md new file mode 100644 index 00000000000..eee0ab4d56b --- /dev/null +++ b/docs/_plugins/non-map-base-layers/tilelayer-gigapan.md @@ -0,0 +1,12 @@ +--- +name: TileLayer.Gigapan +category: non-map-base-layers +repo: https://github.com/namrehs/Leaflet.Gigapan +author: Dan Sherman +author-url: https://github.com/namrehs +demo: +compatible-v0: +compatible-v1: true +--- + +A TileLayer for Gigapan images. diff --git a/docs/_plugins/non-map-base-layers/tilelayer-zoomify.md b/docs/_plugins/non-map-base-layers/tilelayer-zoomify.md new file mode 100644 index 00000000000..8f38fd51a04 --- /dev/null +++ b/docs/_plugins/non-map-base-layers/tilelayer-zoomify.md @@ -0,0 +1,12 @@ +--- +name: TileLayer.Zoomify +category: non-map-base-layers +repo: https://github.com/cmulders/Leaflet.Zoomify +author: Bjørn Sandvik +author-url: https://github.com/turban +demo: +compatible-v0: +compatible-v1: true +--- + +A TileLayer for Zoomify images. diff --git a/docs/_plugins/overlay-animations/leaflet-animatedmarker.md b/docs/_plugins/overlay-animations/leaflet-animatedmarker.md new file mode 100644 index 00000000000..777de16a6b3 --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-animatedmarker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.AnimatedMarker +category: overlay-animations +repo: https://github.com/openplans/Leaflet.AnimatedMarker +author: Aaron Ogle +author-url: https://github.com/atogle +demo: +compatible-v0: +compatible-v1: true +--- + +Animate a marker along a polyline. diff --git a/docs/_plugins/overlay-animations/leaflet-antpath.md b/docs/_plugins/overlay-animations/leaflet-antpath.md new file mode 100644 index 00000000000..c7eb16f03c9 --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-antpath.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.AntPath +category: overlay-animations +repo: https://github.com/rubenspgcavalcante/leaflet-ant-path +author: Rubens Pinheiro +author-url: https://github.com/rubenspgcavalcante +demo: https://rubenspgcavalcante.github.io/leaflet-ant-path/ +compatible-v0: +compatible-v1: true +--- + +Leaflet.AntPath put a flux animation (like ants walking) into a Polyline. diff --git a/docs/_plugins/overlay-animations/leaflet-bouncemarker.md b/docs/_plugins/overlay-animations/leaflet-bouncemarker.md new file mode 100644 index 00000000000..fa11ab8c452 --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-bouncemarker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.BounceMarker +category: overlay-animations +repo: https://github.com/maximeh/leaflet.bouncemarker +author: Maxime Hadjinlian +author-url: https://github.com/maximeh +demo: +compatible-v0: +compatible-v1: true +--- + +Make a marker bounce when you add it to a map. diff --git a/docs/_plugins/overlay-animations/leaflet-marker-slideto.md b/docs/_plugins/overlay-animations/leaflet-marker-slideto.md new file mode 100644 index 00000000000..972c491b1b1 --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-marker-slideto.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Marker.SlideTo +category: overlay-animations +repo: https://gitlab.com/IvanSanchez/Leaflet.Marker.SlideTo +author: Iván Sánchez Ortega +author-url: https://gitlab.com/u/IvanSanchez +demo: http://ivansanchez.gitlab.io/Leaflet.Marker.SlideTo/demo.html +compatible-v0: +compatible-v1: true +--- + +Smoothly move (slide) markers to a new location. diff --git a/docs/_plugins/overlay-animations/leaflet-motion.md b/docs/_plugins/overlay-animations/leaflet-motion.md new file mode 100644 index 00000000000..27cf866e444 --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-motion.md @@ -0,0 +1,12 @@ +--- +name: leaflet.motion +category: overlay-animations +repo: https://github.com/Igor-Vladyka/leaflet.motion +author: Igor Vladyka +author-url: https://github.com/Igor-Vladyka/ +demo: https://igor-vladyka.github.io/leaflet.motion/ +compatible-v0: +compatible-v1: true +--- + +Adds simple motion to your polyline with marker in a head on line. diff --git a/docs/_plugins/overlay-animations/leaflet-movingmarker.md b/docs/_plugins/overlay-animations/leaflet-movingmarker.md new file mode 100644 index 00000000000..8b81f727de6 --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-movingmarker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MovingMarker +category: overlay-animations +repo: https://github.com/ewoken/Leaflet.MovingMarker +author: Ewoken +author-url: https://github.com/ewoken +demo: +compatible-v0: +compatible-v1: true +--- + +Allow to move markers along a polyline with custom durations. diff --git a/docs/_plugins/overlay-animations/leaflet-path-dashflow.md b/docs/_plugins/overlay-animations/leaflet-path-dashflow.md new file mode 100644 index 00000000000..7a64a2b5630 --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-path-dashflow.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Path.DashFlow +category: overlay-animations +repo: https://gitlab.com/IvanSanchez/Leaflet.Path.DashFlow +author: Iván Sánchez Ortega +author-url: https://gitlab.com/IvanSanchez +demo: https://ivansanchez.gitlab.io/Leaflet.Path.DashFlow/demo.html +compatible-v0: +compatible-v1: true +--- + +Animates the dashArray of lines and circles, creating a basic flow effect. diff --git a/docs/_plugins/overlay-animations/leaflet-polyline-snakeanim.md b/docs/_plugins/overlay-animations/leaflet-polyline-snakeanim.md new file mode 100644 index 00000000000..296b982459f --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-polyline-snakeanim.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Polyline.SnakeAnim +category: overlay-animations +repo: https://github.com/IvanSanchez/Leaflet.Polyline.SnakeAnim +author: Iván Sánchez Ortega +author-url: https://github.com/IvanSanchez +demo: +compatible-v0: +compatible-v1: true +--- + +Animates (poly)lines into existence, as if they were being slowly drawn from start to end. diff --git a/docs/_plugins/overlay-animations/leaflet-rain.md b/docs/_plugins/overlay-animations/leaflet-rain.md new file mode 100644 index 00000000000..0b3d9e9d0cc --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-rain.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Rain +category: overlay-animations +repo: https://github.com/ggolikov/Leaflet.Rain +author: Grigory Golikov +author-url: https://github.com/ggolikov +demo: https://ggolikov.github.io/Leaflet.Rain/ +compatible-v0: +compatible-v1: true +--- + +Customizable WebGL rain animation for Leaflet. Useful for weather maps. diff --git a/docs/_plugins/overlay-animations/leaflet-smoothmarkerbouncing.md b/docs/_plugins/overlay-animations/leaflet-smoothmarkerbouncing.md new file mode 100644 index 00000000000..079063149e2 --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-smoothmarkerbouncing.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.SmoothMarkerBouncing +category: overlay-animations +repo: https://github.com/hosuaby/Leaflet.SmoothMarkerBouncing +author: Alexei KLENIN +author-url: https://github.com/hosuaby +demo: +compatible-v0: +compatible-v1: true +--- + +Smooth animation of marker bouncing for Leaflet. diff --git a/docs/_plugins/overlay-animations/leaflet-snow.md b/docs/_plugins/overlay-animations/leaflet-snow.md new file mode 100644 index 00000000000..aff28a4159e --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-snow.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Snow +category: overlay-animations +repo: https://github.com/ggolikov/Leaflet.Snow +author: Grigory Golikov +author-url: https://github.com/ggolikov +demo: https://ggolikov.github.io/Leaflet.Snow/ +compatible-v0: +compatible-v1: true +--- + +Customizable WebGL snow animation for Leaflet. Useful for weather maps. diff --git a/docs/_plugins/overlay-animations/leaflet-transitionedicon.md b/docs/_plugins/overlay-animations/leaflet-transitionedicon.md new file mode 100644 index 00000000000..081dfc26d33 --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflet-transitionedicon.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TransitionedIcon +category: overlay-animations +repo: https://github.com/naturalatlas/leaflet-transitionedicon +author: Brian Reavis +author-url: https://github.com/brianreavis +demo: http://naturalatlas.github.io/leaflet-transitionedicon/ +compatible-v0: +compatible-v1: true +--- + +Transition in/out markers with CSS3 transitions. It supports jitter for staggering markers into view to prevent visual overload. diff --git a/docs/_plugins/overlay-animations/leafletpointanimator.md b/docs/_plugins/overlay-animations/leafletpointanimator.md new file mode 100644 index 00000000000..7338d6422d7 --- /dev/null +++ b/docs/_plugins/overlay-animations/leafletpointanimator.md @@ -0,0 +1,12 @@ +--- +name: leaflet-point-animator +category: overlay-animations +repo: https://github.com/onaci/leaflet-point-animator +author: danwild +author-url: https://github.com/danwild +demo: https://onaci.github.io/leaflet-point-animator/ +compatible-v0: +compatible-v1: true +--- + +Animate a large number of GeoJSON points. diff --git a/docs/_plugins/overlay-animations/leaflettemporalgeojson.md b/docs/_plugins/overlay-animations/leaflettemporalgeojson.md new file mode 100644 index 00000000000..862b7676008 --- /dev/null +++ b/docs/_plugins/overlay-animations/leaflettemporalgeojson.md @@ -0,0 +1,12 @@ +--- +name: leaflet-temporal-geojson +category: overlay-animations +repo: https://github.com/onaci/leaflet-temporal-geojson +author: danwild +author-url: https://github.com/danwild +demo: https://onaci.github.io/leaflet-temporal-geojson/ +compatible-v0: +compatible-v1: true +--- + +Flexible animation of GeoJSON features. diff --git a/docs/_plugins/overlay-data-formats/leaflet-encoded.md b/docs/_plugins/overlay-data-formats/leaflet-encoded.md new file mode 100644 index 00000000000..818bbf6a39e --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leaflet-encoded.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.encoded +category: overlay-data-formats +repo: https://github.com/jieter/Leaflet.encoded +author: Jieter +author-url: https://github.com/jieter +demo: +compatible-v0: +compatible-v1: true +--- + +Use encoded polylines in Leaflet. diff --git a/docs/_plugins/overlay-data-formats/leaflet-filegdb.md b/docs/_plugins/overlay-data-formats/leaflet-filegdb.md new file mode 100644 index 00000000000..ee6f9aca848 --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leaflet-filegdb.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.FileGDB +category: overlay-data-formats +repo: https://github.com/calvinmetcalf/leaflet.filegdb +author: Calvin Metcalf +author-url: https://github.com/calvinmetcalf +demo: +compatible-v0: +compatible-v1: true +--- + +Put an ESRI File GeoDatabase onto your map as a layer. diff --git a/docs/_plugins/overlay-data-formats/leaflet-filelayer.md b/docs/_plugins/overlay-data-formats/leaflet-filelayer.md new file mode 100644 index 00000000000..9d11b243b5a --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leaflet-filelayer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.FileLayer +category: overlay-data-formats +repo: https://github.com/makinacorpus/Leaflet.FileLayer +author: Mathieu Leplatre +author-url: https://github.com/leplatrem +demo: +compatible-v0: +compatible-v1: true +--- + +Loads files (GeoJSON, GPX, KML) into the map using the HTML5 FileReader API (i.e. locally without server). diff --git a/docs/_plugins/overlay-data-formats/leaflet-geocsv.md b/docs/_plugins/overlay-data-formats/leaflet-geocsv.md new file mode 100644 index 00000000000..5b1f75e8f9e --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leaflet-geocsv.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.geoCSV +category: overlay-data-formats +repo: https://github.com/joker-x/Leaflet.geoCSV +author: Iván Eixarch +author-url: https://github.com/joker-x +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet plugin for loading a CSV file as geoJSON layer. diff --git a/docs/_plugins/overlay-data-formats/leaflet-gpx.md b/docs/_plugins/overlay-data-formats/leaflet-gpx.md new file mode 100644 index 00000000000..dd743ada87a --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leaflet-gpx.md @@ -0,0 +1,12 @@ +--- +name: Leaflet GPX +category: overlay-data-formats +repo: https://github.com/mpetazzoni/leaflet-gpx +author: Maxime Petazzoni +author-url: https://github.com/mpetazzoni/ +demo: +compatible-v0: +compatible-v1: true +--- + +GPX layer, targeted at sporting activities by providing access to information such as distance, moving time, pace, elevation, heart rate, etc. diff --git a/docs/_plugins/overlay-data-formats/leaflet-layerjson.md b/docs/_plugins/overlay-data-formats/leaflet-layerjson.md new file mode 100644 index 00000000000..a60256792a6 --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leaflet-layerjson.md @@ -0,0 +1,12 @@ +--- +name: Leaflet LayerJSON +category: overlay-data-formats +repo: https://github.com/stefanocudini/leaflet-layerJSON +author: Stefano Cudini +author-url: https://opengeo.tech/ +demo: https://opengeo.tech/maps/leaflet-layerjson/ +compatible-v0: +compatible-v1: true +--- + +Simple way for transform any JSON data source in a Leaflet Layer, load JSON data in layer and minimize remote requests with caching system. diff --git a/docs/_plugins/overlay-data-formats/leaflet-shapefile.md b/docs/_plugins/overlay-data-formats/leaflet-shapefile.md new file mode 100644 index 00000000000..1facbaccb2d --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leaflet-shapefile.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Shapefile +category: overlay-data-formats +repo: https://github.com/calvinmetcalf/leaflet.shapefile +author: Calvin Metcalf +author-url: https://github.com/calvinmetcalf +demo: +compatible-v0: +compatible-v1: true +--- + +Put a shapefile onto your map as a layer. diff --git a/docs/_plugins/overlay-data-formats/leafletbetterscale.md b/docs/_plugins/overlay-data-formats/leafletbetterscale.md new file mode 100644 index 00000000000..b467f145b24 --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leafletbetterscale.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-BetterScale +category: overlay-data-formats +repo: https://github.com/daniellsu/leaflet-betterscale +author: Dan Brown +author-url: https://github.com/daniellsu/ +demo: +compatible-v0: +compatible-v1: true +--- + +A new, more GIS-like scalebar with alternating black/white bars. diff --git a/docs/_plugins/overlay-data-formats/leafletcsvtiles.md b/docs/_plugins/overlay-data-formats/leafletcsvtiles.md new file mode 100644 index 00000000000..680969a8054 --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leafletcsvtiles.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-CsvTiles +category: overlay-data-formats +repo: https://github.com/gherardovarando/leaflet-csvtiles +author: Gherardo Varando +author-url: https://github.com/gherardovarando +demo: https://gherardovarando.github.io/leaflet-csvtiles/demo/index.html +compatible-v0: +compatible-v1: true +--- + +Load points from tiled csv files, using the amazing PapaParse library. diff --git a/docs/_plugins/overlay-data-formats/leafletgeopackage.md b/docs/_plugins/overlay-data-formats/leafletgeopackage.md new file mode 100644 index 00000000000..4ea057073bc --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leafletgeopackage.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-GeoPackage +category: overlay-data-formats +repo: https://github.com/ngageoint/geopackage-js/tree/master/leaflet +author: Daniel Barela +author-url: https://github.com/danielbarela +demo: +compatible-v0: +compatible-v1: true +--- + +Load GeoPackage Tile and Feature Layers. diff --git a/docs/_plugins/overlay-data-formats/leafletkml.md b/docs/_plugins/overlay-data-formats/leafletkml.md new file mode 100644 index 00000000000..2ee50ab7973 --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leafletkml.md @@ -0,0 +1,12 @@ +--- +name: leaflet-kml +category: overlay-data-formats +repo: https://github.com/windycom/leaflet-kml +author: Windyx +author-url: https://github.com/windycom +demo: +compatible-v0: +compatible-v1: true +--- + +Loads & displays KML diff --git a/docs/_plugins/overlay-data-formats/leafletomnivore.md b/docs/_plugins/overlay-data-formats/leafletomnivore.md new file mode 100644 index 00000000000..75a832825fc --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leafletomnivore.md @@ -0,0 +1,12 @@ +--- +name: leaflet-omnivore +category: overlay-data-formats +repo: https://github.com/mapbox/leaflet-omnivore +author: Mapbox +author-url: https://github.com/mapbox +demo: +compatible-v0: +compatible-v1: true +--- + +Loads & converts CSV, KML, GPX, TopoJSON, WKT formats for Leaflet. diff --git a/docs/_plugins/overlay-data-formats/leafletwfst.md b/docs/_plugins/overlay-data-formats/leafletwfst.md new file mode 100644 index 00000000000..e578862bf69 --- /dev/null +++ b/docs/_plugins/overlay-data-formats/leafletwfst.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-WFST +category: overlay-data-formats +repo: https://github.com/Flexberry/Leaflet-WFST +author: Flexberry +author-url: https://github.com/Flexberry/ +demo: +compatible-v0: +compatible-v1: true +--- + +WFS client layer with transaction support diff --git a/docs/_plugins/overlay-data-formats/qgis2web.md b/docs/_plugins/overlay-data-formats/qgis2web.md new file mode 100644 index 00000000000..ce949b6c7ff --- /dev/null +++ b/docs/_plugins/overlay-data-formats/qgis2web.md @@ -0,0 +1,12 @@ +--- +name: qgis2web +category: overlay-data-formats +repo: https://github.com/tomchadwin/qgis2web +author: Tom Chadwin +author-url: https://github.com/tomchadwin +demo: +compatible-v0: +compatible-v1: true +--- + +A QGIS plugin to make webmaps without coding. diff --git a/docs/_plugins/overlay-data-formats/wicket.md b/docs/_plugins/overlay-data-formats/wicket.md new file mode 100644 index 00000000000..12f2da8b7ae --- /dev/null +++ b/docs/_plugins/overlay-data-formats/wicket.md @@ -0,0 +1,12 @@ +--- +name: Wicket +category: overlay-data-formats +repo: https://github.com/arthur-e/Wicket/ +author: K. Arthur Endsley +author-url: https://github.com/arthur-e/ +demo: +compatible-v0: +compatible-v1: true +--- + +A modest library for translating between Well-Known Text (WKT) and Leaflet geometry objects (e.g. between L.marker() instances and "POINT()" strings). diff --git a/docs/_plugins/plugin-collections/mapbbcoderelated-leaflet-plugins.md b/docs/_plugins/plugin-collections/mapbbcoderelated-leaflet-plugins.md new file mode 100644 index 00000000000..c995a8f83f3 --- /dev/null +++ b/docs/_plugins/plugin-collections/mapbbcoderelated-leaflet-plugins.md @@ -0,0 +1,12 @@ +--- +name: MapBBCode-related leaflet plugins +category: plugin-collections +repo: http://mapbbcode.org/leaflet.html +author: Ilya Zverev +author-url: https://github.com/zverik +demo: +compatible-v0: +compatible-v1: true +--- + +Seven plugins for various features, independent of the MapBBCode library. From circular and popup icons to buttons, layer switcher, better search and attribution. diff --git a/docs/_plugins/plugin-collections/plugins-by-pavel-shramov.md b/docs/_plugins/plugin-collections/plugins-by-pavel-shramov.md new file mode 100644 index 00000000000..5e8e020541d --- /dev/null +++ b/docs/_plugins/plugin-collections/plugins-by-pavel-shramov.md @@ -0,0 +1,12 @@ +--- +name: Plugins by Pavel Shramov +category: plugin-collections +repo: https://github.com/shramov/leaflet-plugins +author: Pavel Shramov +author-url: https://github.com/shramov +demo: +compatible-v0: +compatible-v1: true +--- + +A set of plugins for: GPX, KML, TOPOJSON layers; Bing tile layer; Yandex layers (implemented with their APIs), and permalink control. diff --git a/docs/_plugins/plugin-collections/spectrum4leaflet.md b/docs/_plugins/plugin-collections/spectrum4leaflet.md new file mode 100644 index 00000000000..ecdcb14607b --- /dev/null +++ b/docs/_plugins/plugin-collections/spectrum4leaflet.md @@ -0,0 +1,12 @@ +--- +name: Spectrum4Leaflet +category: plugin-collections +repo: https://github.com/Estimap/Spectrum4Leaflet +author: SVoyt +author-url: https://github.com/SVoyt +demo: +compatible-v0: +compatible-v1: true +--- + +Tools for using Spectrum Spatial Server services with leaflet. This plugin supports: map service, tile service, feature service. It has layers, legend and feature controls. diff --git a/docs/_plugins/print-export/leaflet-bigimage.md b/docs/_plugins/print-export/leaflet-bigimage.md new file mode 100644 index 00000000000..79d46a5803f --- /dev/null +++ b/docs/_plugins/print-export/leaflet-bigimage.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.BigImage +category: print-export +repo: https://github.com/pasichnykvasyl/Leaflet.BigImage +author: Vasyl Pasichnyk (Oswald) +author-url: https://github.com/pasichnykvasyl +demo: +compatible-v0: +compatible-v1: true +--- + +Allows users to download an image with a scaled-up version of the visible map. diff --git a/docs/_plugins/print-export/leaflet-browser-print.md b/docs/_plugins/print-export/leaflet-browser-print.md new file mode 100644 index 00000000000..19ab5e70320 --- /dev/null +++ b/docs/_plugins/print-export/leaflet-browser-print.md @@ -0,0 +1,12 @@ +--- +name: leaflet.browser.print +category: print-export +repo: https://github.com/Igor-Vladyka/leaflet.browser.print +author: Igor Vladyka +author-url: https://github.com/Igor-Vladyka +demo: +compatible-v0: +compatible-v1: true +--- + +Allows users to print full page map directly from the browser. diff --git a/docs/_plugins/print-export/leaflet-print.md b/docs/_plugins/print-export/leaflet-print.md new file mode 100644 index 00000000000..d850961ff0b --- /dev/null +++ b/docs/_plugins/print-export/leaflet-print.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.print +category: print-export +repo: https://github.com/aratcliffe/Leaflet.print +author: Adam Ratcliffe +author-url: https://github.com/aratcliffe +demo: +compatible-v0: +compatible-v1: true +--- + +Implements the Mapfish print protocol allowing a Leaflet map to be printed using either the Mapfish or GeoServer print module. diff --git a/docs/_plugins/print-export/leafleteasyprint.md b/docs/_plugins/print-export/leafleteasyprint.md new file mode 100644 index 00000000000..3ff0814ca48 --- /dev/null +++ b/docs/_plugins/print-export/leafleteasyprint.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-easyPrint +category: print-export +repo: https://github.com/rowanwins/leaflet-easyPrint +author: Rowan Winsemius +author-url: https://github.com/rowanwins +demo: +compatible-v0: +compatible-v1: true +--- + +A simple plugin which adds an icon to print your Leaflet map. diff --git a/docs/_plugins/print-export/leafletimage.md b/docs/_plugins/print-export/leafletimage.md new file mode 100644 index 00000000000..e1493bf3f79 --- /dev/null +++ b/docs/_plugins/print-export/leafletimage.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-image +category: print-export +repo: https://github.com/mapbox/leaflet-image +author: Tom MacWright +author-url: https://github.com/tmcw +demo: +compatible-v0: +compatible-v1: true +--- + +Export images out of Leaflet maps without a server component, by using Canvas and CORS. diff --git a/docs/_plugins/print-export/leafletrouteprint.md b/docs/_plugins/print-export/leafletrouteprint.md new file mode 100644 index 00000000000..29ff35199de --- /dev/null +++ b/docs/_plugins/print-export/leafletrouteprint.md @@ -0,0 +1,12 @@ +--- +name: leaflet-route-print +category: print-export +repo: https://github.com/hersle/leaflet-route-print +author: Herman Sletmoen +author-url: https://github.com/hersle +demo: +compatible-v0: +compatible-v1: true +--- + +Automatic PDF printing of routes (i.e. polylines) with custom scale, paper size and margin by covering the route with a sequence of identical rectangles. diff --git a/docs/_plugins/routing/leaflet-reachability.md b/docs/_plugins/routing/leaflet-reachability.md new file mode 100644 index 00000000000..5aa8de33dbe --- /dev/null +++ b/docs/_plugins/routing/leaflet-reachability.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Reachability +category: routing +repo: https://github.com/traffordDataLab/leaflet.reachability +author: Trafford Data Lab +author-url: https://github.com/traffordDataLab +demo: +compatible-v0: +compatible-v1: true +--- + +Show areas of reachability based on time or distance for different modes of travel using the openrouteservice isochrones API. diff --git a/docs/_plugins/routing/leaflet-routeboxer.md b/docs/_plugins/routing/leaflet-routeboxer.md new file mode 100644 index 00000000000..0ce968cd518 --- /dev/null +++ b/docs/_plugins/routing/leaflet-routeboxer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet RouteBoxer +category: routing +repo: https://github.com/StephanGeorg/leaflet-routeboxer +author: Stephan Georg +author-url: https://github.com/StephanGeorg +demo: +compatible-v0: +compatible-v1: true +--- + +This is a Leaflet implementation of the RouteBoxer Class from Google. The Leaflet RouteBoxer class generates a set of L.LatLngBounds objects that are guaranteed to cover every point within a specified distance of a path. diff --git a/docs/_plugins/routing/leaflet-routetoaddress.md b/docs/_plugins/routing/leaflet-routetoaddress.md new file mode 100644 index 00000000000..7e8289e0be4 --- /dev/null +++ b/docs/_plugins/routing/leaflet-routetoaddress.md @@ -0,0 +1,12 @@ +--- +name: Leaflet RouteToAddress +category: routing +repo: https://github.com/astridx/LeafletControlRouteToAddress +author: Astrid Günther +author-url: https://github.com/astridx/ +demo: https://astrid-guenther.de/dies-und-das/38-leaflet-control-plugin-leafletcontrolroutetoaddress/ +compatible-v0: +compatible-v1: true +--- + +Control for route search from a custom address to a fixed address.The Plugin integrates a simple geocoder that uses OpenstreetMap Nominatim to locate places by address. Ideal for the description of the directions "Find your way to us" on a website. Uses OSRM by default, but also supportsMapbox Directions API. diff --git a/docs/_plugins/routing/leaflet-routing-amap.md b/docs/_plugins/routing/leaflet-routing-amap.md new file mode 100644 index 00000000000..73d853e03aa --- /dev/null +++ b/docs/_plugins/routing/leaflet-routing-amap.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Routing.Amap +category: routing +repo: https://github.com/UinJack/Leaflet.Routing.Amap +author: Jack Good +author-url: https://github.com/BKGiser +demo: +compatible-v0: +compatible-v1: true +--- + +Control for route search using AMap(高德地图) as a backend. Supports the Chinese BD09 and GCJ02 coordinate systems, colourful lines, and turn-by-turn popups. diff --git a/docs/_plugins/routing/leaflet-routing-machine.md b/docs/_plugins/routing/leaflet-routing-machine.md new file mode 100644 index 00000000000..bd41ec42bcf --- /dev/null +++ b/docs/_plugins/routing/leaflet-routing-machine.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Routing Machine +category: routing +repo: http://www.liedman.net/leaflet-routing-machine/ +author: Per Liedman +author-url: https://github.com/perliedman +demo: +compatible-v0: +compatible-v1: true +--- + +Control for route search with via points, displaying itinerary and alternative routes. Uses OSRM by default, but also supports GraphHopper, Mapbox Directions API and more. diff --git a/docs/_plugins/routing/leaflet-routing.md b/docs/_plugins/routing/leaflet-routing.md new file mode 100644 index 00000000000..5053fe9a5c9 --- /dev/null +++ b/docs/_plugins/routing/leaflet-routing.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Routing +category: routing +repo: https://github.com/Turistforeningen/leaflet-routing +author: Norwegian Trekking Association +author-url: https://github.com/turistforeningen +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet controller and interface for routing paths between waypoints using any user provided routing service. diff --git a/docs/_plugins/routing/leaflet-travelnotes.md b/docs/_plugins/routing/leaflet-travelnotes.md new file mode 100644 index 00000000000..5eea04a6a43 --- /dev/null +++ b/docs/_plugins/routing/leaflet-travelnotes.md @@ -0,0 +1,12 @@ +--- +name: leaflet.TravelNotes +category: routing +repo: https://github.com/wwwouaiebe/leaflet.TravelNotes +author: Christian Guyette +author-url: https://github.com/wwwouaiebe +demo: https://wwwouaiebe.github.io/leaflet.TravelNotes/?lng=en +compatible-v0: +compatible-v1: true +--- + +Editable markers and routing engine for leaflet. The routing engine have plugins for Mapbox, GraphHopper and OSRM and can be used for car, bike or pedestrian route. diff --git a/docs/_plugins/routing/leaflet-tripgo-routing.md b/docs/_plugins/routing/leaflet-tripgo-routing.md new file mode 100644 index 00000000000..39fe18f852e --- /dev/null +++ b/docs/_plugins/routing/leaflet-tripgo-routing.md @@ -0,0 +1,12 @@ +--- +name: Leaflet TripGo routing +category: routing +repo: https://github.com/skedgo/tripkit-leaflet +author: SkedGo +author-url: https://skedgo.com/ +demo: +compatible-v0: +compatible-v1: true +--- + +The TripGo mobility platform lets you create apps providing seamless and personalised door-to-door trips using any public, private or commercial mode of transport. TripGo Leaflet's plugin motivation is to provide an easy way to include its functionality in an external platform. diff --git a/docs/_plugins/routing/targomo-js.md b/docs/_plugins/routing/targomo-js.md new file mode 100644 index 00000000000..1c9baee8164 --- /dev/null +++ b/docs/_plugins/routing/targomo-js.md @@ -0,0 +1,12 @@ +--- +name: Targomo JS +category: routing +repo: https://github.com/targomo/targomo-js +author: Targomo GmbH +author-url: https://www.targomo.com/ +demo: https://www.targomo.com/developers/documentation/javascript/code_example/ +compatible-v0: +compatible-v1: true +--- + +Targomo visualizes the area which is reachable from a set of starting points in a given time and gives detailed routing information (walk, bike, car and public transportation) to targets. diff --git a/docs/_plugins/search-popups/l-tagfilterbutton.md b/docs/_plugins/search-popups/l-tagfilterbutton.md new file mode 100644 index 00000000000..aa1486de3f8 --- /dev/null +++ b/docs/_plugins/search-popups/l-tagfilterbutton.md @@ -0,0 +1,12 @@ +--- +name: L.tagFilterButton +category: search-popups +repo: https://github.com/maydemirx/leaflet-tag-filter-button +author: Mehmet Aydemir +author-url: https://github.com/maydemirx +demo: +compatible-v0: +compatible-v1: true +--- + +LeafLet marker filtering by tags diff --git a/docs/_plugins/search-popups/leaflet-animatedsearchbox.md b/docs/_plugins/search-popups/leaflet-animatedsearchbox.md new file mode 100644 index 00000000000..951038e9f9f --- /dev/null +++ b/docs/_plugins/search-popups/leaflet-animatedsearchbox.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.AnimatedSearchBox +category: search-popups +repo: https://github.com/luka1199/Leaflet.AnimatedSearchBox +author: Luka Steinbach +author-url: https://github.com/luka1199/ +demo: +compatible-v0: +compatible-v1: true +--- + +A simple Leaflet plugin that provides a collapsible search box. diff --git a/docs/_plugins/search-popups/leaflet-geojsonautocomplete.md b/docs/_plugins/search-popups/leaflet-geojsonautocomplete.md new file mode 100644 index 00000000000..536e566393d --- /dev/null +++ b/docs/_plugins/search-popups/leaflet-geojsonautocomplete.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GeoJSONAutocomplete +category: search-popups +repo: https://github.com/utahemre/Leaflet.GeoJSONAutocomplete +author: Yunus Emre Özkaya +author-url: https://github.com/utahemre +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet Autocomplete For Remote Searching with GeoJSON Services. diff --git a/docs/_plugins/search-popups/leaflet-revealosm.md b/docs/_plugins/search-popups/leaflet-revealosm.md new file mode 100644 index 00000000000..a93ac6f266b --- /dev/null +++ b/docs/_plugins/search-popups/leaflet-revealosm.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.RevealOSM +category: search-popups +repo: https://github.com/yohanboniface/Leaflet.RevealOSM +author: Yohan Boniface +author-url: https://yohanboniface.me/ +demo: +compatible-v0: +compatible-v1: true +--- + +Very simple but extendable Leaflet plugin to display OSM POIs data on map click. diff --git a/docs/_plugins/search-popups/leaflet-rrose.md b/docs/_plugins/search-popups/leaflet-rrose.md new file mode 100644 index 00000000000..7f547edc175 --- /dev/null +++ b/docs/_plugins/search-popups/leaflet-rrose.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Rrose +category: search-popups +repo: https://github.com/erictheise/rrose +author: Eric Theise +author-url: https://github.com/erictheise +demo: +compatible-v0: +compatible-v1: true +--- + +A Leaflet Plugin for Edge Cases. For use when you want popups on mouseover, not click, and you need popup tips to reorient as you get close to the edges of your map. diff --git a/docs/_plugins/search-popups/leaflet-search.md b/docs/_plugins/search-popups/leaflet-search.md new file mode 100644 index 00000000000..7d6714230db --- /dev/null +++ b/docs/_plugins/search-popups/leaflet-search.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Search +category: search-popups +repo: https://github.com/stefanocudini/leaflet-search +author: Stefano Cudini +author-url: https://opengeo.tech/ +demo: +compatible-v0: +compatible-v1: true +--- + +A control for search Markers/Features location by custom property in LayerGroup/GeoJSON. Support AJAX/JSONP, Autocompletion and 3rd party service diff --git a/docs/_plugins/search-popups/leaflet-underneath.md b/docs/_plugins/search-popups/leaflet-underneath.md new file mode 100644 index 00000000000..c4199a7df7f --- /dev/null +++ b/docs/_plugins/search-popups/leaflet-underneath.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Underneath +category: search-popups +repo: https://github.com/perliedman/leaflet-underneath +author: Per Liedman +author-url: https://github.com/perliedman +demo: +compatible-v0: +compatible-v1: true +--- + +Find interesting features near a location using Mapbox Vector Tiles data, to add interactive functionality to a tile layer with speed and limited bandwidth. diff --git a/docs/_plugins/search-popups/leaflet-utfgrid.md b/docs/_plugins/search-popups/leaflet-utfgrid.md new file mode 100644 index 00000000000..0302584aa66 --- /dev/null +++ b/docs/_plugins/search-popups/leaflet-utfgrid.md @@ -0,0 +1,13 @@ +--- +name: Leaflet.utfgrid +category: search-popups +repo: https://github.com/danzel/Leaflet.utfgrid +author: Dave Leaver +author-url: https://github.com/danzel +demo: +compatible-v0: false +compatible-v1: true +--- + +Provides a utfgrid interaction handler for leaflet a very small footprint. +support for Leaflet >= 1.0. Includes basic mouseover support plus ability to highlight feature from UTFGrid on hover. diff --git a/docs/_plugins/search-popups/leafletcustomsearchbox.md b/docs/_plugins/search-popups/leafletcustomsearchbox.md new file mode 100644 index 00000000000..ce57f76fa1e --- /dev/null +++ b/docs/_plugins/search-popups/leafletcustomsearchbox.md @@ -0,0 +1,12 @@ +--- +name: leaflet-custom-searchbox +category: search-popups +repo: https://github.com/8to5Developer/leaflet-custom-searchbox +author: A.D +author-url: https://github.com/8to5Developer/ +demo: +compatible-v0: +compatible-v1: true +--- + +A google map style search box which includes a side panel slider control. diff --git a/docs/_plugins/search-popups/leafletfusesearch.md b/docs/_plugins/search-popups/leafletfusesearch.md new file mode 100644 index 00000000000..44feee246b9 --- /dev/null +++ b/docs/_plugins/search-popups/leafletfusesearch.md @@ -0,0 +1,12 @@ +--- +name: leaflet-fusesearch +category: search-popups +repo: https://github.com/naomap/leaflet-fusesearch +author: Antoine Riche +author-url: https://github.com/naomap +demo: +compatible-v0: http://dev.cartocite.fr/CultureNantes/ +compatible-v1: true +--- + +A control that provides a panel to search features in a GeoJSON layer using the lightweight fuzzy search Fuse.js diff --git a/docs/_plugins/search-popups/leafletgplacesautocomplete.md b/docs/_plugins/search-popups/leafletgplacesautocomplete.md new file mode 100644 index 00000000000..cfff405a44f --- /dev/null +++ b/docs/_plugins/search-popups/leafletgplacesautocomplete.md @@ -0,0 +1,12 @@ +--- +name: Leaflet-gplaces-autocomplete +category: search-popups +repo: https://github.com/Twista/leaflet-google-places-autocomplete +author: Michal Haták +author-url: https://github.com/Twista +demo: +compatible-v0: +compatible-v1: true +--- + +Add google places search into map diff --git a/docs/_plugins/search-popups/leafletpopupmodifier.md b/docs/_plugins/search-popups/leafletpopupmodifier.md new file mode 100644 index 00000000000..91b87360bda --- /dev/null +++ b/docs/_plugins/search-popups/leafletpopupmodifier.md @@ -0,0 +1,12 @@ +--- +name: leaflet-popup-modifier +category: search-popups +repo: https://github.com/slutske22/leaflet-popup-modifier +author: Slutske22 +author-url: https://github.com/slutske22 +demo: +compatible-v0: +compatible-v1: true +--- + +Allows user to edit the contents of a popup, or use the popup to remove its source marker. diff --git a/docs/_plugins/search-popups/leafletresponsivepopup.md b/docs/_plugins/search-popups/leafletresponsivepopup.md new file mode 100644 index 00000000000..d99783e25a9 --- /dev/null +++ b/docs/_plugins/search-popups/leafletresponsivepopup.md @@ -0,0 +1,12 @@ +--- +name: leaflet-responsive-popup +category: search-popups +repo: https://github.com/yafred/leaflet-responsive-popup +author: YaFred +author-url: https://github.com/yafred +demo: +compatible-v0: +compatible-v1: true +--- + +Removes the need to move the map to be able to see the content of the popup. diff --git a/docs/_plugins/synthetic-overlays/l-os-graticule.md b/docs/_plugins/synthetic-overlays/l-os-graticule.md new file mode 100644 index 00000000000..bb34d433fdf --- /dev/null +++ b/docs/_plugins/synthetic-overlays/l-os-graticule.md @@ -0,0 +1,12 @@ +--- +name: L.OS.Graticule +category: synthetic-overlays +repo: https://github.com/jonshutt/Leaflet.OS.Graticule +author: Jon Shutt +author-url: https://github.com/jonshutt +demo: +compatible-v0: +compatible-v1: true +--- + +Overlays UK Ordinance Survey (OS) 1km grid squares and labels. diff --git a/docs/_plugins/synthetic-overlays/leaflet-autograticule.md b/docs/_plugins/synthetic-overlays/leaflet-autograticule.md new file mode 100644 index 00000000000..bc3a7ec61f8 --- /dev/null +++ b/docs/_plugins/synthetic-overlays/leaflet-autograticule.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.AutoGraticule +category: synthetic-overlays +repo: https://github.com/facilmap/Leaflet.AutoGraticule +author: Candid Dauth +author-url: https://github.com/cdauth +demo: https://unpkg.com/leaflet-auto-graticule/example.html +compatible-v0: +compatible-v1: true +--- + +Draws a grid of latitude and longitude lines, automatically adjusting the scale to the current zoom level. diff --git a/docs/_plugins/synthetic-overlays/leaflet-edgescalebar.md b/docs/_plugins/synthetic-overlays/leaflet-edgescalebar.md new file mode 100644 index 00000000000..c87d42c3633 --- /dev/null +++ b/docs/_plugins/synthetic-overlays/leaflet-edgescalebar.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.EdgeScaleBar +category: synthetic-overlays +repo: https://github.com/dtutic/Leaflet.EdgeScaleBar +author: Dražen Tutić, Ana Kuveždić Divjak +author-url: https://github.com/GEOF-OSGL +demo: +compatible-v0: +compatible-v1: true +--- + +Creates scale bars along top and right edge of a map in the Web Mercator projection. diff --git a/docs/_plugins/synthetic-overlays/leaflet-graticule.md b/docs/_plugins/synthetic-overlays/leaflet-graticule.md new file mode 100644 index 00000000000..acb096e0fcb --- /dev/null +++ b/docs/_plugins/synthetic-overlays/leaflet-graticule.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Graticule +category: synthetic-overlays +repo: https://github.com/turban/Leaflet.Graticule +author: Bjørn Sandvik +author-url: https://github.com/turban +demo: +compatible-v0: +compatible-v1: true +--- + +Draws a grid of latitude and longitude lines. diff --git a/docs/_plugins/synthetic-overlays/leaflet-latlnggraticule.md b/docs/_plugins/synthetic-overlays/leaflet-latlnggraticule.md new file mode 100644 index 00000000000..fbe7c16c50d --- /dev/null +++ b/docs/_plugins/synthetic-overlays/leaflet-latlnggraticule.md @@ -0,0 +1,12 @@ +--- +name: leaflet.latlng-graticule +category: synthetic-overlays +repo: https://github.com/cloudybay/leaflet.latlng-graticule +author: CloudyBay +author-url: https://github.com/cloudybay/ +demo: https://cloudybay.github.io/leaflet.latlng-graticule/example/ +compatible-v0: +compatible-v1: true +--- + +Create a Canvas as ImageOverlay to draw the Lat/Lon Graticule, and show the grid tick label at the edges of the map. diff --git a/docs/_plugins/synthetic-overlays/leaflet-maidenhead.md b/docs/_plugins/synthetic-overlays/leaflet-maidenhead.md new file mode 100644 index 00000000000..fca42b89627 --- /dev/null +++ b/docs/_plugins/synthetic-overlays/leaflet-maidenhead.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Maidenhead +category: synthetic-overlays +repo: https://gitlab.com/IvanSanchez/leaflet.maidenhead +author: Iván Sánchez Ortega +author-url: https://github.com/IvanSanchez +demo: https://ivansanchez.gitlab.io/leaflet.maidenhead/demo.html +compatible-v0: +compatible-v1: true +--- + +An implementation of the Maidenhead Locator System grid. diff --git a/docs/_plugins/synthetic-overlays/leaflet-metricgrid.md b/docs/_plugins/synthetic-overlays/leaflet-metricgrid.md new file mode 100644 index 00000000000..59d6a80d0a1 --- /dev/null +++ b/docs/_plugins/synthetic-overlays/leaflet-metricgrid.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MetricGrid +category: synthetic-overlays +repo: https://github.com/bill-chadwick/Leaflet.MetricGrid +author: Bill Chadwick +author-url: https://github.com/bill-chadwick +demo: +compatible-v0: +compatible-v1: true +--- + +A general purpose Metric Grid overlay for Leaflet with ready defined UTM, British and Irish Grids. diff --git a/docs/_plugins/synthetic-overlays/leaflet-simplegraticule.md b/docs/_plugins/synthetic-overlays/leaflet-simplegraticule.md new file mode 100644 index 00000000000..0e48889c2d5 --- /dev/null +++ b/docs/_plugins/synthetic-overlays/leaflet-simplegraticule.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.SimpleGraticule +category: synthetic-overlays +repo: https://github.com/ablakey/Leaflet.SimpleGraticule +author: Andrew Blakey +author-url: https://github.com/ablakey +demo: +compatible-v0: +compatible-v1: true +--- + +Draws a grid lines for L.CRS.Simple coordinate system. diff --git a/docs/_plugins/synthetic-overlays/leaflet-sun.md b/docs/_plugins/synthetic-overlays/leaflet-sun.md new file mode 100644 index 00000000000..2210c5f02f5 --- /dev/null +++ b/docs/_plugins/synthetic-overlays/leaflet-sun.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Sun +category: synthetic-overlays +repo: https://github.com/dj0001/Leaflet.Sun +author: DJ +author-url: https://github.com/dj0001 +demo: https://dj0001.github.io/Leaflet.Sun/ +compatible-v0: +compatible-v1: true +--- + +Get sunset or sunrise at map click. diff --git a/docs/_plugins/synthetic-overlays/leaflet-terminator.md b/docs/_plugins/synthetic-overlays/leaflet-terminator.md new file mode 100644 index 00000000000..fb796c61aa0 --- /dev/null +++ b/docs/_plugins/synthetic-overlays/leaflet-terminator.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Terminator +category: synthetic-overlays +repo: https://github.com/joergdietrich/Leaflet.Terminator +author: Jörg Dietrich +author-url: https://github.com/joergdietrich +demo: +compatible-v0: +compatible-v1: true +--- + +Overlay day and night regions on a map. diff --git a/docs/_plugins/synthetic-overlays/leaflet-timezones.md b/docs/_plugins/synthetic-overlays/leaflet-timezones.md new file mode 100644 index 00000000000..82f0b6a303e --- /dev/null +++ b/docs/_plugins/synthetic-overlays/leaflet-timezones.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.timezones +category: synthetic-overlays +repo: https://github.com/dj0001/Leaflet.timezones +author: DJ +author-url: https://github.com/dj0001 +demo: https://dj0001.github.io/Leaflet.timezones/ +compatible-v0: +compatible-v1: true +--- + +Overlay timezones on a Leaflet Earth map. diff --git a/docs/_plugins/template.md b/docs/_plugins/template.md new file mode 100644 index 00000000000..5e4b24bc0e9 --- /dev/null +++ b/docs/_plugins/template.md @@ -0,0 +1,12 @@ +--- +name: required +category: required (same name as directory) +repo: required +author: required +author-url: +demo: +compatible-v0: +compatible-v1: true +--- + +Describe here your **plugin**, you can use *markdown* to format your text. Keep it short and check out the [plugin guide](https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md). diff --git a/docs/_plugins/tile-image-display/leaflet-control-detaillevel.md b/docs/_plugins/tile-image-display/leaflet-control-detaillevel.md new file mode 100644 index 00000000000..c472e82e6e4 --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-control-detaillevel.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Control.DetailLevel +category: tile-image-display +repo: https://github.com/valkenburg/Leaflet.Control.DetailLevel +author: Wessel Valkenburg +author-url: https://github.com/valkenburg +demo: https://valkenburg.github.io/Leaflet.Control.DetailLevel/demo.html +compatible-v0: +compatible-v1: true +--- + +Display tiles at higher-than-retina (hdpi) resolutions, by real-time modification of the zoomOffset. Useful for mapping sources which drastically change map style between different zoom levels. Increasing the zoomOffset by too much does slow down the browser, as the number of displayed tiles grows exponentially with the zoomOffset. diff --git a/docs/_plugins/tile-image-display/leaflet-control-opacity.md b/docs/_plugins/tile-image-display/leaflet-control-opacity.md new file mode 100644 index 00000000000..e7e8097dc5b --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-control-opacity.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Control.Opacity +category: tile-image-display +repo: https://github.com/dayjournal/Leaflet.Control.Opacity +author: Yasunori Kirimoto +author-url: https://day-journal.com/ +demo: https://dayjournal.github.io/Leaflet.Control.Opacity/ +compatible-v0: +compatible-v1: true +--- + +Make multiple tile layers transparent. diff --git a/docs/_plugins/tile-image-display/leaflet-control-sidebyside.md b/docs/_plugins/tile-image-display/leaflet-control-sidebyside.md new file mode 100644 index 00000000000..1449df45db4 --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-control-sidebyside.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Control.SideBySide +category: tile-image-display +repo: https://github.com/digidem/leaflet-side-by-side +author: Digital Democracy +author-url: https://www.digital-democracy.org/ +demo: +compatible-v0: +compatible-v1: true +--- + +A Leaflet control to add a split screen to compare two map overlays. diff --git a/docs/_plugins/tile-image-display/leaflet-distortableimage.md b/docs/_plugins/tile-image-display/leaflet-distortableimage.md new file mode 100644 index 00000000000..291d69fa746 --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-distortableimage.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.DistortableImage +category: tile-image-display +repo: https://github.com/publiclab/Leaflet.DistortableImage +author: Public Lab +author-url: https://github.com/publiclab +demo: +compatible-v0: +compatible-v1: true +--- + +Enable users to scale, rotate, and distort images on Leaflet maps. diff --git a/docs/_plugins/tile-image-display/leaflet-distortablevideo.md b/docs/_plugins/tile-image-display/leaflet-distortablevideo.md new file mode 100644 index 00000000000..c86f05b821b --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-distortablevideo.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.DistortableVideo +category: tile-image-display +repo: https://github.com/ronikar/Leaflet.DistortableVideo +author: Roni Karilkar +author-url: https://github.com/ronikar +demo: https://ronikar.github.io/Leaflet.DistortableVideo/examples/ +compatible-v0: +compatible-v1: true +--- + +Enable users to scale, rotate, and distort videos on Leaflet maps. diff --git a/docs/_plugins/tile-image-display/leaflet-imageoverlay-arrugator.md b/docs/_plugins/tile-image-display/leaflet-imageoverlay-arrugator.md new file mode 100644 index 00000000000..b2b4da35153 --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-imageoverlay-arrugator.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ImageOverlay.Arrugator +category: tile-image-display +repo: https://gitlab.com/IvanSanchez/Leaflet.ImageOverlay.Arrugator +author: Iván Sánchez Ortega +author-url: https://ivan.sanchezortega.es/ +demo: https://ivansanchez.gitlab.io/Leaflet.ImageOverlay.Arrugator/demo.html +compatible-v0: +compatible-v1: true +--- + +Displays reprojected ImageOverlays, given four control points and a proj4js projection function. diff --git a/docs/_plugins/tile-image-display/leaflet-imageoverlay-rotate.md b/docs/_plugins/tile-image-display/leaflet-imageoverlay-rotate.md new file mode 100644 index 00000000000..aed6514ef58 --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-imageoverlay-rotate.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ImageOverlay.Rotate +category: tile-image-display +repo: https://github.com/IvanSanchez/Leaflet.ImageOverlay.Rotated +author: Iván Sánchez Ortega +author-url: https://github.com/IvanSanchez +demo: http://ivansanchez.github.io/Leaflet.ImageOverlay.Rotated/demo.html +compatible-v0: +compatible-v1: true +--- + +Displays rotated, scaled and skewed (but not rubbersheeted) ImageOverlays, given three control points. diff --git a/docs/_plugins/tile-image-display/leaflet-multispectral.md b/docs/_plugins/tile-image-display/leaflet-multispectral.md new file mode 100644 index 00000000000..56589e6a0cf --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-multispectral.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Multispectral +category: tile-image-display +repo: https://github.com/publiclab/leaflet-multispectral +author: Public Lab +author-url: https://publiclab.org/ +demo: https://publiclab.github.io/leaflet-multispectral/ +compatible-v0: +compatible-v1: true +--- + +Provides multispectral channel manipulation and processing tools (such as NDVI or other remote sensing methods) for Leaflet image layers using pure client-side JavaScript. It uses `image-sequencer` via an ImageOverlay `filter()` function. diff --git a/docs/_plugins/tile-image-display/leaflet-nontiledlayers.md b/docs/_plugins/tile-image-display/leaflet-nontiledlayers.md new file mode 100644 index 00000000000..166065abc9c --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-nontiledlayers.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.NonTiledLayers +category: tile-image-display +repo: https://github.com/ptv-logistics/Leaflet.NonTiledLayer +author: PTV Logistics +author-url: https://github.com/ptv-logistics +demo: https://ptv-logistics.github.io/Leaflet.NonTiledLayer/index.html +compatible-v0: +compatible-v1: true +--- + +A Leaflet layer for non-tiled overlays. diff --git a/docs/_plugins/tile-image-display/leaflet-opacitycontrols.md b/docs/_plugins/tile-image-display/leaflet-opacitycontrols.md new file mode 100644 index 00000000000..5812f8595ee --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-opacitycontrols.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.OpacityControls +category: tile-image-display +repo: https://github.com/lizardtechblog/Leaflet.OpacityControls +author: Jared Dominguez +author-url: https://github.com/lizardtechblog/ +demo: +compatible-v0: +compatible-v1: true +--- + +Simple Leaflet controls to adjust the opacity of a map layer. diff --git a/docs/_plugins/tile-image-display/leaflet-tilelayer-canvas.md b/docs/_plugins/tile-image-display/leaflet-tilelayer-canvas.md new file mode 100644 index 00000000000..283c685ae38 --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-tilelayer-canvas.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.Canvas +category: tile-image-display +repo: https://github.com/GIAPspzoo/L.TileLayer.Canvas +author: GIAP +author-url: https://giap.pl +demo: +compatible-v0: +compatible-v1: true +--- + +Render tiles as canvas elements. diff --git a/docs/_plugins/tile-image-display/leaflet-tilelayer-colorfilter.md b/docs/_plugins/tile-image-display/leaflet-tilelayer-colorfilter.md new file mode 100644 index 00000000000..d00664053a9 --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-tilelayer-colorfilter.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.ColorFilter +category: tile-image-display +repo: https://github.com/xtk93x/Leaflet.TileLayer.ColorFilter +author: Cláudio Kawakani +author-url: https://github.com/xtk93x +demo: https://xtk93x.github.io/Leaflet.TileLayer.ColorFilter/ +compatible-v0: +compatible-v1: true +--- + +A simple and lightweight Leaflet plugin to apply CSS filters on map tiles. diff --git a/docs/_plugins/tile-image-display/leaflet-tilelayer-colorizr.md b/docs/_plugins/tile-image-display/leaflet-tilelayer-colorizr.md new file mode 100644 index 00000000000..a12544492c6 --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-tilelayer-colorizr.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.Colorizr +category: tile-image-display +repo: https://github.com/hnrchrdl/leaflet-tilelayer-colorizr +author: Hinrich Riedel +author-url: https://github.com/hnrchrdl +demo: +compatible-v0: +compatible-v1: true +--- + +A Leaflet TileLayer which can modify colors by RGBA code. diff --git a/docs/_plugins/tile-image-display/leaflet-tilelayer-colorpicker.md b/docs/_plugins/tile-image-display/leaflet-tilelayer-colorpicker.md new file mode 100644 index 00000000000..4239f29c24c --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-tilelayer-colorpicker.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.ColorPicker +category: tile-image-display +repo: https://github.com/frogcat/leaflet-tilelayer-colorpicker +author: Yuzo Matsuzawa +author-url: https://github.com/frogcat +demo: https://frogcat.github.io/leaflet-tilelayer-colorpicker/ +compatible-v0: +compatible-v1: true +--- + +A Leaflet TileLayer with getColor(latLng). diff --git a/docs/_plugins/tile-image-display/leaflet-tilelayer-gl.md b/docs/_plugins/tile-image-display/leaflet-tilelayer-gl.md new file mode 100644 index 00000000000..348f9509bbf --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-tilelayer-gl.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.GL +category: tile-image-display +repo: https://gitlab.com/IvanSanchez/Leaflet.TileLayer.GL +author: Iván Sánchez +author-url: https://github.com/IvanSanchez +demo: https://ivansanchez.gitlab.io/Leaflet.TileLayer.GL/demo/repl.html +compatible-v0: +compatible-v1: true +--- + +Applies custom WebGL shaders to each tile in a tilelayer. diff --git a/docs/_plugins/tile-image-display/leaflet-tilelayer-glcolorscale.md b/docs/_plugins/tile-image-display/leaflet-tilelayer-glcolorscale.md new file mode 100644 index 00000000000..491fb4350b3 --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-tilelayer-glcolorscale.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.GLColorScale +category: tile-image-display +repo: https://github.com/ihmeuw/leaflet.tilelayer.glcolorscale +author: David Schneider +author-url: https://github.com/davschne +demo: https://ihmeuw.github.io/leaflet.tilelayer.glcolorscale/demo/ +compatible-v0: +compatible-v1: true +--- + +TileLayer that uses WebGL to colorize floating-point pixels according to a specified color scale. diff --git a/docs/_plugins/tile-image-display/leaflet-tilelayer-gloperations.md b/docs/_plugins/tile-image-display/leaflet-tilelayer-gloperations.md new file mode 100644 index 00000000000..165a07140bb --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-tilelayer-gloperations.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.GLOperations +category: tile-image-display +repo: https://github.com/equinor/leaflet.tilelayer.gloperations +author: Thorbjørn Horgen +author-url: https://github.com/thor85 +demo: https://equinor.github.io/leaflet.tilelayer.gloperations/ +compatible-v0: +compatible-v1: true +--- + +WebGL TileLayer: Colorize floating-point pixels, mouse event handlers for pixel values, hillshading, contours, transitions, filter and do calculations on multiple layers. diff --git a/docs/_plugins/tile-image-display/leaflet-tilelayer-mask.md b/docs/_plugins/tile-image-display/leaflet-tilelayer-mask.md new file mode 100644 index 00000000000..e5da27e1914 --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-tilelayer-mask.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.Mask +category: tile-image-display +repo: https://github.com/frogcat/leaflet-tilelayer-mask +author: Yuzo Matsuzawa +author-url: https://github.com/frogcat +demo: http://frogcat.github.io/leaflet-tilelayer-mask/default/ +compatible-v0: +compatible-v1: true +--- + +A TileLayer with mask effect. diff --git a/docs/_plugins/tile-image-display/leaflet-tilelayer-pixelfilter.md b/docs/_plugins/tile-image-display/leaflet-tilelayer-pixelfilter.md new file mode 100644 index 00000000000..694a7be919e --- /dev/null +++ b/docs/_plugins/tile-image-display/leaflet-tilelayer-pixelfilter.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.PixelFilter +category: tile-image-display +repo: https://github.com/GreenInfo-Network/L.TileLayer.PixelFilter/ +author: GreenInfo Network +author-url: https://github.com/GreenInfo-Network/ +demo: http://greeninfo-network.github.io/L.TileLayer.PixelFilter/demo1.html +compatible-v0: +compatible-v1: true +--- + +A TileLayer which can filter and replace pixels by RGB code. diff --git a/docs/_plugins/tile-image-display/tilelayer-boundarycanvas.md b/docs/_plugins/tile-image-display/tilelayer-boundarycanvas.md new file mode 100644 index 00000000000..8b3831e54ed --- /dev/null +++ b/docs/_plugins/tile-image-display/tilelayer-boundarycanvas.md @@ -0,0 +1,12 @@ +--- +name: TileLayer.BoundaryCanvas +category: tile-image-display +repo: https://github.com/aparshin/leaflet-boundary-canvas +author: Alexander Parshin +author-url: https://github.com/aparshin +demo: +compatible-v0: +compatible-v1: true +--- + +Allows you to draw tile layers with arbitrary polygonal boundary. HTML5 Canvas is used for rendering. diff --git a/docs/_plugins/tile-image-display/tilelayer-grayscale.md b/docs/_plugins/tile-image-display/tilelayer-grayscale.md new file mode 100644 index 00000000000..38c91d2119e --- /dev/null +++ b/docs/_plugins/tile-image-display/tilelayer-grayscale.md @@ -0,0 +1,12 @@ +--- +name: TileLayer.Grayscale +category: tile-image-display +repo: https://github.com/Zverik/leaflet-grayscale/ +author: Ilya Zverev +author-url: https://github.com/Zverik +demo: +compatible-v0: +compatible-v1: true +--- + +A regular TileLayer with grayscale makeover. diff --git a/docs/_plugins/tile-load/leaflet-edgebuffer.md b/docs/_plugins/tile-load/leaflet-edgebuffer.md new file mode 100644 index 00000000000..2166cf87671 --- /dev/null +++ b/docs/_plugins/tile-load/leaflet-edgebuffer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.EdgeBuffer +category: tile-load +repo: https://github.com/TolonUK/Leaflet.EdgeBuffer +author: Alex Paterson +author-url: https://github.com/TolonUK +demo: http://www.tolon.co.uk/Leaflet.EdgeBuffer/comparison.html +compatible-v0: false +compatible-v1: true +--- + +Buffer tiles beyond the edge of the viewport, for Leaflet 1.0. diff --git a/docs/_plugins/tile-load/leaflet-featuregroup-loadevents.md b/docs/_plugins/tile-load/leaflet-featuregroup-loadevents.md new file mode 100644 index 00000000000..537ef41a8ee --- /dev/null +++ b/docs/_plugins/tile-load/leaflet-featuregroup-loadevents.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.FeatureGroup.LoadEvents +category: tile-load +repo: https://github.com/Outdooractive/Leaflet.FeatureGroup.LoadEvents +author: G. Lathoud +author-url: http://glat.info/ +demo: +compatible-v0: true +compatible-v1: false +--- + +`FeatureGroup` that supports the `"loading"` and `"load"` events (for v0.7.*). diff --git a/docs/_plugins/tile-load/leaflet-functionaltilelayer.md b/docs/_plugins/tile-load/leaflet-functionaltilelayer.md new file mode 100644 index 00000000000..020a1f1baa2 --- /dev/null +++ b/docs/_plugins/tile-load/leaflet-functionaltilelayer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.FunctionalTileLayer +category: tile-load +repo: https://github.com/ismyrnow/Leaflet.functionaltilelayer +author: Ishmael Smyrnow +author-url: https://github.com/ismyrnow +demo: +compatible-v0: +compatible-v1: true +--- + +Allows you to define tile layer URLs using a function. Even works with asynchronous sources, using promises. diff --git a/docs/_plugins/tile-load/leaflet-gridlayer-fadeout.md b/docs/_plugins/tile-load/leaflet-gridlayer-fadeout.md new file mode 100644 index 00000000000..a758f96ce67 --- /dev/null +++ b/docs/_plugins/tile-load/leaflet-gridlayer-fadeout.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GridLayer.FadeOut +category: tile-load +repo: https://gitlab.com/IvanSanchez/Leaflet.GridLayer.FadeOut +author: Iván Sánchez +author-url: https://github.com/IvanSanchez +demo: http://ivansanchez.gitlab.io/Leaflet.GridLayer.FadeOut/demo.html +compatible-v0: false +compatible-v1: true +--- + +Fades out grid layers and tilelayers when they are removed, making basemap changes smoother (for 1.0.0). diff --git a/docs/_plugins/tile-load/leaflet-loading.md b/docs/_plugins/tile-load/leaflet-loading.md new file mode 100644 index 00000000000..c99d52b4425 --- /dev/null +++ b/docs/_plugins/tile-load/leaflet-loading.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.loading +category: tile-load +repo: https://github.com/ebrelsford/Leaflet.loading +author: Eric Brelsford +author-url: https://github.com/ebrelsford/ +demo: +compatible-v0: +compatible-v1: true +--- + +A simple control that adds a loading indicator as tiles and other data are loaded. diff --git a/docs/_plugins/tile-load/leaflet-multitilelayer.md b/docs/_plugins/tile-load/leaflet-multitilelayer.md new file mode 100644 index 00000000000..b0f7c91e289 --- /dev/null +++ b/docs/_plugins/tile-load/leaflet-multitilelayer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MultiTileLayer +category: tile-load +repo: https://github.com/mattiasb/Leaflet.MultiTileLayer +author: Mattias Bengtsson +author-url: https://github.com/mattiasb +demo: +compatible-v0: +compatible-v1: true +--- + +Allows to compose a TileLayer from several tile sources. Each source is active only on a defined set of zoomlevels. diff --git a/docs/_plugins/tile-load/leaflet-offline.md b/docs/_plugins/tile-load/leaflet-offline.md new file mode 100644 index 00000000000..c1ad7fa60e4 --- /dev/null +++ b/docs/_plugins/tile-load/leaflet-offline.md @@ -0,0 +1,12 @@ +--- +name: leaflet.offline +category: tile-load +repo: https://github.com/allartk/leaflet.offline +author: Allart Kooiman +author-url: https://github.com/allartk +demo: https://allartk.github.io/leaflet.offline/ +compatible-v0: +compatible-v1: true +--- + +Allow tiles to be stored in an database for offline access. diff --git a/docs/_plugins/tile-load/leaflet-tilecorrection.md b/docs/_plugins/tile-load/leaflet-tilecorrection.md new file mode 100644 index 00000000000..a1a2f8ad8a6 --- /dev/null +++ b/docs/_plugins/tile-load/leaflet-tilecorrection.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileCorrection +category: tile-load +repo: https://github.com/z632896862/Leaflet.TileCorrection +author: Allart Kooiman +author-url: https://github.com/z632896862 +demo: +compatible-v0: +compatible-v1: true +--- + +Allow tiles to be loaded in an different crs from map's and start at a custom zoom. diff --git a/docs/_plugins/tile-load/leaflet-tilelayer-fallback.md b/docs/_plugins/tile-load/leaflet-tilelayer-fallback.md new file mode 100644 index 00000000000..251c9712327 --- /dev/null +++ b/docs/_plugins/tile-load/leaflet-tilelayer-fallback.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLayer.Fallback +category: tile-load +repo: https://github.com/ghybs/Leaflet.TileLayer.Fallback +author: ghybs +author-url: https://github.com/ghybs +demo: +compatible-v0: +compatible-v1: true +--- + +Replaces missing Tiles (HTTP 404 Not Found Error) by scaled up equivalent Tiles from lower zooms. diff --git a/docs/_plugins/tile-load/tilelayer-cordova.md b/docs/_plugins/tile-load/tilelayer-cordova.md new file mode 100644 index 00000000000..d5f42b8ee18 --- /dev/null +++ b/docs/_plugins/tile-load/tilelayer-cordova.md @@ -0,0 +1,12 @@ +--- +name: TileLayer.Cordova +category: tile-load +repo: https://github.com/gregallensworth/L.TileLayer.Cordova +author: Greg Allensworth +author-url: https://github.com/gregallensworth +demo: +compatible-v0: +compatible-v1: true +--- + +For use with Cordova/Phonegap, adds tile caching onto local device storage, switching between offline and online mode. diff --git a/docs/_plugins/tile-load/tilelayer-pouchdbcached.md b/docs/_plugins/tile-load/tilelayer-pouchdbcached.md new file mode 100644 index 00000000000..18c040b5ffc --- /dev/null +++ b/docs/_plugins/tile-load/tilelayer-pouchdbcached.md @@ -0,0 +1,12 @@ +--- +name: TileLayer.PouchDBCached +category: tile-load +repo: https://github.com/MazeMap/Leaflet.TileLayer.PouchDBCached +author: Iván Sánchez Ortega +author-url: https://github.com/IvanSanchez +demo: +compatible-v0: +compatible-v1: true +--- + +Allows all Leaflet TileLayers to cache into PouchDB for offline use. diff --git a/docs/_plugins/time-elevation/leaflet-elevation.md b/docs/_plugins/time-elevation/leaflet-elevation.md new file mode 100644 index 00000000000..c1432adb408 --- /dev/null +++ b/docs/_plugins/time-elevation/leaflet-elevation.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Elevation +category: time-elevation +repo: https://github.com/MrMufflon/Leaflet.Elevation +author: Felix Bache +author-url: https://github.com/MrMufflon +demo: +compatible-v0: +compatible-v1: true +--- + +A Leaflet plugin to view interactive height profiles of GeoJSON lines using d3. diff --git a/docs/_plugins/time-elevation/leaflet-heightgraph.md b/docs/_plugins/time-elevation/leaflet-heightgraph.md new file mode 100644 index 00000000000..9fbd987e18a --- /dev/null +++ b/docs/_plugins/time-elevation/leaflet-heightgraph.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Heightgraph +category: time-elevation +repo: https://github.com/GIScience/Leaflet.Heightgraph +author: Robin Boldt +author-url: https://github.com/boldtrn +demo: +compatible-v0: +compatible-v1: true +--- + +Inspired by Leaflet.Elevation this Leaflet plugin allows you to view interactive height profiles stored as GeoJSON featuring the handy ability to visualize arbitrary segments (e.g. surface types or steepness categories) with customized colors stored as properties within the GeoJSON itself. diff --git a/docs/_plugins/time-elevation/leaflet-hex-timeslider.md b/docs/_plugins/time-elevation/leaflet-hex-timeslider.md new file mode 100644 index 00000000000..6d98760799a --- /dev/null +++ b/docs/_plugins/time-elevation/leaflet-hex-timeslider.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Hex Time Slider +category: time-elevation +repo: https://github.com/albertkun/leaflet_hex_timeslider/ +author: Albert Kochaphum +author-url: https://github.com/albertkun +demo: https://albertkun.github.io/leaflet_hex_timeslider/ +compatible-v0: +compatible-v1: true +--- + +Minimalistic time slider using leaflet + d3.js and nouislider for displaying time series data using a geoJSON file. diff --git a/docs/_plugins/time-elevation/leaflet-hotline.md b/docs/_plugins/time-elevation/leaflet-hotline.md new file mode 100644 index 00000000000..89ba54c51d8 --- /dev/null +++ b/docs/_plugins/time-elevation/leaflet-hotline.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.hotline +category: time-elevation +repo: https://github.com/iosphere/Leaflet.hotline +author: iosphere +author-url: https://github.com/iosphere +demo: +compatible-v0: +compatible-v1: true +--- + +A Leaflet plugin for drawing gradients along polylines. diff --git a/docs/_plugins/time-elevation/leaflet-timedimension.md b/docs/_plugins/time-elevation/leaflet-timedimension.md new file mode 100644 index 00000000000..0f3222e6de6 --- /dev/null +++ b/docs/_plugins/time-elevation/leaflet-timedimension.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TimeDimension +category: time-elevation +repo: https://github.com/socib/Leaflet.TimeDimension +author: ICTS SOCIB +author-url: https://www.socib.es/ +demo: https://apps.socib.es/Leaflet.TimeDimension/examples/index.html +compatible-v0: +compatible-v1: true +--- + +Add time dimension capabilities on a Leaflet map. diff --git a/docs/_plugins/time-elevation/leaflet-timeline-control.md b/docs/_plugins/time-elevation/leaflet-timeline-control.md new file mode 100644 index 00000000000..a7ffc817ac2 --- /dev/null +++ b/docs/_plugins/time-elevation/leaflet-timeline-control.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Timeline Control +category: time-elevation +repo: https://github.com/zimmicz/Leaflet-Timeline-Control +author: Michal Zimmermann +author-url: https://github.com/zimmicz +demo: https://codesandbox.io/s/leaflet-timeline-control-ibyby +compatible-v0: +compatible-v1: true +--- + +Unopinionated timeline control that helps you display time series data. diff --git a/docs/_plugins/time-elevation/leaflet-timeline.md b/docs/_plugins/time-elevation/leaflet-timeline.md new file mode 100644 index 00000000000..eaf3b81695f --- /dev/null +++ b/docs/_plugins/time-elevation/leaflet-timeline.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.timeline +category: time-elevation +repo: https://github.com/skeate/Leaflet.timeline +author: Jonathan Skeate +author-url: https://github.com/skeate +demo: +compatible-v0: +compatible-v1: true +--- + +Display arbitrary GeoJSON on a map with a timeline slider and play button. diff --git a/docs/_plugins/time-elevation/leaflet-timelineslider.md b/docs/_plugins/time-elevation/leaflet-timelineslider.md new file mode 100644 index 00000000000..0f508bb3a38 --- /dev/null +++ b/docs/_plugins/time-elevation/leaflet-timelineslider.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.timelineSlider +category: time-elevation +repo: https://github.com/svitkin/leaflet-timeline-slider/ +author: Sol Vitkin +author-url: https://github.com/svitkin +demo: +compatible-v0: +compatible-v1: true +--- + +Leaflet plugin that creates a customizable timeline slider with user designed functionality. diff --git a/docs/_plugins/time-elevation/leaflet-timeslider.md b/docs/_plugins/time-elevation/leaflet-timeslider.md new file mode 100644 index 00000000000..8709e14ed94 --- /dev/null +++ b/docs/_plugins/time-elevation/leaflet-timeslider.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Time-Slider +category: time-elevation +repo: https://github.com/dwilhelm89/LeafletSlider +author: Dennis Wilhelm +author-url: https://github.com/dwilhelm89 +demo: +compatible-v0: +compatible-v1: true +--- + +The Leaflet Time-Slider enables you to dynamically add and remove Markers on a map by using a JQuery UI slider diff --git a/docs/_plugins/time-elevation/leaflet-topography.md b/docs/_plugins/time-elevation/leaflet-topography.md new file mode 100644 index 00000000000..3be44be3ab7 --- /dev/null +++ b/docs/_plugins/time-elevation/leaflet-topography.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Topography +category: time-elevation +repo: https://github.com/slutske22/leaflet-topography +author: Seth Lutske +author-url: https://github.com/slutske22 +demo: +compatible-v0: +compatible-v1: true +--- + +A set of tools for calculating and visualizing topographic data (elevation, slope, aspect) at lightning speed. Based on Mapbox RGB Encoded DEM tiles. diff --git a/docs/_plugins/time-elevation/leaflet-trackplayback.md b/docs/_plugins/time-elevation/leaflet-trackplayback.md new file mode 100644 index 00000000000..cc1099dbb3e --- /dev/null +++ b/docs/_plugins/time-elevation/leaflet-trackplayback.md @@ -0,0 +1,12 @@ +--- +name: leaflet.TrackPlayBack +category: time-elevation +repo: https://github.com/linghuam/Leaflet.TrackPlayBack +author: linghuam +author-url: https://github.com/linghuam +demo: https://linghuam.github.io/Leaflet.TrackPlayBack/ +compatible-v0: +compatible-v1: true +--- + +A leaflet track-playback plugin, can display and dynamically play tracks. diff --git a/docs/_plugins/time-elevation/leafletplayback.md b/docs/_plugins/time-elevation/leafletplayback.md new file mode 100644 index 00000000000..c0c5ef0f15d --- /dev/null +++ b/docs/_plugins/time-elevation/leafletplayback.md @@ -0,0 +1,12 @@ +--- +name: LeafletPlayback +category: time-elevation +repo: https://github.com/hallahan/LeafletPlayback +author: Nicholas Hallahan +author-url: http://theoutpost.io/ +demo: +compatible-v0: +compatible-v1: true +--- + +Play back time-stamped GPS Tracks synchronized to a clock. diff --git a/docs/_plugins/user-interface/l-credits.md b/docs/_plugins/user-interface/l-credits.md new file mode 100644 index 00000000000..68ae12ad7b1 --- /dev/null +++ b/docs/_plugins/user-interface/l-credits.md @@ -0,0 +1,12 @@ +--- +name: L.Credits +category: user-interface +repo: https://github.com/GreenInfo-Network/Leaflet-Control-Credits +author: Greg Allensworth +author-url: https://github.com/gregallensworth/ +demo: +compatible-v0: +compatible-v1: true +--- + +A simple, attractive, interactive control to put your logo and link in the corner of your map. diff --git a/docs/_plugins/user-interface/l-easybutton.md b/docs/_plugins/user-interface/l-easybutton.md new file mode 100644 index 00000000000..80b2c18a475 --- /dev/null +++ b/docs/_plugins/user-interface/l-easybutton.md @@ -0,0 +1,12 @@ +--- +name: L.EasyButton +category: user-interface +repo: https://github.com/CliffCloud/Leaflet.EasyButton +author: atstp +author-url: https://github.com/atstp +demo: https://cliffcloud.github.io/Leaflet.EasyButton/ +compatible-v0: +compatible-v1: true +--- + +In one line, add a Font Awesome control button with attached click events. diff --git a/docs/_plugins/user-interface/leaflet-bootstrapzoom.md b/docs/_plugins/user-interface/leaflet-bootstrapzoom.md new file mode 100644 index 00000000000..30b10c1c6c7 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-bootstrapzoom.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.BootstrapZoom +category: user-interface +repo: https://github.com/MAD-GooZe/Leaflet.BootstrapZoom +author: Alexey Gusev +author-url: https://github.com/MAD-GooZe +demo: +compatible-v0: +compatible-v1: true +--- + +Overrides default zoom control buttons with Twitter Bootstrap styled ones diff --git a/docs/_plugins/user-interface/leaflet-condensedattribution.md b/docs/_plugins/user-interface/leaflet-condensedattribution.md new file mode 100644 index 00000000000..9d65905d3cc --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-condensedattribution.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.CondensedAttribution +category: user-interface +repo: https://github.com/targomo/Leaflet.CondensedAttribution +author: Targomo GmbH +author-url: https://www.targomo.com/ +demo: +compatible-v0: +compatible-v1: true +--- + +An attribution plugin that makes long attributes visible on hover diff --git a/docs/_plugins/user-interface/leaflet-contextmenu.md b/docs/_plugins/user-interface/leaflet-contextmenu.md new file mode 100644 index 00000000000..0f023db8672 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-contextmenu.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.contextmenu +category: user-interface +repo: https://github.com/aratcliffe/Leaflet.contextmenu +author: Adam Ratcliffe +author-url: https://github.com/aratcliffe/ +demo: +compatible-v0: +compatible-v1: true +--- + +A context menu for Leaflet. diff --git a/docs/_plugins/user-interface/leaflet-control-custom.md b/docs/_plugins/user-interface/leaflet-control-custom.md new file mode 100644 index 00000000000..fc502709b00 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-control-custom.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Control.Custom +category: user-interface +repo: https://github.com/yigityuce/Leaflet.Control.Custom +author: Yiğit Yüce +author-url: https://github.com/yigityuce +demo: https://yigityuce.github.io/Leaflet.Control.Custom/examples/index.html +compatible-v0: +compatible-v1: true +--- + +Fully customizable Leaflet control panel with HTML element. diff --git a/docs/_plugins/user-interface/leaflet-control-resizer.md b/docs/_plugins/user-interface/leaflet-control-resizer.md new file mode 100644 index 00000000000..8cc3ac61c6b --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-control-resizer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Control.Resizer +category: user-interface +repo: https://github.com/jjimenezshaw/Leaflet.Control.Resizer +author: Javier Jimenez Shaw +author-url: https://github.com/jjimenezshaw/ +demo: https://jjimenezshaw.github.io/Leaflet.Control.Resizer/examples/basic.html +compatible-v0: +compatible-v1: true +--- + +Control to resize your map on the right or bottom side. diff --git a/docs/_plugins/user-interface/leaflet-control-select.md b/docs/_plugins/user-interface/leaflet-control-select.md new file mode 100644 index 00000000000..9908382dba4 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-control-select.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Control.Select +category: user-interface +repo: https://github.com/adammertel/Leaflet.Control.Select +author: Adam Mertel +author-url: https://github.com/adammertel +demo: https://adammertel.github.io/Leaflet.Control.Select/ +compatible-v0: +compatible-v1: true +--- + +Customisable menu-style control. diff --git a/docs/_plugins/user-interface/leaflet-coordinatedimagepreview.md b/docs/_plugins/user-interface/leaflet-coordinatedimagepreview.md new file mode 100644 index 00000000000..938b454253b --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-coordinatedimagepreview.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.CoordinatedImagePreview +category: user-interface +repo: https://github.com/utahemre/Leaflet.CoordinatedImagePreview +author: Yunus Emre Özkaya +author-url: https://github.com/utahemre +demo: +compatible-v0: +compatible-v1: true +--- + +Displays coordinated images in map bounds. diff --git a/docs/_plugins/user-interface/leaflet-countryselect.md b/docs/_plugins/user-interface/leaflet-countryselect.md new file mode 100644 index 00000000000..2790799acf8 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-countryselect.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.CountrySelect +category: user-interface +repo: https://github.com/ahalota/Leaflet.CountrySelect/ +author: Anika Halota +author-url: https://github.com/ahalota/ +demo: http://ahalota.github.io/Leaflet.CountrySelect/demo.html +compatible-v0: +compatible-v1: true +--- + +Control with menu of all countries, and an event listener that returns the selected country as a GeoJSON feature. diff --git a/docs/_plugins/user-interface/leaflet-dialog.md b/docs/_plugins/user-interface/leaflet-dialog.md new file mode 100644 index 00000000000..49fba5573b2 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-dialog.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Dialog +category: user-interface +repo: https://github.com/NBTSolutions/Leaflet.Dialog +author: NBT Solutions +author-url: https://github.com/NBTSolutions +demo: http://nbtsolutions.github.io/Leaflet.Dialog/ +compatible-v0: +compatible-v1: true +--- + +A simple resizable, movable, customizable dialog box. diff --git a/docs/_plugins/user-interface/leaflet-geojsonlayerswitcher.md b/docs/_plugins/user-interface/leaflet-geojsonlayerswitcher.md new file mode 100644 index 00000000000..bbe831774ae --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-geojsonlayerswitcher.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.GeojsonLayerSwitcher +category: user-interface +repo: https://github.com/easymountain/Leaflet.GeojsonLayerSwitcher +author: Easy-Mountain +author-url: https://github.com/easymountain +demo: +compatible-v0: +compatible-v1: true +--- + +Allows to navigate between GeoJSON layers, select some, and return selection. diff --git a/docs/_plugins/user-interface/leaflet-htmllegend.md b/docs/_plugins/user-interface/leaflet-htmllegend.md new file mode 100644 index 00000000000..a740215307a --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-htmllegend.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.HtmlLegend +category: user-interface +repo: https://github.com/consbio/Leaflet.HtmlLegend +author: Kaveh Karimi +author-url: https://github.com/ka7eh +demo: https://consbio.github.io/Leaflet.HtmlLegend/ +compatible-v0: +compatible-v1: true +--- + +A simple Leaflet plugin for creating legends using HTML elements. diff --git a/docs/_plugins/user-interface/leaflet-legend.md b/docs/_plugins/user-interface/leaflet-legend.md new file mode 100644 index 00000000000..3fa23d0360a --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-legend.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Legend +category: user-interface +repo: https://github.com/ptma/Leaflet.Legend +author: JJ Jin +author-url: https://github.com/ptma +demo: https://ptma.github.io/Leaflet.Legend/examples/legend.html +compatible-v0: +compatible-v1: true +--- + +Display legend symbols and toggle overlays. diff --git a/docs/_plugins/user-interface/leaflet-messagebox.md b/docs/_plugins/user-interface/leaflet-messagebox.md new file mode 100644 index 00000000000..c698de43749 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-messagebox.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Messagebox +category: user-interface +repo: https://github.com/tinuzz/leaflet-messagebox +author: Martijn Grendelman +author-url: https://github.com/tinuzz/ +demo: https://www.grendelman.net/leaflet/ +compatible-v0: +compatible-v1: true +--- + +Display a temporary text message on a map. diff --git a/docs/_plugins/user-interface/leaflet-notifications.md b/docs/_plugins/user-interface/leaflet-notifications.md new file mode 100644 index 00000000000..99a06b87bc1 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-notifications.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Notifications +category: user-interface +repo: https://gitlab.com/manuel.richter95/leaflet.notifications +author: Manuel Richter +author-url: https://gitlab.com/manuel.richter95 +demo: +compatible-v0: +compatible-v1: true +--- + +Spawn toast notifications inside your map diff --git a/docs/_plugins/user-interface/leaflet-resizablecontrol.md b/docs/_plugins/user-interface/leaflet-resizablecontrol.md new file mode 100644 index 00000000000..7d5dc3cc0d8 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-resizablecontrol.md @@ -0,0 +1,12 @@ +--- +name: Leaflet ResizableControl +category: user-interface +repo: https://github.com/dalbrx/Leaflet.ResizableControl +author: David Albrecht +author-url: https://github.com/dalbrx +demo: http://dalbrx.github.io/Leaflet.ResizableControl/ +compatible-v0: +compatible-v1: true +--- + +A Leaflet plugin to add a resizable and scrollable control to the map. diff --git a/docs/_plugins/user-interface/leaflet-signposts.md b/docs/_plugins/user-interface/leaflet-signposts.md new file mode 100644 index 00000000000..7e8ea7f454e --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-signposts.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Signposts +category: user-interface +repo: https://github.com/williamlow/Leaflet.Signposts +author: William Low +author-url: https://github.com/williamlow +demo: https://williamlow.github.io/leaflet-signpost/demo.html +compatible-v0: +compatible-v1: true +--- + +Guides users to points outside the current map view with directional arrows and a count of points in each given direction. diff --git a/docs/_plugins/user-interface/leaflet-slidemenu.md b/docs/_plugins/user-interface/leaflet-slidemenu.md new file mode 100644 index 00000000000..07c02d4234e --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-slidemenu.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.SlideMenu +category: user-interface +repo: https://github.com/unbam/Leaflet.SlideMenu +author: Masashi Takeshita +author-url: https://github.com/unbam +demo: +compatible-v0: +compatible-v1: true +--- + +A simple slide menu for Leaflet. diff --git a/docs/_plugins/user-interface/leaflet-slider.md b/docs/_plugins/user-interface/leaflet-slider.md new file mode 100644 index 00000000000..8fdb06c91fe --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-slider.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Slider +category: user-interface +repo: https://github.com/Eclipse1979/leaflet-slider +author: EPP +author-url: https://github.com/Eclipse1979 +demo: https://github.com/Eclipse1979/leaflet-slider +compatible-v0: +compatible-v1: true +--- + +Adds a <input type="range"> slider that calls a function every time its input is changed. diff --git a/docs/_plugins/user-interface/leaflet-spin.md b/docs/_plugins/user-interface/leaflet-spin.md new file mode 100644 index 00000000000..5338f4c0a53 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-spin.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.Spin +category: user-interface +repo: https://github.com/makinacorpus/Leaflet.Spin +author: Mathieu Leplatre +author-url: https://github.com/leplatrem +demo: +compatible-v0: +compatible-v1: true +--- + +Shows a nice spinner on the map using Spin.js, for asynchronous data load, like with Leaflet Ajax. diff --git a/docs/_plugins/user-interface/leaflet-tilelegend.md b/docs/_plugins/user-interface/leaflet-tilelegend.md new file mode 100644 index 00000000000..bf68872c1f3 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-tilelegend.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.TileLegend +category: user-interface +repo: https://github.com/yohanboniface/Leaflet.TileLegend +author: Yohan Boniface +author-url: https://yohanboniface.me/ +demo: +compatible-v0: +compatible-v1: true +--- + +Create illustrated and interactive legends for your background layers. diff --git a/docs/_plugins/user-interface/leaflet-toolbar.md b/docs/_plugins/user-interface/leaflet-toolbar.md new file mode 100644 index 00000000000..677414dc6de --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-toolbar.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.toolbar +category: user-interface +repo: https://github.com/Leaflet/Leaflet.toolbar +author: Justin Manley +author-url: https://github.com/manleyjster +demo: https://leaflet.github.io/Leaflet.toolbar/examples/popup.html +compatible-v0: +compatible-v1: true +--- + +Flexible, extensible toolbars for Leaflet maps. diff --git a/docs/_plugins/user-interface/leaflet-weather.md b/docs/_plugins/user-interface/leaflet-weather.md new file mode 100644 index 00000000000..1ccffa099a7 --- /dev/null +++ b/docs/_plugins/user-interface/leaflet-weather.md @@ -0,0 +1,12 @@ +--- +name: Leaflet Weather +category: user-interface +repo: https://github.com/oskosk/Leaflet.Weather +author: Osk +author-url: https://github.com/oskosk +demo: http://oskosk.github.io/Leaflet.Weather/ +compatible-v0: +compatible-v1: true +--- + +A Leaflet plugin for adding a weather widget to the map using OpenWeatherMap API. diff --git a/docs/_plugins/user-interface/leafletblurredlocation.md b/docs/_plugins/user-interface/leafletblurredlocation.md new file mode 100644 index 00000000000..e7fbf68b8b3 --- /dev/null +++ b/docs/_plugins/user-interface/leafletblurredlocation.md @@ -0,0 +1,12 @@ +--- +name: leaflet-blurred-location +category: user-interface +repo: https://github.com/publiclab/leaflet-blurred-location/ +author: Public Lab +author-url: https://github.com/publiclab +demo: https://publiclab.github.io/leaflet-blurred-location/examples/ +compatible-v0: +compatible-v1: true +--- + +A Leaflet-based interface for selecting a "blurred" or low-resolution location, to preserve privacy. diff --git a/docs/_plugins/user-interface/leafletblurredlocationdisplay.md b/docs/_plugins/user-interface/leafletblurredlocationdisplay.md new file mode 100644 index 00000000000..fca91e2108e --- /dev/null +++ b/docs/_plugins/user-interface/leafletblurredlocationdisplay.md @@ -0,0 +1,12 @@ +--- +name: leaflet-blurred-location-display +category: user-interface +repo: https://github.com/publiclab/leaflet-blurred-location-display +author: Public Lab +author-url: https://github.com/publiclab +demo: https://publiclab.github.io/leaflet-blurred-location-display/examples/HumanReadableBlurring.html +compatible-v0: +compatible-v1: true +--- + +Cleverly dispays "blurred" locations using color-coded heatmap and color-coded markers while fetching data from remote API. diff --git a/docs/_plugins/user-interface/leafletcontrolwindow.md b/docs/_plugins/user-interface/leafletcontrolwindow.md new file mode 100644 index 00000000000..982a31a2a70 --- /dev/null +++ b/docs/_plugins/user-interface/leafletcontrolwindow.md @@ -0,0 +1,12 @@ +--- +name: leaflet-control-window +category: user-interface +repo: https://github.com/mapshakers/leaflet-control-window +author: mapshakers +author-url: https://github.com/mapshakers +demo: +compatible-v0: +compatible-v1: true +--- + +Creates modal/modeless, draggable, responsive, customisable window in your map. diff --git a/docs/_plugins/user-interface/leafletsidebar.md b/docs/_plugins/user-interface/leafletsidebar.md new file mode 100644 index 00000000000..61133ff80c1 --- /dev/null +++ b/docs/_plugins/user-interface/leafletsidebar.md @@ -0,0 +1,12 @@ +--- +name: leaflet-sidebar +category: user-interface +repo: https://github.com/turbo87/leaflet-sidebar/ +author: Tobias Bieniek +author-url: https://github.com/turbo87/ +demo: +compatible-v0: +compatible-v1: true +--- + +A responsive sidebar plugin. diff --git a/docs/_plugins/user-interface/leafletsidebarv2.md b/docs/_plugins/user-interface/leafletsidebarv2.md new file mode 100644 index 00000000000..20a2ced0b2b --- /dev/null +++ b/docs/_plugins/user-interface/leafletsidebarv2.md @@ -0,0 +1,12 @@ +--- +name: leaflet-sidebar-v2 +category: user-interface +repo: https://github.com/noerw/leaflet-sidebar-v2 +author: Norwin Roosen +author-url: https://github.com/noerw/ +demo: +compatible-v0: true +compatible-v1: true +--- + +A responsive, tabbed sidebar with HTML & JS API. Compatible with old (0.7) and current leaflet. diff --git a/docs/_plugins/user-interface/sidebarv2.md b/docs/_plugins/user-interface/sidebarv2.md new file mode 100644 index 00000000000..9c5b7013821 --- /dev/null +++ b/docs/_plugins/user-interface/sidebarv2.md @@ -0,0 +1,12 @@ +--- +name: sidebar-v2 +category: user-interface +repo: https://github.com/turbo87/sidebar-v2/ +author: Tobias Bieniek +author-url: https://github.com/turbo87/ +demo: +compatible-v0: +compatible-v1: true +--- + +Another responsive sidebar plugin. This time with tabs! diff --git a/docs/_plugins/vector-tiles/geojsonvt.md b/docs/_plugins/vector-tiles/geojsonvt.md new file mode 100644 index 00000000000..59117df23e7 --- /dev/null +++ b/docs/_plugins/vector-tiles/geojsonvt.md @@ -0,0 +1,12 @@ +--- +name: geojson-vt +category: vector-tiles +repo: https://github.com/mapbox/geojson-vt +author: Mapbox +author-url: https://www.mapbox.com/ +demo: +compatible-v0: +compatible-v1: true +--- + +Efficient library for slicing GeoJSON data into vector tiles on the fly. diff --git a/docs/_plugins/vector-tiles/hoverboard.md b/docs/_plugins/vector-tiles/hoverboard.md new file mode 100644 index 00000000000..806b25a8008 --- /dev/null +++ b/docs/_plugins/vector-tiles/hoverboard.md @@ -0,0 +1,12 @@ +--- +name: Hoverboard +category: vector-tiles +repo: https://github.com/summer4096/hoverboard +author: Tristan Davies +author-url: https://madd.tech/ +demo: https://madd.tech/hoverboard/ +compatible-v0: true +compatible-v1: false +--- + +Render vector tiles on canvas with leaflet (geojson, topojson, and protobuf). Compatible with Leaflet 0.7.x only. diff --git a/docs/_plugins/vector-tiles/leaflet-mapboxvectortile.md b/docs/_plugins/vector-tiles/leaflet-mapboxvectortile.md new file mode 100644 index 00000000000..695f12a2a2b --- /dev/null +++ b/docs/_plugins/vector-tiles/leaflet-mapboxvectortile.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.MapboxVectorTile +category: vector-tiles +repo: https://github.com/SpatialServer/Leaflet.MapboxVectorTile +author: SpatialDev +author-url: https://www.spatialdev.com/ +demo: http://spatialserver.github.io/Leaflet.MapboxVectorTile/examples/confetti.html +compatible-v0: true +compatible-v1: false +--- + +A Leaflet Plugin that renders Mapbox Vector Tiles on canvas. Compatible with Leaflet 0.7.x only. diff --git a/docs/_plugins/vector-tiles/leaflet-vectorgrid.md b/docs/_plugins/vector-tiles/leaflet-vectorgrid.md new file mode 100644 index 00000000000..a1a8a1ad67f --- /dev/null +++ b/docs/_plugins/vector-tiles/leaflet-vectorgrid.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.VectorGrid +category: vector-tiles +repo: https://github.com/Leaflet/Leaflet.VectorGrid +author: Iván Sánchez +author-url: https://github.com/IvanSanchez +demo: https://github.com/Leaflet/Leaflet.VectorGrid#demos +compatible-v0: false +compatible-v1: true +--- + +Display gridded vector data (GeoJSON or TopoJSON sliced with geojson-vt, or protobuf vector tiles) in Leaflet 1.0.0. diff --git a/docs/_plugins/vector-tiles/leaflet-vectortilelayer.md b/docs/_plugins/vector-tiles/leaflet-vectortilelayer.md new file mode 100644 index 00000000000..c51c06a11ad --- /dev/null +++ b/docs/_plugins/vector-tiles/leaflet-vectortilelayer.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.VectorTileLayer +category: vector-tiles +repo: https://gitlab.com/jkuebart/Leaflet.VectorTileLayer/ +author: Joachim Kuebart +author-url: https://gitlab.com/jkuebart/ +demo: +compatible-v0: false +compatible-v1: true +--- + +A Leaflet layer for displaying vector tiles. Very similar to Leaflet.VectorGrid except for styling: a single style can be specified for all layers while VectorGrid requires knowing layer names in advance. For Leaflet 1.0.0. diff --git a/docs/_plugins/vector-tiles/leafletgeojsonvt.md b/docs/_plugins/vector-tiles/leafletgeojsonvt.md new file mode 100644 index 00000000000..1d44ec134fe --- /dev/null +++ b/docs/_plugins/vector-tiles/leafletgeojsonvt.md @@ -0,0 +1,12 @@ +--- +name: leaflet-geojson-vt +category: vector-tiles +repo: https://github.com/iamtekson/leaflet-geojson-vt +author: Tek Kshetri +author-url: https://github.com/iamtekson +demo: +compatible-v0: +compatible-v1: true +--- + +Displaying the vector tiles of GeoJSON data on the fly on leaflet diff --git a/docs/plugins.md b/docs/plugins.md index 6529e745af8..697f87812b3 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -4,7 +4,14 @@ title: Plugins bodyclass: plugins-page --- -## Leaflet Plugins + + +## Leaflet Plugins database While Leaflet is meant to be as lightweight as possible, and focuses on a core set of features, an easy way to extend its functionality is to use third-party plugins. Thanks to the awesome community behind Leaflet, there are literally hundreds of nice plugins to choose from. @@ -80,6 +87,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s +--- ## Tile & image layers @@ -97,776 +105,38 @@ The following plugins allow loading different maps and provide functionality to Ready-to-go basemaps, with little or no configuration at all. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - leaflet-providers - - Contains configurations for various free tile providers — OSM, OpenCycleMap, Stamen, Esri, etc. - - leaflet-extras members -
      - Leaflet.KoreanTmsProviders - - Contains configurations for various (South) Korean tile providers — Daum, Naver, VWorld, etc. - - Seong Choi -
      - Leaflet.ChineseTmsProviders - - Contains configurations for various Chinese tile providers — TianDiTu, MapABC, GaoDe, etc. - - Tao Huang -
      - Esri Leaflet - - A set of tools for using ArcGIS services with Leaflet. Support for map services, feature layers, ArcGIS Online tiles and more. - - Patrick Arlt -
      - Leaflet.GIBS - - NASA EOSDIS GIBS imagery integration. The plugin provides 96 daily updated layers with satellite imagery and science parameters. Demo. - - Alexander Parshin -
      - L.TileLayer.Kartverket - - Provides easy setup of the tile layers from Kartverket (The Norwegian Mapping Authority) - - Kultur og naturreise / Atle Frenvik Sveen -
      - Leaflet.Spain.WMS - - Provides easy setup for several Web Map Services (WMS) layers for Spain (PNOA, IGN base, Catastro, etc), from Spanish mapping agencies. - - Patricio Soriano -
      - PolarMap.js - - JavaScript library for displaying tiles from ArcticWebMap, a free tile provider with OSM data in multiple Arctic polar projections. Includes lower-level API for deeper integration with other Leaflet plugins. - - GeoSensorWeb Lab -
      - Bing Maps Layer - - Add Bing Maps tiles to your Leaflet Map. Requires Leaflet v1.0.0.beta.2 or later. - - Gregor MacLennan -
      - L.TileLayer.HERE - - Displays map tiles from HERE maps (demo). - - Iván Sánchez -
      - L.GridLayer.GoogleMutant - - Displays Google maps (with minimal artifacts thanks to a DOM mutation observer technique) (demo). - - Iván Sánchez -
      - L.MapkitMutant - - Displays Apple's MapkitJS basemaps. - - Iván Sánchez -
      - SuperMap Leaflet - - SuperMap Leaflet is a Leaflet plugins for working with SuperMap service types. - Support for SuperMap services, tiles and more. - - SuperMap -
      - Leaflet.TileLayer.Mierune - - Displays tiles from Mierune map. (Demo) - - Mierune -
      - Leaflet.TileLayer.Swiss - - Displays national maps of Switzerland using map tiles from Swisstopo. - Demo. - - Roman Karavia -
      - Azure Maps Leaflet plugin - - A leafletjs plugin that makes it easy to overlay all the different tile layers available from the Azure Maps. Supports using an Azure Maps subscription key or Azure Active Directory for authentication. - Demos. - - Ricky Brundritt -
      - Leaflet.TileLayer.HERE - - Displays tiles from HERE maps. - - Wanderson Souza -
      - +{% include plugin_category_table.html category="basemap-providers" %} ### Basemap formats Plugins for loading basemaps or GIS raster layers in common (albeit non-default) formats. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - leaflet.TileLayer.WMTS - Add WMTS (IGN) layering for leaflet. - - Alexandre Melard -
      - azgs-leaflet - - A set of small plugins for Leaflet, including WFS-GeoJSON layer with filtering, a hover control for GeoJSON, and an Esri tile layer. - - AZGS -
      - leaflet.wms - - Enhanced WMS support for Leaflet, including single-tile/untiled layers, shared WMS sources, and layer identify via GetFeatureInfo. - - S. Andrew Sheppard
      (HEI Geo) -
      - L.TileLayer.WMTS - - A simple WMTS Tile Layer plugin for Leaflet. - - Alexandru Calin -
      - Leaflet.NonTiledLayer.WCS - - Display raster data from Web Coverage Services. Rasters can be styled and queried in the client. See the demo. - - Stuart Matthews -
      - Leaflet.bpg - - TileLayer with .bpg image format decoding. - - Andrzej Zaborowski -
      - TileLayer.GeoJSON - - A TileLayer for GeoJSON tiles. - - Glen Robertson -
      - leaflet-tilejson - - Adds support for the TileJSON specification to Leaflet. - - Per Liedman, Kartena -
      - cartodb-leaflet - - Official CartoDB plugin for Leaflet. - - Vizzuality -
      - Leaflet-2gis - - Adds support for 2GIS tile layer - - Eugene Mikhalev -
      - Leaflet GeoJSON Encoded - - Extends the L.GeoJSON layer using Google polyline encoding algorithm, allowing an optimized data transfer. - - Geobricks -
      - Leaflet.TileLayer.MBTiles - - Loads .mbtiles tilesets. - - Iván Sánchez -
      - Leaflet.CanvasLayer.Field - - Loads and styles raster files (geotiff & asciigrid formats). - It includes a ScalarField layer (for DTM, temperature...) and - VectorFieldAnim (an animated layer for wind, currents...). See the examples - - Víctor Velarde -
      - leaflet-geotiff - - Display raster data from geoTIFF files as images or direction arrows. Rasters can be styled and queried in the client. An optional clipping mask can be applied, e.g. to restrict DEMs to land areas. See the demo. - - Stuart Matthews -
      - GeoRasterLayer - - Display small and large GeoTIFF files with configurable resolution. Built for simplicity and performance. Integrates with GeoBlaze, a JavaScript raster analysis library. See the demo. - - Daniel J. Dufour -
      - Leaflet.projwmts - - Adding WMTS services (GUGiK Poland). - (demo). - - Geoportal Poland -
      - +{% include plugin_category_table.html category="basemap-formats" %} ### Non-map base layers Sometimes you don't want to load a map, just big custom images. **Really** big ones. - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - TileLayer.Zoomify - - A TileLayer for Zoomify images. - - Bjørn Sandvik -
      - TileLayer.DeepZoom - - A TileLayer for DeepZoom images. - - Al Farisi, - Indokreatif Teknologi -
      - TileLayer.Gigapan - - A TileLayer for Gigapan images. - - Dan Sherman -
      - Leaflet.TileLayer.IIP - Add support for IIPImage layers in Leaflet. - - Emmanuel Bertin -
      - Leaflet-IIIF - - A IIIF (International Image Interoperability Framework) viewer for Leaflet. See the demo. - - Jack Reed -
      - leaflet-fractal - - Renders some fractals (Mandelbrot set, Julia set and some others) using 2D canvas (demo). - - Alexander Parshin -
      - leaflet-rastercoords - - Renders large tiled images generated with - gdal2tiles-leaflet. - Image raster coordinates can be used to set markers, etc. - (demo). - - Commenthol -
      - - +{% include plugin_category_table.html category="non-map-base-layers" %} ### Tile/image display The following plugins change the way that tile or image layers are displayed in the map. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - TileLayer.BoundaryCanvas - - Allows you to draw tile layers with arbitrary polygonal boundary. HTML5 Canvas is used for rendering. - - Alexander Parshin -
      - TileLayer.Grayscale - - A regular TileLayer with grayscale makeover. - - Ilya Zverev -
      - Leaflet.ImageTransform - Add support of image overlays with arbitrary perspective transformation. - - Alexander Parshin, - Sergey Alekseev -
      - Leaflet.OpacityControls - - Simple Leaflet controls to adjust the opacity of a map layer. - - Jared Dominguez -
      - Leaflet.DistortableImage - - Enable users to scale, rotate, and distort images on Leaflet maps. - - Public Lab -
      - Leaflet.DistortableVideo - - Enable users to scale, rotate, and distort videos on Leaflet maps. (demo). - - Roni Karilkar -
      - Leaflet.ImageOverlay.Rotate - - Displays rotated, scaled and skewed (but not rubbersheeted) ImageOverlays, given three control points. (demo). - - Iván Sánchez Ortega -
      - Leaflet.ImageOverlay.Arrugator - - Displays reprojected ImageOverlays, given four control points and a proj4js projection function. (demo). - - Iván Sánchez Ortega -
      - Leaflet.TileLayer.ColorFilter - - A simple and lightweight Leaflet plugin to apply CSS filters on map tiles (demo). - - Cláudio Kawakani -
      - Leaflet.TileLayer.Mask - - A TileLayer with mask effect (demo) - - Yuzo Matsuzawa -
      - Leaflet.TileLayer.PixelFilter - - A TileLayer which can filter and replace pixels by RGB code. -
      - demo 1demo 2 -
      - GreenInfo Network -
      - Leaflet.Control.SideBySide - - A Leaflet control to add a split screen to compare two map overlays (demo). - - Digital Democracy -
      - Leaflet.TileLayer.GL - - Applies custom WebGL shaders to each tile in a tilelayer (demo). - - Iván Sánchez -
      - Leaflet.TileLayer.ColorPicker - - A Leaflet TileLayer with getColor(latLng). Demos: color picker, elevation picker with mapbox terrain-RGB - - Yuzo Matsuzawa -
      - Leaflet.TileLayer.Colorizr - - A Leaflet TileLayer which can modify colors by RGBA code. Demos: coming soon. - - Hinrich Riedel -
      - Leaflet.UTFGrid - - Provides UTF-8 Grid support for Leaflet >= 1.0. Includes basic mouseover support plus ability to highlight feature from UTFGrid on hover (demo). - - Brendan Ward -
      - Leaflet.Control.Opacity - - Make multiple tile layers transparent. (demo) - - Yasunori Kirimoto -
      - Leaflet.TileLayer.GLColorScale - - TileLayer that uses WebGL to colorize floating-point pixels according to a specified color scale (demo). - - David Schneider -
      - Leaflet.Control.DetailLevel - - Display tiles at higher-than-retina (hdpi) resolutions, by real-time modification of the zoomOffset. Useful for mapping sources which drastically change map style between different zoom levels. Increasing the zoomOffset by too much does slow down the browser, as the number of displayed tiles grows exponentially with the zoomOffset. (demo). - - Wessel Valkenburg -
      - Leaflet.Multispectral - - Provides multispectral channel manipulation and processing tools (such as NDVI or other remote sensing methods) for Leaflet image layers using pure client-side JavaScript. It uses `image-sequencer` via an ImageOverlay `filter()` function. (demo). - - Public Lab -
      - Leaflet.TileLayer.GLOperations - - WebGL TileLayer: Colorize floating-point pixels, mouse event handlers for pixel values, hillshading, contours, - transitions, filter and do calculations on multiple layers. - (Demo). - - Thorbjørn Horgen -
      - Leaflet.NonTiledLayers - - A Leaflet layer for non-tiled overlays. - (Demo). - - PTV Logistics -
      - - +{% include plugin_category_table.html category="tile-image-display" %} ### Tile Load The following plugins change the way that tile layers are loaded into the map. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.MultiTileLayer - - Allows to compose a TileLayer from several tile sources. Each source is active only on a defined set of zoomlevels. - - Mattias Bengtsson -
      - Leaflet.FunctionalTileLayer - - Allows you to define tile layer URLs using a function. Even works with asynchronous sources, using promises. - - Ishmael Smyrnow -
      - TileLayer.Cordova - - For use with Cordova/Phonegap, adds tile caching onto local device storage, switching between offline and online mode. - - Greg Allensworth -
      - TileLayer.PouchDBCached - - Allows all Leaflet TileLayers to cache into PouchDB for offline use. - - Iván Sánchez Ortega, - MazeMap -
      - Leaflet.loading - - A simple control that adds a loading indicator as tiles and other data are loaded. - - Eric Brelsford -
      - Leaflet.EdgeBuffer - - Buffer tiles beyond the edge of the viewport, for Leaflet 1.0. Demo. - - Alex Paterson -
      - Leaflet.TileLayer.Fallback - - Replaces missing Tiles (HTTP 404 Not Found Error) by scaled up equivalent Tiles from lower zooms. - - ghybs -
      - Leaflet.FeatureGroup.LoadEvents - - `FeatureGroup` that supports the `"loading"` and `"load"` events (for v0.7.*). - - G. Lathoud, Outdooractive. -
      - Leaflet.GridLayer.FadeOut - - Fades out grid layers and tilelayers when they are removed, making basemap changes smoother (for 1.0.0). Demo. - - Iván Sánchez -
      - leaflet-offline - - Allows the use of offline tiles in a customizable way while falling back to the normal TileLayer when necessary. Demo. - - Roberto Soares -
      - leaflet.offline - - Allow tiles to be stored in an database for offline access. Original plugin.Demo. - - Allart Kooiman -
      - - +{% include plugin_category_table.html category="tile-load" %} ### Vector tiles Plugins to display [vector tiles](https://github.com/mapbox/vector-tile-spec). - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.MapboxVectorTile - - A Leaflet Plugin that renders Mapbox Vector Tiles on canvas. See demo. Compatible with Leaflet 0.7.x only. - - SpatialDev -
      - Hoverboard - - Render vector tiles on canvas with leaflet (geojson, topojson, and protobuf). See demo. Compatible with Leaflet 0.7.x only. - - Tristan Davies -
      - leaflet-geojson-vt - - Displaying the vector tiles of GeoJSON data on the fly on leaflet - - Tek Kshetri -
      - geojson-vt - - Efficient library for slicing GeoJSON data into vector tiles on the fly. - - Mapbox -
      - Leaflet.VectorGrid - - Display gridded vector data (GeoJSON or TopoJSON sliced with geojson-vt, or protobuf vector tiles) in Leaflet 1.0.0. See demos. Not compatible with 0.7.x. - - Iván Sánchez -
      - Leaflet.VectorTileLayer - - A Leaflet layer for displaying vector tiles. Very similar to Leaflet.VectorGrid except for styling: a single style can be specified for all layers while VectorGrid requires knowing layer names in advance. For Leaflet 1.0.0. - - Joachim Kuebart -
      +{% include plugin_category_table.html category="vector-tiles" %} ## Overlay data @@ -882,449 +152,19 @@ The following plugins provide new ways of loading overlay data (GIS vector data) Load your own data from various GIS formats. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - leaflet-kml - - Loads & displays KML - - Windyx -
      - leaflet-omnivore - - Loads & converts CSV, KML, GPX, TopoJSON, WKT formats for Leaflet. - - Mapbox -
      - Leaflet.FileLayer - - Loads files (GeoJSON, GPX, KML) into the map using the HTML5 FileReader API (i.e. locally without server). - - Mathieu Leplatre -
      - Leaflet.geoCSV - - Leaflet plugin for loading a CSV file as geoJSON layer. - - Iván Eixarch -
      - Leaflet.Shapefile - - Put a shapefile onto your map as a layer. - - Calvin Metcalf -
      - Leaflet.FileGDB - - Put an ESRI File GeoDatabase onto your map as a layer. - - Calvin Metcalf -
      - Leaflet.encoded - - Use encoded polylines in Leaflet. - - Jieter -
      - Leaflet GPX - - GPX layer, targeted at sporting activities by providing access to information such as distance, moving time, pace, elevation, heart rate, etc. - - Maxime Petazzoni -
      - Wicket - - A modest library for translating between Well-Known Text (WKT) and Leaflet geometry objects (e.g. between L.marker() instances and "POINT()" strings). - - K. Arthur Endsley -
      - qgis2web - - A QGIS plugin to make webmaps without coding. - - Tom Chadwin -
      - Leaflet-WFST - - WFS client layer with transaction support - - Flexberry -
      - Leaflet-BetterScale - - A new, more GIS-like scalebar with alternating black/white bars. - - Dan Brown -
      - Leaflet-GeoPackage - - Load GeoPackage Tile and Feature Layers. - - Daniel Barela, - NGA -
      - Leaflet-CsvTiles - - Load points from tiled csv files, using the amazing PapaParse library. Demo. - - Gherardo Varando -
      - Leaflet LayerJSON - - Simple way for transform any JSON data source in a Leaflet Layer, load JSON data in layer and minimize remote requests with caching system Demo. - - Stefano Cudini -
      - - +{% include plugin_category_table.html category="overlay-data-formats" %} ### Dynamic/custom data loading Load dynamic data which is updated in the map, or load GIS vector data in non-standard ways. - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet GeoSSE - - Add realtime data to a Leaflet map using server sent events. - - An Tran -
      - Leaflet Realtime - - Put realtime data on a Leaflet map: live tracking GPS units, sensor data or just about anything. - - Per Liedman -
      - Leaflet Ajax - - Add GeoJSON data via ajax or jsonp. - - Calvin Metcalf -
      - Leaflet.Liveupdate - - Periodically ('live') update something on a map (Demo) - - Martijn Grendelman -
      - Leaflet.Pouch - - Use PouchDB to sync CouchDB data to local storage (indexedDB), to just add couchDB data or as just a less confusing implementation of indexedDB. - - Calvin Metcalf -
      - Leaflet.Indoor - - Create indoor maps. - - Christopher Baines -
      - Leaflet uGeoJSON - - Add an auto updating GeoJSON data Layer via ajax post requests. - - Benjamin VADANT -
      - Leaflet.mytrack - Track my way on a map and download it. Demo - - DJ -
      - - - -### Synthetic overlays - -These plugins create useful overlays from scratch, no loading required. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.Graticule - - Draws a grid of latitude and longitude lines. - - Bjørn Sandvik -
      - Leaflet.SimpleGraticule - - Draws a grid lines for L.CRS.Simple coordinate system. - - Andrew Blakey -
      - L.OS.Graticule - - Overlays UK Ordinance Survey (OS) 1km grid squares and labels. - - Jon Shutt -
      - Leaflet.MetricGrid - - A general purpose Metric Grid overlay for Leaflet with ready defined UTM, British and Irish Grids. - - Bill Chadwick -
      - Leaflet.Terminator - Overlay day and night regions on a map. - - Jörg Dietrich -
      - Leaflet.Sun - Get sunset or sunrise at map click. Demo - - DJ -
      - Leaflet.timezones - Overlay timezones on a Leaflet Earth map. Demo - - DJ -
      - leaflet.latlng-graticule - - Create a Canvas as ImageOverlay to draw the Lat/Lon Graticule, and show the grid tick label at the edges of the map.Demo. - - CloudyBay -
      - Leaflet.EdgeScaleBar - - Creates scale bars along top and right edge of a map in the Web Mercator projection..Demo. - - Dražen Tutić, Ana Kuveždić Divjak -
      - Leaflet.Maidenhead - - An implementation of the Maidenhead Locator System grid ((demo)). - - Iván Sánchez Ortega -
      - Leaflet.AutoGraticule - - Draws a grid of latitude and longitude lines, automatically adjusting the scale to the current zoom level. Demo - - Candid Dauth -
      - - +{% include plugin_category_table.html category="dynamic-custom-data-loading" %} ### Data providers Load overlay data from third-party-services. See also [basemap providers](#basemap-providers) and [plugin collections](#collections). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet Vector Layers - - Allows to easily create vector layers from a number of geo web services, such as ArcGIS Server, Arc2Earth, GeoIQ, CartoDB and GIS Cloud. - - Jason Sanford -
      - Leaflet Overpass Layer - - Easily include data from the overpass api. - - Guillaume AMAT -
      - Leaflet.dbpediaLayer - - A layer with Points of interest from Wikipedia - loaded via ajax from DBpedia's SPARQL endpoint. - - Kr1 -
      - Leaflet-Wikipedia - - A leaflet plugin to display Wikipedia API entries on a map layer. - - Matthew Barker -
      - Windy-Leaflet-plugin - - Displays animated weather map on your page using Windy's free API. - - Windy.com -
      - Leaflet.GeographPhotos - - Display Geographical-Photos from Geograph Britain and Ireland in an interactive overlay, using their API. - - Barry Hunter -
      - leaflet-radar - - Animated satellite weather radar overlays for Leaflet. - - rwev -
      - leaflet-environmental-layers - - - Collection of different environmental map layers in an easy to use Leaflet library Demo. - - Public Lab -
      - Leaflet.Rainviewer - - - Plugin for RainViewer radar data API Demo. - - Marcin Wasilewski -
      - Leaflet.FreieTonne - - An overlay with nautical features from FreieTonne. (Demo) - - Candid Dauth -
      - +{% include plugin_category_table.html category="data-providers" %} ## Overlay display @@ -1342,1174 +182,31 @@ The following plugins provide new ways of displaying overlay data information. These plugins provide new markers or news ways of converting abstract data into images in your screen. Leaflet users versed in GIS also know these as symbolizers. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - leaflet-place-groups-picker - - Plugin for the Leaflet maps that allows grouping places in groups whose visibility can be toggled. - - damianc -
      - Leaflet.RoughCanvas - - Leaflet.RoughCanvas renders hand-drawn, sketch style vector map (polyline, polygon, geojson). - - haoming -
      - Leaflet.ellipse - - Leaflet.ellipse place ellipses on map by specifying center point, semi-major axis, - semi-minor axis, and tilt degrees from west. - - JD Fergason -
      - Leaflet.label - - Adds text labels to map markers and vector layers. - - Jacob Toye -
      - Leaflet-semicircle - - Adds functionality to L.Circle to draw semicircles. - - Jieter -
      - Leaflet.PolylineDecorator - - Allows you to draw patterns (like dashes, arrows or evenly spaced Markers) along Polylines or coordinate paths. - - Benjamin Becquet -
      - Leaflet-arrowheads - - Allows user to quickly draw arrowheads on polylines for vector visualization. - - Slutske22 -
      - Leaflet.Sprite - - Use sprite based icons in your markers. - - Calvin Metcalf -
      - Leaflet.TextPath - - Allows you to draw text along Polylines. - - Mathieu Leplatre -
      - Leaflet-SVGIcon - - A simple and customizable SVG icon with no external dependencies. Also included is a convenience Marker class and two example subclasses. Customizable demo with example subclasses - - Ilya Atkin -
      - Leaflet.BeautifyMarkers - - Lightweight plugin that adds colorful iconic markers without image and gives full control of style to end user (i.e. Unlimited colors and CSS styling). - - Muhammad Arslan Sajid -
      - Leaflet.Awesome-Markers - - Colorful, iconic & retina-proof markers based on the Font Awesome icons/Twitter Bootstrap icons - - Lennard Voogdt -
      - Leaflet.Extra-Markers - - Shameless copy of Awesome-Markers with more shapes, colors and semantic-ui support - - Cory Silva -
      - Leaflet.MakiMarkers - Create markers using Maki Icons from MapBox. - - James Seppi -
      - Leaflet.Icon.Glyph - - Use icon font glyphs in your markers (from Font Awesome, Material Design Icons, Glyphicons, - Metro UI icons, Elusive, and other icon fonts). (demo) - - Iván Sánchez Ortega -
      - Leaflet.LineExtremities - - Show symbols at the extremities of polylines, using SVG markers. - - Frédéric Bonifas -
      - Leaflet.VectorMarkers - - Vector SVG markers for Leaflet, with an option for Font Awesome/Twitter Bootstrap icons. - - Mathias Schneider -
      - Leaflet.SvgShapeMarkers - - Adds support for additional SVG marker types such as triangles, diamonds and squares. - - Rowan Winsemius -
      - Leaflet.pattern - - Add support for pattern fills on Paths. - - Tyler Eastman -
      - Leaflet.BoatMarker - - A boat marker using HTML Canvas for displaying yachts and sailboats with heading and optional wind information. Demo. - - Thomas Brüggemann -
      - leaflet-usermarker - - Plugin for plotting a marker representing a user - or multiple users - on a map, - with support for drawing an accuracy circle. Can be seen in action on - Longitude.me. - - Jonatan Heyman -
      - Leaflet.geojsonCSS - - Geojson CSS implementation for Leaflet. - - Alexander Burtsev -
      - leaflet-simplestyle - - Extends L.geoJSON to support the simple style spec. - - Rowan Winsemius -
      - OSM Buildings - - Amazing JS library for visualizing 3D OSM building geometry on top of Leaflet. - - Jan Marsch -
      - Leaflet.EdgeMarker - - Plugin to indicate the existence of Features outside of the current view. - - Gerald Pape -
      - Leaflet.orientedMarker - - Allows to manage orientation of markers dynamically. - - Gismartwaredev -
      - leaflet-icon-pulse - - Renders pulsing icon using CSS3. It can be used for location marker. - - mapshakers/ - Filip Zavadil -
      - leaflet-mapkey-icon - - Set of cartographic font icons based on mapkeyicons. - - mapshakers/ - Filip Zavadil -
      - Leaflet.Photo - - Plugin to show geotagged photos on a Leaflet map. Demo. - - Bjørn Sandvik -
      - Leaflet.curve - - A Leaflet plugin for drawing Bézier curves and other complex shapes. Demo. - - elfalem -
      - Leaflet.bezier - - Draws a Bézier line between two points with an animated flight object. - - Supun Praneeth -
      - Leaflet.Arc - - This plugin adds L.Polyline.Arc function which wraps arc.js functionality for creation of Great Cirlce arcs. - - Alexey Gusev -
      - leaflet-choropleth - - Extends L.geoJson to add a choropleth visualization (color scale based on value). Demo. - - Tim Wisniewski -
      - Leaflet.Canvas-Markers - - Displays markers on canvas instead of DOM. - - Evgeniy Voynov -
      - leaflet-tracksymbol - - This marker provides a tracksymbol with orientation, velocity-vector and configurable shape. - - Tim Leerhoff -
      - leaflet-ais-tracksymbol - - AIS Extension for leaflet-tracksymbol It displays AIS Contacts on the Map. - - Johannes Rudolph -
      - leaflet-ais-tracksymbol-search - - Adds a Search Box for your Leaflet Map and Your [leaflet-ais-trackymbol](https://github.com/PowerPan/leaflet-ais-tracksymbol) - - Johannes Rudolph -
      - leaflet.TravelNotes - - Editable markers and routing engine for leaflet. The routing engine have plugins for Mapbox, GraphHopper and OSRM and can be used for car, bike or pedestrian route. Demo. - - Christian Guyette -
      - Leaflet.Marker.Stack - - A pure Leaflet implementation of CartoDB's "stacked chips" symbolizer. Demo. - - Iván Sánchez -
      - leaflet-polygon.fillPattern - - Extend the Polygon Object to fill SVG Path element with an image pattern.Demo. - - CloudyBay -
      - Leaflet Polyline Offset - - Adds to L.Polyline the ability to be shifted with a relative pixel offset, without modifying its actual LatLngs. The offset value can be either negative or positive, for left- or right-side offset, and remains constant across zoom levels (basic demo). - - Benjamin Becquet -
      - leaflet-labeled-circle - - Special type of SVG marker with a label inside and draggable around the anchor point (demo). - - Alexander Milevski -
      - Leaflet.ParallaxMarker - - Add markers that moves with a parallax-effect relative to the map when panning (demos / examples). - - Dag Jomar Mersland -
      - leaflet-distance-markers - - Allows displaying markers along a route (L.Polyline) at equivalent distances (eg. one per mile) (demo). - - Doroszlai, Attila -
      - leaflet-corridor - - Renders a polyline with width fixed in meters, not in pixels; adjusts width depending on zoom level (demo). - - Mikhail Shilkov -
      - Leaflet.LabelTextCollision - - Displays labels on paths (polylines, polygons, circles) avoiding label collision. (demo). - - Kenta Hakoishi -
      - Leaflet.streetlabels - - A Leaflet plugin to show labels following the paths of polylines. An extension of yakitoritabetai Leaflet.LabelTextCollision (demo). - - Triede TI -
      - Leaflet.Viewpoint - - Displays circleMarker with multiple directions. - Useful to show photos taken from one point. (demo). - - Grigory Golikov -
      - Leaflet.magicMarker - - Adding magical animation effect to a marker while loading.(Demo). - - Sylvenas -
      - Leaflet.Marker.Highlight - - Adding highlight performance for L.marker.(Demo). - - Brandon Xiang -
      - Leaflet.GeotagPhoto - - Plugin for photo geotagging, with two modes: camera and crosshair (Demo). - - Bert Spaan -
      - Leaflet.GLMarkers - - Display thousands of markers with custom WebGL shaders, optionally animated. (demo) - - Iván Sánchez Ortega -
      - Leaflet.River - - Draw lines with different width (like rivers) on a map. - Useful when you want to show how rivers 'flow' on the map (demo). - - Grigory Golikov -
      - Leaflet.SpeechBubble - - Popup a speech bubble with the arrow that follow points, layer, markers ... - (demo). - - Sylvain BRISSY -
      - Leaflet Swoopy - - A plugin for creating customizable swoopy arrow annotations. - - webkid -
      - leaflet-polycolor - - Color each polyline segment. (demo) - - Olivier Gasc -
      - leaflet-marker-direction - - display the path and the direction of the marker. (demo) - - Jack Zou -
      - Leaflet Rotated Marker - - Enables rotation of marker icons in Leaflet. (Demo) - - Benjamin Becquet -
      - Leaflet Truesize - - A plugin for creating projection aware draggable polygons and polylines. - - webkid -
      - Leaflet.RepeatedMarkers - - Displays markers when wrapping around the globe, once every 360 degrees of longitude (demo). - - Iván Sánchez -
      - Leaflet.Geodesic - - Draw geodesic lines and circles. A geodesic line is the shortest path between two given points on the earth surface. It uses Vincenty's formulae for highest precision and distance calculation. Written in Typescript and available via CDN. Demo - - Henry Thasler -
      - Leaflet.greatCircle - - A wrapper class for the Leaflet.js Polygon object that draws true "great circles" (showing true geodesic, spherical paths) that wrap around the Earth (demo). - - Alex Wellerstein -
      - Leaflet.CustomLayer - - A Leaflet plugin L.CustomLayer - fully custom Layer. - - Derek Li -
      - Leaflet.ArrowCircle - - A Marker extension to display circles with directional arrows. - - R.A. Porter -
      - leaflet-layervisibility - - Extends L.Layer and L.LayerGroup with methods to hide/show layers without removing/re-adding them. - - Philipp Loose -
      - Leaflet.CenterMarker - - Marker that is kept fixed to the center of the map when the map is panned by dragging. - Can be seen in action on What is my adress? - - Jonatan Heyman -
      - L.Donut - - Extension of L.Circle which allows to define a outer and inner radius. Demo - - Falke-Design -
      - Leaflet.HighlightableLayers - - Highlight Leaflet lines and polygons by adding a border and raising them above others. Add a transparent border to increase the tolerance for mouse/touch interactions. Demo - - Candid Dauth -
      - - +{% include plugin_category_table.html category="markers-renderers" %} ### Overlay animations These plugins animate markers or some geometries. See also [geometries with time or elevation](#geometryinteraction-time). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.AnimatedMarker - - Animate a marker along a polyline. - - Aaron Ogle -
      - Leaflet.BounceMarker - - Make a marker bounce when you add it to a map. - - Maxime Hadjinlian -
      - Leaflet.SmoothMarkerBouncing - - Smooth animation of marker bouncing for Leaflet. - - Alexei KLENIN -
      - Leaflet.MovingMarker - - Allow to move markers along a polyline with custom durations. - - Ewoken -
      - Leaflet.TransitionedIcon - - Transition in/out markers with CSS3 transitions. It supports jitter - for staggering markers into view to prevent visual overload. See the demo. - - Brian Reavis -
      - Leaflet.Polyline.SnakeAnim - - Animates (poly)lines into existence, as if they were being slowly drawn from start to end. - - Iván Sánchez Ortega, - MazeMap -
      - Leaflet.Path.DashFlow - - Animates the dashArray of lines and circles, creating a basic flow effect. (Demo. - - Iván Sánchez Ortega -
      - Leaflet.AntPath - - Leaflet.AntPath put a flux animation (like ants walking) into a Polyline. - (demo) - - Rubens Pinheiro -
      - Leaflet.Marker.SlideTo - - Smoothly move (slide) markers to a new location. (demo) - - Iván Sánchez Ortega, - MazeMap -
      - leaflet.motion - - Adds simple motion to your polyline with marker in a head on line (demo) - - Igor Vladyka, -
      - Leaflet.Rain - - Customizable WebGL rain animation for Leaflet. Useful for weather maps. (demo) - - Grigory Golikov -
      - Leaflet.Snow - - Customizable WebGL snow animation for Leaflet. Useful for weather maps. (demo) - - Grigory Golikov -
      - leaflet-point-animator - - Animate a large number of GeoJSON points. (demo) - - danwild, onaci -
      - leaflet-temporal-geojson - - Flexible animation of GeoJSON features. (demo) - - danwild, onaci -
      - - +{% include plugin_category_table.html category="overlay-animations" %} ### Clustering/Decluttering When you are displaying a lot of data, these plugins will make your map look cleaner. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.markercluster - - Beautiful, sophisticated, high performance marker clustering solution with smooth animations and lots of great features. Recommended! - - Dave Leaver -
      - Leaflet.LayerGroup.Collision - - Provides collision detection for groups of markers. Unlike clustering, this takes into account the shape & size of the markers. - - Iván Sánchez Ortega, - MazeMap -
      - Overlapping Marker Spiderfier - - Deals with overlapping markers in a Google Earth-inspired way by gracefully springing them apart on click. - - George MacKerron -
      - PruneCluster - - Fast and realtime marker clustering library. - - Antoine Pultier -
      - Leaflet.Deflate - - Deflates lines and polygons to a marker when their screen size becomes too small in lower zoom levels. - - Oliver Roick -
      - Leaflet.GridCluster - - Create grid-based clusters in realtime. - - Andreas Kiefer -
      - q-cluster - - Quick point clustering library with D3 categorization. - - Nicholas Hallahan -
      - Leaflet.ConditionalLayer - - A FeatureGroup that does not show any more than a certain amount of markers visible in the viewport. (Demo) - - EPP -
      - Leaflet.FeatureGroup.SubGroup - - A simple plugin to create Feature Groups that add their child layers into a parent group. Typical usage is to switch them through L.Control.Layers to dynamically add/remove groups of markers from Leaflet.markercluster. Demo. - - ghybs -
      - leaflet-tooltip-layout - - A plugin to avoid tooltips overlapping and make it easier to find out the relationship between each tooltip and marker. Demo. - - Zijing Peng -
      +{% include plugin_category_table.html category="clustering-decluttering" %} ### Heatmaps These plugins create heatmaps and heatmap-like visualizations from vector data. - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - MaskCanvas - - Canvas layer that can be used to visualize coverage. - - Dominik Moritz -
      - HeatCanvas - - Simple heatmap api based on HTML5 canvas. - - Sun Ning -
      - heatmap.js - - JavaScript Library for HTML5 canvas based heatmaps. - - Its Leaflet layer implementation supports large datasets because it is tile based and uses a quadtree index to store the data. - - Patrick Wied -
      - Leaflet divHeatmap - - Lightweight and versatile heatmap layer based on CSS3 and divIcons - - - Daniele Piccone -
      - WebGL Heatmap - - High performance Javascript heatmap plugin using WebGL. - - - Benjamin J DeLong -
      - Leaflet.heat - - A tiny, simple and fast Leaflet heatmap plugin. Uses simpleheat under the hood, additionally clustering points into a grid for performance. (Demo) - - - Vladimir Agafonkin -
      - Leaflet-Solr-Heatmap - - A Leaflet plugin for rendering heatmaps and clusters from Solr's Heatmap Faceting. High performance for millions of points or polygons. - - Jack Reed / - Steve McDonald -
      - +{% include plugin_category_table.html category="heatmaps" %} ### DataViz Powerful multi-purpose libraries for data visualization. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - geogrid.js - - Displays data aggregated by the ISEA3H discrete global grid system. The data can, e.g., be delivered by using Measures REST (a framework to deliver data aggregated by the grid) or geogrid (a library for handling the grid in case that you want to aggregate data manually). - - F.-B. Mocnik,
      GIScience Research Group,
      Heidelberg University
      -
      - RaphaelLayer - - Allows you to use Raphael as a layer on a Leaflet map for advanced animations and visualizations. - - Dynamic Methods -
      - Leaflet Data Visualization Framework - - New markers, layers, and utility classes for easy thematic mapping and data visualization. - - Scott Fairgrieve -
      - Leaflet.D3SvgOverlay - - SVG overlay class for using with D3 library. Supports zoom animation and scaling without need to redraw the layer. - - Kirill Zhuravlev -
      - mapbox-gl-leaflet - - Binding from Mapbox GL JS to the Leaflet API - - Tom MacWright -
      - leaflet-echarts - - A plugin for Leaflet to load echarts map and make big data visualization easier. - - wandergis -
      - jquery-storymap - - A jQuery plugin to display several map locations as the user scrolls through paragraphs. - - Atle Frenvik Sveen -
      - Leaflet for R - - Allows using Leaflet from within R programs, a programming language popular for statistical analysis and data mining. - - RStudio team -
      - leaflet.migrationLayer - - leaflet.migrationLayer is used to show migration data such as population, flight, vehicle, traffic and so on. Data visualization on map.demo - - Sylvenas -
      - Leaflet.Quadtree - - Leaflet.Quadtree is used to retrieve visible data inside given bounds - - ibesora -
      - Leaflet.Canvas-Flowmap-Layer - - A LeafletJS custom map layer for mapping the flow of objects, ideas, people, etc. with Bezier curves rendered on the HTML canvas. - - Jacob Wasilkowski, - Sarah Bell -
      - Leaflet.PixiOverlay - - A Leaflet overlay class for drawing and animating with Pixi.js. (demo) - - Manuel Baclet -
      - leaflet-velocity - - Visualise velocity layers with leaflet. - Demo here. - - Dan Wild -
      - leaflet-partition - - Divide the area into parts in different ways such as voronoi(triangulation) and hexagonal tiling. - Basic demo - - locknono -
      - Leaflet.glify - - Fast rendering for large (+100MB) GeoJSON datasets with WebGL - Demo - - robertleeplummerjr -
      - Leaflet.glify.layer - - Add-on for the Leaflet.glify plugin to provide more leaflet-idiomatic bindings. Provides fast webgl rendering for GeoJSON FeatureCollections (currently limited to polygons, lines and points). - Demo - - onaci -
      - +{% include plugin_category_table.html category="dataviz" %} ## Interaction with geometries/features @@ -2525,584 +222,25 @@ The following plugins enable users to interact with overlay data: edit geometrie Allows users to create, draw, edit and/or delete points, lines and polygons. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet-Geoman - - Geometry Management for Leaflet 1.0 and higher. Draw, Edit, Cut, Drag and Snap Layers like Markers, Circles, Rectangles, Polylines, Polygons, LayerGroups, geoJSON, MultiPolygons, MultiLineStrings. Supports holes in polygons, snapping, canvas mode and more. (Demo) - - Sumit Kumar -
      - Leaflet.FreeDraw - - Zoopla inspired freehand polygon creation using Leaflet.js and D3. - - Wildhoney -
      - Leaflet.plotter - - leaflet-plotter allows you to create routes using a leaflet powered map. You can click on the mid-points to create a new, draggable point. - - Nathan Mahdavi -
      - Leaflet.Editable.Polyline - Editable polylines: move existing points, add new points and split polylines. - - Tomo Krajina -
      - Leaflet.draw - - Enables drawing features like polylines, polygons, rectangles, circles and markers through a very nice user-friendly interface with icons and hints. Recommended! - - Jacob Toye -
      - Leaflet.EditableHandlers - - A set of plugins that includes circle editing, measuring tool, and label for polygon sides. - - Kartena -
      - Leaflet.StyleEditor - - Enables editing the styles of features (lines, polygons, etc) and markers with a GUI. - - Dennis Wilhelm -
      - Leaflet.SimpleMarkers - - A light-weight Leaflet plugin for adding and deleting markers. - - Jared Dominguez -
      - Leaflet.Editable - - Lightweight fully customisable and controllable drawing/editing plugin. - - Yohan Boniface -
      - Leaflet.Path.Drag - - Drag handler and interaction for polygons and polylines (Demo) - - Alexander Milevski -
      - Leaflet.Path.Transform - - Scale & rotate handler and interaction for polygons and polylines (Demo) - - Alexander Milevski -
      - Leaflet.Snap - - Enables snapping of draggable markers to polylines and other layers. - - Mathieu Leplatre -
      - Leaflet.Clipper - - Allows Union, Difference, Xor, and Intersection operations on two polygons. (Demo) - - will Farrell -
      - Leaflet.MapPaint - - Bitmap painting plugin designed for touch devices. - - Antoine Pultier -
      - Leaflet.Storage - - Create/update/delete Map, Marker, Polygon, Polyline... and expose them for backend storage with an API. - - Yohan Boniface -
      - Leaflet.Pather - - L.Pather is a freehand polyline creator that simplifies the polyline for mutability. Requires D3 support. - - Wildhoney -
      - Leaflet.Illustrate - - Extension for Leaflet.draw enabling users to type annotations directly on maps. - - Justin Manley -
      - Leaflet.Pin - - Enable attaching of markers to other layers during draw or edit features with Leaflet.Draw. - - Konrad Klimczak -
      - L.Control.PaintPolygon - - Draw yours polygons with a circle brush like Paint[brush]. Includes turf.js dependencies. - - Thibault Coupin -
      - Leaflet-Craft - - Extends Leaflet.FreeDraw and gives extended features like Undo-Redo, deleting markers,dynamic area calculation of polygons ,various hooks/events and in-build control bars, etc. - - Sagarpreet Chadha -
      - Leaflet.SegmentEdit - - An extension to Leaflet.draw to allow editing large polylines one chunk at the time. - - Lemaf -
      - Leaflet.DraggableLines - - Add/move/remove points on routes, lines and polygons by drag&drop. Demo - - Candid Dauth -
      - +{% include plugin_category_table.html category="edit-geometries" %} ### Time & elevation Most data is two-dimensional (latitude and longitude), but some data has more dimensions (altitude and/or time). The following plugins help users navigate these extra dimensions. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet Topography - - A set of tools for calculating and visualizing topographic data (elevation, slope, aspect) at lightning speed. Based on Mapbox RGB Encoded DEM tiles. - - Seth Lutske -
      - Leaflet.timelineSlider - - Leaflet plugin that creates a customizable timeline slider with user designed functionality. Original implementation of timeline at https://codepen.io/trevanhetzel/pen/rOVrGK. - - Sol Vitkin -
      - Leaflet.TimeDimension - - Add time dimension capabilities on a Leaflet map. Demos - - ICTS SOCIB -
      - Leaflet Time-Slider - - The Leaflet Time-Slider enables you to dynamically add and remove Markers on a map by using a JQuery UI slider - - Dennis Wilhelm -
      - LeafletPlayback - - Play back time-stamped GPS Tracks synchronized to a clock. - - Nicholas Hallahan -
      - Leaflet.timeline - - Display arbitrary GeoJSON on a map with a timeline slider and play button. - - Jonathan Skeate -
      - Leaflet.Elevation - - A Leaflet plugin to view interactive height profiles of GeoJSON lines using d3. - - Felix Bache -
      - Leaflet.Heightgraph - - Inspired by Leaflet.Elevation this Leaflet plugin allows you to view interactive height profiles stored as GeoJSON featuring the handy ability to visualize arbitrary segments (e.g. surface types or steepness categories) with customized colors stored as properties within the GeoJSON itself. - - Robin Boldt -
      - Leaflet.hotline - - A Leaflet plugin for drawing gradients along polylines. - - iosphere -
      - leaflet.TrackPlayBack - - A leaflet track-playback plugin, can display and dynamically play tracks. Demo. - - linghuam -
      - Leaflet Timeline Control - - Unopinionated timeline control that helps you display time series data. Demo. - - Michal Zimmermann -
      - - - +{% include plugin_category_table.html category="time-elevation" %} ### Search & popups Plugins that search for overlays and enhance how to display information about them. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - leaflet-fusesearch - - A control that provides a panel to search features in a GeoJSON layer using the lightweight fuzzy search Fuse.js - - Antoine Riche -
      - Leaflet Search - - A control for search Markers/Features location by custom property in LayerGroup/GeoJSON. Support AJAX/JSONP, Autocompletion and 3rd party service - - Stefano Cudini -
      - leaflet-custom-searchbox - - A google map style search box which includes a side panel slider control. - - A.D -
      - Leaflet.AnimatedSearchBox - - A simple Leaflet plugin that provides a collapsible search box. - - Luka Steinbach -
      - Leaflet.Rrose - - A Leaflet Plugin for Edge Cases. For use when you want popups on mouseover, not click, and - you need popup tips to reorient as you get close to the edges of your map. - - Eric Theise -
      - Leaflet.utfgrid - - Provides a utfgrid interaction handler for leaflet a very small footprint. - - Dave Leaver -
      - Leaflet.RevealOSM - - Very simple but extendable Leaflet plugin to display OSM POIs data on map click. - - Yohan Boniface -
      - Leaflet Underneath - - Find interesting features near a location using Mapbox Vector Tiles data, to add - interactive functionality to a tile layer with speed and limited bandwidth. - - Per Liedman -
      - Leaflet.GeoJSONAutocomplete - - Leaflet Autocomplete For Remote Searching with GeoJSON Services. - - Yunus Emre Özkaya -
      - L.tagFilterButton - - LeafLet marker filtering by tags - - Mehmet Aydemir -
      - Leaflet-gplaces-autocomplete - - Add google places search into map - - Michal Haták -
      - leaflet-responsive-popup - - Removes the need to move the map to be able to see the content of the popup. - - YaFred -
      - leaflet-popup-modifier - - Allows user to edit the contents of a popup, or use the popup to remove its source marker. - - Slutske22 -
      - - +{% include plugin_category_table.html category="search-popups" %} ### Area/overlay selection These plugins help users select either overlays or areas in the map. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.AreaSelect - - A fixed positioned, resizable rectangle for selecting an area on the map. - - Jonatan Heyman -
      - leaflet-locationfilter - - A draggable/resizable rectangle for selecting an area on the map. - - Robert Kajic -
      - L.Control.LineStringSelect - - Fast LineString(polyline) partial selection tool: select a stretch between two points in a complex path. Demo - - Alexander Milevski -
      - Leaflet.FeatureSelect - Use a configurable centerpoint marker to select any geometry type from a GeoJSON layer. - - Aaron Ogle -
      - Leaflet GeoJSON Selector - - Leaflet Control for selection from GeoJSON feature in an interactive list and map (Demo). - - Stefano Cudini -
      - Leaflet.CheapLayerAt - - Allows querying which layer is under a screen coordinate (Demo). - - Iván Sánchez Ortega, - MazeMap -
      - Leaflet.SelectAreaFeature - - Selecting feature layers on a map by drawing an area. - - Sandro Pibia -
      - Leaflet-Shades - - A draggable and resizable rectangle for selecting an area on a map and creating a gray overlay in unselected areas (Demo) - - Mandy Kong -
      - leaflet-lasso - - Lasso selection plugin (Demo) - - Jan Zak -
      - Leaflet-Select-Polygons - - Leaflet-Select-Polygons allows the selection of several polygons and also adjusts the base map view (demo) - - Erick S Escalante Olano -
      - @bopen/leaflet-area-selection - - leaflet-area-selection allows to easily select a polygonal area on the map (see the demo) - - B-Open -
      - +{% include plugin_category_table.html category="area-overlay-selection" %} ## Map interaction @@ -3125,1230 +263,56 @@ New ways to interact with the map itself. The following plugins enhance or extend `L.Control.Layers`. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.AutoLayers - - Automatically pull layers from multiple mapservers and organize/search them with user controlled overlay zIndex management. - - Alex Ebadirad -
      - Leaflet.SelectLayers - - a Leaflet plugin which adds new control to switch between different layers on the map. New control replaces L.Control.Layers radio button panel with select tag. - - vogdb -
      - Leaflet.StyledLayerControl - - A Leaflet plugin that implements the management and control of layers by organization into categories or groups. - - Davi Custodio -
      - Leaflet.GroupedLayerControl - - Leaflet layer control with support for grouping overlays together. - - Ishmael Smyrnow -
      - Leaflet Control Order Layers - - Adds the ability to change overlay order in the layers control. - - Michael Salgado -
      - Leaflet Categorized Layers - - Leaflet Control Layers extended for groups of categorized layers - - Robbie Trencheny -
      - Leaflet Panel Layers - - Leaflet Control Layers extended for group of layers and icons legend - - Stefano Cudini -
      - Leaflet.UniformControl - - Leaflet layer control with stylable checkboxes and radio buttons. - - Chris Calip -
      - Leaflet-IconLayers - - Leaflet control that displays base layers as small icons (demo). - - Alexander Zverev -
      - Leaflet.LayerTreePlugin - - Leaflet control allows to switch layers on and off, display them in a tree-like way (demo). - - Alexander Arakelyan -
      - Leaflet.Basemaps - - A basemap chooser with a preview image from the tile stack. - Example - - Brendan Ward -
      - Leaflet.Control.Layers.Tree - - L.Control.Layers extension that supports a Tree structure, both for base and overlay layers. Simple and highly configurable. See demos - - Javier Jimenez Shaw -
      - Leaflet.ActiveLayers - - Adds new L.Control.ActiveLayers with functionality to get currently active layers on the map. - - vogdb -
      - Leaflet.Control.Appearance - - Extend of Control.Layers, can control Appearances of Layers - color, opacity and able to remove a overlay layer. Example - - Kanahiro Iguchi -
      +{% include plugin_category_table.html category="layer-switching-controls" %} ### Interactive pan/zoom Change the way the user can interactively move around the map. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.Pancontrol - - A simple panning control. - - Kartena -
      - Leaflet.BoxZoom - - A visible, clickable control to perform a box zoom. - - Greg Allensworth -
      - L.Control.ZoomBar - - An extended version of Leaflet's native Zoom control with Home and Zoom-to-Area buttons. Demo - - Elijah Robison -
      - Leaflet.zoomslider - - A zoom slider control. - - Kartena -
      - Leaflet.zoominfo - - A zoom control which displays the current zoom level. - - Flávio Carmo -
      - Leaflet.BorderPan - - A Leaflet plugin to pan by clicking on map borders. - - Sebastián Lara -
      - Leaflet GameController - - Interaction handler providing support for gamepads. - - Antoine Pultier -
      - Leaflet.twofingerZoom - - Interaction handler for touch devices enabling zooming out with a two finger tap. - - Adam Ratcliffe -
      - Leaflet.ZoomBox - - A lightweight zoom box control: draw a box around the area you want to zoom to. Demo - - Brendan Ward -
      - Leaflet LimitZoom - - Plugins to limit available zoom levels to a given list, either by - restricting zooming or by interpolating tiles. - - Ilya Zverev -
      - Leaflet.DoubleRightClickZoom - - Interaction handler enabling zooming out with double right click. - - Mike O'Toole -
      - Leaflet.ZoomLabel - - A simple zoom label control. - - Masashi Takeshita -
      - Leaflet.ZoomPanel - - A Zoom Control Panel Of Leaflet. Demo - - Shuhua Huang -
      - Leaflet.DoubleTouchDragZoom - - Plugin for one finger zoom. Demo - - Peter C -
      - - +{% include plugin_category_table.html category="interactive-pan-zoom" %} ### Bookmarked pan/zoom Change the way the user is moved around the map, by jumping to predefined/stored places. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.viewcenter - - A simple control that adds a button to change view and zoom to predefined values in options. - - Dariusz Pawlak -
      - leaflet-zoom-min - - Adds a button to the zoom control that allows you to zoom to the map minimum zoom level in a single click. - - Alan Shaw -
      - Leaflet Navigation Toolbar - - Leaflet control for simple back, forward and home navigation. - - David C -
      - Leaflet Locationlist - - A control to jump between predefined locations and zooms. - - Ivan Ignatyev -
      - Leaflet.defaultextent - - A control that returns to the original start extent of the map. Similar to the HomeButton widget. - - Alex Nguyen -
      - Leaflet.Bookmarks - - Control for adding and navigating between user-created bookmarks on the map. - - Alexander Milevski -
      - Leaflet.ShowAll - - A control that can show a predefined extent while saving the current one so it can be jumped back to. - - Mor Yariv -
      - Leaflet.zoomhome - - Zoom control with a home button for resetting the view (Demo) - - Florian Brucker -
      - Leaflet-History - - Track history of map movements and zoom locations similar to a browser. - - Chris Scott -
      - Leaflet.RestoreView - - Stores and restores map view using localStorage. - - Mathieu Leplatre -
      - leaflet-hash - - Plugin for persisting map state and browsing history through the URL hash. - - Michael Lawrence Evans -
      - leaflet-view-meta - - Plugin control that displays and persists map view meta-data, center and boundary coordinates to URL for precise sharing and view reconstruction. - - rwev -
      - - +{% include plugin_category_table.html category="bookmarked-pan-zoom" %} ### Fullscreen controls Allows display of the map in full-screen mode. - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.fullscreen - - A fullscreen button control by Mapbox - - Mapbox -
      - leaflet.fullscreen - - Another fullscreen button control but for modern browsers, using HTML5 Fullscreen API. - - Bruno B -
      - leaflet.zoomfs - - A fullscreen button control. - - Eli Dupuis -
      - - +{% include plugin_category_table.html category="fullscreen-controls" %} ### Minimaps & synced maps Display two maps at once. One of them might be a different size and zoom level, usable as a minimap to aid with navigation. - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.Sync - - Synchronized view of two maps. - - Bjørn Sandvik -
      - Leaflet.MiniMap - - A small minimap showing the map at a different scale to aid navigation. - - Robert Nordan -
      - Leaflet.MagnifyingGlass - - Allows you to display a small portion of the map at another zoom level, either at a fixed position or linked to the mouse movement, for a magnifying glass effect. - - Benjamin Becquet -
      - Leaflet.layerscontrol-minimap - - Extends the default Leaflet layers control with synced minimaps. - - Jieter -
      - Leaflet.GlobeMiniMap - - Simple minimap control that places a 3D Globe in the corner of your map, centered on the same location as the main map (demo). - - Chris Whong -
      - leaflet-clonelayer - - Clone Leaflet layers to allow reuse across different maps in the same runtime. - - Jieter -
      - - - - - +{% include plugin_category_table.html category="minimaps-synced-maps" %} ### Measurement Allow the user to measure distances or areas. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.PolylineMeasure - - Measure great-circle distances of simple lines as well as of complex polylines. (Demo 1), (Demo 2), (Demo 3) - - PPete -
      - Leaflet.MeasureControl - - A simple tool to measure distances on maps (*relies on Leaflet.Draw*). - - Makina Corpus -
      - Leaflet.MeasureAreaControl - - Control for measuring element's area. - - Ondrej Zvara -
      - leaflet-measure - - Coordinate, linear, and area measure control for Leaflet maps - - LJA GIS -
      - leaflet-graphicscale - - Animated graphic scale control (demo). - - Erik Escoffier -
      - Leaflet.ScaleFactor - - Display a Scale Factor (e.g. 1:50,000) for Leaflet maps (Demo) - - Marc Chasse -
      - Leaflet.nauticscale - - Display a Nauticscale on Leaflet maps - - Johannes Rudolph -
      - Leaflet Measure Path - - Show measurements on paths; polylines, polygons and circles currently supported (demo) - - Per Liedman / Prominent Edge -
      - Leaflet.LinearMeasurement - - Leaflet Linear Measurement plugin that creates polylines with incremental measures along the path. (demo) - - New Light Technologies -
      - leaflet-ruler - - A simple leaflet plugin to measure true bearing and distance between clicked points. (Demo) - - Goker Tanrisever -
      - leaflet-reticle - - Leaflet control adding a centering reticle consisting of independently calculated latitude and longitude scales. - - rwev -
      - - - - - - - +{% include plugin_category_table.html category="measurement" %} ### Mouse coordinates Show the geographical coordinates under the mouse cursor in different ways. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.MousePosition - - A simple MousePosition control that displays geographic coordinates of the mouse pointer, as it is moved about the map - - Ardhi Lukianto -
      - Leaflet.MousePosition.ts - - A fully custmizable coordinate viewer written in TypeScript. - You can change how this plugin looks by creating a custom component with JSX. - (demo) - - Yuuki Toriyama -
      - Leaflet.Coordinates - - A simple Leaflet plugin viewing the mouse LatLng-coordinates. Also views a marker with coordinate popup on userinput. - - Felix Bache -
      - Leaflet Coordinates Control - - Captures mouseclick and displays its coordinates with easy way to copy them. - - Michal Zimmermann -
      - Leaflet Copy Coordinates Control - - Works with Leaflet to capture mouseclicks on a map and display the associated coordinates with an easy way to copy them. (Derived from original work by zimmicz. Forked mainly to provide npm functionality.) - - Chaim Krause -
      - Leaflet.NACCoordinates - - Displays NAC coordinate of the mouse pointer on mouse move (Demo) - - Mahmood Dehghan -
      - Leaflet.mouseCoordinates - - Displays the Mouse Coordinate in a Box. - Multiple Formats Are Possible -
        -
      • GPS
      • -
      • UTM
      • -
      • UTMREF / MGRS
      • -
      • QTH
      • -
      -
      - Johannes Rudolph -
      - Leaflet Location Picker - - Simple location picker with mini Leaflet map (Demo) - - Stefano Cudini -
      - Leaflet.MapCenterCoord - - A Leaflet control to display the coordinates of the map center, especially useful on touch/mobile devices. (Doc & demos) - - Xisco Guaita -
      - Leaflet.Mapcodes - - Displays the Mapcode of the mouse pointer on mouse move (Demo) - - Martin Atukunda -
      - Leaflet.CoordProjection - - Shows coordinates on mouse move and displays it based on given projection (Demo) - - Edi Hasaj -
      - - - - - - - - +{% include plugin_category_table.html category="mouse-coordinates" %} ### Events These plugins extend Leaflet event handling. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.GestureHandling - - Brings the basic functionality of Google Maps Gesture Handling into Leaflet. Prevents users from getting trapped on the map when scrolling a long page. - Demo - - Andy Marquis -
      - L.Sleep - - Avoid unwanted scroll capturing. - Demo - - atstp -
      - Leaflet.OverIntent - - Adds a new event ``mouseintent``, that differs from ``mouseover`` since it reflects user - intentions to aim a particular layer. - - Mathieu Leplatre -
      - Leaflet.AlmostOver - - Trigger mouse events when cursor is "almost" over a layer. - - Mathieu Leplatre -
      - Leaflet-active-area - - This plugin allows you to use a smaller portion of the map as an active area. - All positioning methods (setView, fitBounds, setZoom) will be applied on this portion instead of the all map. - - Mappy -
      - Leaflet.ControlledBounds - - Inspired by Leaflet-active-area, automatically detects the largest area of the map not covered by any map controls and applies setView, fitBounds, setZoom, getBounds to that area. - - Iván Sánchez Ortega, - MazeMap -
      - singleclick - - Extend L.Map to fire a singleclick event (demo). Compatible with Leaflet 0.7.x only. - - Guillaume Lathoud -
      - singleclick - - Extend L.Evented to fire a singleclick event (demo). Compatible with Leaflet 1.0.0-beta1 and greater only. - - Iván Sánchez Ortega, - MazeMap -
      - Leaflet.VisualClick - - Adds visual feedback when user clicks/taps the map (demo). - Useful when further action is delayed by server requests, or implementation of Leaflet.singleclick. - Or just because it looks cool :) - Only tested with Leaflet 1.0.0-beta1. - - Dag Jomar Mersland, - Iván Sánchez Ortega, - MazeMap -
      - Leaflet Touch Helper - - Makes it easy to touch vector overlays with thick fingers on a small display by adding a transparent, larger touch surface - - Per Liedman / Prominent Edge -
      - Leaflet.ClickTolerance - - This plugin allows you to increase the click tolerance of canvas powered layers, making it possible to increase the clickable area of vector layers beyond their visible extent. Useful when your features are difficult to click otherwise. - - Geoloep -
      - L.DraggableEnhancer - - Modify the default L.Draggable handler (responsible for map panning, ...) to make it work properly if one of the map container's parents has predefined handlers like "event.stopPropagation()' attached to a "mousemove" event for example. - - Vincent Dechandon -
      - L.Spotlight - - Dynamically highlight features near the mouse cursor with a customizable shape - - Isaac Boates -
      - - +{% include plugin_category_table.html category="events" %} ### User interface Buttons, sliders, toolbars, sidebars, and panels. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.Control.Custom - - Fully customizable Leaflet control panel with HTML element. - Demo - - Yiğit Yüce -
      - L.EasyButton - - In one line, add a Font Awesome control button with attached click events. - Demo - - atstp -
      - Leaflet.contextmenu - - A context menu for Leaflet. - - Adam Ratcliffe -
      - Leaflet.CountrySelect - - Control with menu of all countries, and an event listener that returns - the selected country as a GeoJSON feature (demo) - - Anika Halota -
      - Leaflet.GeojsonLayerSwitcher - - Allows to navigate between GeoJSON layers, select some, and return selection. - - Easy-Mountain -
      - leaflet-sidebar-v2 - - A responsive, tabbed sidebar with HTML & JS API. - Compatible with old (0.7) and current leaflet. - - Norwin Roosen -
      - leaflet-sidebar - - A responsive sidebar plugin. - - Tobias Bieniek -
      - sidebar-v2 - - Another responsive sidebar plugin. This time with tabs! - - Tobias Bieniek -
      - Leaflet.Messagebox - - Display a temporary text message on a map (Demo) - - Martijn Grendelman -
      - Leaflet.Notifications - - Spawn toast notifications inside your map - - Manuel Richter -
      - Leaflet.TileLegend - - Create illustrated and interactive legends for your background layers. - - Yohan Boniface -
      - Leaflet.toolbar - - Flexible, extensible toolbars for Leaflet maps. View an example here. - - Justin Manley -
      - L.Credits - - A simple, attractive, interactive control to put your logo and link in the corner of your map. - - Greg Allensworth -
      - Leaflet.Spin - - Shows a nice spinner on the map using Spin.js, - for asynchronous data load, like with Leaflet Ajax. - - Mathieu Leplatre -
      - Leaflet Weather - - A Leaflet plugin for adding a weather widget to the map using OpenWeatherMap API (Demo). - - Osk -
      - Leaflet ResizableControl - - A Leaflet plugin to add a resizable and scrollable control to the map (Demo). - - David Albrecht -
      - Leaflet.Slider - - Adds a <input type="range"> slider that calls a function every time its input is changed (Demo) - - EPP -
      - leaflet-control-window - - Creates modal/modeless, draggable, responsive, customisable window in your map. - - mapshakers/ - Filip Zavadil -
      - Leaflet.CoordinatedImagePreview - - Displays coordinated images in map bounds. - - Yunus Emre Özkaya -
      - Leaflet.SlideMenu - - A simple slide menu for Leaflet. - - Masashi Takeshita -
      - Leaflet.Dialog - - A simple resizable, movable, customizable dialog box. (Demo) - - NBT Solutions -
      - Leaflet.BootstrapZoom - - Overrides default zoom control buttons with Twitter Bootstrap styled ones - - Alexey Gusev -
      - Leaflet.CondensedAttribution - - An attribution plugin that makes long attributes visible on hover - - Motion Intelligence GmbH -
      - Leaflet.HtmlLegend - - A simple Leaflet plugin for creating legends using HTML elements. Demo. - - Kaveh Karimi -
      - leaflet-blurred-location - - A Leaflet-based interface for selecting a "blurred" or low-resolution location, to preserve privacy. Demo. - - Public Lab -
      - Leaflet.Control.Resizer - - Control to resize your map on the right or bottom side. See demo - - Javier Jimenez Shaw -
      - leaflet-blurred-location-display - - - Cleverly dispays "blurred" locations using color-coded heatmap and color-coded markers while fetching data from remote API Demo. - - Public Lab -
      - Leaflet.Legend - - - Display legend symbols and toggle overlays(Demo). - - JJ Jin -
      - Leaflet.Control.Select - - - Customisable menu-style control. See demo. - - Adam Mertel -
      - Leaflet.Signposts - - - Guides users to points outside the current map view with directional arrows and a count of points in each given direction. See demo. - - William Low -
      - - +{% include plugin_category_table.html category="user-interface" %} ### Print/export @@ -4359,459 +323,34 @@ Print or export your map. - Get a PNG from a Leaflet map and export it in PDF https://github.com/chrissom/leaflet-pdf --> - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.print - - Implements the Mapfish print protocol allowing a Leaflet map to be printed using either the Mapfish or GeoServer print module. - - Adam Ratcliffe -
      - Leaflet-image - - Export images out of Leaflet maps without a server component, by using Canvas and CORS. - - Tom MacWright -
      - Leaflet-easyPrint - - A simple plugin which adds an icon to print your Leaflet map. - - Rowan Winsemius -
      - leaflet.browser.print - - Allows users to print full page map directly from the browser. - - Igor Vladyka -
      - Leaflet.BigImage - - Allows users to download an image with a scaled-up version of the visible map. - - Vasyl Pasichnyk (Oswald) -
      - leaflet-route-print - - Automatic PDF printing of routes (i.e. polylines) with custom scale, paper size and margin by covering the route with a sequence of identical rectangles. - - Herman Sletmoen -
      - - +{% include plugin_category_table.html category="print-export" %} ### Geolocation Plugins that extend Leaflet's geolocation capabilities. - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - L.LocationShare - - Allow users to send and receive a marker with a message. - Demo - - atstp -
      - Leaflet.Locate - - A customizable locate control. - - Dominik Moritz -
      - Leaflet Control Compass - - A leaflet control plugin to build a simple rotating compass - - Stefano Cudini -
      - Leaflet.AccuratePosition - - Leaflet.AccuratePosition aims to provide a desired device location accuracy. - - Michael Schmidt-Voigt -
      - Geolet - - A simple but highly customizable geolocation plugin for Leaflet - - Ruben Holthuijsen -
      - - - +{% include plugin_category_table.html category="geolocation" %} ## Miscellaneous - - ### Geoprocessing The following plugins perform several sorts of geoprocessing (mathematical and topological operations on points, lines and polygons). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Proj4Leaflet - - Proj4js integration plugin, allowing you to use all kinds of weird projections in Leaflet. - - Kartena -
      - arc.js - - A JS library for drawing great circle routes that can be used with Leaflet. - - Dane Springmeyer -
      - Leaflet-pip - - Simple point in polygon calculation using point-in-polygon. - - Tom MacWright -
      - Leaflet.GeometryUtil - - A collection of utilities for Leaflet geometries (linear referencing, etc.) - - Benjamin Becquet, Mathieu Leplatre -
      - Greiner-Hormann - - Greiner-Hormann algorithm for polygon clipping and binary operations, adapted for use with Leaflet. - - Alexander Milevski -
      - Leaflet.buffer - - Enables buffering of shapes drawn with Leaflet.draw. - - Jonathan Skeate -
      - Leaflet.LayerIndex - - An efficient spatial index for features and layers, using RTree.js. - - Mathieu Leplatre -
      - leaflet-spatial-prefix-tree - - Leaflet plugin for visualizing spatial prefix trees, quadtree and geohash. See demo - - Mapzen -
      - Leaflet.UTM - - A simple way to convert L.LatLng into UTM (WGS84) and vice versa. UTM string format easily configurable. It does not depend on any other plugin or 3rd party. See demo - - Javier Jimenez Shaw -
      - Leaflet.Antimeridian - - A plugin to allow polygons and polylines to naturally draw across the Antimeridian (or the International Date Line) instead of always wrapping across the Greenwich meridian. (Demo) - - Brianna Landon -
      - - +{% include plugin_category_table.html category="geoprocessing" %} ### Routing The following plugins use external services to calculate driving or walking routes. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet Routing Machine - - Control for route search with via points, displaying itinerary and alternative routes. Uses - OSRM by default, but also supports - GraphHopper, - Mapbox Directions API and more. - - Per Liedman -
      - Leaflet.Routing - - Leaflet controller and interface for routing paths between waypoints using any user provided routing service. - - Norwegian Trekking Association -
      - Route360° - - Route360° visualizes the area which is reachable from a set of starting points in a given time and gives detailed routing information (walk, bike, car and public transportation) to targets. - - Motion Intelligence GmbH -
      - Leaflet RouteBoxer - - This is a Leaflet implementation of the RouteBoxer Class from Google. The Leaflet RouteBoxer class generates a set of L.LatLngBounds objects that are guaranteed to cover every point within a specified distance of a path. - - Stephan Georg -
      - Leaflet.Routing.Amap - - Control for route search using AMap(高德地图) as a backend. Supports the Chinese BD09 and GCJ02 coordinate systems, colourful lines, and turn-by-turn popups. - - Jack Good -
      - Leaflet RouteToAddress - - Control for route search from a custom address to a fixed address. -The Plugin integrates a simple geocoder that uses OpenstreetMap Nominatim to locate places by address. Ideal for the description of the directions "Find your way to us" on a website. Uses OSRM by default, but also supports -Mapbox Directions API. Demo - - Astrid Günther -
      - Leaflet TripGo routing - - The TripGo mobility platform lets you create apps providing seamless and personalised door-to-door trips using any public, private or commercial mode of transport. - TripGo Leaflet's plugin motivation is to provide an easy way to include its functionality in an external platform. - - SkedGo -
      - leaflet.TravelNotes - - Editable markers and routing engine for leaflet. The routing engine have plugins for Mapbox, GraphHopper and OSRM and can be used for car, bike or pedestrian route. Demo. - - Christian Guyette -
      - Leaflet.Reachability - - Show areas of reachability based on time or distance for different modes of travel using the openrouteservice isochrones API. - - Trafford Data Lab -
      - - - +{% include plugin_category_table.html category="routing" %} ### Geocoding External services that transform an address or the name of a place into latitude and longitude (or vice versa). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet GeoSearch - - Small geocoding plugin that brings address searching/lookup (aka geosearching) to Leaflet.
      - Comes with support for Google, OpenStreetMap Nominatim, Bing, Esri and Nokia. Easily extensible. -
      - Stephan Meijer -
      - Leaflet Control OSM Geocoder - - A simple geocoder that uses OpenstreetMap Nominatim to locate places by address. - - Karsten Hinz -
      - Leaflet Control Bing Geocoder - - A simple geocoder control that uses Bing to locate places. - - Samuel Piquet -
      - Leaflet Control Geocoder - - A clean and extensible control for both geocoding and reverse geocoding. Builtin support for - Nominatim, Bing, MapQuest, Mapbox, What3Words, Google and Photon. Easy to extend to other providers. - - Per Liedman -
      - Leaflet GeoIP Locator - - A simple plugin that allows finding the approximate location of IP addresses and map centering on said location. - - Jakub Dostal -
      - Esri Leaflet Geocoder - - A geocoding control with suggestions powered by the ArcGIS Online geocoder. - - Patrick Arlt -
      - Leaflet.OpenCage.Search - - A search plugin plugin that uses OpenCage's geocoding API. - - The OpenCage team -
      - Leaflet.Geonames - - A lightweight geocoding control powered by GeoNames. Demo - - Brendan Ward -
      - Pelias Leaflet Plugin - - A geocoding control using Geocode Earth or any hosted service powered by the Pelias Geocoder API. Demo - - Lou Huang -
      - Leaflet.Autocomplete - - Leaflet.Autocomplete is to expand the autosugestion plugin with the ability to geocode and show data on the map in the way you think you need. The DEMO is based on the use of OpenstreetMap Nominatim to locate places by address. Accessible, with full support for ARIA attributes and keyboard interactions. - - Grzegorz Tomicki -
      - Leaflet LocationIQ Geocoder - - A plugin that adds the ability to search (geocode) a Leaflet-powered map using LocationIQ. - - LocationIQ -
      - L.Highlight - - A plugin that adds the ability to quick highlighting streets and areas using Nominatim. - - Maciej Kowalski -
      - - +{% include plugin_category_table.html category="geocoding" %} ### Plugin collections @@ -4819,37 +358,7 @@ Sets of plugins that span several categories. Plugin developers: please keep future plugins in individual repositories. - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Plugins by Pavel Shramov - - A set of plugins for: GPX, KML, TOPOJSON layers; Bing tile layer; Yandex layers (implemented with their APIs), and permalink control. - - Pavel Shramov, Bruno B -
      - Spectrum4Leaflet - - Tools for using Spectrum Spatial Server services with leaflet. This plugin supports: map service, tile service, feature service. It has layers, legend and feature controls. - - SVoyt, ESTI MAP -
      - MapBBCode-related leaflet plugins - - Seven plugins for various features, independent of the MapBBCode library. - From circular and popup icons to buttons, layer switcher, better search and attribution. - - Ilya Zverev -
      - +{% include plugin_category_table.html category="plugin-collections" %} ## Integration @@ -4858,410 +367,13 @@ Plugin developers: please keep future plugins in individual repositories. Ease your development integrating Leaflet into a development framework or automating some of the javascript/CSS work for complex applications. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - leaflet-defaulticon-compatibility - - Retrieve all Leaflet Default Icon options from CSS, in particular all icon images URL's, to improve compatibility with bundlers and frameworks that modify URL's in CSS. In particular for webpack (with style-, css-, file- and url-loader's), Rails Asset Pipeline and Django pipeline. Should solve all use cases linked to issue Leaflet/Leaflet #4968. Demo with webpack (and without this plugin). - - ghybs -
      - Leaflet Yeoman Generator - - Yeoman generator that scaffolds out a basic Leaflet map application. - - Moritz Klack -
      - leaflet-geoserver-request - - Basic geoserver requests in leaflet. Currently supports wms, wfs, legend, wmsImage request on the leaflet. - Demo - - Iamtekson -
      - react-leaflet - - React components for Leaflet maps. - - Paul Le Cam -
      - Leaflet.CSS - - Add the main Leaflet CSS files (or any css) from within JavaScript, be gone conditional comments. - - Calvin Metcalf -
      - Leaflet LayerConfig - - Provide a json file or service response with a configuration of layers and markers to automatically set up a Leaflet client. - - Alexander Nossum -
      - Leaflet.i18n - - Internationalization for Leaflet plugins. - - Yohan Boniface -
      - Leaflet ZoomLevel CSS Class - - Add zoom level css class to map element for easy style updates based on zoom levels - - Dag Jomar Mersland -
      - famous-map - - Integrate Leaflet in applications made with the famo.us web framework. - - Hein Rutjes -
      - ngx-leaflet - - Leaflet components and extensions for Angular.io. - - Asymmetrik, Ltd. -
      - Angular Leaflet directive - - Integrate Leaflet in applications made with the AngularJS web framework. - - David Rubert -
      - Tiny Leaflet Directive - - Tiny LeafletJS map directive for your AngularJS apps. - - Martin Tesař -
      - Leaflet Popup Angular - - Use AngularJS in your Leaflet popups. Extends the built-in L.popup. - - Grant Harris -
      - Leaflet Control Angular - - Insert and use Angularized HTML code in your Leaflet map as a Leaflet control. - - Grant Harris -
      - YAGA leaflet-ng2 - - Granular integration into Angular2/4. demo . - - YAGA Development Team -
      - <leaflet-map> - - Integrate Leaflet in applications made with the Polymer >= 1.0 web component framework. - - Hendrik Brummermann, - Prateek Saxena -
      - Leaflet map component - - Integrate Leaflet in applications made with the Polymer 0.5 web framework. - - Prateek Saxena -
      - Leaflet.jsf - - Comprehensive Java Server Faces(JSF) Component/Wrapper for Leaflet. - - Terra SI LLC. - M.Çağrı Tepebaşılı -
      - JSF2Leaf - - A JavaServer Faces wrapper for Leaflet. - - Leonardo Ciocari -
      - ember-leaflet - - Easy and declarative mapping for Ember.js using Leaflet. - - Miguel Andrade -
      - meteor-leaflet - - Provides a Meteor package to quickly build real-time cross-platform map apps. - - Bevan Hunt -
      - L.Control.BootstrapModal - - Trigger a Bootstrap modal using an on-map control. - - Greg Allensworth -
      - L.Control.jQueryDialog - - Trigger a jQuery UI dialog/modal using an on-map control. - - Greg Allensworth -
      - V-Leaflet - - Use Leaflet as a component for the Vaadin Java/HTML framework. - - Matti Tahvonen -
      - gwty-leaflet - - A Java/GWT JsInterop wrapper for Leaflet. It allows using Leaflet in Java the same way as from a javascript script. - - Zakaria Amine -
      - Leaflet Map Builder - - It populates a leaflet map from a configuration object, can also creates zoom, layers, attribution and draw controls. demo . - - Gherardo Varando -
      - Vue2Leaflet - - Vue2Leaflet is a JavaScript library for the Vue.js framework that wraps Leaflet, making it easy to create reactive maps. - - Mickaël KoRiGaN -
      - leaflet-rails gem - - This gem provides the leaflet.js map display library for your Rails 5 application. leaflet-rails on RubyGems - - Akshay Joshi -
      - +{% include plugin_category_table.html category="frameworks-build-systems" %} ### 3rd party integration The following plugins integrate Leaflet into third party services or websites. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet.EditInOSM - - Add a control with links to open the current map view on main OSM editors. - - Yohan Boniface -
      - Maps Marker Pro - - A WordPress plugin that enables users to pin, organize and share their favorite places and tracks through their WordPress powered site. - - Robert Harm -
      - WordPress Leaflet Map - - Interactive and flexible shortcode to create multiple maps in posts and pages, - and to add multiple markers on those maps. - - Benjamin J DeLong -
      - Maptiks - - Analytics platform for web maps. Track map activities, layer load times, marker clicks, and more! - - Sparkgeo -
      - Leaflet for Drupal - - A Drupal (7.x and 8.x) module to integrate Leaflet maps in your Drupal site. Contains a field formatter to show a map for fields containing geospatial data, Views integration to plot data on a map, and a lightweight and easy to use API. Currently used by over 10.000 sites. - - Marzee Labs, and more maintainers listed at drupal.org -
      - Leaflet Easymap - - Include a map in your HTML page without one line of programming. A data-driven Javascript module. - - Klaus Stein -
      - WP MapIt - - Easy to use, WordPress Map plugin based on Open Street Map and Leaflet with custom markers images, descriptions and links. - - Chandni Patel -
      - Map Block Leaflet - - A Block for the New WordPress Block Editor based on Leaflet, it allow add and custom maps from a visual interface. - - Jesús Olazagoitia -
      - ABP Usermap MyBB - - A plugin for MyBB creating a map of users based on Open Street Map and Leaflet, with customisable popup and markers - - CrazyCat -
      - Leaflet Extensions for Joomla! (3.x) - -
        -
      • - Agosm:
        - Joomla Module not only for showing Markers on a OpenStreetMap Map.
        - Gibhub
        - Joomla Extension Directory
        -
      • -
      • - Aggpxtrack:
        - Joomla Custom Field for dispaying a GPX Track on a Map - you can choose an OpenStreetMap or GoogleMaps. With much options. For example: One option is an elevation profil.
        - Gibhub
        - Joomla Extension Directory
        -
      • -
      • - Agosmmapwithmarker:
        - Custom field for show a map with a marker in frond end - always the right card for the content. You can enter the address in backend.
        - Gibhub
        - Joomla Extension Directory
        -
      • -
      -
      - Astrid Günther -
      - Leaflet.Facebook - - Simple plugin for adding Facebook like button as a control. - - Marcin Wasilewski -
      - WP-Trip-Summary - - A WordPress trip summary plugin to help travel bloggers manage and display structured information about their train rides and biking or hiking trips. - - Alexandru Boia -
      - Open User Map – Users can add locations from the frontend - - WordPress plugin to let your visitors add locations directly from the frontend - without registration. They drop a marker on the map and provide some location details. After submit the location proposal will be “pending” and wait for your review approval to get published. - - 100plugins -
      +{% include plugin_category_table.html category="3rd-party-integration" %} @@ -5271,4 +383,4 @@ Leaflet keeps it simple. If you can think of a feature that is not required by a There are no hard requirements on how to create your own plugin, but all developers are encouraged to read the recommendations in the [plugin guide](https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md). -Once your plugin is ready, you can submit it to this list: just send a pull request with the addition to [/docs/plugins.md](https://github.com/Leaflet/Leaflet/blob/master/docs/plugins.md) to our GitHub repository. +Once your plugin is ready, you can submit it: just send a pull request with a new plugin file in [/docs/_plugins/](https://github.com/Leaflet/Leaflet/tree/master/docs/_plugins)to our GitHub repository. From 842dd30cac48fa3f8d8fdba515721b408fd0b599 Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 25 Nov 2021 18:19:15 +0100 Subject: [PATCH 234/306] Remove leaflet-include.js (#7776) * Remove not necessary leaflet-include.js * Remove not necessary leaflet-include.js & line ending --- debug/hacks/jitter.html | 2 +- debug/leaflet-include.js | 1 - debug/map/canvas.html | 2 +- debug/map/control-layers.html | 2 +- debug/map/controls.html | 2 +- debug/map/geolocation.html | 2 +- debug/map/grid.html | 2 +- debug/map/image-overlay.html | 2 +- debug/map/layer_remove_add.html | 2 +- debug/map/map-mobile.html | 2 +- debug/map/map-popup.html | 2 +- debug/map/map-scaled.html | 2 +- debug/map/map.html | 2 +- debug/map/marker-autopan.html | 2 +- debug/map/markers.html | 2 +- debug/map/max-bounds-bouncy.html | 2 +- debug/map/max-bounds-infinite.html | 2 +- debug/map/max-bounds.html | 2 +- debug/map/opacity.html | 2 +- debug/map/popup.html | 2 +- debug/map/scroll.html | 2 +- debug/map/simple-proj.html | 2 +- debug/map/svgoverlay.html | 2 +- debug/map/tile-debug.html | 2 +- debug/map/tile-opacity.html | 2 +- debug/map/tooltip.html | 2 +- debug/map/videooverlay.html | 2 +- debug/map/wms-marble.html | 2 +- debug/map/wms.html | 2 +- debug/map/zoom-delta.html | 2 +- debug/map/zoom-remain-centered.html | 2 +- debug/map/zoomlevels.html | 2 +- debug/map/zoompan.html | 2 +- debug/tests/add_remove_layers.html | 2 +- debug/tests/bringtoback.html | 2 +- debug/tests/canvasloop.html | 2 +- debug/tests/click_on_canvas.html | 2 +- debug/tests/custom-panes.html | 12 ++++++------ debug/tests/detached-dom-memory-leak.html | 2 +- debug/tests/doubleclick-events-slowdown.html | 2 +- debug/tests/dragging_and_copyworldjump.html | 2 +- debug/tests/dragging_cursors.html | 2 +- debug/tests/event-perf-2.html | 4 ++-- debug/tests/event-perf.html | 2 +- debug/tests/mousemove_on_polygons.html | 14 +++++++------- debug/tests/opacity.html | 2 +- debug/tests/popup_offset.html | 2 +- debug/tests/popupcontextmenuclicks.html | 2 +- debug/tests/remove_while_dragging.html | 2 +- debug/tests/removetilewhilepan.html | 2 +- debug/tests/reuse_popups.html | 2 +- debug/tests/rtl.html | 2 +- debug/tests/rtl2.html | 2 +- debug/tests/set_icon_reuse_dom.html | 2 +- debug/tests/svg_clicks.html | 2 +- debug/tests/tile-bounds.html | 2 +- debug/tests/tile-events.html | 2 +- debug/tests/tile-opacity.html | 2 +- debug/tests/touch-shake.html | 2 +- debug/tests/touch-zoom-bounce.html | 2 +- debug/vector/bounds-extend.html | 2 +- debug/vector/feature-group-bounds.html | 2 +- debug/vector/geojson.html | 2 +- debug/vector/inherit-dashArray.html | 2 +- debug/vector/moving-canvas.html | 2 +- debug/vector/rectangle.html | 2 +- debug/vector/touchzoomemu.html | 2 +- debug/vector/vector-bounds.html | 2 +- debug/vector/vector-canvas.html | 2 +- debug/vector/vector-mobile.html | 2 +- debug/vector/vector-simple.html | 4 ++-- debug/vector/vector.html | 2 +- debug/vector/vector2.html | 2 +- 73 files changed, 85 insertions(+), 86 deletions(-) delete mode 120000 debug/leaflet-include.js diff --git a/debug/hacks/jitter.html b/debug/hacks/jitter.html index 14858f8160b..29cd01a0083 100644 --- a/debug/hacks/jitter.html +++ b/debug/hacks/jitter.html @@ -8,7 +8,7 @@ - + diff --git a/debug/leaflet-include.js b/debug/leaflet-include.js deleted file mode 120000 index 23dfb1d9bd2..00000000000 --- a/debug/leaflet-include.js +++ /dev/null @@ -1 +0,0 @@ -../dist/leaflet-src.js \ No newline at end of file diff --git a/debug/map/canvas.html b/debug/map/canvas.html index 9234b356c19..ccca55407b3 100644 --- a/debug/map/canvas.html +++ b/debug/map/canvas.html @@ -7,7 +7,7 @@ - + diff --git a/debug/map/control-layers.html b/debug/map/control-layers.html index 32b87b03f98..25dafef018b 100644 --- a/debug/map/control-layers.html +++ b/debug/map/control-layers.html @@ -7,7 +7,7 @@ - +
      diff --git a/debug/map/controls.html b/debug/map/controls.html index be9488897f8..24906ed5194 100644 --- a/debug/map/controls.html +++ b/debug/map/controls.html @@ -7,7 +7,7 @@ - + diff --git a/debug/map/geolocation.html b/debug/map/geolocation.html index e54d3474425..774710e4312 100644 --- a/debug/map/geolocation.html +++ b/debug/map/geolocation.html @@ -8,7 +8,7 @@ - + diff --git a/debug/map/grid.html b/debug/map/grid.html index 11f4b6005cd..3757ea7ddcd 100644 --- a/debug/map/grid.html +++ b/debug/map/grid.html @@ -9,7 +9,7 @@ - + diff --git a/debug/map/image-overlay.html b/debug/map/image-overlay.html index 13790b5089a..bf1cb1a8ab3 100644 --- a/debug/map/image-overlay.html +++ b/debug/map/image-overlay.html @@ -9,7 +9,7 @@ - + diff --git a/debug/map/layer_remove_add.html b/debug/map/layer_remove_add.html index 3fd81328497..dcbc7120a8e 100644 --- a/debug/map/layer_remove_add.html +++ b/debug/map/layer_remove_add.html @@ -9,7 +9,7 @@ - + diff --git a/debug/map/map-mobile.html b/debug/map/map-mobile.html index fa9ec287894..5ce5c93cdb1 100644 --- a/debug/map/map-mobile.html +++ b/debug/map/map-mobile.html @@ -9,7 +9,7 @@ - + diff --git a/debug/map/map-popup.html b/debug/map/map-popup.html index a0cf98d9c78..e3cb98371c9 100644 --- a/debug/map/map-popup.html +++ b/debug/map/map-popup.html @@ -9,7 +9,7 @@ - + diff --git a/debug/map/map-scaled.html b/debug/map/map-scaled.html index 8b88ff7b977..a99809f1dfe 100644 --- a/debug/map/map-scaled.html +++ b/debug/map/map-scaled.html @@ -28,7 +28,7 @@ } - + diff --git a/debug/map/map.html b/debug/map/map.html index 489fb13dfef..1687eaa02ab 100644 --- a/debug/map/map.html +++ b/debug/map/map.html @@ -9,7 +9,7 @@ - + diff --git a/debug/map/marker-autopan.html b/debug/map/marker-autopan.html index 6bad94391fe..c708cdd43a0 100644 --- a/debug/map/marker-autopan.html +++ b/debug/map/marker-autopan.html @@ -9,7 +9,7 @@ - + diff --git a/debug/map/markers.html b/debug/map/markers.html index 0730f3ea973..3a696f3acce 100644 --- a/debug/map/markers.html +++ b/debug/map/markers.html @@ -9,7 +9,7 @@ - + diff --git a/debug/map/max-bounds-bouncy.html b/debug/map/max-bounds-bouncy.html index bd6d866ae88..f8b1849eafb 100644 --- a/debug/map/max-bounds-bouncy.html +++ b/debug/map/max-bounds-bouncy.html @@ -9,7 +9,7 @@ - + diff --git a/debug/map/max-bounds-infinite.html b/debug/map/max-bounds-infinite.html index e7c460b783a..02cbba4b53e 100644 --- a/debug/map/max-bounds-infinite.html +++ b/debug/map/max-bounds-infinite.html @@ -9,7 +9,7 @@ - + diff --git a/debug/map/max-bounds.html b/debug/map/max-bounds.html index 5e4bf9ccff8..4801af14189 100644 --- a/debug/map/max-bounds.html +++ b/debug/map/max-bounds.html @@ -9,7 +9,7 @@ - + diff --git a/debug/map/opacity.html b/debug/map/opacity.html index a83a1530f8f..738623dc92b 100644 --- a/debug/map/opacity.html +++ b/debug/map/opacity.html @@ -9,7 +9,7 @@ - + - +
      diff --git a/debug/map/tile-opacity.html b/debug/map/tile-opacity.html index 5ddf63642c0..31036136d9e 100644 --- a/debug/map/tile-opacity.html +++ b/debug/map/tile-opacity.html @@ -7,7 +7,7 @@ - + diff --git a/debug/map/tooltip.html b/debug/map/tooltip.html index 2cd73ec3aac..de686193fb5 100644 --- a/debug/map/tooltip.html +++ b/debug/map/tooltip.html @@ -7,7 +7,7 @@ - + - + diff --git a/debug/tests/add_remove_layers.html b/debug/tests/add_remove_layers.html index 3b61b184582..02e8db3e89d 100644 --- a/debug/tests/add_remove_layers.html +++ b/debug/tests/add_remove_layers.html @@ -9,7 +9,7 @@ - +
      diff --git a/debug/tests/bringtoback.html b/debug/tests/bringtoback.html index e6460255a27..af1d8ea99fb 100644 --- a/debug/tests/bringtoback.html +++ b/debug/tests/bringtoback.html @@ -8,7 +8,7 @@ - + diff --git a/debug/tests/canvasloop.html b/debug/tests/canvasloop.html index 997f8ff07a6..6e3027dcb69 100644 --- a/debug/tests/canvasloop.html +++ b/debug/tests/canvasloop.html @@ -4,7 +4,7 @@ - + diff --git a/debug/tests/click_on_canvas.html b/debug/tests/click_on_canvas.html index d4e02de03d3..a72ef887fb6 100644 --- a/debug/tests/click_on_canvas.html +++ b/debug/tests/click_on_canvas.html @@ -9,7 +9,7 @@ - +
      diff --git a/debug/tests/custom-panes.html b/debug/tests/custom-panes.html index 0a6fd08618b..ef993fa12f1 100644 --- a/debug/tests/custom-panes.html +++ b/debug/tests/custom-panes.html @@ -2,15 +2,15 @@ Leaflet debug page - + - + - + - - - + + + - + @@ -63,7 +63,7 @@ },1); } } - + var polygon = (new L.Polygon([ [39, 8.40], [39.10, 8.50], @@ -73,7 +73,7 @@ .on('mouseout',update('exit1')) .on('click',update('click1')) .bindPopup('Triangle 1'); - + var polygon2 = (new L.Polygon([ [39.03, 8.30], [39.10, 8.40], @@ -84,11 +84,11 @@ .on('click',update('click2')) .bindPopup('Triangle 2'); - + var marker = new L.Marker(latlng, {draggable: true}) .bindPopup('Marker');; map.addLayer(marker); - + // map.on('mousemove', function (e) { // marker.setLatLng(e.latlng); @@ -97,7 +97,7 @@ .on('mousemove',update('move3')) .on('mouseout',update('exit3')) .on('click',update('click3')); - + // We should be able to move marker around in a fluid way, // plus going over the polygon with no issue. diff --git a/debug/tests/opacity.html b/debug/tests/opacity.html index 6747d9d2e01..6098a57eab1 100644 --- a/debug/tests/opacity.html +++ b/debug/tests/opacity.html @@ -14,7 +14,7 @@ } - + diff --git a/debug/tests/popup_offset.html b/debug/tests/popup_offset.html index a101853d7b4..83ff95616e0 100644 --- a/debug/tests/popup_offset.html +++ b/debug/tests/popup_offset.html @@ -9,7 +9,7 @@ - + diff --git a/debug/tests/popupcontextmenuclicks.html b/debug/tests/popupcontextmenuclicks.html index 8080f9e1e4d..1251065d401 100644 --- a/debug/tests/popupcontextmenuclicks.html +++ b/debug/tests/popupcontextmenuclicks.html @@ -9,7 +9,7 @@ - + diff --git a/debug/tests/remove_while_dragging.html b/debug/tests/remove_while_dragging.html index 6539738e3c7..5726c782e01 100644 --- a/debug/tests/remove_while_dragging.html +++ b/debug/tests/remove_while_dragging.html @@ -7,7 +7,7 @@ - + diff --git a/debug/tests/removetilewhilepan.html b/debug/tests/removetilewhilepan.html index 8475b0fff6e..0b9bd1c27b2 100644 --- a/debug/tests/removetilewhilepan.html +++ b/debug/tests/removetilewhilepan.html @@ -8,7 +8,7 @@ - + diff --git a/debug/tests/reuse_popups.html b/debug/tests/reuse_popups.html index f1bafbfad54..5feddb99b7d 100644 --- a/debug/tests/reuse_popups.html +++ b/debug/tests/reuse_popups.html @@ -6,7 +6,7 @@ - +
      diff --git a/debug/tests/rtl.html b/debug/tests/rtl.html index 2344856cf62..81605a233d6 100644 --- a/debug/tests/rtl.html +++ b/debug/tests/rtl.html @@ -9,7 +9,7 @@ - + diff --git a/debug/tests/set_icon_reuse_dom.html b/debug/tests/set_icon_reuse_dom.html index e4bb7d489c6..f5985f66f3c 100644 --- a/debug/tests/set_icon_reuse_dom.html +++ b/debug/tests/set_icon_reuse_dom.html @@ -5,7 +5,7 @@ - +
      diff --git a/debug/tests/svg_clicks.html b/debug/tests/svg_clicks.html index 9056d75e7b9..871b9807d9b 100644 --- a/debug/tests/svg_clicks.html +++ b/debug/tests/svg_clicks.html @@ -8,7 +8,7 @@ - + diff --git a/debug/tests/tile-bounds.html b/debug/tests/tile-bounds.html index c5e6b757d1a..57408906f9b 100644 --- a/debug/tests/tile-bounds.html +++ b/debug/tests/tile-bounds.html @@ -9,7 +9,7 @@ - + diff --git a/debug/tests/touch-shake.html b/debug/tests/touch-shake.html index 7ecdf14d444..1588f1781d1 100644 --- a/debug/tests/touch-shake.html +++ b/debug/tests/touch-shake.html @@ -11,7 +11,7 @@ - + diff --git a/debug/tests/touch-zoom-bounce.html b/debug/tests/touch-zoom-bounce.html index e5486062eea..d3c818b4b60 100644 --- a/debug/tests/touch-zoom-bounce.html +++ b/debug/tests/touch-zoom-bounce.html @@ -11,7 +11,7 @@ - + diff --git a/debug/vector/bounds-extend.html b/debug/vector/bounds-extend.html index 611460fcf01..c3cd3b84257 100644 --- a/debug/vector/bounds-extend.html +++ b/debug/vector/bounds-extend.html @@ -7,7 +7,7 @@ - +
      diff --git a/debug/vector/feature-group-bounds.html b/debug/vector/feature-group-bounds.html index de2bc24d617..82947fde4b3 100644 --- a/debug/vector/feature-group-bounds.html +++ b/debug/vector/feature-group-bounds.html @@ -7,7 +7,7 @@ - + diff --git a/debug/vector/geojson.html b/debug/vector/geojson.html index b13733c83bc..54cb3e041c7 100644 --- a/debug/vector/geojson.html +++ b/debug/vector/geojson.html @@ -40,7 +40,7 @@ } - + diff --git a/debug/vector/inherit-dashArray.html b/debug/vector/inherit-dashArray.html index 01d0019e8b6..853ccd98a64 100644 --- a/debug/vector/inherit-dashArray.html +++ b/debug/vector/inherit-dashArray.html @@ -7,7 +7,7 @@ - +
      diff --git a/debug/vector/moving-canvas.html b/debug/vector/moving-canvas.html index ca4728a86b4..3e7ab7424c1 100644 --- a/debug/vector/moving-canvas.html +++ b/debug/vector/moving-canvas.html @@ -9,7 +9,7 @@ - + diff --git a/debug/vector/rectangle.html b/debug/vector/rectangle.html index 2d73b0c44d7..2e97b683297 100644 --- a/debug/vector/rectangle.html +++ b/debug/vector/rectangle.html @@ -7,7 +7,7 @@ - + diff --git a/debug/vector/touchzoomemu.html b/debug/vector/touchzoomemu.html index 6402f6b2d1e..f7a8d7f4702 100644 --- a/debug/vector/touchzoomemu.html +++ b/debug/vector/touchzoomemu.html @@ -7,7 +7,7 @@ - +
      diff --git a/debug/vector/vector-bounds.html b/debug/vector/vector-bounds.html index 3984a6944e3..1504ef44d8a 100644 --- a/debug/vector/vector-bounds.html +++ b/debug/vector/vector-bounds.html @@ -7,7 +7,7 @@ - +
      diff --git a/debug/vector/vector-canvas.html b/debug/vector/vector-canvas.html index 16e1be79a51..aa92675abc1 100644 --- a/debug/vector/vector-canvas.html +++ b/debug/vector/vector-canvas.html @@ -7,7 +7,7 @@ - +
      diff --git a/debug/vector/vector-mobile.html b/debug/vector/vector-mobile.html index 66385d4583c..5c059f21ce5 100644 --- a/debug/vector/vector-mobile.html +++ b/debug/vector/vector-mobile.html @@ -9,7 +9,7 @@ - +
      diff --git a/debug/vector/vector-simple.html b/debug/vector/vector-simple.html index 6bb4280f287..ff6589482dd 100644 --- a/debug/vector/vector-simple.html +++ b/debug/vector/vector-simple.html @@ -9,14 +9,14 @@ - +
      +
      diff --git a/debug/vector/vector2.html b/debug/vector/vector2.html index 2050f2a2a81..3c19dc497ce 100644 --- a/debug/vector/vector2.html +++ b/debug/vector/vector2.html @@ -6,7 +6,7 @@ - +
      From 2eec1985f50dbd2a7be031b7458c39c2e96a35d0 Mon Sep 17 00:00:00 2001 From: Chandra Kiran G <52241074+Chandu-4444@users.noreply.github.com> Date: Thu, 25 Nov 2021 22:49:27 +0530 Subject: [PATCH 235/306] Add fallbacks to font-size (#7800) --- dist/leaflet.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dist/leaflet.css b/dist/leaflet.css index bdcde50cc5e..06945ec4c79 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -273,6 +273,7 @@ svg.leaflet-image-layer.leaflet-interactive path { /* general typography */ .leaflet-container { font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; + font: 0.75rem/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; } @@ -424,6 +425,7 @@ svg.leaflet-image-layer.leaflet-interactive path { .leaflet-container .leaflet-control-attribution, .leaflet-container .leaflet-control-scale { font-size: 11px; + font-size: 0.69rem; } .leaflet-left .leaflet-control-scale { margin-left: 5px; @@ -437,6 +439,7 @@ svg.leaflet-image-layer.leaflet-interactive path { line-height: 1.1; padding: 2px 5px 1px; font-size: 11px; + font-size: 0.69rem; white-space: nowrap; overflow: hidden; -moz-box-sizing: border-box; From c6c82f07c594a68ca50ab49e4a726c97b4762a0b Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 25 Nov 2021 18:25:43 +0100 Subject: [PATCH 236/306] Add keepInView test (#7790) --- spec/suites/layer/PopupSpec.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index 3d980a3305f..02264f7778f 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -413,6 +413,27 @@ describe("L.Map#openPopup", function () { .down().moveBy(10, 10, 20).up(); }); + it('keeps the popup in the view (keepInView)', function (done) { + c.style.position = 'absolute'; + c.style.left = 0; + c.style.top = 0; + c.style.zIndex = 10000; + + // to prevent waiting until the animation is finished + map.options.inertia = false; + + var spy = sinon.spy(); + var p = new L.Popup({keepInView: true}).setContent('Popup').setLatLng(center); + map.openPopup(p); + map.on('autopanstart', spy); + + map.panBy([200, 0]); + setTimeout(function () { + expect(spy.called).to.be(true); + expect(map.getCenter().equals([55.801280971180454, 40.86914062500001])).to.be(true); + done(); + }, 800); + }); }); describe('L.Layer#_popup', function () { From 1180e7e8c2b55dca8141ddb405ad85d8994a9d34 Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 25 Nov 2021 18:50:18 +0100 Subject: [PATCH 237/306] Accessibility popup close button (#7794) * Change color of close button #7539 * Add role=button and aria-label #7399 * Add aria-hidden to `times` / `x` #7472 * remove bold on close button Co-authored-by: Vladimir Agafonkin --- dist/leaflet.css | 5 ++--- src/layer/Popup.js | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 06945ec4c79..5630816cfaf 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -526,13 +526,12 @@ svg.leaflet-image-layer.leaflet-interactive path { width: 18px; height: 14px; font: 16px/14px Tahoma, Verdana, sans-serif; - color: #c3c3c3; + color: #757575; text-decoration: none; - font-weight: bold; background: transparent; } .leaflet-container a.leaflet-popup-close-button:hover { - color: #999; + color: #585858; } .leaflet-popup-scrolled { overflow: auto; diff --git a/src/layer/Popup.js b/src/layer/Popup.js index e7a1cce9f25..aa8d9057d5a 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -190,8 +190,10 @@ export var Popup = DivOverlay.extend({ if (this.options.closeButton) { var closeButton = this._closeButton = DomUtil.create('a', prefix + '-close-button', container); + closeButton.setAttribute('role', 'button'); // overrides the implicit role=link of elements #7399 + closeButton.setAttribute('aria-label', 'Close popup'); closeButton.href = '#close'; - closeButton.innerHTML = '×'; + closeButton.innerHTML = ''; DomEvent.on(closeButton, 'click', this._close, this); } From 4dadf840af1c58ab2494e4f038d20df815cd4923 Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 25 Nov 2021 19:34:19 +0100 Subject: [PATCH 238/306] Fix Popup keepInView if the map needs to panned over a long distance (#7792) * Fix keepInView recursion #5035 * Fix test Co-authored-by: Vladimir Agafonkin --- spec/suites/layer/PopupSpec.js | 9 ++++----- src/layer/Popup.js | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index 02264f7778f..c85fcdcc6fb 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -413,7 +413,7 @@ describe("L.Map#openPopup", function () { .down().moveBy(10, 10, 20).up(); }); - it('keeps the popup in the view (keepInView)', function (done) { + it('moves the map over a long distance to the popup if it is not in the view (keepInView)', function (done) { c.style.position = 'absolute'; c.style.left = 0; c.style.top = 0; @@ -423,14 +423,13 @@ describe("L.Map#openPopup", function () { map.options.inertia = false; var spy = sinon.spy(); - var p = new L.Popup({keepInView: true}).setContent('Popup').setLatLng(center); - map.openPopup(p); map.on('autopanstart', spy); + var p = new L.Popup({keepInView: true}).setContent('Popup').setLatLng([center[0], center[1] + 50]); + map.openPopup(p); - map.panBy([200, 0]); setTimeout(function () { expect(spy.called).to.be(true); - expect(map.getCenter().equals([55.801280971180454, 40.86914062500001])).to.be(true); + expect(map.getBounds().contains(p.getLatLng())).to.be(true); done(); }, 800); }); diff --git a/src/layer/Popup.js b/src/layer/Popup.js index aa8d9057d5a..810a3791750 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -235,7 +235,7 @@ export var Popup = DivOverlay.extend({ DomUtil.setPosition(this._container, pos.add(anchor)); }, - _adjustPan: function () { + _adjustPan: function (e) { if (!this.options.autoPan) { return; } if (this._map._panAnim) { this._map._panAnim.stop(); } @@ -275,7 +275,7 @@ export var Popup = DivOverlay.extend({ if (dx || dy) { map .fire('autopanstart') - .panBy([dx, dy]); + .panBy([dx, dy], {animate: e && e.type === 'moveend'}); } }, From 6db8d22b617b9ed253749a503d3672603a8800ae Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 25 Nov 2021 23:00:07 +0100 Subject: [PATCH 239/306] Add aria-hidden to the +/- characters of zoom controls (#7795) * Add aria-hidden to zoom controls #7433 * Fix lint * Move aria-hidden to the `zoomIn\OutText` * Update src/control/Control.Zoom.js Co-authored-by: Vladimir Agafonkin --- src/control/Control.Zoom.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/control/Control.Zoom.js b/src/control/Control.Zoom.js index 3c8055003ae..e3d62fcbafc 100644 --- a/src/control/Control.Zoom.js +++ b/src/control/Control.Zoom.js @@ -20,7 +20,7 @@ export var Zoom = Control.extend({ // @option zoomInText: String = '+' // The text set on the 'zoom in' button. - zoomInText: '+', + zoomInText: '', // @option zoomInTitle: String = 'Zoom in' // The title set on the 'zoom in' button. @@ -28,7 +28,7 @@ export var Zoom = Control.extend({ // @option zoomOutText: String = '−' // The text set on the 'zoom out' button. - zoomOutText: '−', + zoomOutText: '', // @option zoomOutTitle: String = 'Zoom out' // The title set on the 'zoom out' button. From 649eaf37e52aae6dd66c6457eb3ebb9b85a137ae Mon Sep 17 00:00:00 2001 From: Olivier Date: Fri, 26 Nov 2021 19:38:03 +1100 Subject: [PATCH 240/306] Add documentation for Event Listens Propagate argument. Fixes Leaflet/Leaflet#6912 (#7103) --- docs/reference-1.0.3.html | 4 ++-- docs/reference-1.1.0.html | 4 ++-- docs/reference-1.2.0.html | 4 ++-- docs/reference-1.3.4.html | 4 ++-- docs/reference-1.4.0.html | 4 ++-- docs/reference-1.6.0.html | 4 ++-- src/core/Events.js | 3 ++- 7 files changed, 14 insertions(+), 13 deletions(-) diff --git a/docs/reference-1.0.3.html b/docs/reference-1.0.3.html index 61fdbdc7952..1c55d2f6f50 100644 --- a/docs/reference-1.0.3.html +++ b/docs/reference-1.0.3.html @@ -19773,9 +19773,9 @@

      Methods

      - + - diff --git a/docs/reference-1.1.0.html b/docs/reference-1.1.0.html index 384839396c4..cf857fa9c28 100644 --- a/docs/reference-1.1.0.html +++ b/docs/reference-1.1.0.html @@ -19903,9 +19903,9 @@

      Methods

      - + - diff --git a/docs/reference-1.2.0.html b/docs/reference-1.2.0.html index fa0fa819e03..7ec20f69480 100644 --- a/docs/reference-1.2.0.html +++ b/docs/reference-1.2.0.html @@ -19918,9 +19918,9 @@

      Methods

      - + - diff --git a/docs/reference-1.3.4.html b/docs/reference-1.3.4.html index a4f7dff66b1..7d08ea80e26 100644 --- a/docs/reference-1.3.4.html +++ b/docs/reference-1.3.4.html @@ -20120,9 +20120,9 @@

      Methods

      - + - diff --git a/docs/reference-1.4.0.html b/docs/reference-1.4.0.html index 3a4fd2afca7..38a69092a02 100644 --- a/docs/reference-1.4.0.html +++ b/docs/reference-1.4.0.html @@ -20133,9 +20133,9 @@

      Methods

      - + - diff --git a/docs/reference-1.6.0.html b/docs/reference-1.6.0.html index dfe9b74eb8a..1fa18a9b9f8 100644 --- a/docs/reference-1.6.0.html +++ b/docs/reference-1.6.0.html @@ -21025,9 +21025,9 @@

      Methods

      - + - diff --git a/src/core/Events.js b/src/core/Events.js index 9cb4704c745..c8d5da258f1 100644 --- a/src/core/Events.js +++ b/src/core/Events.js @@ -215,8 +215,9 @@ export var Events = { return this; }, - // @method listens(type: String): Boolean + // @method listens(type: String, propagate?: Boolean): Boolean // Returns `true` if a particular event type has any listeners attached to it. + // The verification can optionally be propagated, it will return `true` if parents have the listener attached to it. listens: function (type, propagate) { if (typeof type !== 'string') { console.warn('"string" type argument expected'); From 8fbb14937182a8c66c822fdc9baf06a4511d0e3d Mon Sep 17 00:00:00 2001 From: Eric Hippler <45562924+Hippl-Eric@users.noreply.github.com> Date: Fri, 26 Nov 2021 04:14:30 -0500 Subject: [PATCH 241/306] Update Renderer documentation to clarify tolerance option Canvas only (#7515) * update renderer doc to clarify tolerance option Canvas only * Revert "update renderer doc to clarify tolerance option Canvas only" This reverts commit 6d9e82fc20d2e5eb4c39ed1e8cbecf0e09dd58d6. * moved tolerance option from Render to Canvas * Refactor _clickTolerance Co-authored-by: johnd0e Co-authored-by: johnd0e --- src/layer/vector/Canvas.js | 9 +++++++++ src/layer/vector/Path.js | 3 ++- src/layer/vector/Renderer.js | 6 +----- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 2c5a3dfde9e..da16a33d347 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -38,6 +38,15 @@ import {Bounds} from '../../geometry/Bounds'; */ export var Canvas = Renderer.extend({ + + // @section + // @aka Canvas options + options: { + // @option tolerance: Number = 0 + // How much to extend the click tolerance around a path/object on the map. + tolerance: 0 + }, + getEvents: function () { var events = Renderer.prototype.getEvents.call(this); events.viewprereset = this._onViewPreReset; diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 9d80273ea74..494a420c358 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -142,6 +142,7 @@ export var Path = Layer.extend({ _clickTolerance: function () { // used when doing hit detection for Canvas layers - return (this.options.stroke ? this.options.weight / 2 : 0) + this._renderer.options.tolerance; + return (this.options.stroke ? this.options.weight / 2 : 0) + + (this._renderer.options.tolerance || 0); } }); diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index 424a179b8c2..d2e5e77dc03 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -34,11 +34,7 @@ export var Renderer = Layer.extend({ // @option padding: Number = 0.1 // How much to extend the clip area around the map view (relative to its size) // e.g. 0.1 would be 10% of map view in each direction - padding: 0.1, - - // @option tolerance: Number = 0 - // How much to extend click tolerance round a path/object on the map - tolerance : 0 + padding: 0.1 }, initialize: function (options) { From 25fce1684789da91e3c8db10e308b7f6274e66e6 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 26 Nov 2021 11:20:47 +0200 Subject: [PATCH 242/306] ignore built docs when running eslint --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 9128a8e8385..5b6f9eb5f2a 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,8 @@ "docs/docs/highlight", "docs/examples/choropleth", "docs/examples/geojson", - "docs/examples/map-panes" + "docs/examples/map-panes", + "docs/_site" ], "root": true, "globals": { From 18389fbe706ec69a08278f628b2941c97f675961 Mon Sep 17 00:00:00 2001 From: daverayment Date: Fri, 26 Nov 2021 09:23:07 +0000 Subject: [PATCH 243/306] Improve panInside documentation (#7397) * Improve panInside doc and add arg check * Removed unwanted parameter check. * Throw when padding value is not a point, plus test * New padding options docs and error checking * Update src/map/Map.js Co-authored-by: johnd0e * Error checking for fitBounds and flyToBounds * Separate padding options tests * Comment update on padding tests * Revert padding checks and associated tests * Remove extra blank line Co-authored-by: johnd0e Co-authored-by: Vladimir Agafonkin --- src/map/Map.js | 5 ++--- src/map/Map.methodOptions.leafdoc | 12 ++++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index fc7e8636ac8..bea6ab6a0ce 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -511,10 +511,9 @@ export var Map = Evented.extend({ return this; }, - // @method panInside(latlng: LatLng, options?: options): this + // @method panInside(latlng: LatLng, options?: padding options): this // Pans the map the minimum amount to make the `latlng` visible. Use - // `padding`, `paddingTopLeft` and `paddingBottomRight` options to fit - // the display to more restricted bounds, like [`fitBounds`](#map-fitbounds). + // padding options to fit the display to more restricted bounds. // If `latlng` is already within the (optionally padded) display bounds, // the map will not be panned. panInside: function (latlng, options) { diff --git a/src/map/Map.methodOptions.leafdoc b/src/map/Map.methodOptions.leafdoc index 8ce8aad5af2..c8abbe1df50 100644 --- a/src/map/Map.methodOptions.leafdoc +++ b/src/map/Map.methodOptions.leafdoc @@ -86,10 +86,8 @@ panning inertia). @inherits Pan options -@miniclass FitBounds options (Map) -@aka fitBounds options -@inherits Zoom/pan options - +@miniclass Padding options (Map) +@aka padding options @option paddingTopLeft: Point = [0, 0] Sets the amount of padding in the top left corner of a map container that shouldn't be accounted for when setting the view to fit bounds. Useful if you @@ -102,6 +100,12 @@ The same for the bottom right corner of the map. @option padding: Point = [0, 0] Equivalent of setting both top left and bottom right padding to the same value. + +@miniclass FitBounds options (Map) +@aka fitBounds options +@inherits Zoom/pan options +@inherits Padding options + @option maxZoom: Number = null The maximum possible zoom to use. From 38c0c55ff02d30d7d02733d723385ee488d910ef Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 26 Nov 2021 13:07:16 +0200 Subject: [PATCH 244/306] Fix #7439 for mousemove (#7809) We need pass event to map when canvas does not have targets --- spec/suites/layer/vector/CanvasSpec.js | 7 +++++++ src/layer/vector/Canvas.js | 4 +--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/spec/suites/layer/vector/CanvasSpec.js b/spec/suites/layer/vector/CanvasSpec.js index 7506500fa68..5faeaad1402 100644 --- a/spec/suites/layer/vector/CanvasSpec.js +++ b/spec/suites/layer/vector/CanvasSpec.js @@ -94,6 +94,13 @@ describe('Canvas', function () { expect(spyCircle.callCount).to.eql(1); }); + it("should not block mousemove event going to non-canvas features", function () { + var spyMap = sinon.spy(); + map.on("mousemove", spyMap); + happen.at('mousemove', 151, 151); // empty space + expect(spyMap.calledOnce).to.be.ok(); + }); + it("should fire preclick before click", function () { var clickSpy = sinon.spy(); var preclickSpy = sinon.spy(); diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index da16a33d347..c76284fb96a 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -410,9 +410,7 @@ export var Canvas = Renderer.extend({ } } - if (this._hoveredLayer) { - this._fireEvent([this._hoveredLayer], e); - } + this._fireEvent(this._hoveredLayer ? [this._hoveredLayer] : false, e); this._mouseHoverThrottled = true; setTimeout(Util.bind(function () { From 05fa5802a65c21db7d2ee6246c5b6fb59d1c25d7 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Fri, 26 Nov 2021 13:38:24 +0200 Subject: [PATCH 245/306] New TapHold handler instead of legacy Tap (#7026) * Replace legacy over-functional Tap handler with much simpler TapHold handler as currently it is needed only for single purpose: emulate `contextmenu` on iOS. * `tapHold` map option can be forced now Anyway, this option is not meant to be explicit, any overriding is useful for debug purposes only. * Remove Map.Tap * Get rid of deprecated initMouseEvent Use MouseEvent constructor. Note: some properties are commented out, as they may vary between browsers. Ref: - https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/initMouseEvent - https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent Compatibility: - https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent#browser_compatibility Some legacy browsers lacks support, but here we care only about iOS Safari. (Anyway it can be solved with polyfill) * Add tests for Map.TapHold.js --- dist/leaflet.css | 3 - spec/index.html | 1 + spec/suites/map/handler/Map.TapHoldSpec.js | 209 +++++++++++++++++++++ src/dom/Draggable.js | 23 +-- src/map/Map.js | 2 +- src/map/handler/Map.Tap.js | 136 -------------- src/map/handler/Map.TapHold.js | 102 ++++++++++ src/map/index.js | 4 +- 8 files changed, 322 insertions(+), 158 deletions(-) create mode 100644 spec/suites/map/handler/Map.TapHoldSpec.js delete mode 100644 src/map/handler/Map.Tap.js create mode 100644 src/map/handler/Map.TapHold.js diff --git a/dist/leaflet.css b/dist/leaflet.css index 5630816cfaf..048250525ad 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -261,9 +261,6 @@ svg.leaflet-image-layer.leaflet-interactive path { .leaflet-container a { color: #0078A8; } -.leaflet-container a.leaflet-active { - outline: 2px solid orange; - } .leaflet-zoom-box { border: 2px dotted #38f; background: rgba(255,255,255,0.5); diff --git a/spec/index.html b/spec/index.html index 86597ee06e9..f80903a8c1f 100644 --- a/spec/index.html +++ b/spec/index.html @@ -94,6 +94,7 @@ + diff --git a/spec/suites/map/handler/Map.TapHoldSpec.js b/spec/suites/map/handler/Map.TapHoldSpec.js new file mode 100644 index 00000000000..6378ff08ca8 --- /dev/null +++ b/spec/suites/map/handler/Map.TapHoldSpec.js @@ -0,0 +1,209 @@ +describe('Map.TapHoldSpec.js', function () { + var el, clock, spy, map; + + var posStart = {clientX:1, clientY:1}; + var posNear = {clientX:10, clientY:10}; + var posFar = {clientX:100, clientY:100}; + + beforeEach(function () { + el = document.createElement('div'); + document.body.appendChild(el); + + clock = sinon.useFakeTimers(); + clock.tick(1000); + spy = sinon.spy(); + + map = L.map(el, { + center: [51.505, -0.09], + zoom: 13, + tapHold: true + }); + map.on('contextmenu', spy); + + posStart.target = el; + posNear.target = el; + posFar.target = el; + }); + + afterEach(function () { + happen.once(el, {type: 'touchend'}); + for (var id = 0; id <= 2; id++) { // reset pointers (for prosphetic-hand) + happen.once(el, {type: 'pointercancel', pointerId:id}); + } + clock.restore(); + map.remove(); + document.body.removeChild(el); + }); + + it('fires synthetic contextmenu after hold delay>600', function () { + happen.once(el, {type: 'touchstart', touches: [posStart]}); + happen.once(el, L.extend({type: 'pointerdown', pointerId:0}, posStart)); + clock.tick(550); + + expect(spy.notCalled).to.be.ok(); + + clock.tick(100); + + expect(spy.called).to.be.ok(); + expect(spy.calledOnce).to.be.ok(); + + var event = spy.lastCall.args[0]; + expect(event.type).to.be('contextmenu'); + expect(event.originalEvent._simulated).to.be.ok(); + }); + + it('does not fire contextmenu when touches > 1', function () { + happen.once(el, {type: 'touchstart', touches: [posStart]}); + happen.once(el, L.extend({type: 'pointerdown', pointerId:0}, posStart)); + clock.tick(100); + happen.once(el, {type: 'touchstart', touches: [posStart, posNear]}); + happen.once(el, L.extend({type: 'pointerdown', pointerId:1}, posNear)); + clock.tick(550); + + expect(spy.notCalled).to.be.ok(); + }); + + it('does not fire contextmenu when touches > 1 (case:2)', function () { + happen.once(el, {type: 'touchstart', touches: [posStart]}); + happen.once(el, L.extend({type: 'pointerdown', pointerId:0}, posStart)); + clock.tick(100); + happen.once(el, {type: 'touchstart', touches: [posStart, posNear]}); + happen.once(el, L.extend({type: 'pointerdown', pointerId:1}, posNear)); + clock.tick(100); + happen.once(el, {type: 'touchend', touches: [posStart]}); + happen.once(el, L.extend({type: 'pointerup', pointerId:0}, posNear)); + clock.tick(450); + + expect(spy.notCalled).to.be.ok(); + }); + + (L.Browser.pointer ? it : it.skip)('ignores events from mouse', function () { + happen.once(el, L.extend({type: 'pointerdown', pointerId:0, pointerType:'mouse'}, posStart)); + clock.tick(650); + + expect(spy.notCalled).to.be.ok(); + }); + + it('does not conflict with native contextmenu', function () { + happen.once(el, {type: 'touchstart', touches: [posStart]}); + happen.once(el, L.extend({type: 'pointerdown', pointerId:0}, posStart)); + clock.tick(550); + + happen.once(el, {type: 'contextmenu'}); + + clock.tick(100); + + expect(spy.called).to.be.ok(); + expect(spy.calledOnce).to.be.ok(); + expect(spy.lastCall.args[0].originalEvent._simulated).not.to.be.ok(); + + // Note: depending on tapHoldDelay value it's also possible that native contextmenu may come after simulated one + // and the only way to handle this gracefully - increase tapHoldDelay value. + // Anyway that is edge case, as tapHold is meant for browsers where native contextmenu is not fired on touch. + }); + + it.skip('prevents native click', function () { // to be performed by hand + // Not valid here, as there is no way to initiate native click with fake touch + var clickSpy = sinon.spy(); + map.on('click', clickSpy); + + happen.once(el, {type: 'touchstart', touches: [posStart]}); + happen.once(el, L.extend({type: 'pointerdown', pointerId:0}, posStart)); + clock.tick(650); + happen.once(el, {type: 'touchend', touches: [posStart]}); + happen.once(el, L.extend({type: 'pointerup', pointerId:0}, posNear)); + + expect(clickSpy.notCalled).to.be.ok(); + }); + + it('allows short movements', function () { + happen.once(el, {type: 'touchstart', touches: [posStart]}); + happen.once(el, L.extend({type: 'pointerdown', pointerId:0}, posStart)); + clock.tick(550); + + happen.once(el, {type: 'touchmove', touches: [posNear]}); + happen.once(el, L.extend({type: 'pointermove', pointerId:0}, posNear)); + + clock.tick(100); + + expect(spy.called).to.be.ok(); + }); + + it('ignores long movements', function () { + expect(L.point(posStart.clientX, posStart.clientY).distanceTo([posFar.clientX, posFar.clientY])) + .to.be.above(map.options.tapTolerance); + + happen.once(el, {type: 'touchstart', touches: [posStart]}); + happen.once(el, L.extend({type: 'pointerdown', pointerId:0}, posStart)); + clock.tick(550); + + happen.once(el, {type: 'touchmove', touches: [posFar]}); + happen.once(el, L.extend({type: 'pointermove', pointerId:0}, posFar)); + + clock.tick(100); + + expect(spy.notCalled).to.be.ok(); + }); + + it('.originalEvent has expected properties', function () { + L.extend(posStart, { + screenX: 2, + screenY: 2, + }); + + happen.once(el, {type: 'touchstart', touches: [posStart]}); + happen.once(el, L.extend({type: 'pointerdown', pointerId:0}, posStart)); + clock.tick(650); + + var originalEvent = spy.lastCall.args[0].originalEvent; + var expectedProps = L.extend({ + type: 'contextmenu', + bubbles: true, + cancelable: true, + target: el + }, posStart); + for (var prop in expectedProps) { + expect(originalEvent[prop]).to.be(expectedProps[prop]); + } + }); +}); + +// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent#polyfill +// required for PhantomJS + +(function (window) { + try { + new MouseEvent('test'); // eslint-disable-line no-new + return false; // No need to polyfill + } catch (e) { + // Need to polyfill - fall through + } + + // Polyfills DOM4 MouseEvent + var MouseEventPolyfill = function (eventType, params) { + params = params || {bubbles: false, cancelable: false}; + var mouseEvent = document.createEvent('MouseEvent'); + mouseEvent.initMouseEvent(eventType, + params.bubbles, + params.cancelable, + window, + 0, + params.screenX || 0, + params.screenY || 0, + params.clientX || 0, + params.clientY || 0, + params.ctrlKey || false, + params.altKey || false, + params.shiftKey || false, + params.metaKey || false, + params.button || 0, + params.relatedTarget || null + ); + + return mouseEvent; + }; + + MouseEventPolyfill.prototype = Event.prototype; + + window.MouseEvent = MouseEventPolyfill; +})(window); diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 37acb5018a1..4a39c9faa19 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -72,12 +72,9 @@ export var Draggable = Evented.extend({ }, _onDown: function (e) { - // Ignore simulated events, since we handle both touch and - // mouse explicitly; otherwise we risk getting duplicates of - // touch events, see #4315. - // Also ignore the event if disabled; this happens in IE11 + // Ignore the event if disabled; this happens in IE11 // under some circumstances, see #3666. - if (e._simulated || !this._enabled) { return; } + if (!this._enabled) { return; } this._moved = false; @@ -113,12 +110,9 @@ export var Draggable = Evented.extend({ }, _onMove: function (e) { - // Ignore simulated events, since we handle both touch and - // mouse explicitly; otherwise we risk getting duplicates of - // touch events, see #4315. - // Also ignore the event if disabled; this happens in IE11 + // Ignore the event if disabled; this happens in IE11 // under some circumstances, see #3666. - if (e._simulated || !this._enabled) { return; } + if (!this._enabled) { return; } if (e.touches && e.touches.length > 1) { this._moved = true; @@ -180,13 +174,10 @@ export var Draggable = Evented.extend({ this.fire('drag', e); }, - _onUp: function (e) { - // Ignore simulated events, since we handle both touch and - // mouse explicitly; otherwise we risk getting duplicates of - // touch events, see #4315. - // Also ignore the event if disabled; this happens in IE11 + _onUp: function () { + // Ignore the event if disabled; this happens in IE11 // under some circumstances, see #3666. - if (e._simulated || !this._enabled) { return; } + if (!this._enabled) { return; } this.finishDrag(); }, diff --git a/src/map/Map.js b/src/map/Map.js index bea6ab6a0ce..67527700776 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -1348,7 +1348,7 @@ export var Map = Evented.extend({ while (src) { target = this._targets[Util.stamp(src)]; - if (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) { + if (target && (type === 'click' || type === 'preclick') && this._draggableMoved(target)) { // Prevent firing click after you just dragged an object. dragging = true; break; diff --git a/src/map/handler/Map.Tap.js b/src/map/handler/Map.Tap.js deleted file mode 100644 index 99712e327f8..00000000000 --- a/src/map/handler/Map.Tap.js +++ /dev/null @@ -1,136 +0,0 @@ -import {Map} from '../Map'; -import {Handler} from '../../core/Handler'; -import * as DomEvent from '../../dom/DomEvent'; -import {Point} from '../../geometry/Point'; -import * as Util from '../../core/Util'; -import * as DomUtil from '../../dom/DomUtil'; -import * as Browser from '../../core/Browser'; - - -/* - * L.Map.Tap is used to enable mobile hacks like quick taps and long hold. - */ - -// @namespace Map -// @section Interaction Options -Map.mergeOptions({ - // @section Touch interaction options - // @option tap: Boolean - // Enables mobile hacks for supporting instant taps (fixing 200ms click - // delay on iOS/Android) and touch holds (fired as `contextmenu` events). - // This is legacy option, by default enabled in mobile Safari only - // (because we still need `contextmenu` simulation for iOS). - tap: Browser.safari && Browser.mobile, - - // @option tapTolerance: Number = 15 - // The max number of pixels a user can shift his finger during touch - // for it to be considered a valid tap. - tapTolerance: 15 -}); - -export var Tap = Handler.extend({ - addHooks: function () { - DomEvent.on(this._map._container, 'touchstart', this._onDown, this); - }, - - removeHooks: function () { - DomEvent.off(this._map._container, 'touchstart', this._onDown, this); - }, - - _onDown: function (e) { - if (!e.touches) { return; } - - DomEvent.preventDefault(e); - - this._fireClick = true; - - // don't simulate click or track longpress if more than 1 touch - if (e.touches.length > 1) { - this._fireClick = false; - clearTimeout(this._holdTimeout); - return; - } - - var first = e.touches[0], - el = first.target; - - this._startPos = this._newPos = new Point(first.clientX, first.clientY); - - // if touching a link, highlight it - if (el.tagName && el.tagName.toLowerCase() === 'a') { - DomUtil.addClass(el, 'leaflet-active'); - } - - // simulate long hold but setting a timeout - this._holdTimeout = setTimeout(Util.bind(function () { - if (this._isTapValid()) { - this._fireClick = false; - this._onUp(); - this._simulateEvent('contextmenu', first); - } - }, this), 1000); - - this._simulateEvent('mousedown', first); - - DomEvent.on(document, { - touchmove: this._onMove, - touchend: this._onUp - }, this); - }, - - _onUp: function (e) { - clearTimeout(this._holdTimeout); - - DomEvent.off(document, { - touchmove: this._onMove, - touchend: this._onUp - }, this); - - if (this._fireClick && e && e.changedTouches) { - - var first = e.changedTouches[0], - el = first.target; - - if (el && el.tagName && el.tagName.toLowerCase() === 'a') { - DomUtil.removeClass(el, 'leaflet-active'); - } - - this._simulateEvent('mouseup', first); - - // simulate click if the touch didn't move too much - if (this._isTapValid()) { - this._simulateEvent('click', first); - } - } - }, - - _isTapValid: function () { - return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance; - }, - - _onMove: function (e) { - var first = e.touches[0]; - this._newPos = new Point(first.clientX, first.clientY); - this._simulateEvent('mousemove', first); - }, - - _simulateEvent: function (type, e) { - var simulatedEvent = document.createEvent('MouseEvents'); - - simulatedEvent._simulated = true; - e.target._simulatedClick = true; - - simulatedEvent.initMouseEvent( - type, true, true, window, 1, - e.screenX, e.screenY, - e.clientX, e.clientY, - false, false, false, false, 0, null); - - e.target.dispatchEvent(simulatedEvent); - } -}); - -// @section Handlers -// @property tap: Handler -// Mobile touch hacks (quick tap and touch hold) handler. -Map.addInitHook('addHandler', 'tap', Tap); diff --git a/src/map/handler/Map.TapHold.js b/src/map/handler/Map.TapHold.js new file mode 100644 index 00000000000..68a8f03214e --- /dev/null +++ b/src/map/handler/Map.TapHold.js @@ -0,0 +1,102 @@ +import {Map} from '../Map'; +import {Handler} from '../../core/Handler'; +import * as DomEvent from '../../dom/DomEvent'; +import {Point} from '../../geometry/Point'; +import * as Util from '../../core/Util'; +import * as Browser from '../../core/Browser'; + +/* + * L.Map.TapHold is used to simulate `contextmenu` event on long hold, + * which otherwise is not fired by mobile Safari. + */ + +var tapHoldDelay = 600; + +// @namespace Map +// @section Interaction Options +Map.mergeOptions({ + // @section Touch interaction options + // @option tapHold: Boolean + // Enables simulation of `contextmenu` event, default is `true` for mobile Safari. + tapHold: Browser.touchNative && Browser.safari && Browser.mobile, + + // @option tapTolerance: Number = 15 + // The max number of pixels a user can shift his finger during touch + // for it to be considered a valid tap. + tapTolerance: 15 +}); + +export var TapHold = Handler.extend({ + addHooks: function () { + DomEvent.on(this._map._container, 'touchstart', this._onDown, this); + }, + + removeHooks: function () { + DomEvent.off(this._map._container, 'touchstart', this._onDown, this); + }, + + _onDown: function (e) { + clearTimeout(this._holdTimeout); + if (e.touches.length !== 1) { return; } + + var first = e.touches[0]; + this._startPos = this._newPos = new Point(first.clientX, first.clientY); + + this._holdTimeout = setTimeout(Util.bind(function () { + this._cancel(); + if (!this._isTapValid()) { return; } + + // prevent simulated mouse events https://w3c.github.io/touch-events/#mouse-events + DomEvent.on(document, 'touchend', DomEvent.preventDefault); + DomEvent.on(document, 'touchend touchcancel', this._cancelClickPrevent); + this._simulateEvent('contextmenu', first); + }, this), tapHoldDelay); + + DomEvent.on(document, 'touchend touchcancel contextmenu', this._cancel, this); + DomEvent.on(document, 'touchmove', this._onMove, this); + }, + + _cancelClickPrevent: function cancelClickPrevent() { + DomEvent.off(document, 'touchend', DomEvent.preventDefault); + DomEvent.off(document, 'touchend touchcancel', cancelClickPrevent); + }, + + _cancel: function () { + clearTimeout(this._holdTimeout); + DomEvent.off(document, 'touchend touchcancel contextmenu', this._cancel, this); + DomEvent.off(document, 'touchmove', this._onMove, this); + }, + + _onMove: function (e) { + var first = e.touches[0]; + this._newPos = new Point(first.clientX, first.clientY); + }, + + _isTapValid: function () { + return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance; + }, + + _simulateEvent: function (type, e) { + var simulatedEvent = new MouseEvent(type, { + bubbles: true, + cancelable: true, + view: window, + // detail: 1, + screenX: e.screenX, + screenY: e.screenY, + clientX: e.clientX, + clientY: e.clientY, + // button: 2, + // buttons: 2 + }); + + simulatedEvent._simulated = true; + + e.target.dispatchEvent(simulatedEvent); + } +}); + +// @section Handlers +// @property tapHold: Handler +// Long tap handler to simulate `contextmenu` event (useful in mobile Safari). +Map.addInitHook('addHandler', 'tapHold', TapHold); diff --git a/src/map/index.js b/src/map/index.js index bc737908668..e35f7553364 100644 --- a/src/map/index.js +++ b/src/map/index.js @@ -9,8 +9,8 @@ import {Keyboard} from './handler/Map.Keyboard'; Map.Keyboard = Keyboard; import {ScrollWheelZoom} from './handler/Map.ScrollWheelZoom'; Map.ScrollWheelZoom = ScrollWheelZoom; -import {Tap} from './handler/Map.Tap'; -Map.Tap = Tap; +import {TapHold} from './handler/Map.TapHold'; +Map.TapHold = TapHold; import {TouchZoom} from './handler/Map.TouchZoom'; Map.TouchZoom = TouchZoom; From 2e8638761ca91506e3dc2b132da4c8185aab27f0 Mon Sep 17 00:00:00 2001 From: Andrew Cherniavskii Date: Fri, 26 Nov 2021 16:39:17 +0100 Subject: [PATCH 246/306] [GridLayer] redraw tiles properly after changing maxNativeZoom (#6443) --- spec/suites/layer/tile/GridLayerSpec.js | 12 ++++++++++++ src/layer/tile/GridLayer.js | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index f5ce05f6b05..dd70c9081c0 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -354,6 +354,18 @@ describe('GridLayer', function () { map.addLayer(grid); }); + + it("redraws tiles properly after changing maxNativeZoom", function () { + var initialZoom = 12; + map.setView([0, 0], initialZoom); + + var grid = L.gridLayer().addTo(map); + expect(grid._tileZoom).to.be(initialZoom); + + grid.options.maxNativeZoom = 11; + grid.redraw(); + expect(grid._tileZoom).to.be(11); + }); }); describe("number of 256px tiles loaded in synchronous non-animated grid @800x600px", function () { diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 91183d324e0..2b3ea4d0f00 100755 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -228,6 +228,11 @@ export var GridLayer = Layer.extend({ redraw: function () { if (this._map) { this._removeAllTiles(); + var tileZoom = this._clampZoom(this._map.getZoom()); + if (tileZoom !== this._tileZoom) { + this._tileZoom = tileZoom; + this._updateLevels(); + } this._update(); } return this; From 1e7f27331af485fc806f8f6c9421a6fc9ffb3995 Mon Sep 17 00:00:00 2001 From: Falke Design Date: Fri, 26 Nov 2021 21:17:11 +0100 Subject: [PATCH 247/306] Simplifiy examples (#7816) * Replace mymap with map * Updated quick-start - added variables * Add variable names Add variable names * Replace blanks with tabs --- docs/examples/choropleth/example-basic.md | 2 +- docs/examples/choropleth/example-color.md | 2 +- docs/examples/choropleth/example.md | 2 +- .../crs-simple/crs-simple-example2.md | 4 +- .../crs-simple/crs-simple-example3.md | 8 ++-- .../examples/custom-icons/example-one-icon.md | 2 +- docs/examples/custom-icons/example.md | 6 +-- docs/examples/extending/canvascircles.md | 3 +- docs/examples/extending/gridcoords.md | 3 +- docs/examples/extending/kittenlayer.md | 3 +- docs/examples/extending/watermark.md | 2 +- docs/examples/geojson/example.md | 6 +-- docs/examples/geojson/geojson-example.html | 6 +-- docs/examples/layers-control/example.md | 10 ++--- docs/examples/mobile/example.md | 8 ++-- docs/examples/quick-start/example-basic.md | 6 +-- docs/examples/quick-start/example-overlays.md | 16 ++++---- docs/examples/quick-start/example-popups.md | 38 ------------------- docs/examples/quick-start/example.md | 28 ++++++++------ docs/examples/quick-start/index.md | 22 +++++------ docs/examples/video-overlay/example-bounds.md | 4 +- .../video-overlay/example-nocontrols.md | 2 +- docs/examples/video-overlay/example.md | 15 +++++--- docs/examples/wms/wms-example3.md | 2 +- docs/examples/zoom-levels/example-delta.md | 2 +- .../zoom-levels/example-fractional.md | 2 +- docs/examples/zoom-levels/example-scale.md | 2 +- docs/examples/zoom-levels/example-setzoom.md | 2 +- 28 files changed, 92 insertions(+), 116 deletions(-) delete mode 100644 docs/examples/quick-start/example-popups.md diff --git a/docs/examples/choropleth/example-basic.md b/docs/examples/choropleth/example-basic.md index 3e283f461e4..fa4fac82508 100644 --- a/docs/examples/choropleth/example-basic.md +++ b/docs/examples/choropleth/example-basic.md @@ -7,7 +7,7 @@ title: Choropleth Tutorial var map = L.map('map').setView([37.8, -96], 4); - L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + var tiles = L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'Imagery © Mapbox', diff --git a/docs/examples/choropleth/example-color.md b/docs/examples/choropleth/example-color.md index 26a31404f71..e41103fd813 100644 --- a/docs/examples/choropleth/example-color.md +++ b/docs/examples/choropleth/example-color.md @@ -8,7 +8,7 @@ title: Choropleth Tutorial var map = L.map('map').setView([37.8, -96], 4); - L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + var tiles = L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'Imagery © Mapbox', diff --git a/docs/examples/choropleth/example.md b/docs/examples/choropleth/example.md index 7232b9bf2c0..3deb154225e 100644 --- a/docs/examples/choropleth/example.md +++ b/docs/examples/choropleth/example.md @@ -38,7 +38,7 @@ css: "#map { var map = L.map('map').setView([37.8, -96], 4); - L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { + var tiles = L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + 'Imagery © Mapbox', diff --git a/docs/examples/crs-simple/crs-simple-example2.md b/docs/examples/crs-simple/crs-simple-example2.md index 3344a8c3a69..9d8b0a6d744 100644 --- a/docs/examples/crs-simple/crs-simple-example2.md +++ b/docs/examples/crs-simple/crs-simple-example2.md @@ -13,8 +13,8 @@ title: CRS.Simple example var image = L.imageOverlay('uqm_map_full.png', bounds).addTo(map); var sol = L.latLng([ 145, 175 ]); - L.marker(sol).addTo(map); + var marker = L.marker(sol).addTo(map); map.setView( [70, 120], 1); - \ No newline at end of file + diff --git a/docs/examples/crs-simple/crs-simple-example3.md b/docs/examples/crs-simple/crs-simple-example3.md index eba513b5253..df2e4b2304a 100644 --- a/docs/examples/crs-simple/crs-simple-example3.md +++ b/docs/examples/crs-simple/crs-simple-example3.md @@ -26,10 +26,10 @@ title: CRS.Simple example var kruegerZ = xy( 13.4, 56.5); var deneb = xy(218.7, 8.3); - L.marker( sol).addTo(map).bindPopup( 'Sol'); - L.marker( mizar).addTo(map).bindPopup( 'Mizar'); - L.marker(kruegerZ).addTo(map).bindPopup('Krueger-Z'); - L.marker( deneb).addTo(map).bindPopup( 'Deneb'); + var mSol = L.marker(sol).addTo(map).bindPopup('Sol'); + var mMizar = L.marker(mizar).addTo(map).bindPopup('Mizar'); + var mKruegerZ = L.marker(kruegerZ).addTo(map).bindPopup('Krueger-Z'); + var mDeneb = L.marker(deneb).addTo(map).bindPopup('Deneb'); var travel = L.polyline([sol, deneb]).addTo(map); diff --git a/docs/examples/custom-icons/example-one-icon.md b/docs/examples/custom-icons/example-one-icon.md index b5f909eceeb..22bac8ebd3a 100644 --- a/docs/examples/custom-icons/example-one-icon.md +++ b/docs/examples/custom-icons/example-one-icon.md @@ -22,6 +22,6 @@ title: Custom Icons Tutorial var greenIcon = new LeafIcon({iconUrl: 'leaf-green.png'}); - L.marker([51.5, -0.09], {icon: greenIcon}).addTo(map); + var mGreen = L.marker([51.5, -0.09], {icon: greenIcon}).addTo(map); diff --git a/docs/examples/custom-icons/example.md b/docs/examples/custom-icons/example.md index 83c7858c8fa..b2a949d861c 100644 --- a/docs/examples/custom-icons/example.md +++ b/docs/examples/custom-icons/example.md @@ -24,8 +24,8 @@ title: Custom Icons Tutorial redIcon = new LeafIcon({iconUrl: 'leaf-red.png'}), orangeIcon = new LeafIcon({iconUrl: 'leaf-orange.png'}); - L.marker([51.5, -0.09], {icon: greenIcon}).bindPopup("I am a green leaf.").addTo(map); - L.marker([51.495, -0.083], {icon: redIcon}).bindPopup("I am a red leaf.").addTo(map); - L.marker([51.49, -0.1], {icon: orangeIcon}).bindPopup("I am an orange leaf.").addTo(map); + var mGreen = L.marker([51.5, -0.09], {icon: greenIcon}).bindPopup("I am a green leaf.").addTo(map); + var mRed = L.marker([51.495, -0.083], {icon: redIcon}).bindPopup("I am a red leaf.").addTo(map); + var mOrange = L.marker([51.49, -0.1], {icon: orangeIcon}).bindPopup("I am an orange leaf.").addTo(map); diff --git a/docs/examples/extending/canvascircles.md b/docs/examples/extending/canvascircles.md index 0758feb24c0..d56e5ebdbfb 100644 --- a/docs/examples/extending/canvascircles.md +++ b/docs/examples/extending/canvascircles.md @@ -32,6 +32,7 @@ title: CanvasCircles return new L.GridLayer.CanvasCircles(opts); }; - map.addLayer( L.gridLayer.canvasCircles() ); + var cavasGridLayer = L.gridLayer.canvasCircles(); + map.addLayer( cavasGridLayer ); diff --git a/docs/examples/extending/gridcoords.md b/docs/examples/extending/gridcoords.md index 9f4783e034c..c7b2eb7e503 100644 --- a/docs/examples/extending/gridcoords.md +++ b/docs/examples/extending/gridcoords.md @@ -27,6 +27,7 @@ title: Grid coordinates return new L.GridLayer.DebugCoords(opts); }; - map.addLayer( L.gridLayer.debugCoords() ); + var debugCoordsGrid = L.gridLayer.debugCoords(); + map.addLayer( debugCoordsGrid ); diff --git a/docs/examples/extending/kittenlayer.md b/docs/examples/extending/kittenlayer.md index b28e169fb7f..7fb5f6e33fa 100644 --- a/docs/examples/extending/kittenlayer.md +++ b/docs/examples/extending/kittenlayer.md @@ -24,6 +24,7 @@ title: KittenLayer return new L.TileLayer.Kitten(); } - map.addLayer( L.tileLayer.kitten() ); + var kittenTiles = L.tileLayer.kitten(); + map.addLayer( kittenTiles ); diff --git a/docs/examples/extending/watermark.md b/docs/examples/extending/watermark.md index 7c4b3fdafc9..21402a39124 100644 --- a/docs/examples/extending/watermark.md +++ b/docs/examples/extending/watermark.md @@ -31,6 +31,6 @@ title: Watermark control return new L.Control.Watermark(opts); } - L.control.watermark({ position: 'bottomleft' }).addTo(map); + var watermarkControl = L.control.watermark({ position: 'bottomleft' }).addTo(map); diff --git a/docs/examples/geojson/example.md b/docs/examples/geojson/example.md index dbec5d185df..b1ce2063a71 100644 --- a/docs/examples/geojson/example.md +++ b/docs/examples/geojson/example.md @@ -7,7 +7,7 @@ title: GeoJSON tutorial diff --git a/docs/examples/mobile/example.md b/docs/examples/mobile/example.md index 89f953de2cd..44d377ab85b 100644 --- a/docs/examples/mobile/example.md +++ b/docs/examples/mobile/example.md @@ -13,7 +13,7 @@ css: "body { diff --git a/docs/examples/quick-start/example-overlays.md b/docs/examples/quick-start/example-overlays.md index 20675671dd5..97798cf9796 100644 --- a/docs/examples/quick-start/example-overlays.md +++ b/docs/examples/quick-start/example-overlays.md @@ -6,31 +6,31 @@ customMapContainer: "true"
      diff --git a/docs/examples/quick-start/example-popups.md b/docs/examples/quick-start/example-popups.md deleted file mode 100644 index 5ea74f6bc77..00000000000 --- a/docs/examples/quick-start/example-popups.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -layout: tutorial_frame -title: Quick Start -customMapContainer: "true" ---- -
      - diff --git a/docs/examples/quick-start/example.md b/docs/examples/quick-start/example.md index 4bccff1b641..16b87ca1a48 100644 --- a/docs/examples/quick-start/example.md +++ b/docs/examples/quick-start/example.md @@ -6,42 +6,46 @@ customMapContainer: "true"
      diff --git a/docs/examples/quick-start/index.md b/docs/examples/quick-start/index.md index faf12bf1351..2b6aeeec263 100644 --- a/docs/examples/quick-start/index.md +++ b/docs/examples/quick-start/index.md @@ -44,7 +44,7 @@ Now you're ready to initialize the map and do some stuff with it. Let's create a map of the center of London with pretty Mapbox Streets tiles. First we'll initialize the map and set its view to our chosen geographical coordinates and a zoom level: - var mymap = L.map('map').setView([51.505, -0.09], 13); + var map = L.map('map').setView([51.505, -0.09], 13); By default (as we didn't pass any options when creating the map instance), all mouse and touch interactions on the map are enabled, and it has zoom and attribution controls. @@ -59,7 +59,7 @@ Next, we'll add a tile layer to add to our map, in this case it's a Mapbox Stree tileSize: 512, zoomOffset: -1, accessToken: 'your.mapbox.access.token' -}).addTo(mymap); +}).addTo(map); Make sure all the code is called after the `div` and `leaflet.js` inclusion. That's it! You have a working Leaflet map now. @@ -75,7 +75,7 @@ Whenever using anything based on OpenStreetMap, an *attribution* is obligatory a Besides tile layers, you can easily add other things to your map, including markers, polylines, polygons, circles, and popups. Let's add a marker: - var marker = L.marker([51.5, -0.09]).addTo(mymap); + var marker = L.marker([51.5, -0.09]).addTo(map); Adding a circle is the same (except for specifying the radius in meters as a second argument), but lets you control how it looks by passing options as the last argument when creating the object: @@ -84,7 +84,7 @@ Adding a circle is the same (except for specifying the radius in meters as a sec fillColor: '#f03', fillOpacity: 0.5, radius: 500 - }).addTo(mymap); + }).addTo(map); Adding a polygon is as easy: @@ -92,12 +92,12 @@ Adding a polygon is as easy: [51.509, -0.08], [51.503, -0.06], [51.51, -0.047] - ]).addTo(mymap); + ]).addTo(map); ### Working with popups -{% include frame.html url="example-popups.html" %} +{% include frame.html url="example.html" %} Popups are usually used when you want to attach some information to a particular object on a map. Leaflet has a very handy shortcut for this: @@ -110,9 +110,9 @@ Try clicking on our objects. The `bindPopup` method attaches a popup with the sp You can also use popups as layers (when you need something more than attaching a popup to an object): var popup = L.popup() - .setLatLng([51.5, -0.09]) + .setLatLng([51.513, -0.09]) .setContent("I am a standalone popup.") - .openOn(mymap); + .openOn(map); Here we use `openOn` instead of `addTo` because it handles automatic closing of a previously opened popup when opening a new one which is good for usability. @@ -125,7 +125,7 @@ Every time something happens in Leaflet, e.g. user clicks on a marker or map zoo alert("You clicked the map at " + e.latlng); } - mymap.on('click', onMapClick); + map.on('click', onMapClick); Each object has its own set of events --- see [documentation](/reference.html) for details. The first argument of the listener function is an event object --- it contains useful information about the event that happened. For example, map click event object (`e` in the example above) has `latlng` property which is a location at which the click occurred. @@ -137,10 +137,10 @@ Let's improve our example by using a popup instead of an alert: popup .setLatLng(e.latlng) .setContent("You clicked the map at " + e.latlng.toString()) - .openOn(mymap); + .openOn(map); } - mymap.on('click', onMapClick); + map.on('click', onMapClick); Try clicking on the map and you will see the coordinates in a popup. View the full example → diff --git a/docs/examples/video-overlay/example-bounds.md b/docs/examples/video-overlay/example-bounds.md index cbd1c426a96..578c2046ccc 100644 --- a/docs/examples/video-overlay/example-bounds.md +++ b/docs/examples/video-overlay/example-bounds.md @@ -5,7 +5,7 @@ title: Video Overlay Tutorial diff --git a/docs/examples/wms/wms-example3.md b/docs/examples/wms/wms-example3.md index e4d4d7d6d43..c120314b521 100644 --- a/docs/examples/wms/wms-example3.md +++ b/docs/examples/wms/wms-example3.md @@ -27,7 +27,7 @@ title: WMS example }) }; - L.control.layers(basemaps, {}, {collapsed: false}).addTo(map); + var layerControl = L.control.layers(basemaps, {}, {collapsed: false}).addTo(map); basemaps.Topography.addTo(map); diff --git a/docs/examples/zoom-levels/example-delta.md b/docs/examples/zoom-levels/example-delta.md index e837606808b..df58fa2ee75 100644 --- a/docs/examples/zoom-levels/example-delta.md +++ b/docs/examples/zoom-levels/example-delta.md @@ -34,7 +34,7 @@ title: Zoom Levels Tutorial } }); - (new ZoomViewer).addTo(map); + var zoomViewerControl = (new ZoomViewer).addTo(map); map.setView([0, 0], 0); diff --git a/docs/examples/zoom-levels/example-fractional.md b/docs/examples/zoom-levels/example-fractional.md index bf7465696c4..9cd01c94152 100644 --- a/docs/examples/zoom-levels/example-fractional.md +++ b/docs/examples/zoom-levels/example-fractional.md @@ -49,7 +49,7 @@ title: Zoom Levels Tutorial } }); - (new ZoomViewer).addTo(map); + var zoomViewerControl = (new ZoomViewer).addTo(map); map.setView([0, 0], 0); diff --git a/docs/examples/zoom-levels/example-scale.md b/docs/examples/zoom-levels/example-scale.md index 9f282d6a8ee..62856cde17d 100644 --- a/docs/examples/zoom-levels/example-scale.md +++ b/docs/examples/zoom-levels/example-scale.md @@ -16,7 +16,7 @@ title: Zoom Levels Tutorial attribution: cartodbAttribution }).addTo(map); - L.control.scale({maxWidth: 150}).addTo(map); + var scaleControl = L.control.scale({maxWidth: 150}).addTo(map); setInterval(function(){ map.setView([0, 0], 0, {duration: 1, animate: true}); diff --git a/docs/examples/zoom-levels/example-setzoom.md b/docs/examples/zoom-levels/example-setzoom.md index 096af342beb..fe0f88e4e45 100644 --- a/docs/examples/zoom-levels/example-setzoom.md +++ b/docs/examples/zoom-levels/example-setzoom.md @@ -38,7 +38,7 @@ title: Zoom Levels Tutorial } }); - (new ZoomViewer).addTo(map); + var zoomViewer = (new ZoomViewer).addTo(map); map.setView([0, 0], 0); From 0a61e9065b163f2b270d99e13d6f0f5f0978ad09 Mon Sep 17 00:00:00 2001 From: johnd0e Date: Sat, 27 Nov 2021 13:08:04 +0200 Subject: [PATCH 248/306] Tests: simplify .near and .nearLatlng usage (#7820) --- spec/suites/SpecHelper.js | 2 ++ spec/suites/geo/CRSSpec.js | 42 ++++++++++++------------ spec/suites/geo/ProjectionSpec.js | 36 ++++++++++---------- spec/suites/layer/vector/CircleSpec.js | 8 ++--- spec/suites/layer/vector/PolygonSpec.js | 4 +-- spec/suites/layer/vector/PolylineSpec.js | 10 +++--- 6 files changed, 52 insertions(+), 50 deletions(-) diff --git a/spec/suites/SpecHelper.js b/spec/suites/SpecHelper.js index b0818b3db48..f6a6fbc3a48 100644 --- a/spec/suites/SpecHelper.js +++ b/spec/suites/SpecHelper.js @@ -26,6 +26,7 @@ if (!Array.prototype.map) { } expect.Assertion.prototype.near = function (expected, delta) { + expected = L.point(expected); delta = delta || 1; expect(this.obj.x).to .be.within(expected.x - delta, expected.x + delta); @@ -34,6 +35,7 @@ expect.Assertion.prototype.near = function (expected, delta) { }; expect.Assertion.prototype.nearLatLng = function (expected, delta) { + expected = L.latLng(expected); delta = delta || 1e-4; expect(this.obj.lat).to .be.within(expected.lat - delta, expected.lat + delta); diff --git a/spec/suites/geo/CRSSpec.js b/spec/suites/geo/CRSSpec.js index 1c10083fec7..28986519f48 100644 --- a/spec/suites/geo/CRSSpec.js +++ b/spec/suites/geo/CRSSpec.js @@ -3,37 +3,37 @@ describe("CRS.EPSG3857", function () { describe("#latLngToPoint", function () { it("projects a center point", function () { - expect(crs.latLngToPoint(L.latLng(0, 0), 0)).near(new L.Point(128, 128), 0.01); + expect(crs.latLngToPoint(L.latLng(0, 0), 0)).near([128, 128], 0.01); }); it("projects the northeast corner of the world", function () { - expect(crs.latLngToPoint(L.latLng(85.0511287798, 180), 0)).near(new L.Point(256, 0)); + expect(crs.latLngToPoint(L.latLng(85.0511287798, 180), 0)).near([256, 0]); }); }); describe("#pointToLatLng", function () { it("reprojects a center point", function () { - expect(crs.pointToLatLng(new L.Point(128, 128), 0)).nearLatLng(L.latLng(0, 0), 0.01); + expect(crs.pointToLatLng(new L.Point(128, 128), 0)).nearLatLng([0, 0], 0.01); }); it("reprojects the northeast corner of the world", function () { - expect(crs.pointToLatLng(new L.Point(256, 0), 0)).nearLatLng(L.latLng(85.0511287798, 180)); + expect(crs.pointToLatLng(new L.Point(256, 0), 0)).nearLatLng([85.0511287798, 180]); }); }); describe("project", function () { it('projects geo coords into meter coords correctly', function () { - expect(crs.project(new L.LatLng(50, 30))).near(new L.Point(3339584.7238, 6446275.84102)); - expect(crs.project(new L.LatLng(85.0511287798, 180))).near(new L.Point(20037508.34279, 20037508.34278)); - expect(crs.project(new L.LatLng(-85.0511287798, -180))).near(new L.Point(-20037508.34279, -20037508.34278)); + expect(crs.project(new L.LatLng(50, 30))).near([3339584.7238, 6446275.84102]); + expect(crs.project(new L.LatLng(85.0511287798, 180))).near([20037508.34279, 20037508.34278]); + expect(crs.project(new L.LatLng(-85.0511287798, -180))).near([-20037508.34279, -20037508.34278]); }); }); describe("unproject", function () { it('unprojects meter coords into geo coords correctly', function () { - expect(crs.unproject(new L.Point(3339584.7238, 6446275.84102))).nearLatLng(new L.LatLng(50, 30)); - expect(crs.unproject(new L.Point(20037508.34279, 20037508.34278))).nearLatLng(new L.LatLng(85.051129, 180)); - expect(crs.unproject(new L.Point(-20037508.34279, -20037508.34278))).nearLatLng(new L.LatLng(-85.051129, -180)); + expect(crs.unproject(new L.Point(3339584.7238, 6446275.84102))).nearLatLng([50, 30]); + expect(crs.unproject(new L.Point(20037508.34279, 20037508.34278))).nearLatLng([85.051129, 180]); + expect(crs.unproject(new L.Point(-20037508.34279, -20037508.34278))).nearLatLng([-85.051129, -180]); }); }); @@ -164,21 +164,21 @@ describe("CRS.EPSG3395", function () { describe("#latLngToPoint", function () { it("projects a center point", function () { - expect(crs.latLngToPoint(L.latLng(0, 0), 0)).near(new L.Point(128, 128), 0.01); + expect(crs.latLngToPoint(L.latLng(0, 0), 0)).near([128, 128], 0.01); }); it("projects the northeast corner of the world", function () { - expect(crs.latLngToPoint(L.latLng(85.0840591556, 180), 0)).near(new L.Point(256, 0)); + expect(crs.latLngToPoint(L.latLng(85.0840591556, 180), 0)).near([256, 0]); }); }); describe("#pointToLatLng", function () { it("reprojects a center point", function () { - expect(crs.pointToLatLng(new L.Point(128, 128), 0)).nearLatLng(L.latLng(0, 0), 0.01); + expect(crs.pointToLatLng(new L.Point(128, 128), 0)).nearLatLng([0, 0], 0.01); }); it("reprojects the northeast corner of the world", function () { - expect(crs.pointToLatLng(new L.Point(256, 0), 0)).nearLatLng(L.latLng(85.0840591556, 180)); + expect(crs.pointToLatLng(new L.Point(256, 0), 0)).nearLatLng([85.0840591556, 180]); }); }); }); @@ -188,17 +188,17 @@ describe("CRS.Simple", function () { describe("#latLngToPoint", function () { it("converts LatLng coords to pixels", function () { - expect(crs.latLngToPoint(L.latLng(0, 0), 0)).near(new L.Point(0, 0)); - expect(crs.latLngToPoint(L.latLng(700, 300), 0)).near(new L.Point(300, -700)); - expect(crs.latLngToPoint(L.latLng(-200, 1000), 1)).near(new L.Point(2000, 400)); + expect(crs.latLngToPoint(L.latLng(0, 0), 0)).near([0, 0]); + expect(crs.latLngToPoint(L.latLng(700, 300), 0)).near([300, -700]); + expect(crs.latLngToPoint(L.latLng(-200, 1000), 1)).near([2000, 400]); }); }); describe("#pointToLatLng", function () { it("converts pixels to LatLng coords", function () { - expect(crs.pointToLatLng(L.point(0, 0), 0)).nearLatLng(new L.LatLng(0, 0)); - expect(crs.pointToLatLng(L.point(300, -700), 0)).nearLatLng(new L.LatLng(700, 300)); - expect(crs.pointToLatLng(L.point(2000, 400), 1)).nearLatLng(new L.LatLng(-200, 1000)); + expect(crs.pointToLatLng(L.point(0, 0), 0)).nearLatLng([0, 0]); + expect(crs.pointToLatLng(L.point(300, -700), 0)).nearLatLng([700, 300]); + expect(crs.pointToLatLng(L.point(2000, 400), 1)).nearLatLng([-200, 1000]); }); }); @@ -219,7 +219,7 @@ describe("CRS.Simple", function () { wrapLat: [-200, 200] }); - expect(crs.wrapLatLng(new L.LatLng(300, -250))).nearLatLng(new L.LatLng(-100, 150)); + expect(crs.wrapLatLng(new L.LatLng(300, -250))).nearLatLng([-100, 150]); }); }); }); diff --git a/spec/suites/geo/ProjectionSpec.js b/spec/suites/geo/ProjectionSpec.js index 731f53ee74f..83d46a48d0a 100644 --- a/spec/suites/geo/ProjectionSpec.js +++ b/spec/suites/geo/ProjectionSpec.js @@ -4,23 +4,23 @@ describe("Projection.Mercator", function () { describe("#project", function () { it("projects a center point", function () { // edge cases - expect(p.project(new L.LatLng(0, 0))).near(new L.Point(0, 0)); + expect(p.project(new L.LatLng(0, 0))).near([0, 0]); }); it("projects the northeast corner of the world", function () { - expect(p.project(new L.LatLng(85.0840591556, 180))).near(new L.Point(20037508, 20037508)); + expect(p.project(new L.LatLng(85.0840591556, 180))).near([20037508, 20037508]); }); it("projects the southwest corner of the world", function () { - expect(p.project(new L.LatLng(-85.0840591556, -180))).near(new L.Point(-20037508, -20037508)); + expect(p.project(new L.LatLng(-85.0840591556, -180))).near([-20037508, -20037508]); }); it("projects other points", function () { - expect(p.project(new L.LatLng(50, 30))).near(new L.Point(3339584, 6413524)); + expect(p.project(new L.LatLng(50, 30))).near([3339584, 6413524]); // from https://github.com/Leaflet/Leaflet/issues/1578 expect(p.project(new L.LatLng(51.9371170300465, 80.11230468750001))) - .near(new L.Point(8918060.964088084, 6755099.410887127)); + .near([8918060.964088084, 6755099.410887127]); }); }); @@ -30,14 +30,14 @@ describe("Projection.Mercator", function () { } it("unprojects a center point", function () { - expect(pr(new L.Point(0, 0))).near(new L.Point(0, 0)); + expect(pr(new L.Point(0, 0))).near([0, 0]); }); it("unprojects pi points", function () { - expect(pr(new L.Point(-Math.PI, Math.PI))).near(new L.Point(-Math.PI, Math.PI)); - expect(pr(new L.Point(-Math.PI, -Math.PI))).near(new L.Point(-Math.PI, -Math.PI)); + expect(pr(new L.Point(-Math.PI, Math.PI))).near([-Math.PI, Math.PI]); + expect(pr(new L.Point(-Math.PI, -Math.PI))).near([-Math.PI, -Math.PI]); - expect(pr(new L.Point(0.523598775598, 1.010683188683))).near(new L.Point(0.523598775598, 1.010683188683)); + expect(pr(new L.Point(0.523598775598, 1.010683188683))).near([0.523598775598, 1.010683188683]); }); it('unprojects other points', function () { @@ -53,23 +53,23 @@ describe("Projection.SphericalMercator", function () { describe("#project", function () { it("projects a center point", function () { // edge cases - expect(p.project(new L.LatLng(0, 0))).near(new L.Point(0, 0)); + expect(p.project(new L.LatLng(0, 0))).near([0, 0]); }); it("projects the northeast corner of the world", function () { - expect(p.project(new L.LatLng(85.0511287798, 180))).near(new L.Point(20037508, 20037508)); + expect(p.project(new L.LatLng(85.0511287798, 180))).near([20037508, 20037508]); }); it("projects the southwest corner of the world", function () { - expect(p.project(new L.LatLng(-85.0511287798, -180))).near(new L.Point(-20037508, -20037508)); + expect(p.project(new L.LatLng(-85.0511287798, -180))).near([-20037508, -20037508]); }); it("projects other points", function () { - expect(p.project(new L.LatLng(50, 30))).near(new L.Point(3339584, 6446275)); + expect(p.project(new L.LatLng(50, 30))).near([3339584, 6446275]); // from https://github.com/Leaflet/Leaflet/issues/1578 expect(p.project(new L.LatLng(51.9371170300465, 80.11230468750001))) - .near(new L.Point(8918060.96409, 6788763.38325)); + .near([8918060.96409, 6788763.38325]); }); }); @@ -79,14 +79,14 @@ describe("Projection.SphericalMercator", function () { } it("unprojects a center point", function () { - expect(pr(new L.Point(0, 0))).near(new L.Point(0, 0)); + expect(pr(new L.Point(0, 0))).near([0, 0]); }); it("unprojects pi points", function () { - expect(pr(new L.Point(-Math.PI, Math.PI))).near(new L.Point(-Math.PI, Math.PI)); - expect(pr(new L.Point(-Math.PI, -Math.PI))).near(new L.Point(-Math.PI, -Math.PI)); + expect(pr(new L.Point(-Math.PI, Math.PI))).near([-Math.PI, Math.PI]); + expect(pr(new L.Point(-Math.PI, -Math.PI))).near([-Math.PI, -Math.PI]); - expect(pr(new L.Point(0.523598775598, 1.010683188683))).near(new L.Point(0.523598775598, 1.010683188683)); + expect(pr(new L.Point(0.523598775598, 1.010683188683))).near([0.523598775598, 1.010683188683]); }); it('unprojects other points', function () { diff --git a/spec/suites/layer/vector/CircleSpec.js b/spec/suites/layer/vector/CircleSpec.js index 86abc669376..9a00e4c7c7f 100644 --- a/spec/suites/layer/vector/CircleSpec.js +++ b/spec/suites/layer/vector/CircleSpec.js @@ -28,8 +28,8 @@ describe('Circle', function () { it('returns bounds', function () { var bounds = circle.getBounds(); - expect(bounds.getSouthWest()).nearLatLng(new L.LatLng(49.99820, 29.99720)); - expect(bounds.getNorthEast()).nearLatLng(new L.LatLng(50.00179, 30.00279)); + expect(bounds.getSouthWest()).nearLatLng([49.99820, 29.99720]); + expect(bounds.getNorthEast()).nearLatLng([50.00179, 30.00279]); }); }); @@ -37,8 +37,8 @@ describe('Circle', function () { it('returns same bounds as 1.0 factory', function () { var bounds = circle.getBounds(); - expect(bounds.getSouthWest()).nearLatLng(new L.LatLng(49.99820, 29.99720)); - expect(bounds.getNorthEast()).nearLatLng(new L.LatLng(50.00179, 30.00279)); + expect(bounds.getSouthWest()).nearLatLng([49.99820, 29.99720]); + expect(bounds.getNorthEast()).nearLatLng([50.00179, 30.00279]); }); }); }); diff --git a/spec/suites/layer/vector/PolygonSpec.js b/spec/suites/layer/vector/PolygonSpec.js index 5f6ca64dfb5..1518fe71a12 100644 --- a/spec/suites/layer/vector/PolygonSpec.js +++ b/spec/suites/layer/vector/PolygonSpec.js @@ -153,7 +153,7 @@ describe('Polygon', function () { [[0, 0], [10, 0], [10, 10], [0, 10]] ]; var layer = new L.Polygon(latlngs).addTo(map); - expect(layer.getCenter()).to.be.nearLatLng(L.latLng([5, 5]), 1e-1); + expect(layer.getCenter()).to.be.nearLatLng([5, 5], 1e-1); }); it('should compute center of a small simple polygon', function () { @@ -162,7 +162,7 @@ describe('Polygon', function () { ]; var layer = new L.Polygon(latlngs).addTo(map); map.setZoom(0); // Make the polygon disappear in screen. - expect(layer.getCenter()).to.be.nearLatLng(L.latLng([0, 0])); + expect(layer.getCenter()).to.be.nearLatLng([0, 0]); }); it('throws error if not yet added to map', function () { diff --git a/spec/suites/layer/vector/PolylineSpec.js b/spec/suites/layer/vector/PolylineSpec.js index b5e4e867200..b0835fd6e1b 100644 --- a/spec/suites/layer/vector/PolylineSpec.js +++ b/spec/suites/layer/vector/PolylineSpec.js @@ -111,28 +111,28 @@ describe('Polyline', function () { it('should compute center of a big flat line close to the pole', function () { var polyline = new L.Polyline([[80, 0], [80, 90]]).addTo(map); - expect(polyline.getCenter()).to.be.nearLatLng(L.latLng([80, 45]), 1e-2); + expect(polyline.getCenter()).to.be.nearLatLng([80, 45], 1e-2); }); it('should compute center of a big diagonal line', function () { var polyline = new L.Polyline([[0, 0], [80, 80]]).addTo(map); - expect(polyline.getCenter()).to.be.nearLatLng(L.latLng([57, 40]), 1); + expect(polyline.getCenter()).to.be.nearLatLng([57, 40], 1); }); it('should compute center of a diagonal line close to the pole', function () { var polyline = new L.Polyline([[70, 70], [84, 84]]).addTo(map); - expect(polyline.getCenter()).to.be.nearLatLng(L.latLng([79, 77]), 1); + expect(polyline.getCenter()).to.be.nearLatLng([79, 77], 1); }); it('should compute center of a big multiline', function () { var polyline = new L.Polyline([[10, -80], [0, 0], [0, 10], [10, 90]]).addTo(map); - expect(polyline.getCenter()).to.be.nearLatLng(L.latLng([0, 5]), 1); + expect(polyline.getCenter()).to.be.nearLatLng([0, 5], 1); }); it('should compute center of a small flat line', function () { var polyline = new L.Polyline([[0, 0], [0, 0.090]]).addTo(map); map.setZoom(0); // Make the line disappear in screen; - expect(polyline.getCenter()).to.be.nearLatLng(L.latLng([0, 0]), 1e-2); + expect(polyline.getCenter()).to.be.nearLatLng([0, 0], 1e-2); }); it('throws error if not yet added to map', function () { From 326211d5d4bab6f7f3faed57a1f2d4a070b30bea Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 29 Nov 2021 15:56:50 +0200 Subject: [PATCH 249/306] add linting to examples (WIP) --- .../zoom-levels/example-fractional.md | 30 +++-- docs/examples/zoom-levels/example-scale.md | 4 +- docs/examples/zoom-levels/example-setzoom.md | 12 +- package-lock.json | 113 ++++++++++++++++++ package.json | 19 ++- 5 files changed, 151 insertions(+), 27 deletions(-) diff --git a/docs/examples/zoom-levels/example-fractional.md b/docs/examples/zoom-levels/example-fractional.md index 9cd01c94152..f420dc0c97f 100644 --- a/docs/examples/zoom-levels/example-fractional.md +++ b/docs/examples/zoom-levels/example-fractional.md @@ -17,39 +17,37 @@ title: Zoom Levels Tutorial attribution: cartodbAttribution }).addTo(map); - function zoomCycle(){ + function zoomCycle() { map.setZoom(0); - timeouts = []; - timeouts.push(setTimeout(function(){ map.setZoom(0.25); }, 1000)); - timeouts.push(setTimeout(function(){ map.setZoom(0.50); }, 2000)); - timeouts.push(setTimeout(function(){ map.setZoom(0.75); }, 3000)); - timeouts.push(setTimeout(function(){ map.setZoom(1); }, 4000)); - timeouts.push(setTimeout(function(){ map.setZoom(0.75); }, 5000)); - timeouts.push(setTimeout(function(){ map.setZoom(0.50); }, 6000)); - timeouts.push(setTimeout(function(){ map.setZoom(0.25); }, 7000)); + var timeouts = []; + timeouts.push(setTimeout(function () { map.setZoom(0.25); }, 1000)); + timeouts.push(setTimeout(function () { map.setZoom(0.50); }, 2000)); + timeouts.push(setTimeout(function () { map.setZoom(0.75); }, 3000)); + timeouts.push(setTimeout(function () { map.setZoom(1.00); }, 4000)); + timeouts.push(setTimeout(function () { map.setZoom(0.75); }, 5000)); + timeouts.push(setTimeout(function () { map.setZoom(0.50); }, 6000)); + timeouts.push(setTimeout(function () { map.setZoom(0.25); }, 7000)); } zoomCycle(); var zoomingInterval = setInterval(zoomCycle, 8000); var ZoomViewer = L.Control.extend({ - onAdd: function(){ - - var container= L.DomUtil.create('div'); + onAdd: function () { + var container = L.DomUtil.create('div'); var gauge = L.DomUtil.create('div'); container.style.width = '200px'; container.style.background = 'rgba(255,255,255,0.5)'; container.style.textAlign = 'left'; - map.on('zoomstart zoom zoomend', function(ev){ + map.on('zoomstart zoom zoomend', function (ev) { gauge.innerHTML = 'Zoom level: ' + map.getZoom(); - }) + }); container.appendChild(gauge); - return container; } }); - var zoomViewerControl = (new ZoomViewer).addTo(map); + var zoomViewerControl = (new ZoomViewer()).addTo(map); map.setView([0, 0], 0); diff --git a/docs/examples/zoom-levels/example-scale.md b/docs/examples/zoom-levels/example-scale.md index 62856cde17d..93108eee5f5 100644 --- a/docs/examples/zoom-levels/example-scale.md +++ b/docs/examples/zoom-levels/example-scale.md @@ -18,9 +18,9 @@ title: Zoom Levels Tutorial var scaleControl = L.control.scale({maxWidth: 150}).addTo(map); - setInterval(function(){ + setInterval(function () { map.setView([0, 0], 0, {duration: 1, animate: true}); - setTimeout(function(){ + setTimeout(function () { map.setView([60, 0], 0, {duration: 1, animate: true}); }, 2000); }, 4000); diff --git a/docs/examples/zoom-levels/example-setzoom.md b/docs/examples/zoom-levels/example-setzoom.md index fe0f88e4e45..5a565a19ed2 100644 --- a/docs/examples/zoom-levels/example-setzoom.md +++ b/docs/examples/zoom-levels/example-setzoom.md @@ -15,30 +15,30 @@ title: Zoom Levels Tutorial attribution: cartodbAttribution }).addTo(map); - setInterval(function(){ + setInterval(function () { map.setZoom(0); - setTimeout(function(){ + setTimeout(function () { map.setZoom(1); }, 2000); }, 4000); var ZoomViewer = L.Control.extend({ - onAdd: function(){ + onAdd: function () { var gauge = L.DomUtil.create('div'); gauge.style.width = '200px'; gauge.style.background = 'rgba(255,255,255,0.5)'; gauge.style.textAlign = 'left'; - map.on('zoomstart zoom zoomend', function(ev){ + map.on('zoomstart zoom zoomend', function (ev) { gauge.innerHTML = 'Zoom level: ' + map.getZoom(); - }) + }); return gauge; } }); - var zoomViewer = (new ZoomViewer).addTo(map); + var zoomViewer = (new ZoomViewer()).addTo(map); map.setView([0, 0], 0); diff --git a/package-lock.json b/package-lock.json index 4407ebed5f5..5a37cce617e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@rollup/plugin-json": "^4.1.0", "eslint": "^8.1.0", "eslint-config-mourner": "^2.0.3", + "eslint-plugin-script-tags": "^0.5.0", "git-rev-sync": "^3.0.1", "happen": "~0.3.2", "karma": "^6.3.6", @@ -483,6 +484,19 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clone-regexp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz", + "integrity": "sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==", + "dev": true, + "dependencies": { + "is-regexp": "^1.0.0", + "is-supported-regexp-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -893,6 +907,18 @@ "integrity": "sha512-ydFFzE/WkqvmozI3CM0lAtDZoYfmN03ycjlHzdPZW5x+o3Me1pI0lyfpsWoz9kOqykZk8qlvOVC5BN5UMwtXrg==", "dev": true }, + "node_modules/eslint-plugin-script-tags": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-script-tags/-/eslint-plugin-script-tags-0.5.0.tgz", + "integrity": "sha512-iomN8+MwDyhRGWKwRKfBg4EchXuOCJ4iPC8bE9q255xdneXdIhvJU0AaWEe9GPXQIrJ3JKNKZbU1dAlAPbyyAg==", + "deprecated": "Now published as @mapbox/eslint-plugin-script-tags", + "dev": true, + "dependencies": { + "execall": "^1.0.0", + "lodash": "^4.16.0", + "split-lines": "^1.1.0" + } + }, "node_modules/eslint-scope": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", @@ -1010,6 +1036,18 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, + "node_modules/execall": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", + "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", + "dev": true, + "dependencies": { + "clone-regexp": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/expect.js": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", @@ -1555,6 +1593,24 @@ "node": ">=8" } }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-supported-regexp-flag": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", + "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -2765,6 +2821,15 @@ "node": ">=0.10.0" } }, + "node_modules/split-lines": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-1.1.0.tgz", + "integrity": "sha1-Oruo9ZhhQUL5240nq2q4dWYqHgk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -3571,6 +3636,16 @@ "wrap-ansi": "^7.0.0" } }, + "clone-regexp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz", + "integrity": "sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==", + "dev": true, + "requires": { + "is-regexp": "^1.0.0", + "is-supported-regexp-flag": "^1.0.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3901,6 +3976,17 @@ "integrity": "sha512-ydFFzE/WkqvmozI3CM0lAtDZoYfmN03ycjlHzdPZW5x+o3Me1pI0lyfpsWoz9kOqykZk8qlvOVC5BN5UMwtXrg==", "dev": true }, + "eslint-plugin-script-tags": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-script-tags/-/eslint-plugin-script-tags-0.5.0.tgz", + "integrity": "sha512-iomN8+MwDyhRGWKwRKfBg4EchXuOCJ4iPC8bE9q255xdneXdIhvJU0AaWEe9GPXQIrJ3JKNKZbU1dAlAPbyyAg==", + "dev": true, + "requires": { + "execall": "^1.0.0", + "lodash": "^4.16.0", + "split-lines": "^1.1.0" + } + }, "eslint-scope": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", @@ -3987,6 +4073,15 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, + "execall": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", + "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", + "dev": true, + "requires": { + "clone-regexp": "^1.0.0" + } + }, "expect.js": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", @@ -4400,6 +4495,18 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-supported-regexp-flag": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", + "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", + "dev": true + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -5342,6 +5449,12 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "split-lines": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-1.1.0.tgz", + "integrity": "sha1-Oruo9ZhhQUL5240nq2q4dWYqHgk=", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", diff --git a/package.json b/package.json index 5b6f9eb5f2a..7a9791ae0c6 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "@rollup/plugin-json": "^4.1.0", "eslint": "^8.1.0", "eslint-config-mourner": "^2.0.3", + "eslint-plugin-script-tags": "^0.5.0", "git-rev-sync": "^3.0.1", "happen": "~0.3.2", "karma": "^6.3.6", @@ -53,9 +54,9 @@ "dist", "debug", "docs/docs/highlight", - "docs/examples/choropleth", - "docs/examples/geojson", - "docs/examples/map-panes", + "docs/examples/choropleth/us-states.js", + "docs/examples/geojson/sample-geojson.js", + "docs/examples/map-panes/eu-countries.js", "docs/_site" ], "root": true, @@ -68,6 +69,9 @@ "node": false }, "extends": "mourner", + "plugins": [ + "script-tags" + ], "parserOptions": { "ecmaVersion": 6, "sourceType": "module" @@ -113,6 +117,15 @@ "rules": { "global-require": 0 } + }, + { + "files": [ + "*.md" + ], + "rules": { + "eol-last": 0, + "no-unused-vars": 0 + } } ] }, From 31259a9d2557313413c432220976e1c31cd24223 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 29 Nov 2021 15:58:54 +0200 Subject: [PATCH 250/306] revert linting examples (accidentally pushed to master) --- package.json | 9 --------- 1 file changed, 9 deletions(-) diff --git a/package.json b/package.json index 7a9791ae0c6..9e320f9ca27 100644 --- a/package.json +++ b/package.json @@ -117,15 +117,6 @@ "rules": { "global-require": 0 } - }, - { - "files": [ - "*.md" - ], - "rules": { - "eol-last": 0, - "no-unused-vars": 0 - } } ] }, From 80279dd98beeb979285da44f32c909e1f2c44694 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 29 Nov 2021 16:31:54 +0200 Subject: [PATCH 251/306] Lint examples (#7827) * lint examples * examples lint fixes * more lint fixes * fixes * final fixes --- docs/_posts/2013-02-20-guest-post-draw.md | 7 ++- docs/examples/choropleth/example-basic.md | 1 + docs/examples/choropleth/example-color.md | 14 +++--- docs/examples/choropleth/example.md | 25 +++++----- .../crs-simple/crs-simple-example1.md | 2 +- .../crs-simple/crs-simple-example2.md | 6 +-- .../crs-simple/crs-simple-example3.md | 14 +++--- docs/examples/custom-icons/example.md | 12 ++--- docs/examples/extending/canvascircles.md | 18 +++---- docs/examples/extending/class-diagram.md | 2 +- docs/examples/extending/gridcoords.md | 6 +-- docs/examples/extending/kittenlayer.md | 18 +++---- docs/examples/extending/pixelorigin.md | 50 +++++++++---------- docs/examples/extending/tilt.md | 14 +++--- docs/examples/extending/watermark.md | 18 +++---- docs/examples/geojson/example.md | 9 ++-- docs/examples/layers-control/example.md | 24 ++++----- docs/examples/map-panes/example.md | 6 +-- docs/examples/mobile/example.md | 8 ++- docs/examples/quick-start/example.md | 10 ++-- docs/examples/video-overlay/example-bounds.md | 2 +- .../video-overlay/example-nocontrols.md | 2 +- docs/examples/video-overlay/example.md | 19 +++---- docs/examples/zoom-levels/example-delta.md | 12 ++--- package.json | 11 ++++ 25 files changed, 153 insertions(+), 157 deletions(-) diff --git a/docs/_posts/2013-02-20-guest-post-draw.md b/docs/_posts/2013-02-20-guest-post-draw.md index 56fd0554421..4373bde27bd 100644 --- a/docs/_posts/2013-02-20-guest-post-draw.md +++ b/docs/_posts/2013-02-20-guest-post-draw.md @@ -117,7 +117,7 @@ Jacob Toye // add an OpenStreetMap tile layer L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { - attribution: '© OpenStreetMap contributors' + attribution: '© OpenStreetMap contributors' }).addTo(map); // Initialize the FeatureGroup to store editable layers @@ -133,10 +133,9 @@ Jacob Toye map.addControl(drawControl); map.on('draw:created', function (e) { - var type = e.layerType, - layer = e.layer; + var layer = e.layer; - if (type === 'marker') { + if (e.layerType === 'marker') { layer.bindPopup('A popup!'); } diff --git a/docs/examples/choropleth/example-basic.md b/docs/examples/choropleth/example-basic.md index fa4fac82508..17172d02bdc 100644 --- a/docs/examples/choropleth/example-basic.md +++ b/docs/examples/choropleth/example-basic.md @@ -16,6 +16,7 @@ title: Choropleth Tutorial zoomOffset: -1 }).addTo(map); + /* global statesData */ var geojson = L.geoJson(statesData).addTo(map); diff --git a/docs/examples/choropleth/example-color.md b/docs/examples/choropleth/example-color.md index e41103fd813..dc9ee0c1879 100644 --- a/docs/examples/choropleth/example-color.md +++ b/docs/examples/choropleth/example-color.md @@ -20,13 +20,12 @@ title: Choropleth Tutorial // get color depending on population density value function getColor(d) { return d > 1000 ? '#800026' : - d > 500 ? '#BD0026' : - d > 200 ? '#E31A1C' : - d > 100 ? '#FC4E2A' : - d > 50 ? '#FD8D3C' : - d > 20 ? '#FEB24C' : - d > 10 ? '#FED976' : - '#FFEDA0'; + d > 500 ? '#BD0026' : + d > 200 ? '#E31A1C' : + d > 100 ? '#FC4E2A' : + d > 50 ? '#FD8D3C' : + d > 20 ? '#FEB24C' : + d > 10 ? '#FED976' : '#FFEDA0'; } function style(feature) { @@ -40,6 +39,7 @@ title: Choropleth Tutorial }; } + /* global statesData */ var geojson = L.geoJson(statesData, { style: style, }).addTo(map); diff --git a/docs/examples/choropleth/example.md b/docs/examples/choropleth/example.md index 3deb154225e..a04e7f9871e 100644 --- a/docs/examples/choropleth/example.md +++ b/docs/examples/choropleth/example.md @@ -59,8 +59,7 @@ css: "#map { info.update = function (props) { this._div.innerHTML = '

      US Population Density

      ' + (props ? - '' + props.name + '
      ' + props.density + ' people / mi2' - : 'Hover over a state'); + '' + props.name + '
      ' + props.density + ' people / mi2' : 'Hover over a state'); }; info.addTo(map); @@ -69,13 +68,12 @@ css: "#map { // get color depending on population density value function getColor(d) { return d > 1000 ? '#800026' : - d > 500 ? '#BD0026' : - d > 200 ? '#E31A1C' : - d > 100 ? '#FC4E2A' : - d > 50 ? '#FD8D3C' : - d > 20 ? '#FEB24C' : - d > 10 ? '#FED976' : - '#FFEDA0'; + d > 500 ? '#BD0026' : + d > 200 ? '#E31A1C' : + d > 100 ? '#FC4E2A' : + d > 50 ? '#FD8D3C' : + d > 20 ? '#FEB24C' : + d > 10 ? '#FED976' : '#FFEDA0'; } function style(feature) { @@ -125,6 +123,7 @@ css: "#map { }); } + /* global statesData */ geojson = L.geoJson(statesData, { style: style, onEachFeature: onEachFeature @@ -137,10 +136,10 @@ css: "#map { legend.onAdd = function (map) { - var div = L.DomUtil.create('div', 'info legend'), - grades = [0, 10, 20, 50, 100, 200, 500, 1000], - labels = [], - from, to; + var div = L.DomUtil.create('div', 'info legend'); + var grades = [0, 10, 20, 50, 100, 200, 500, 1000]; + var labels = []; + var from, to; for (var i = 0; i < grades.length; i++) { from = grades[i]; diff --git a/docs/examples/crs-simple/crs-simple-example1.md b/docs/examples/crs-simple/crs-simple-example1.md index 630555bc37c..fac3e8a211d 100644 --- a/docs/examples/crs-simple/crs-simple-example1.md +++ b/docs/examples/crs-simple/crs-simple-example1.md @@ -8,7 +8,7 @@ title: CRS.Simple example crs: L.CRS.Simple }); - var bounds = [[0,0], [1000,1000]]; + var bounds = [[0, 0], [1000, 1000]]; var image = L.imageOverlay('uqm_map_full.png', bounds).addTo(map); map.fitBounds(bounds); diff --git a/docs/examples/crs-simple/crs-simple-example2.md b/docs/examples/crs-simple/crs-simple-example2.md index 9d8b0a6d744..a605836d6b5 100644 --- a/docs/examples/crs-simple/crs-simple-example2.md +++ b/docs/examples/crs-simple/crs-simple-example2.md @@ -9,12 +9,12 @@ title: CRS.Simple example minZoom: -3 }); - var bounds = [[-26.5,-25], [1021.5,1023]]; + var bounds = [[-26.5, -25], [1021.5, 1023]]; var image = L.imageOverlay('uqm_map_full.png', bounds).addTo(map); - var sol = L.latLng([ 145, 175 ]); + var sol = L.latLng([145, 175]); var marker = L.marker(sol).addTo(map); - map.setView( [70, 120], 1); + map.setView([70, 120], 1); diff --git a/docs/examples/crs-simple/crs-simple-example3.md b/docs/examples/crs-simple/crs-simple-example3.md index df2e4b2304a..5f995a4cfc7 100644 --- a/docs/examples/crs-simple/crs-simple-example3.md +++ b/docs/examples/crs-simple/crs-simple-example3.md @@ -11,20 +11,20 @@ title: CRS.Simple example var yx = L.latLng; - var xy = function(x, y) { - if (L.Util.isArray(x)) { // When doing xy([x, y]); + function xy(x, y) { + if (L.Util.isArray(x)) { // When doing xy([x, y]); return yx(x[1], x[0]); } - return yx(y, x); // When doing xy(x, y); - }; + return yx(y, x); // When doing xy(x, y); + } var bounds = [xy(-25, -26.5), xy(1023, 1021.5)]; var image = L.imageOverlay('uqm_map_full.png', bounds).addTo(map); var sol = xy(175.2, 145.0); - var mizar = xy( 41.6, 130.1); - var kruegerZ = xy( 13.4, 56.5); - var deneb = xy(218.7, 8.3); + var mizar = xy(41.6, 130.1); + var kruegerZ = xy(13.4, 56.5); + var deneb = xy(218.7, 8.3); var mSol = L.marker(sol).addTo(map).bindPopup('Sol'); var mMizar = L.marker(mizar).addTo(map).bindPopup('Mizar'); diff --git a/docs/examples/custom-icons/example.md b/docs/examples/custom-icons/example.md index b2a949d861c..4b6f55ce6e7 100644 --- a/docs/examples/custom-icons/example.md +++ b/docs/examples/custom-icons/example.md @@ -20,12 +20,12 @@ title: Custom Icons Tutorial } }); - var greenIcon = new LeafIcon({iconUrl: 'leaf-green.png'}), - redIcon = new LeafIcon({iconUrl: 'leaf-red.png'}), - orangeIcon = new LeafIcon({iconUrl: 'leaf-orange.png'}); + var greenIcon = new LeafIcon({iconUrl: 'leaf-green.png'}); + var redIcon = new LeafIcon({iconUrl: 'leaf-red.png'}); + var orangeIcon = new LeafIcon({iconUrl: 'leaf-orange.png'}); - var mGreen = L.marker([51.5, -0.09], {icon: greenIcon}).bindPopup("I am a green leaf.").addTo(map); - var mRed = L.marker([51.495, -0.083], {icon: redIcon}).bindPopup("I am a red leaf.").addTo(map); - var mOrange = L.marker([51.49, -0.1], {icon: orangeIcon}).bindPopup("I am an orange leaf.").addTo(map); + var mGreen = L.marker([51.5, -0.09], {icon: greenIcon}).bindPopup('I am a green leaf.').addTo(map); + var mRed = L.marker([51.495, -0.083], {icon: redIcon}).bindPopup('I am a red leaf.').addTo(map); + var mOrange = L.marker([51.49, -0.1], {icon: orangeIcon}).bindPopup('I am an orange leaf.').addTo(map); diff --git a/docs/examples/extending/canvascircles.md b/docs/examples/extending/canvascircles.md index d56e5ebdbfb..b45dae5a951 100644 --- a/docs/examples/extending/canvascircles.md +++ b/docs/examples/extending/canvascircles.md @@ -12,27 +12,27 @@ title: CanvasCircles L.GridLayer.CanvasCircles = L.GridLayer.extend({ createTile: function (coords) { var tile = document.createElement('canvas'); - + var tileSize = this.getTileSize(); tile.setAttribute('width', tileSize.x); tile.setAttribute('height', tileSize.y); - + var ctx = tile.getContext('2d'); - + // Draw whatever is needed in the canvas context // For example, circles which get bigger as we zoom in - ctx.arc(tileSize.x/2, tileSize.x/2, 4 + coords.z*4, 0, 2*Math.PI, false); + ctx.arc(tileSize.x / 2, tileSize.x / 2, 4 + coords.z * 4, 0, 2 * Math.PI, false); ctx.fill(); - + return tile; } }); - - L.gridLayer.canvasCircles = function(opts) { + + L.gridLayer.canvasCircles = function (opts) { return new L.GridLayer.CanvasCircles(opts); }; var cavasGridLayer = L.gridLayer.canvasCircles(); - map.addLayer( cavasGridLayer ); - + map.addLayer(cavasGridLayer); + diff --git a/docs/examples/extending/class-diagram.md b/docs/examples/extending/class-diagram.md index 81509194ff4..d5514763a9f 100644 --- a/docs/examples/extending/class-diagram.md +++ b/docs/examples/extending/class-diagram.md @@ -8,7 +8,7 @@ css: "#map { --- diff --git a/docs/examples/extending/kittenlayer.md b/docs/examples/extending/kittenlayer.md index 7fb5f6e33fa..0823772ce14 100644 --- a/docs/examples/extending/kittenlayer.md +++ b/docs/examples/extending/kittenlayer.md @@ -11,20 +11,20 @@ title: KittenLayer }); L.TileLayer.Kitten = L.TileLayer.extend({ - getTileUrl: function(coords) { - var i = Math.ceil( Math.random() * 4 ); - return "https://placekitten.com/256/256?image=" + i; + getTileUrl: function (coords) { + var i = Math.ceil(Math.random() * 4); + return 'https://placekitten.com/256/256?image=' + i; }, - getAttribution: function() { - return "PlaceKitten" - } + getAttribution: function () { + return 'PlaceKitten'; + } }); - L.tileLayer.kitten = function() { + L.tileLayer.kitten = function () { return new L.TileLayer.Kitten(); - } + }; var kittenTiles = L.tileLayer.kitten(); - map.addLayer( kittenTiles ); + map.addLayer(kittenTiles); diff --git a/docs/examples/extending/pixelorigin.md b/docs/examples/extending/pixelorigin.md index 96796723fd4..6b651348923 100644 --- a/docs/examples/extending/pixelorigin.md +++ b/docs/examples/extending/pixelorigin.md @@ -28,7 +28,6 @@ title: Grid coordinates var trd = [63.41, 10.41]; - var map = L.map('map', { center: [40, 0], zoom: 1 @@ -39,52 +38,49 @@ title: Grid coordinates }).addTo(map); var marker = L.marker(trd).addTo(map); - - var pane = map.getPane('markerPane') - + + var pane = map.getPane('markerPane'); + var paneCorner = document.createElement('div'); paneCorner.style.width = '12px'; paneCorner.style.height = '12px'; paneCorner.style.borderTop = '2px red solid'; paneCorner.style.borderLeft = '2px red solid'; - + pane.appendChild(paneCorner); - + marker._icon.style.border = '1px solid blue'; - - var crsMarker = L.marker( map.unproject([0, 0]), { - icon: L.divIcon({ + + var crsMarker = L.marker(map.unproject([0, 0]), { + icon: L.divIcon({ className: 'crsMarker', iconAnchor: [0, 0] }) - } ).addTo(map); - - + }).addTo(map); + + var markerOffsetLine = L.polyline([[0, 0], [0, 0]], {color: 'skyblue'}).addTo(map); var iconOffsetLine = L.polyline([[0, 0], [0, 0]], {color: 'blue'}).addTo(map); function info() { - var pixelOrigin = map.getPixelOrigin(); var markerPixelCoords = map.project(trd, map.getZoom()); var markerAnchor = marker.options.icon.options.iconAnchor; var markerOffset = marker._icon._leaflet_pos; - - document.getElementById('info').innerHTML = - '
      CRS origin: 0,0
      ' + - '
      px origin: Δ' + pixelOrigin.x + ',' + pixelOrigin.y + '
      ' + - '
      marker px coords:' + markerPixelCoords.x.toFixed(2) + ',' + markerPixelCoords.y.toFixed(2) + '
      ' + + + document.getElementById('info').innerHTML = + '
      CRS origin: 0,0
      ' + + '
      px origin: Δ' + pixelOrigin.x + ',' + pixelOrigin.y + '
      ' + + '
      marker px coords:' + markerPixelCoords.x.toFixed(2) + ',' + markerPixelCoords.y.toFixed(2) + '
      ' + '
      marker anchor: Δ' + markerAnchor[0] + ',' + markerAnchor[1] + '
      ' + '
      marker pane offset: Δ' + markerOffset.x + ',' + markerOffset.y + '
      '; - - markerOffsetLine.setLatLngs([ map.unproject(pixelOrigin), map.unproject(pixelOrigin.add(markerOffset))]); - iconOffsetLine.setLatLngs([ map.unproject(pixelOrigin.add(markerOffset)), map.unproject(pixelOrigin.add(markerOffset).subtract(markerAnchor))]); + + markerOffsetLine.setLatLngs([map.unproject(pixelOrigin), map.unproject(pixelOrigin.add(markerOffset))]); + iconOffsetLine.setLatLngs([map.unproject(pixelOrigin.add(markerOffset)), map.unproject(pixelOrigin.add(markerOffset).subtract(markerAnchor))]); } - - - map.on('load move moveend zoomend viewreset', info) - + + map.on('load move moveend zoomend viewreset', info); + info(); - - + diff --git a/docs/examples/extending/tilt.md b/docs/examples/extending/tilt.md index 38286f59a77..919e9e75869 100644 --- a/docs/examples/extending/tilt.md +++ b/docs/examples/extending/tilt.md @@ -29,25 +29,25 @@ title: Tilt handler var trd = [63.41, 10.41]; L.TiltHandler = L.Handler.extend({ - addHooks: function() { + addHooks: function () { L.DomEvent.on(window, 'deviceorientation', this._tilt, this); }, - removeHooks: function() { + removeHooks: function () { L.DomEvent.off(window, 'deviceorientation', this._tilt, this); }, - - _tilt: function(ev) { + + _tilt: function (ev) { // Treat Gamma angle as horizontal pan (1 degree = 1 pixel) and Beta angle as vertical pan var info; - var offset = L.point(ev.gamma, ev.beta) + var offset = L.point(ev.gamma, ev.beta); if (offset) { this._map.panBy(offset); info = ev.gamma + ',' + ev.beta; } else { - info = 'Device orientation not detected' + info = 'Device orientation not detected'; } - document.getElementById('info').innerHTML = info + document.getElementById('info').innerHTML = info; } }); diff --git a/docs/examples/extending/watermark.md b/docs/examples/extending/watermark.md index 21402a39124..29d0e15d201 100644 --- a/docs/examples/extending/watermark.md +++ b/docs/examples/extending/watermark.md @@ -13,24 +13,24 @@ title: Watermark control }).addTo(map); L.Control.Watermark = L.Control.extend({ - onAdd: function(map) { + onAdd: function (map) { var img = L.DomUtil.create('img'); - + img.src = '../../docs/images/logo.png'; img.style.width = '200px'; - + return img; }, - - onRemove: function(map) { + + onRemove: function (map) { // Nothing to do here } }); - L.control.watermark = function(opts) { + L.control.watermark = function (opts) { return new L.Control.Watermark(opts); - } - - var watermarkControl = L.control.watermark({ position: 'bottomleft' }).addTo(map); + }; + var watermarkControl = L.control.watermark({position: 'bottomleft'}).addTo(map); + diff --git a/docs/examples/geojson/example.md b/docs/examples/geojson/example.md index b1ce2063a71..cc7c68f9434 100644 --- a/docs/examples/geojson/example.md +++ b/docs/examples/geojson/example.md @@ -24,8 +24,8 @@ title: GeoJSON tutorial }); function onEachFeature(feature, layer) { - var popupContent = "

      I started out as a GeoJSON " + - feature.geometry.type + ", but now I'm a Leaflet vector!

      "; + var popupContent = '

      I started out as a GeoJSON ' + + feature.geometry.type + ', but now I\'m a Leaflet vector!

      '; if (feature.properties && feature.properties.popupContent) { popupContent += feature.properties.popupContent; @@ -34,6 +34,7 @@ title: GeoJSON tutorial layer.bindPopup(popupContent); } + /* global campus, bicycleRental, freeBus, coorsField */ var bicycleRentalLayer = L.geoJSON([bicycleRental, campus], { style: function (feature) { @@ -45,8 +46,8 @@ title: GeoJSON tutorial pointToLayer: function (feature, latlng) { return L.circleMarker(latlng, { radius: 8, - fillColor: "#ff7800", - color: "#000", + fillColor: '#ff7800', + color: '#000', weight: 1, opacity: 1, fillOpacity: 0.8 diff --git a/docs/examples/layers-control/example.md b/docs/examples/layers-control/example.md index 38e0e9ee03f..c2601237609 100644 --- a/docs/examples/layers-control/example.md +++ b/docs/examples/layers-control/example.md @@ -5,18 +5,16 @@ title: Layers Control Tutorial diff --git a/docs/examples/mobile/example.md b/docs/examples/mobile/example.md index 44d377ab85b..a840377abda 100644 --- a/docs/examples/mobile/example.md +++ b/docs/examples/mobile/example.md @@ -22,15 +22,13 @@ css: "body { zoomOffset: -1 }).addTo(map); - var locationMarker, - locationCircle; function onLocationFound(e) { var radius = e.accuracy / 2; - locationMarker = L.marker(e.latlng).addTo(map) - .bindPopup("You are within " + radius + " meters from this point").openPopup(); + var locationMarker = L.marker(e.latlng).addTo(map) + .bindPopup('You are within ' + radius + ' meters from this point').openPopup(); - locationCircle = L.circle(e.latlng, radius).addTo(map); + var locationCircle = L.circle(e.latlng, radius).addTo(map); } function onLocationError(e) { diff --git a/docs/examples/quick-start/example.md b/docs/examples/quick-start/example.md index 16b87ca1a48..845bf71a9de 100644 --- a/docs/examples/quick-start/example.md +++ b/docs/examples/quick-start/example.md @@ -18,31 +18,31 @@ customMapContainer: "true" }).addTo(map); var marker = L.marker([51.5, -0.09]).addTo(map) - .bindPopup("Hello world!
      I am a popup.").openPopup(); + .bindPopup('Hello world!
      I am a popup.').openPopup(); var circle = L.circle([51.508, -0.11], { color: 'red', fillColor: '#f03', fillOpacity: 0.5, radius: 500 - }).addTo(map).bindPopup("I am a circle."); + }).addTo(map).bindPopup('I am a circle.'); var polygon = L.polygon([ [51.509, -0.08], [51.503, -0.06], [51.51, -0.047] - ]).addTo(map).bindPopup("I am a polygon."); + ]).addTo(map).bindPopup('I am a polygon.'); var popup = L.popup() .setLatLng([51.513, -0.09]) - .setContent("I am a standalone popup.") + .setContent('I am a standalone popup.') .openOn(map); function onMapClick(e) { popup .setLatLng(e.latlng) - .setContent("You clicked the map at " + e.latlng.toString()) + .setContent('You clicked the map at ' + e.latlng.toString()) .openOn(map); } diff --git a/docs/examples/video-overlay/example-bounds.md b/docs/examples/video-overlay/example-bounds.md index 578c2046ccc..c5591bd543e 100644 --- a/docs/examples/video-overlay/example-bounds.md +++ b/docs/examples/video-overlay/example-bounds.md @@ -14,7 +14,7 @@ title: Video Overlay Tutorial zoomOffset: -1 }).addTo(map); - bounds = L.latLngBounds([[ 32, -130], [ 13, -100]]); + var bounds = L.latLngBounds([[32, -130], [13, -100]]); var rectangle = L.rectangle(bounds).addTo(map); diff --git a/docs/examples/video-overlay/example-nocontrols.md b/docs/examples/video-overlay/example-nocontrols.md index 2afa32eb54a..5bb866d5e37 100644 --- a/docs/examples/video-overlay/example-nocontrols.md +++ b/docs/examples/video-overlay/example-nocontrols.md @@ -18,7 +18,7 @@ title: Video Overlay Tutorial 'https://www.mapbox.com/bites/00188/patricia_nasa.webm', 'https://www.mapbox.com/bites/00188/patricia_nasa.mp4' ], - bounds = L.latLngBounds([[ 32, -130], [ 13, -100]]); + bounds = L.latLngBounds([[32, -130], [13, -100]]); map.fitBounds(bounds); diff --git a/docs/examples/video-overlay/example.md b/docs/examples/video-overlay/example.md index 782ed2c773e..f3bb21efe7a 100644 --- a/docs/examples/video-overlay/example.md +++ b/docs/examples/video-overlay/example.md @@ -18,7 +18,7 @@ title: Video Overlay Tutorial 'https://www.mapbox.com/bites/00188/patricia_nasa.webm', 'https://www.mapbox.com/bites/00188/patricia_nasa.mp4' ], - bounds = L.latLngBounds([[ 32, -130], [ 13, -100]]); + bounds = L.latLngBounds([[32, -130], [13, -100]]); map.fitBounds(bounds); @@ -29,14 +29,9 @@ title: Video Overlay Tutorial }); map.addLayer(overlay); - var MyPauseControl, - MyPlayControl, - pauseControl, - playControl; - overlay.on('load', function () { - MyPauseControl = L.Control.extend({ - onAdd: function() { + var MyPauseControl = L.Control.extend({ + onAdd: function () { var button = L.DomUtil.create('button'); button.innerHTML = '⏸'; L.DomEvent.on(button, 'click', function () { @@ -45,8 +40,8 @@ title: Video Overlay Tutorial return button; } }); - MyPlayControl = L.Control.extend({ - onAdd: function() { + var MyPlayControl = L.Control.extend({ + onAdd: function () { var button = L.DomUtil.create('button'); button.innerHTML = '▶️'; L.DomEvent.on(button, 'click', function () { @@ -56,8 +51,8 @@ title: Video Overlay Tutorial } }); - pauseControl = (new MyPauseControl()).addTo(map); - playControl = (new MyPlayControl()).addTo(map); + var pauseControl = (new MyPauseControl()).addTo(map); + var playControl = (new MyPlayControl()).addTo(map); }); diff --git a/docs/examples/zoom-levels/example-delta.md b/docs/examples/zoom-levels/example-delta.md index df58fa2ee75..a90b393d283 100644 --- a/docs/examples/zoom-levels/example-delta.md +++ b/docs/examples/zoom-levels/example-delta.md @@ -18,23 +18,21 @@ title: Zoom Levels Tutorial }).addTo(map); var ZoomViewer = L.Control.extend({ - onAdd: function(){ - - var container= L.DomUtil.create('div'); + onAdd: function () { + var container = L.DomUtil.create('div'); var gauge = L.DomUtil.create('div'); container.style.width = '200px'; container.style.background = 'rgba(255,255,255,0.5)'; container.style.textAlign = 'left'; - map.on('zoomstart zoom zoomend', function(ev){ + map.on('zoomstart zoom zoomend', function (ev) { gauge.innerHTML = 'Zoom level: ' + map.getZoom(); - }) + }); container.appendChild(gauge); - return container; } }); - var zoomViewerControl = (new ZoomViewer).addTo(map); + var zoomViewerControl = (new ZoomViewer()).addTo(map); map.setView([0, 0], 0); diff --git a/package.json b/package.json index 9e320f9ca27..f9204806cc2 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,8 @@ "docs/examples/choropleth/us-states.js", "docs/examples/geojson/sample-geojson.js", "docs/examples/map-panes/eu-countries.js", + "docs/examples/extending/extending-2-layers.md", + "docs/_posts/2012*", "docs/_site" ], "root": true, @@ -117,6 +119,15 @@ "rules": { "global-require": 0 } + }, + { + "files": [ + "*.md" + ], + "rules": { + "eol-last": 0, + "no-unused-vars": 0 + } } ] }, From 27f49645efd83f55b8184c084b814ec3e306f640 Mon Sep 17 00:00:00 2001 From: Falke Design Date: Tue, 30 Nov 2021 16:42:26 +0100 Subject: [PATCH 252/306] Update zoom buttons documentation text (#7815) --- src/control/Control.Zoom.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/control/Control.Zoom.js b/src/control/Control.Zoom.js index e3d62fcbafc..65307f9d5b6 100644 --- a/src/control/Control.Zoom.js +++ b/src/control/Control.Zoom.js @@ -18,7 +18,7 @@ export var Zoom = Control.extend({ options: { position: 'topleft', - // @option zoomInText: String = '+' + // @option zoomInText: String = '' // The text set on the 'zoom in' button. zoomInText: '', @@ -26,7 +26,7 @@ export var Zoom = Control.extend({ // The title set on the 'zoom in' button. zoomInTitle: 'Zoom in', - // @option zoomOutText: String = '−' + // @option zoomOutText: String = '' // The text set on the 'zoom out' button. zoomOutText: '', From 39c7ea64da30ae406f63ceb4c83d5818b061236f Mon Sep 17 00:00:00 2001 From: shevekk <56224372+shevekk@users.noreply.github.com> Date: Wed, 1 Dec 2021 16:03:13 +0100 Subject: [PATCH 253/306] Create leaflet-coloricon.md (#7812) --- docs/_plugins/markers-renderers/leaflet-coloricon.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 docs/_plugins/markers-renderers/leaflet-coloricon.md diff --git a/docs/_plugins/markers-renderers/leaflet-coloricon.md b/docs/_plugins/markers-renderers/leaflet-coloricon.md new file mode 100644 index 00000000000..9289860fee4 --- /dev/null +++ b/docs/_plugins/markers-renderers/leaflet-coloricon.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ColorIcon +category: markers-renderers +repo: https://github.com/shevekk/Leaflet.ColorIcon +author: Maxence Martin (shevek) +author-url: https://github.com/shevekk +demo: http://dataexplorer.hd.free.fr/Leaflet.ColorIcon/examples/basic/ +compatible-v0: false +compatible-v1: true +--- + +Overwrite color of the icon with CSS filters and make it possible to add same icon-image in different colors. From 2476975c65cbd747b9e78242ae97efdd9e06ffd5 Mon Sep 17 00:00:00 2001 From: bozdoz Date: Thu, 2 Dec 2021 13:45:11 -0400 Subject: [PATCH 254/306] makes L.Browser mutable (#7335) * makes L.Browser mutable * reverts fix to tilelayer min/maxzoom detectRetina issue Co-authored-by: bozdoz Co-authored-by: Vladimir Agafonkin --- src/core/Browser.js | 100 +++++++++++++++++++++---------- src/core/index.js | 2 +- src/dom/DomEvent.Pointer.js | 2 +- src/dom/DomEvent.js | 2 +- src/dom/DomUtil.js | 2 +- src/dom/Draggable.js | 2 +- src/layer/marker/Icon.js | 4 +- src/layer/tile/GridLayer.js | 2 +- src/layer/tile/TileLayer.WMS.js | 4 +- src/layer/tile/TileLayer.js | 2 +- src/layer/vector/Canvas.js | 2 +- src/layer/vector/Renderer.js | 2 +- src/layer/vector/SVG.Util.js | 2 +- src/layer/vector/SVG.js | 2 +- src/map/Map.js | 2 +- src/map/handler/Map.TapHold.js | 2 +- src/map/handler/Map.TouchZoom.js | 2 +- 17 files changed, 86 insertions(+), 50 deletions(-) diff --git a/src/core/Browser.js b/src/core/Browser.js index c782314aedb..0187d811686 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -19,108 +19,108 @@ import {svgCreate} from '../layer/vector/SVG.Util'; var style = document.documentElement.style; // @property ie: Boolean; `true` for all Internet Explorer versions (not Edge). -export var ie = 'ActiveXObject' in window; +var ie = 'ActiveXObject' in window; // @property ielt9: Boolean; `true` for Internet Explorer versions less than 9. -export var ielt9 = ie && !document.addEventListener; +var ielt9 = ie && !document.addEventListener; // @property edge: Boolean; `true` for the Edge web browser. -export var edge = 'msLaunchUri' in navigator && !('documentMode' in document); +var edge = 'msLaunchUri' in navigator && !('documentMode' in document); // @property webkit: Boolean; // `true` for webkit-based browsers like Chrome and Safari (including mobile versions). -export var webkit = userAgentContains('webkit'); +var webkit = userAgentContains('webkit'); // @property android: Boolean // **Deprecated.** `true` for any browser running on an Android platform. -export var android = userAgentContains('android'); +var android = userAgentContains('android'); // @property android23: Boolean; **Deprecated.** `true` for browsers running on Android 2 or Android 3. -export var android23 = userAgentContains('android 2') || userAgentContains('android 3'); +var android23 = userAgentContains('android 2') || userAgentContains('android 3'); /* See https://stackoverflow.com/a/17961266 for details on detecting stock Android */ var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10); // also matches AppleWebKit // @property androidStock: Boolean; **Deprecated.** `true` for the Android stock browser (i.e. not Chrome) -export var androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window); +var androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window); // @property opera: Boolean; `true` for the Opera browser -export var opera = !!window.opera; +var opera = !!window.opera; // @property chrome: Boolean; `true` for the Chrome browser. -export var chrome = !edge && userAgentContains('chrome'); +var chrome = !edge && userAgentContains('chrome'); // @property gecko: Boolean; `true` for gecko-based browsers like Firefox. -export var gecko = userAgentContains('gecko') && !webkit && !opera && !ie; +var gecko = userAgentContains('gecko') && !webkit && !opera && !ie; // @property safari: Boolean; `true` for the Safari browser. -export var safari = !chrome && userAgentContains('safari'); +var safari = !chrome && userAgentContains('safari'); -export var phantom = userAgentContains('phantom'); +var phantom = userAgentContains('phantom'); // @property opera12: Boolean // `true` for the Opera browser supporting CSS transforms (version 12 or later). -export var opera12 = 'OTransition' in style; +var opera12 = 'OTransition' in style; // @property win: Boolean; `true` when the browser is running in a Windows platform -export var win = navigator.platform.indexOf('Win') === 0; +var win = navigator.platform.indexOf('Win') === 0; // @property ie3d: Boolean; `true` for all Internet Explorer versions supporting CSS transforms. -export var ie3d = ie && ('transition' in style); +var ie3d = ie && ('transition' in style); // @property webkit3d: Boolean; `true` for webkit-based browsers supporting CSS transforms. -export var webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23; +var webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23; // @property gecko3d: Boolean; `true` for gecko-based browsers supporting CSS transforms. -export var gecko3d = 'MozPerspective' in style; +var gecko3d = 'MozPerspective' in style; // @property any3d: Boolean // `true` for all browsers supporting CSS transforms. -export var any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantom; +var any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantom; // @property mobile: Boolean; `true` for all browsers running in a mobile device. -export var mobile = typeof orientation !== 'undefined' || userAgentContains('mobile'); +var mobile = typeof orientation !== 'undefined' || userAgentContains('mobile'); // @property mobileWebkit: Boolean; `true` for all webkit-based browsers in a mobile device. -export var mobileWebkit = mobile && webkit; +var mobileWebkit = mobile && webkit; // @property mobileWebkit3d: Boolean // `true` for all webkit-based browsers in a mobile device supporting CSS transforms. -export var mobileWebkit3d = mobile && webkit3d; +var mobileWebkit3d = mobile && webkit3d; // @property msPointer: Boolean // `true` for browsers implementing the Microsoft touch events model (notably IE10). -export var msPointer = !window.PointerEvent && window.MSPointerEvent; +var msPointer = !window.PointerEvent && window.MSPointerEvent; // @property pointer: Boolean // `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx). -export var pointer = !!(window.PointerEvent || msPointer); +var pointer = !!(window.PointerEvent || msPointer); // @property touchNative: Boolean // `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events). // **This does not necessarily mean** that the browser is running in a computer with // a touchscreen, it only means that the browser is capable of understanding // touch events. -export var touchNative = 'ontouchstart' in window || !!window.TouchEvent; +var touchNative = 'ontouchstart' in window || !!window.TouchEvent; // @property touch: Boolean // `true` for all browsers supporting either [touch](#browser-touch) or [pointer](#browser-pointer) events. // Note: pointer events will be preferred (if available), and processed for all `touch*` listeners. -export var touch = !window.L_NO_TOUCH && (touchNative || pointer); +var touch = !window.L_NO_TOUCH && (touchNative || pointer); // @property mobileOpera: Boolean; `true` for the Opera browser in a mobile device. -export var mobileOpera = mobile && opera; +var mobileOpera = mobile && opera; // @property mobileGecko: Boolean // `true` for gecko-based browsers running in a mobile device. -export var mobileGecko = mobile && gecko; +var mobileGecko = mobile && gecko; // @property retina: Boolean // `true` for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%. -export var retina = (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1; +var retina = (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1; // @property passiveEvents: Boolean // `true` for browsers that support passive events. -export var passiveEvents = (function () { +var passiveEvents = (function () { var supportsPassiveOption = false; try { var opts = Object.defineProperty({}, 'passive', { @@ -138,17 +138,17 @@ export var passiveEvents = (function () { // @property canvas: Boolean // `true` when the browser supports [``](https://developer.mozilla.org/docs/Web/API/Canvas_API). -export var canvas = (function () { +var canvas = (function () { return !!document.createElement('canvas').getContext; }()); // @property svg: Boolean // `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG). -export var svg = !!(document.createElementNS && svgCreate('svg').createSVGRect); +var svg = !!(document.createElementNS && svgCreate('svg').createSVGRect); // @property vml: Boolean // `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language). -export var vml = !svg && (function () { +var vml = !svg && (function () { try { var div = document.createElement('div'); div.innerHTML = ''; @@ -167,3 +167,39 @@ export var vml = !svg && (function () { function userAgentContains(str) { return navigator.userAgent.toLowerCase().indexOf(str) >= 0; } + + +export default { + ie: ie, + ielt9: ielt9, + edge: edge, + webkit: webkit, + android: android, + android23: android23, + androidStock: androidStock, + opera: opera, + chrome: chrome, + gecko: gecko, + safari: safari, + phantom: phantom, + opera12: opera12, + win: win, + ie3d: ie3d, + webkit3d: webkit3d, + gecko3d: gecko3d, + any3d: any3d, + mobile: mobile, + mobileWebkit: mobileWebkit, + mobileWebkit3d: mobileWebkit3d, + msPointer: msPointer, + pointer: pointer, + touch: touch, + touchNative: touchNative, + mobileOpera: mobileOpera, + mobileGecko: mobileGecko, + retina: retina, + passiveEvents: passiveEvents, + canvas: canvas, + svg: svg, + vml: vml, +}; diff --git a/src/core/index.js b/src/core/index.js index ae9297d4a80..8c5ccc1e48b 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -1,4 +1,4 @@ -import * as Browser from './Browser'; +import Browser from './Browser'; export {Browser}; export {Class} from './Class'; diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index a050cdecdad..312c978021b 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -1,5 +1,5 @@ import * as DomEvent from './DomEvent'; -import * as Browser from '../core/Browser'; +import Browser from '../core/Browser'; /* * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 5f7d894529e..b6ebcbcf947 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -1,6 +1,6 @@ import {Point} from '../geometry/Point'; import * as Util from '../core/Util'; -import * as Browser from '../core/Browser'; +import Browser from '../core/Browser'; import {addPointerListener, removePointerListener} from './DomEvent.Pointer'; import {addDoubleTapListener, removeDoubleTapListener} from './DomEvent.DoubleTap'; import {getScale} from './DomUtil'; diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index aabcef31b73..8296548d672 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -1,7 +1,7 @@ import * as DomEvent from './DomEvent'; import * as Util from '../core/Util'; import {Point} from '../geometry/Point'; -import * as Browser from '../core/Browser'; +import Browser from '../core/Browser'; /* * @namespace DomUtil diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 4a39c9faa19..3958cd51098 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -1,5 +1,5 @@ import {Evented} from '../core/Events'; -import * as Browser from '../core/Browser'; +import Browser from '../core/Browser'; import * as DomEvent from './DomEvent'; import * as DomUtil from './DomUtil'; import * as Util from '../core/Util'; diff --git a/src/layer/marker/Icon.js b/src/layer/marker/Icon.js index 489c8df1a0f..ed32484e92b 100644 --- a/src/layer/marker/Icon.js +++ b/src/layer/marker/Icon.js @@ -1,7 +1,7 @@ import {Class} from '../../core/Class'; import {setOptions} from '../../core/Util'; import {toPoint as point} from '../../geometry/Point'; -import {retina} from '../../core/Browser'; +import Browser from '../../core/Browser'; /* * @class Icon @@ -153,7 +153,7 @@ export var Icon = Class.extend({ }, _getIconUrl: function (name) { - return retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url']; + return Browser.retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url']; } }); diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 2b3ea4d0f00..df6f1288143 100755 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -1,5 +1,5 @@ import {Layer} from '../Layer'; -import * as Browser from '../../core/Browser'; +import Browser from '../../core/Browser'; import * as Util from '../../core/Util'; import * as DomUtil from '../../dom/DomUtil'; import {Point} from '../../geometry/Point'; diff --git a/src/layer/tile/TileLayer.WMS.js b/src/layer/tile/TileLayer.WMS.js index 7ace31c62d5..679440483d9 100644 --- a/src/layer/tile/TileLayer.WMS.js +++ b/src/layer/tile/TileLayer.WMS.js @@ -1,6 +1,6 @@ import {TileLayer} from './TileLayer'; import {extend, setOptions, getParamString} from '../../core/Util'; -import {retina} from '../../core/Browser'; +import Browser from '../../core/Browser'; import {EPSG4326} from '../../geo/crs/CRS.EPSG4326'; import {toBounds} from '../../geometry/Bounds'; @@ -80,7 +80,7 @@ export var TileLayerWMS = TileLayer.extend({ options = setOptions(this, options); - var realRetina = options.detectRetina && retina ? 2 : 1; + var realRetina = options.detectRetina && Browser.retina ? 2 : 1; var tileSize = this.getTileSize(); wmsParams.width = tileSize.x * realRetina; wmsParams.height = tileSize.y * realRetina; diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 95c8dd41a2d..ec38a36e5d5 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -1,5 +1,5 @@ import {GridLayer} from './GridLayer'; -import * as Browser from '../../core/Browser'; +import Browser from '../../core/Browser'; import * as Util from '../../core/Util'; import * as DomEvent from '../../dom/DomEvent'; import * as DomUtil from '../../dom/DomUtil'; diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index c76284fb96a..baa8255b661 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -1,7 +1,7 @@ import {Renderer} from './Renderer'; import * as DomUtil from '../../dom/DomUtil'; import * as DomEvent from '../../dom/DomEvent'; -import * as Browser from '../../core/Browser'; +import Browser from '../../core/Browser'; import * as Util from '../../core/Util'; import {Bounds} from '../../geometry/Bounds'; diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index d2e5e77dc03..8e635a88ddc 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -1,7 +1,7 @@ import {Layer} from '../Layer'; import * as DomUtil from '../../dom/DomUtil'; import * as Util from '../../core/Util'; -import * as Browser from '../../core/Browser'; +import Browser from '../../core/Browser'; import {Bounds} from '../../geometry/Bounds'; diff --git a/src/layer/vector/SVG.Util.js b/src/layer/vector/SVG.Util.js index 2a547972ca9..9c7fd9394b5 100644 --- a/src/layer/vector/SVG.Util.js +++ b/src/layer/vector/SVG.Util.js @@ -1,4 +1,4 @@ -import * as Browser from '../../core/Browser'; +import Browser from '../../core/Browser'; // @namespace SVG; @section // There are several static functions which can be called without instantiating L.SVG: diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index 8c085e4043a..e4b07895053 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -1,7 +1,7 @@ import {Renderer} from './Renderer'; import * as DomUtil from '../../dom/DomUtil'; import * as DomEvent from '../../dom/DomEvent'; -import * as Browser from '../../core/Browser'; +import Browser from '../../core/Browser'; import {stamp} from '../../core/Util'; import {svgCreate, pointsToPath} from './SVG.Util'; export {pointsToPath}; diff --git a/src/map/Map.js b/src/map/Map.js index 67527700776..a1ec6305a07 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -5,7 +5,7 @@ import {Point, toPoint} from '../geometry/Point'; import {Bounds, toBounds} from '../geometry/Bounds'; import {LatLng, toLatLng} from '../geo/LatLng'; import {LatLngBounds, toLatLngBounds} from '../geo/LatLngBounds'; -import * as Browser from '../core/Browser'; +import Browser from '../core/Browser'; import * as DomEvent from '../dom/DomEvent'; import * as DomUtil from '../dom/DomUtil'; import {PosAnimation} from '../dom/PosAnimation'; diff --git a/src/map/handler/Map.TapHold.js b/src/map/handler/Map.TapHold.js index 68a8f03214e..558ba77e5d3 100644 --- a/src/map/handler/Map.TapHold.js +++ b/src/map/handler/Map.TapHold.js @@ -3,7 +3,7 @@ import {Handler} from '../../core/Handler'; import * as DomEvent from '../../dom/DomEvent'; import {Point} from '../../geometry/Point'; import * as Util from '../../core/Util'; -import * as Browser from '../../core/Browser'; +import Browser from '../../core/Browser'; /* * L.Map.TapHold is used to simulate `contextmenu` event on long hold, diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index 74bc20add7d..9ca240cc1d0 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -3,7 +3,7 @@ import {Handler} from '../../core/Handler'; import * as DomEvent from '../../dom/DomEvent'; import * as Util from '../../core/Util'; import * as DomUtil from '../../dom/DomUtil'; -import * as Browser from '../../core/Browser'; +import Browser from '../../core/Browser'; /* * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers. From e8b87eacf5313f8e3ddd4d1eac69e1f1472bac4d Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 2 Dec 2021 18:51:38 +0100 Subject: [PATCH 255/306] bindTooltip should unbind existent tooltip (#7633) * Fix overlapping permanent tooltip on bindTooltip Fix overlapping permanent tooltip on bindTooltip * Update test * Fix lint errors * Using sinon.spy on a function of layer * unwrap spy in the test * move spy restore --- spec/suites/layer/TooltipSpec.js | 11 +++++++++++ src/layer/Tooltip.js | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/spec/suites/layer/TooltipSpec.js b/spec/suites/layer/TooltipSpec.js index 91d991ff0ce..9314c4f9d52 100644 --- a/spec/suites/layer/TooltipSpec.js +++ b/spec/suites/layer/TooltipSpec.js @@ -303,4 +303,15 @@ describe('Tooltip', function () { layer.bindTooltip('Tooltip', {interactive: true}); layer.closeTooltip(); }); + + it("closes existent tooltip on new bindTooltip call", function () { + var layer = new L.Marker(center).addTo(map); + var eventSpy = sinon.spy(layer, "unbindTooltip"); + layer.bindTooltip('Tooltip1', {permanent: true}); + var tooltip1 = layer.getTooltip(); + layer.bindTooltip('Tooltip2').openTooltip(); + layer.unbindTooltip.restore(); // unwrap the spy + expect(map.hasLayer(tooltip1)).to.not.be.ok(); + expect(eventSpy.calledOnce).to.be.ok(); + }); }); diff --git a/src/layer/Tooltip.js b/src/layer/Tooltip.js index 3c3121b217d..c391e96e838 100644 --- a/src/layer/Tooltip.js +++ b/src/layer/Tooltip.js @@ -276,6 +276,10 @@ Layer.include({ // the layer as the first argument and should return a `String` or `HTMLElement`. bindTooltip: function (content, options) { + if (this._tooltip && this.isTooltipOpen()) { + this.unbindTooltip(); + } + if (content instanceof Tooltip) { Util.setOptions(content, options); this._tooltip = content; From e7d5a3725fc6119efaa21ccb8441c83e44e35a91 Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 2 Dec 2021 18:59:14 +0100 Subject: [PATCH 256/306] Locate - locationfound: Add check if map container has leaflet_id / is existing (#7813) * Add check if map container has the leaflet_id * Fix lint * Use private _container * Add test for _handleGeolocationError * Update test text * Change text of test --- spec/suites/map/MapSpec.js | 18 ++++++++++++++++++ src/map/Map.js | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index cf7b2dba83b..75a9c2b5c28 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -1318,4 +1318,22 @@ describe("Map", function () { expect(map.getZoom()).to.be(undefined); }); }); + + describe("#Geolocation", function () { + it("doesn't throw error if location is found and map is not existing", function () { + var fn = L.Util.bind(map._handleGeolocationResponse, map); + map.remove(); + expect(function () { + fn({coords: {latitude: 40.415296, longitude: 10.7419264, accuracy: 1129.5646101470752}}); + }).to.not.throwException(); + }); + it("doesn't throw error if location is not found and map is not existing", function () { + map._locateOptions = {setView: true}; + var fn = L.Util.bind(map._handleGeolocationError, map); + map.remove(); + expect(function () { + fn({coords: {latitude: 40.415296, longitude: 10.7419264, accuracy: 1129.5646101470752}}); + }).to.not.throwException(); + }); + }); }); diff --git a/src/map/Map.js b/src/map/Map.js index a1ec6305a07..73d7db83512 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -664,6 +664,8 @@ export var Map = Evented.extend({ }, _handleGeolocationError: function (error) { + if (!this._container._leaflet_id) { return; } + var c = error.code, message = error.message || (c === 1 ? 'permission denied' : @@ -683,6 +685,8 @@ export var Map = Evented.extend({ }, _handleGeolocationResponse: function (pos) { + if (!this._container._leaflet_id) { return; } + var lat = pos.coords.latitude, lng = pos.coords.longitude, latlng = new LatLng(lat, lng), From 4b2946c205d0a6e51f324cfff6536d1ef7caf463 Mon Sep 17 00:00:00 2001 From: vcoppe Date: Thu, 2 Dec 2021 18:59:47 +0100 Subject: [PATCH 257/306] Correct condition to add zoom limits for Layer (#7609) --- src/layer/Layer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index ab5a8bc6920..8d379f24fad 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -227,7 +227,7 @@ Map.include({ }, _addZoomLimit: function (layer) { - if (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) { + if (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) { this._zoomBoundLayers[Util.stamp(layer)] = layer; this._updateZoomLevels(); } From 30d91b1769d3708aa11ea5bff81dd9b22fe1b971 Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 2 Dec 2021 19:01:17 +0100 Subject: [PATCH 258/306] Fix Bug: permanent & sticky tooltip (#7563) * Fixes bug: if tooltip is sticky and permanent it was not following the mouse * Add tests * Use fastframe * fix whitespace Co-authored-by: Vladimir Agafonkin --- spec/suites/layer/TooltipSpec.js | 29 +++++++++++++++++++++++++++++ src/layer/Tooltip.js | 6 +++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/spec/suites/layer/TooltipSpec.js b/spec/suites/layer/TooltipSpec.js index 9314c4f9d52..9f2af18a288 100644 --- a/spec/suites/layer/TooltipSpec.js +++ b/spec/suites/layer/TooltipSpec.js @@ -304,6 +304,35 @@ describe('Tooltip', function () { layer.closeTooltip(); }); + it("opens a tooltip and follow the mouse (sticky)", function () { + var layer = L.rectangle([[58, 39.7], [54, 35.3]]).addTo(map); + layer.bindTooltip('Sticky', {sticky: true}).openTooltip(); + var tooltip = layer.getTooltip(); + expect(tooltip.getLatLng().equals(layer.getCenter())).to.be(true); + + happen.at('click', 120, 120); + var latlng = map.containerPointToLatLng([120, 120]); + expect(tooltip.getLatLng().equals(latlng)).to.be(true); + }); + + it("opens a permanent tooltip and follow the mouse (sticky)", function (done) { + var layer = L.rectangle([[58, 39.7], [54, 35.3]]).addTo(map); + layer.bindTooltip('Sticky', {sticky: true, permanent: true}).openTooltip(); + var tooltip = layer.getTooltip(); + expect(tooltip.getLatLng().equals(layer.getCenter())).to.be(true); + + var hand = new Hand({ + timing: 'fastframe', + onStop: function () { + var latlng = map.containerPointToLatLng([120, 120]); + expect(tooltip.getLatLng().equals(latlng)).to.be(true); + done(); + } + }); + var toucher = hand.growFinger('mouse'); + toucher.wait(100).moveTo(120, 120, 1000).wait(100); + }); + it("closes existent tooltip on new bindTooltip call", function () { var layer = new L.Marker(center).addTo(map); var eventSpy = sinon.spy(layer, "unbindTooltip"); diff --git a/src/layer/Tooltip.js b/src/layer/Tooltip.js index c391e96e838..dd50f34e226 100644 --- a/src/layer/Tooltip.js +++ b/src/layer/Tooltip.js @@ -322,13 +322,13 @@ Layer.include({ if (!this._tooltip.options.permanent) { events.mouseover = this._openTooltip; events.mouseout = this.closeTooltip; - if (this._tooltip.options.sticky) { - events.mousemove = this._moveTooltip; - } events.click = this._openTooltip; } else { events.add = this._openTooltip; } + if (this._tooltip.options.sticky) { + events.mousemove = this._moveTooltip; + } this[onOff](events); this._tooltipHandlersAdded = !remove; }, From a340c086c2c5b2f8fcf95da0765a72566bb54d2a Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 2 Dec 2021 19:02:49 +0100 Subject: [PATCH 259/306] Break the reference to the options of the Class prototype (#7459) * Break the reference to the options of the Class prototype * Refactor test and .setOptions * Revert: Merge https://github.com/Leaflet/Leaflet into class_options --- spec/suites/core/ClassSpec.js | 6 ++++++ src/core/Class.js | 2 ++ 2 files changed, 8 insertions(+) diff --git a/spec/suites/core/ClassSpec.js b/spec/suites/core/ClassSpec.js index 040fe0e6e5b..83b717caa3c 100644 --- a/spec/suites/core/ClassSpec.js +++ b/spec/suites/core/ClassSpec.js @@ -154,6 +154,12 @@ describe("Class", function () { expect(props.options).to.be(opts); }); + it("prevents change of prototype options", function () { + var Klass = L.Class.extend({options: {}}); + var instance = new Klass(); + expect(Klass.prototype.options).to.not.be(instance.options); + }); + it("adds constructor hooks correctly", function () { var spy1 = sinon.spy(); diff --git a/src/core/Class.js b/src/core/Class.js index 6cae85b0082..7d1c1b26a88 100644 --- a/src/core/Class.js +++ b/src/core/Class.js @@ -17,6 +17,8 @@ Class.extend = function (props) { // Returns a Javascript function that is a class constructor (to be called with `new`). var NewClass = function () { + Util.setOptions(this); + // call the constructor if (this.initialize) { this.initialize.apply(this, arguments); From d00a8b28ae9992e789b46f128d2cb74b9346fbcf Mon Sep 17 00:00:00 2001 From: Alexandria Quelle <38425426+aquelle-cp@users.noreply.github.com> Date: Thu, 2 Dec 2021 11:32:14 -0800 Subject: [PATCH 260/306] Added clarification (#7819) Added a sentence to indicate when the code examples switch from HTML and CSS to JS for clarity --- docs/examples/quick-start/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/quick-start/index.md b/docs/examples/quick-start/index.md index 2b6aeeec263..ce676c9e8d1 100644 --- a/docs/examples/quick-start/index.md +++ b/docs/examples/quick-start/index.md @@ -42,7 +42,7 @@ Now you're ready to initialize the map and do some stuff with it. {% include frame.html url="example-basic.html" %} -Let's create a map of the center of London with pretty Mapbox Streets tiles. First we'll initialize the map and set its view to our chosen geographical coordinates and a zoom level: +Let's create a map of the center of London with pretty Mapbox Streets tiles. From here on, we'll be working in JS. First we'll initialize the map and set its view to our chosen geographical coordinates and a zoom level: var map = L.map('map').setView([51.505, -0.09], 13); From 8531ede66284d6ab7d1ec76efac47781d7398b3c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 3 Dec 2021 14:13:02 +0200 Subject: [PATCH 261/306] bump license formatting hoping that GH picks it up now --- LICENSE | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/LICENSE b/LICENSE index 0cb916b4523..2773af505ee 100644 --- a/LICENSE +++ b/LICENSE @@ -1,23 +1,26 @@ +BSD 2-Clause License + Copyright (c) 2010-2021, Vladimir Agafonkin Copyright (c) 2010-2011, CloudMade All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are -permitted provided that the following conditions are met: +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright notice, this list of - conditions and the following disclaimer. +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, this list - of conditions and the following disclaimer in the documentation and/or other materials - provided with the distribution. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From a921fdd9546e9208f65d6826dd68d0372d079b48 Mon Sep 17 00:00:00 2001 From: Jon Koops Date: Fri, 3 Dec 2021 13:15:08 +0100 Subject: [PATCH 262/306] Remove all references of Bower (#7831) --- .gitignore | 1 - FAQ.md | 2 -- 2 files changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index 0d912d9eec3..2e410f4f4a2 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ dist/reference.html coverage/ *.js.html .mailmap -bower.json component.json debug/local/ Gemfile.lock diff --git a/FAQ.md b/FAQ.md index 4a675214c83..8949ee80109 100644 --- a/FAQ.md +++ b/FAQ.md @@ -137,5 +137,3 @@ updated automatically on each commit to the repo. We removed the built versions from the repository because it's a chore to build and commit them manually on each change, and it often complicates merging branches and managing contributions. - -There's a common complaint that Leaflet can't be used with [Bower](http://bower.io/) because of that, but we'll resolve the issue soon. From a6d6d512acdf95466ad5fb49785783048bd6c981 Mon Sep 17 00:00:00 2001 From: b_b Date: Fri, 3 Dec 2021 19:37:27 +0100 Subject: [PATCH 263/306] leaflet.zoomfs compatibility (#7832) I don't think this plugin is compatible with Leaflet v1 :\ - the demo use Leaflet 0.5.1 https://github.com/elidupuis/leaflet.zoomfs/blob/master/index.html#L12 - the last commit on the repo was made 9 years ago - the online demo page https://elidupuis.github.com/leaflet.zoomfs returns a 404 error --- docs/_plugins/fullscreen-controls/leaflet-zoomfs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_plugins/fullscreen-controls/leaflet-zoomfs.md b/docs/_plugins/fullscreen-controls/leaflet-zoomfs.md index 5dd3ca6eb02..f5fe697e7ea 100644 --- a/docs/_plugins/fullscreen-controls/leaflet-zoomfs.md +++ b/docs/_plugins/fullscreen-controls/leaflet-zoomfs.md @@ -5,8 +5,8 @@ repo: https://github.com/elidupuis/leaflet.zoomfs author: Eli Dupuis author-url: https://github.com/elidupuis demo: -compatible-v0: -compatible-v1: true +compatible-v0: true +compatible-v1: false --- A fullscreen button control. From fc9c7164575530c067b8f7ed03c4607eb51c4514 Mon Sep 17 00:00:00 2001 From: b_b Date: Fri, 3 Dec 2021 20:17:15 +0100 Subject: [PATCH 264/306] Update plugins compat & demos (#7834) * add demo url for leaflet-providers * update Leaflet.Routing compat - demo page use leaflet 0.7 https://github.com/Turistforeningen/leaflet-routing/blob/gh-pages/index.html#L34 and it's broken http://turistforeningen.github.io/leaflet-routing/examples/osm.html - project seems unmaintained, last commit from 2015 + https://github.com/Turistforeningen/leaflet-routing/issues/50 * add demo url for Leaflet.Locate * add demo for Leaflet Control Compass * add demo for Leaflet.AccuratePosition + update compat info - demo use leaflet 0.7 https://github.com/M165437/Leaflet.AccuratePosition/blob/gh-pages/index.html#L11 - last commit from 2016 * update compat for L.LocationShare - demo page use leaflet 0.7 https://github.com/CliffCloud/Leaflet.LocationShare/blob/master/index.html#L11 - index.html file provided by the repo doesn't work when using leaflet 1.7 --- docs/_plugins/basemap-providers/leafletproviders.md | 2 +- docs/_plugins/geolocation/l-locationshare.md | 4 ++-- docs/_plugins/geolocation/leaflet-accurateposition.md | 6 +++--- docs/_plugins/geolocation/leaflet-control-compass.md | 2 +- docs/_plugins/geolocation/leaflet-locate.md | 2 +- docs/_plugins/routing/leaflet-routing.md | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/_plugins/basemap-providers/leafletproviders.md b/docs/_plugins/basemap-providers/leafletproviders.md index c50d1922b5b..2095610bb87 100644 --- a/docs/_plugins/basemap-providers/leafletproviders.md +++ b/docs/_plugins/basemap-providers/leafletproviders.md @@ -4,7 +4,7 @@ category: basemap-providers repo: https://github.com/leaflet-extras/leaflet-providers author: leaflet-extras members author-url: https://github.com/leaflet-extras -demo: +demo: https://leaflet-extras.github.io/leaflet-providers/preview/ compatible-v0: compatible-v1: true --- diff --git a/docs/_plugins/geolocation/l-locationshare.md b/docs/_plugins/geolocation/l-locationshare.md index 545175b8e56..473af80a679 100644 --- a/docs/_plugins/geolocation/l-locationshare.md +++ b/docs/_plugins/geolocation/l-locationshare.md @@ -5,8 +5,8 @@ repo: https://github.com/CliffCloud/Leaflet.LocationShare author: atstp author-url: https://github.com/atstp demo: https://cliffcloud.github.io/Leaflet.LocationShare/ -compatible-v0: -compatible-v1: true +compatible-v0: true +compatible-v1: false --- Allow users to send and receive a marker with a message. diff --git a/docs/_plugins/geolocation/leaflet-accurateposition.md b/docs/_plugins/geolocation/leaflet-accurateposition.md index c7a0092a65d..b7992a18494 100644 --- a/docs/_plugins/geolocation/leaflet-accurateposition.md +++ b/docs/_plugins/geolocation/leaflet-accurateposition.md @@ -4,9 +4,9 @@ category: geolocation repo: https://github.com/M165437/Leaflet.AccuratePosition author: Michael Schmidt-Voigt author-url: https://github.com/M165437 -demo: -compatible-v0: -compatible-v1: true +demo: https://m165437.github.io/Leaflet.AccuratePosition/ +compatible-v0: true +compatible-v1: false --- Leaflet.AccuratePosition aims to provide a desired device location accuracy. diff --git a/docs/_plugins/geolocation/leaflet-control-compass.md b/docs/_plugins/geolocation/leaflet-control-compass.md index 303cb5492a0..b41d44d68fb 100644 --- a/docs/_plugins/geolocation/leaflet-control-compass.md +++ b/docs/_plugins/geolocation/leaflet-control-compass.md @@ -4,7 +4,7 @@ category: geolocation repo: https://github.com/stefanocudini/leaflet-compass author: Stefano Cudini author-url: https://opengeo.tech/ -demo: +demo: https://opengeo.tech/maps/leaflet-compass/examples/simple.html compatible-v0: compatible-v1: true --- diff --git a/docs/_plugins/geolocation/leaflet-locate.md b/docs/_plugins/geolocation/leaflet-locate.md index 783ebe20411..6ffb4541996 100644 --- a/docs/_plugins/geolocation/leaflet-locate.md +++ b/docs/_plugins/geolocation/leaflet-locate.md @@ -4,7 +4,7 @@ category: geolocation repo: https://github.com/domoritz/leaflet-locatecontrol author: Dominik Moritz author-url: https://github.com/domoritz -demo: +demo: https://domoritz.github.io/leaflet-locatecontrol/demo/ compatible-v0: compatible-v1: true --- diff --git a/docs/_plugins/routing/leaflet-routing.md b/docs/_plugins/routing/leaflet-routing.md index 5053fe9a5c9..45a04fe2537 100644 --- a/docs/_plugins/routing/leaflet-routing.md +++ b/docs/_plugins/routing/leaflet-routing.md @@ -5,8 +5,8 @@ repo: https://github.com/Turistforeningen/leaflet-routing author: Norwegian Trekking Association author-url: https://github.com/turistforeningen demo: -compatible-v0: -compatible-v1: true +compatible-v0: true +compatible-v1: false --- Leaflet controller and interface for routing paths between waypoints using any user provided routing service. From a1342a15e9aa8d59dbde28ee22780fb3f06a9961 Mon Sep 17 00:00:00 2001 From: b_b Date: Fri, 3 Dec 2021 20:33:12 +0100 Subject: [PATCH 265/306] add demo url for the plugin (#7833) no need to comment :p --- docs/_plugins/fullscreen-controls/leaflet-fullscreen.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_plugins/fullscreen-controls/leaflet-fullscreen.md b/docs/_plugins/fullscreen-controls/leaflet-fullscreen.md index 369247a2881..29a23167547 100644 --- a/docs/_plugins/fullscreen-controls/leaflet-fullscreen.md +++ b/docs/_plugins/fullscreen-controls/leaflet-fullscreen.md @@ -4,7 +4,7 @@ category: fullscreen-controls repo: https://github.com/brunob/leaflet.fullscreen author: Bruno B author-url: https://github.com/brunob/ -demo: +demo: https://brunob.github.io/leaflet.fullscreen/ compatible-v0: compatible-v1: true --- From 80b268525e842fe087f0d058fd16efa75423557b Mon Sep 17 00:00:00 2001 From: johnd0e Date: Sun, 5 Dec 2021 12:32:19 +0200 Subject: [PATCH 266/306] Better icon image path detection (#7092) --- dist/leaflet.css | 2 +- spec/suites/layer/marker/Icon.DefaultSpec.js | 27 ++++++++++++++++++++ src/layer/marker/Icon.Default.js | 24 ++++++++++------- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 048250525ad..7d36a39077f 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -396,7 +396,7 @@ svg.leaflet-image-layer.leaflet-interactive path { } /* Default icon URLs */ -.leaflet-default-icon-path { +.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */ background-image: url(images/marker-icon.png); } diff --git a/spec/suites/layer/marker/Icon.DefaultSpec.js b/spec/suites/layer/marker/Icon.DefaultSpec.js index f29c033952e..5994995eb88 100644 --- a/spec/suites/layer/marker/Icon.DefaultSpec.js +++ b/spec/suites/layer/marker/Icon.DefaultSpec.js @@ -14,6 +14,33 @@ describe("Icon.Default", function () { document.body.removeChild(div); }); + it("detect icon images path", function () { + var origPath = L.Icon.Default.imagePath; // set in after.js + expect(origPath).to.be.ok(); + delete L.Icon.Default.imagePath; + var marker = new L.Marker([0, 0]); + + expect(L.Icon.Default.imagePath).to.not.be.ok(); + marker.addTo(map); + + // polyfill for IE<11 + var origin = document.location.origin || window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port : ''); + expect(L.Icon.Default.imagePath).to.equal(origin + origPath); + + var stripUrl = L.Icon.Default.prototype._stripUrl; + var properPath = 'http://localhost:8000/base/dist/images/'; + [ // valid + 'url("http://localhost:8000/base/dist/images/marker-icon.png")', // Firefox + "url('http://localhost:8000/base/dist/images/marker-icon.png')", + 'url(http://localhost:8000/base/dist/images/marker-icon.png)', // IE, Edge + ].map(stripUrl).forEach(function (str) { expect(str).to.be(properPath); }); + + [ // invalid + 'url("http://localhost:8000/base/dist/images/marker-icon.png?2x)"', + 'url("data:image/png;base64,iVBORw...")', // inline image (bundlers) + ].map(stripUrl).forEach(function (str) { expect(str).not.to.be.ok(); }); + }); + it("icon measures 25x41px", function () { var img = map.getPane('markerPane').querySelector('img'); expect(img.clientHeight).to.be(41); diff --git a/src/layer/marker/Icon.Default.js b/src/layer/marker/Icon.Default.js index fc6996c51c7..32372892b50 100644 --- a/src/layer/marker/Icon.Default.js +++ b/src/layer/marker/Icon.Default.js @@ -31,7 +31,7 @@ export var IconDefault = Icon.extend({ }, _getIconUrl: function (name) { - if (!IconDefault.imagePath) { // Deprecated, backwards-compatibility only + if (typeof IconDefault.imagePath !== 'string') { // Deprecated, backwards-compatibility only IconDefault.imagePath = this._detectIconPath(); } @@ -42,19 +42,25 @@ export var IconDefault = Icon.extend({ return (this.options.imagePath || IconDefault.imagePath) + Icon.prototype._getIconUrl.call(this, name); }, + _stripUrl: function (path) { // separate function to use in tests + var strip = function (str, re, idx) { + var match = re.exec(str); + return match && match[idx]; + }; + path = strip(path, /^url\((['"])?(.+)\1\)$/, 2); + return path && strip(path, /^(.*)marker-icon\.png$/, 1); + }, + _detectIconPath: function () { var el = DomUtil.create('div', 'leaflet-default-icon-path', document.body); var path = DomUtil.getStyle(el, 'background-image') || DomUtil.getStyle(el, 'backgroundImage'); // IE8 document.body.removeChild(el); - - if (path === null || path.indexOf('url') !== 0) { - path = ''; - } else { - path = path.replace(/^url\(["']?/, '').replace(/marker-icon\.png["']?\)$/, ''); - } - - return path; + path = this._stripUrl(path); + if (path) { return path; } + var link = document.querySelector('link[href$="leaflet.css"]'); + if (!link) { return ''; } + return link.href.substring(0, link.href.length - 'leaflet.css'.length - 1); } }); From 7dcc3de7161ef4527e5b1fd67b44a3959f679d43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Dec 2021 14:39:53 +0200 Subject: [PATCH 267/306] Bump rollup from 2.60.1 to 2.60.2 (#7838) Bumps [rollup](https://github.com/rollup/rollup) from 2.60.1 to 2.60.2. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v2.60.1...v2.60.2) --- updated-dependencies: - dependency-name: rollup dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5a37cce617e..d73c1003692 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2613,9 +2613,9 @@ } }, "node_modules/rollup": { - "version": "2.60.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", - "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", + "version": "2.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.2.tgz", + "integrity": "sha512-1Bgjpq61sPjgoZzuiDSGvbI1tD91giZABgjCQBKM5aYLnzjq52GoDuWVwT/cm/MCxCMPU8gqQvkj8doQ5C8Oqw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5295,9 +5295,9 @@ } }, "rollup": { - "version": "2.60.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", - "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", + "version": "2.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.2.tgz", + "integrity": "sha512-1Bgjpq61sPjgoZzuiDSGvbI1tD91giZABgjCQBKM5aYLnzjq52GoDuWVwT/cm/MCxCMPU8gqQvkj8doQ5C8Oqw==", "dev": true, "requires": { "fsevents": "~2.3.2" From 1e1987e1ba8be4a8421f7740f45a1170f74a48e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Dec 2021 14:40:10 +0200 Subject: [PATCH 268/306] Bump eslint from 8.3.0 to 8.4.0 (#7837) Bumps [eslint](https://github.com/eslint/eslint) from 8.3.0 to 8.4.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.3.0...v8.4.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 80 +++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index d73c1003692..1b043b3e3d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,14 +49,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", + "espree": "^9.2.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -69,12 +69,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" }, @@ -83,9 +83,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "node_modules/@rollup/plugin-json": { @@ -847,13 +847,13 @@ } }, "node_modules/eslint": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", - "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.0.tgz", + "integrity": "sha512-kv0XQcAQJL/VD9THQKhTQZVqkJKA+tIj/v2ZKNaIHRAADcJWFb+B/BAewUYuF6UVg1s2xC5qXVoDk0G8sKGeTA==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -864,7 +864,7 @@ "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.1.0", - "espree": "^9.1.0", + "espree": "^9.2.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -969,9 +969,9 @@ } }, "node_modules/espree": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", - "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", + "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", "dev": true, "dependencies": { "acorn": "^8.6.0", @@ -3283,14 +3283,14 @@ } }, "@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", + "espree": "^9.2.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -3300,20 +3300,20 @@ } }, "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } }, "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "@rollup/plugin-json": { @@ -3925,13 +3925,13 @@ "dev": true }, "eslint": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", - "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.0.tgz", + "integrity": "sha512-kv0XQcAQJL/VD9THQKhTQZVqkJKA+tIj/v2ZKNaIHRAADcJWFb+B/BAewUYuF6UVg1s2xC5qXVoDk0G8sKGeTA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -3942,7 +3942,7 @@ "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.1.0", - "espree": "^9.1.0", + "espree": "^9.2.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4021,9 +4021,9 @@ "dev": true }, "espree": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", - "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", + "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", "dev": true, "requires": { "acorn": "^8.6.0", From e3719a317ab325ed091fbbc6bfd34640fe19e13e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Dec 2021 14:40:20 +0200 Subject: [PATCH 269/306] Bump uglify-js from 3.14.3 to 3.14.4 (#7836) Bumps [uglify-js](https://github.com/mishoo/UglifyJS) from 3.14.3 to 3.14.4. - [Release notes](https://github.com/mishoo/UglifyJS/releases) - [Commits](https://github.com/mishoo/UglifyJS/compare/v3.14.3...v3.14.4) --- updated-dependencies: - dependency-name: uglify-js dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1b043b3e3d7..5ed7554f936 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3041,9 +3041,9 @@ "dev": true }, "node_modules/uglify-js": { - "version": "3.14.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", - "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", + "version": "3.14.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.4.tgz", + "integrity": "sha512-AbiSR44J0GoCeV81+oxcy/jDOElO2Bx3d0MfQCUShq7JRXaM4KtQopZsq2vFv8bCq2yMaGrw1FgygUd03RyRDA==", "dev": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -5604,9 +5604,9 @@ "dev": true }, "uglify-js": { - "version": "3.14.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", - "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", + "version": "3.14.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.4.tgz", + "integrity": "sha512-AbiSR44J0GoCeV81+oxcy/jDOElO2Bx3d0MfQCUShq7JRXaM4KtQopZsq2vFv8bCq2yMaGrw1FgygUd03RyRDA==", "dev": true }, "universalify": { From f3f28c3188958f228f7e78d7740e290b86b0f64e Mon Sep 17 00:00:00 2001 From: Jon Koops Date: Fri, 10 Dec 2021 17:41:56 +0100 Subject: [PATCH 270/306] Upload files to AWS even if the file-size is the same (#7853) --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fd19d6a5798..2f01ae0a14d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -111,7 +111,7 @@ jobs: - name: Deploy artifacts uses: jakejarvis/s3-sync-action@v0.5.1 with: - args: --acl public-read --delete + args: --acl public-read --delete --exact-timestamps env: AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} From 06f76d4c53a68f53b44d3ab67595829425da1c1a Mon Sep 17 00:00:00 2001 From: Falke Design Date: Fri, 10 Dec 2021 17:58:26 +0100 Subject: [PATCH 271/306] Added missing tests to index.html (#7845) --- spec/index.html | 10 ++++++---- spec/suites/core/GeneralSpec.js | 4 ++-- spec/suites/geo/{ => crs}/CRSSpec.js | 0 spec/suites/geo/{ => projection}/ProjectionSpec.js | 0 4 files changed, 8 insertions(+), 6 deletions(-) rename spec/suites/geo/{ => crs}/CRSSpec.js (100%) rename spec/suites/geo/{ => projection}/ProjectionSpec.js (100%) diff --git a/spec/index.html b/spec/index.html index f80903a8c1f..f0e74016b26 100644 --- a/spec/index.html +++ b/spec/index.html @@ -42,6 +42,7 @@ + @@ -53,7 +54,10 @@ - + + + + @@ -91,14 +95,12 @@ + - - - diff --git a/spec/suites/core/GeneralSpec.js b/spec/suites/core/GeneralSpec.js index fce1f215a0e..d5de9fcfebc 100644 --- a/spec/suites/core/GeneralSpec.js +++ b/spec/suites/core/GeneralSpec.js @@ -1,5 +1,5 @@ describe('General', function () { - describe('noConflict', function () { + it('noConflict', function () { var leaflet = L; after(function () { @@ -9,7 +9,7 @@ describe('General', function () { expect(L.noConflict()).to.eql(leaflet); }); - describe('namespace extension', function () { + it('namespace extension', function () { L.Util.foo = 'bar'; L.Foo = 'Bar'; diff --git a/spec/suites/geo/CRSSpec.js b/spec/suites/geo/crs/CRSSpec.js similarity index 100% rename from spec/suites/geo/CRSSpec.js rename to spec/suites/geo/crs/CRSSpec.js diff --git a/spec/suites/geo/ProjectionSpec.js b/spec/suites/geo/projection/ProjectionSpec.js similarity index 100% rename from spec/suites/geo/ProjectionSpec.js rename to spec/suites/geo/projection/ProjectionSpec.js From afe38e09d919e06e3d7d537730d88d9c6a225677 Mon Sep 17 00:00:00 2001 From: Falke Design Date: Fri, 10 Dec 2021 17:58:57 +0100 Subject: [PATCH 272/306] Add `getCenter` to ImageOverlay (#7848) --- spec/suites/layer/ImageOverlaySpec.js | 11 +++++++++++ src/layer/ImageOverlay.js | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/spec/suites/layer/ImageOverlaySpec.js b/spec/suites/layer/ImageOverlaySpec.js index a59edd436e1..0db082ecf24 100644 --- a/spec/suites/layer/ImageOverlaySpec.js +++ b/spec/suites/layer/ImageOverlaySpec.js @@ -133,6 +133,17 @@ describe('ImageOverlay', function () { }); }); + describe('#getCenter', function () { + it('should return the correct center', function () { + var overlay = L.imageOverlay('', imageBounds).addTo(map); + expect(overlay.getCenter()).to.be.nearLatLng([40.743078, -74.175995]); + }); + it('should open popup at the center', function () { + var overlay = L.imageOverlay('', imageBounds).addTo(map); + overlay.bindPopup('Center').openPopup(); + expect(overlay.getPopup().getLatLng()).to.be.nearLatLng([40.743078, -74.175995]); + }); + }); // For tests that do not actually need to append the map container to the document. // This saves PhantomJS memory. var _describe = 'crossOrigin' in L.DomUtil.create('img') ? describe : describe.skip; // skip in IE<11 diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 4a543ad62c9..d7bc95960e4 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -253,6 +253,12 @@ export var ImageOverlay = Layer.extend({ this._url = errorUrl; this._image.src = errorUrl; } + }, + + // @method getCenter(): LatLng + // Returns the center of the ImageOverlay. + getCenter: function () { + return this._bounds.getCenter(); } }); From acffb7edf85e1fad004ed79ac6ecfb0c22329515 Mon Sep 17 00:00:00 2001 From: Robert Linder Date: Fri, 10 Dec 2021 17:59:16 +0100 Subject: [PATCH 273/306] Set `role=button` on the Layer control (#7850) --- src/control/Control.Layers.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 7d22d885d3a..429ede0521e 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -201,6 +201,7 @@ export var Layers = Control.extend({ var link = this._layersLink = DomUtil.create('a', className + '-toggle', container); link.href = '#'; link.title = 'Layers'; + link.setAttribute('role', 'button'); DomEvent.on(link, 'click', DomEvent.preventDefault); // prevent link function DomEvent.on(link, 'focus', this.expand, this); From a9d7c4fe7d56a109eeba7d5c05b6dad93feb13e7 Mon Sep 17 00:00:00 2001 From: Robert Linder Date: Fri, 10 Dec 2021 18:01:40 +0100 Subject: [PATCH 274/306] Add print styles to prevent printers from removing background-images in controls (#7851) * Add print styles (prevent printers from removing background-images in controls) * Update leaflet.css --- dist/leaflet.css | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/dist/leaflet.css b/dist/leaflet.css index 7d36a39077f..d740ea9a9d8 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -643,3 +643,13 @@ svg.leaflet-image-layer.leaflet-interactive path { margin-left: -12px; border-right-color: #fff; } + +/* Printing */ + +@media print { + /* Prevent printers from removing background-images of controls. */ + .leaflet-control { + -webkit-print-color-adjust: exact; + color-adjust: exact; + } + } From 009748a0ca404ad8708ba71def33f20fff1a607f Mon Sep 17 00:00:00 2001 From: Falke Design Date: Sun, 12 Dec 2021 14:34:38 +0100 Subject: [PATCH 275/306] Change http to https of https://leafletjs.com (#7857) --- build/banner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/banner.js b/build/banner.js index 82dee2acbda..327745a70e0 100644 --- a/build/banner.js +++ b/build/banner.js @@ -1,6 +1,6 @@ export function createBanner(version) { return `/* @preserve - * Leaflet ${version}, a JS library for interactive maps. http://leafletjs.com + * Leaflet ${version}, a JS library for interactive maps. https://leafletjs.com * (c) 2010-${new Date().getFullYear()} Vladimir Agafonkin, (c) 2010-2011 CloudMade */ `; From 08b39b0a8c7b0b8176ac61c8ef56d4a731ba1908 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Dec 2021 10:04:27 +0000 Subject: [PATCH 276/306] Bump eslint from 8.4.0 to 8.4.1 Bumps [eslint](https://github.com/eslint/eslint) from 8.4.0 to 8.4.1. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.4.0...v8.4.1) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5ed7554f936..285aeee3155 100644 --- a/package-lock.json +++ b/package-lock.json @@ -847,9 +847,9 @@ } }, "node_modules/eslint": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.0.tgz", - "integrity": "sha512-kv0XQcAQJL/VD9THQKhTQZVqkJKA+tIj/v2ZKNaIHRAADcJWFb+B/BAewUYuF6UVg1s2xC5qXVoDk0G8sKGeTA==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-TxU/p7LB1KxQ6+7aztTnO7K0i+h0tDi81YRY9VzB6Id71kNz+fFYnf5HD5UOQmxkzcoa0TlVZf9dpMtUv0GpWg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.0.5", @@ -3925,9 +3925,9 @@ "dev": true }, "eslint": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.0.tgz", - "integrity": "sha512-kv0XQcAQJL/VD9THQKhTQZVqkJKA+tIj/v2ZKNaIHRAADcJWFb+B/BAewUYuF6UVg1s2xC5qXVoDk0G8sKGeTA==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-TxU/p7LB1KxQ6+7aztTnO7K0i+h0tDi81YRY9VzB6Id71kNz+fFYnf5HD5UOQmxkzcoa0TlVZf9dpMtUv0GpWg==", "dev": true, "requires": { "@eslint/eslintrc": "^1.0.5", From dc17bd848f109146342821a70d0ac3de07625ff5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Dec 2021 10:04:36 +0000 Subject: [PATCH 277/306] Bump rollup from 2.60.2 to 2.61.1 Bumps [rollup](https://github.com/rollup/rollup) from 2.60.2 to 2.61.1. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v2.60.2...v2.61.1) --- updated-dependencies: - dependency-name: rollup dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 285aeee3155..3a4cdb4acd1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2613,9 +2613,9 @@ } }, "node_modules/rollup": { - "version": "2.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.2.tgz", - "integrity": "sha512-1Bgjpq61sPjgoZzuiDSGvbI1tD91giZABgjCQBKM5aYLnzjq52GoDuWVwT/cm/MCxCMPU8gqQvkj8doQ5C8Oqw==", + "version": "2.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.1.tgz", + "integrity": "sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5295,9 +5295,9 @@ } }, "rollup": { - "version": "2.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.2.tgz", - "integrity": "sha512-1Bgjpq61sPjgoZzuiDSGvbI1tD91giZABgjCQBKM5aYLnzjq52GoDuWVwT/cm/MCxCMPU8gqQvkj8doQ5C8Oqw==", + "version": "2.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.1.tgz", + "integrity": "sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==", "dev": true, "requires": { "fsevents": "~2.3.2" From 982042ccd0fd9054c5a555ac96f355200cb05ff0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Dec 2021 10:04:42 +0000 Subject: [PATCH 278/306] Bump uglify-js from 3.14.4 to 3.14.5 Bumps [uglify-js](https://github.com/mishoo/UglifyJS) from 3.14.4 to 3.14.5. - [Release notes](https://github.com/mishoo/UglifyJS/releases) - [Commits](https://github.com/mishoo/UglifyJS/compare/v3.14.4...v3.14.5) --- updated-dependencies: - dependency-name: uglify-js dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a4cdb4acd1..0cff1ac6d52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3041,9 +3041,9 @@ "dev": true }, "node_modules/uglify-js": { - "version": "3.14.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.4.tgz", - "integrity": "sha512-AbiSR44J0GoCeV81+oxcy/jDOElO2Bx3d0MfQCUShq7JRXaM4KtQopZsq2vFv8bCq2yMaGrw1FgygUd03RyRDA==", + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.5.tgz", + "integrity": "sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==", "dev": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -5604,9 +5604,9 @@ "dev": true }, "uglify-js": { - "version": "3.14.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.4.tgz", - "integrity": "sha512-AbiSR44J0GoCeV81+oxcy/jDOElO2Bx3d0MfQCUShq7JRXaM4KtQopZsq2vFv8bCq2yMaGrw1FgygUd03RyRDA==", + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.5.tgz", + "integrity": "sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==", "dev": true }, "universalify": { From d86ad49d4a26ec5ebfc77b3e1cd959f3a7ead2a8 Mon Sep 17 00:00:00 2001 From: Jon Koops Date: Mon, 13 Dec 2021 15:14:41 +0100 Subject: [PATCH 279/306] Publish package to NPM when pushing tag (#7854) --- .github/workflows/main.yml | 32 +++++++++++++++++++++++++++++--- RELEASE.md | 4 ++-- package.json | 3 +-- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2f01ae0a14d..7f9a3a4cf79 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,6 +32,8 @@ jobs: - name: Build project run: npm run build + env: + NODE_ENV: ${{ startsWith(github.ref, 'refs/tags/v') && 'release' || '' }} - name: Cache setup uses: actions/cache@v2 @@ -89,7 +91,7 @@ jobs: - name: Run tests on ${{ matrix.browser }} run: npm test -- --browsers ${{ matrix.browser }} - deploy: + publish-artifacts: needs: setup if: github.repository_owner == 'Leaflet' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')) runs-on: ubuntu-latest @@ -106,9 +108,11 @@ jobs: - name: Determine directory for artifacts id: artifacts-directory - run: VERSION=$(git tag --points-at HEAD) echo "::set-output name=path::content/leaflet/${VERSION:-master}" + run: | + VERSION=$(git tag --points-at HEAD) + echo "::set-output name=path::content/leaflet/${VERSION:-master}" - - name: Deploy artifacts + - name: Publish artifacts uses: jakejarvis/s3-sync-action@v0.5.1 with: args: --acl public-read --delete --exact-timestamps @@ -118,3 +122,25 @@ jobs: AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} SOURCE_DIR: dist DEST_DIR: ${{ steps.artifacts-directory.outputs.path }} + + publish-npm: + needs: setup + if: github.repository_owner == 'Leaflet' && startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + steps: + - name: Restore setup + uses: actions/cache@v2 + with: + path: ./* + key: ${{ runner.os }}-${{ github.sha }} + + - name: Set up Node + uses: actions/setup-node@v2 + with: + node-version: ${{ env.NODE_VERSION }} + registry-url: https://registry.npmjs.org + + - name: Publish to NPM + run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/RELEASE.md b/RELEASE.md index 7b4f962a23f..cf4b0a9869f 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,9 +1,9 @@ ## Releasing a new version of Leaflet - [ ] Update [the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) since last release and commit. -- [ ] Run `npm publish --dry-run` to run all the necessary checks without actually publishing, and make sure it runs successfully. - [ ] Run `npm version ` (this will bump the version in `package.json` and create a new tag). -- [ ] Run `npm publish` to publish to NPM. +- [ ] Run `git push --follow-tags` to push the commit created by NPM to Github (together with the tag). +- [ ] Wait for the CI to complete and follow the logs to make sure it runs successfully. - [ ] Verify that the release was correctly published to NPM by checking: - [ ] [Leaflet NPM package page](https://www.npmjs.com/package/leaflet) - [ ] files on [Leaflet unpkg page](https://unpkg.com/leaflet@latest/) diff --git a/package.json b/package.json index f9204806cc2..b9530e4c083 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,7 @@ "rollup": "rollup -c build/rollup-config.js", "watch": "rollup -w -c build/rollup-watch-config.js", "uglify": "uglifyjs dist/leaflet-src.js -c -m -o dist/leaflet.js --source-map filename=dist/leaflet.js.map --source-map content=dist/leaflet-src.js.map --source-map url=leaflet.js.map --comments", - "integrity": "node ./build/integrity.js", - "prepublishOnly": "npm ci && npm run lint && npm run test && NODE_ENV=release npm run build" + "integrity": "node ./build/integrity.js" }, "eslintConfig": { "ignorePatterns": [ From 7e938af221e0087e574a10b731a6836dc9564421 Mon Sep 17 00:00:00 2001 From: Falke Design Date: Mon, 13 Dec 2021 15:20:45 +0100 Subject: [PATCH 280/306] Increase captureTimeout and browserSocketTimeout (#7856) --- spec/karma.conf.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spec/karma.conf.js b/spec/karma.conf.js index 92dded89f4c..bc4bcaa157d 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -123,7 +123,10 @@ module.exports = function (config) { concurrency: 1, // If browser does not capture in given timeout [ms], kill it - captureTimeout: 10000, + captureTimeout: 60000, + + // Timeout for the client socket connection [ms]. + browserSocketTimeout: 30000, // Continuous Integration mode // if true, it capture browsers, run tests and exit From e9fc60c022fab6557744576f324c82ae1958b16c Mon Sep 17 00:00:00 2001 From: johnd0e Date: Mon, 13 Dec 2021 16:22:25 +0200 Subject: [PATCH 281/306] Fixup #7544 (#7861) * Remove redundant condition Source: https://github.com/Leaflet/Leaflet/commit/7c2ac9f39d427de40c2dba1bc6591fd0a902e9d5#diff-f7c61cee5bee8604986cfce68530ef8df7316a4e93ea6a2ddfb6e97fa4234421R662 * Fix issue when contextmenu was prevented on map even w/o real listeners --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index 73d7db83512..60b5cd1d745 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -1365,7 +1365,7 @@ export var Map = Evented.extend({ if (src === this._container) { break; } src = src.parentNode; } - if (!targets.length && !dragging && !isHover && DomEvent.isExternalTarget(src, e)) { + if (!targets.length && !dragging && !isHover && this.listens(type, true)) { targets = [this]; } return targets; From 26ba65ae111e960567511730cfcca52d06f69081 Mon Sep 17 00:00:00 2001 From: Falke Design Date: Wed, 15 Dec 2021 16:40:24 +0100 Subject: [PATCH 282/306] Fix opening / closing tooltip while dragging map (#7862) * Fix opening / closing tooltip while dragging map * Fix lint * Update src/layer/Tooltip.js Co-authored-by: johnd0e Co-authored-by: johnd0e --- spec/suites/layer/TooltipSpec.js | 43 ++++++++++++++++++++++++++++++++ src/layer/Tooltip.js | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/spec/suites/layer/TooltipSpec.js b/spec/suites/layer/TooltipSpec.js index 9f2af18a288..b6aea553ad4 100644 --- a/spec/suites/layer/TooltipSpec.js +++ b/spec/suites/layer/TooltipSpec.js @@ -343,4 +343,47 @@ describe('Tooltip', function () { expect(map.hasLayer(tooltip1)).to.not.be.ok(); expect(eventSpy.calledOnce).to.be.ok(); }); + + it("don't opens the tooltip on marker mouseover while dragging map", function () { + // Sometimes the mouse is moving faster then the map while dragging and then the marker can be hover and + // the tooltip opened / closed. + var layer = L.marker(center).addTo(map).bindTooltip('Tooltip'); + var tooltip = layer.getTooltip(); + + // simulate map dragging + map.dragging.moving = function () { + return true; + }; + happen.at('mouseover', 210, 195); + expect(tooltip.isOpen()).to.be(false); + + // simulate map not dragging anymore + map.dragging.moving = function () { + return false; + }; + happen.at('mouseover', 210, 195); + expect(tooltip.isOpen()).to.be.ok(); + }); + + it("closes the tooltip on marker mouseout while dragging map and don't open it again", function () { + // Sometimes the mouse is moving faster then the map while dragging and then the marker can be hover and + // the tooltip opened / closed. + var layer = L.marker(center).addTo(map).bindTooltip('Tooltip'); + var tooltip = layer.getTooltip(); + + // open tooltip before "dragging map" + happen.at('mouseover', 210, 195); + expect(tooltip.isOpen()).to.be.ok(); + + // simulate map dragging + map.dragging.moving = function () { + return true; + }; + happen.mouseout(layer._icon, {relatedTarget: map._container}); + expect(tooltip.isOpen()).to.be(false); + + // tooltip should not open again while dragging + happen.at('mouseover', 210, 195); + expect(tooltip.isOpen()).to.be(false); + }); }); diff --git a/src/layer/Tooltip.js b/src/layer/Tooltip.js index dd50f34e226..1a898d8ed8f 100644 --- a/src/layer/Tooltip.js +++ b/src/layer/Tooltip.js @@ -388,7 +388,7 @@ Layer.include({ }, _openTooltip: function (e) { - if (!this._tooltip || !this._map) { + if (!this._tooltip || !this._map || (this._map.dragging && this._map.dragging.moving())) { return; } this._tooltip._source = e.layer || e.target; From abf16d5a2c043f1611a46a6c8c852241f35b93ee Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 16 Dec 2021 10:35:59 +0100 Subject: [PATCH 283/306] Update the doc of DivOverlay (#7778) * Update the doc of DivOverlay * Moved popup options from DivOverlay to Popup --- src/layer/DivOverlay.js | 45 +++++++++++++++++++++++------------------ src/layer/Popup.js | 8 ++++++++ 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/layer/DivOverlay.js b/src/layer/DivOverlay.js index 36c0b241fee..4e0a3a95eec 100644 --- a/src/layer/DivOverlay.js +++ b/src/layer/DivOverlay.js @@ -9,7 +9,7 @@ import * as DomUtil from '../dom/DomUtil'; * @class DivOverlay * @inherits Layer * @aka L.DivOverlay - * Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins. + * Base model for L.Popup and L.Tooltip. Inherit from it for custom overlays like plugins. */ // @namespace DivOverlay @@ -18,18 +18,17 @@ export var DivOverlay = Layer.extend({ // @section // @aka DivOverlay options options: { - // @option offset: Point = Point(0, 7) - // The offset of the popup position. Useful to control the anchor - // of the popup when opening it on some overlays. - offset: [0, 7], + // @option offset: Point = Point(0, 0) + // The offset of the overlay position. + offset: [0, 0], // @option className: String = '' - // A custom CSS class name to assign to the popup. + // A custom CSS class name to assign to the overlay. className: '', - // @option pane: String = 'popupPane' - // `Map pane` where the popup will be added. - pane: 'popupPane' + // @option pane: String = undefined + // `Map pane` where the overlay will be added. + pane: undefined }, initialize: function (options, source) { @@ -69,15 +68,15 @@ export var DivOverlay = Layer.extend({ } }, - // @namespace Popup + // @namespace DivOverlay // @method getLatLng: LatLng - // Returns the geographical point of popup. + // Returns the geographical point of the overlay. getLatLng: function () { return this._latlng; }, // @method setLatLng(latlng: LatLng): this - // Sets the geographical point where the popup will open. + // Sets the geographical point where the overlay will open. setLatLng: function (latlng) { this._latlng = toLatLng(latlng); if (this._map) { @@ -88,13 +87,14 @@ export var DivOverlay = Layer.extend({ }, // @method getContent: String|HTMLElement - // Returns the content of the popup. + // Returns the content of the overlay. getContent: function () { return this._content; }, // @method setContent(htmlContent: String|HTMLElement|Function): this - // Sets the HTML content of the popup. If a function is passed the source layer will be passed to the function. The function should return a `String` or `HTMLElement` to be used in the popup. + // Sets the HTML content of the overlay. If a function is passed the source layer will be passed to the function. + // The function should return a `String` or `HTMLElement` to be used in the overlay. setContent: function (content) { this._content = content; this.update(); @@ -102,13 +102,13 @@ export var DivOverlay = Layer.extend({ }, // @method getElement: String|HTMLElement - // Returns the HTML container of the popup. + // Returns the HTML container of the overlay. getElement: function () { return this._container; }, // @method update: null - // Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded. + // Updates the overlay content, layout and position. Useful for updating the overlay after something inside changed, e.g. image loaded. update: function () { if (!this._map) { return; } @@ -136,13 +136,13 @@ export var DivOverlay = Layer.extend({ }, // @method isOpen: Boolean - // Returns `true` when the popup is visible on the map. + // Returns `true` when the overlay is visible on the map. isOpen: function () { return !!this._map && this._map.hasLayer(this); }, // @method bringToFront: this - // Brings this popup in front of other popups (in the same map pane). + // Brings this overlay in front of other overlays (in the same map pane). bringToFront: function () { if (this._map) { DomUtil.toFront(this._container); @@ -151,7 +151,7 @@ export var DivOverlay = Layer.extend({ }, // @method bringToBack: this - // Brings this popup to the back of other popups (in the same map pane). + // Brings this overlay to the back of other overlays (in the same map pane). bringToBack: function () { if (this._map) { DomUtil.toBack(this._container); @@ -214,6 +214,11 @@ export var DivOverlay = Layer.extend({ } node.appendChild(content); } + + // @namespace DivOverlay + // @section DivOverlay events + // @event contentupdate: Event + // Fired when the content of the overlay is updated this.fire('contentupdate'); }, @@ -233,7 +238,7 @@ export var DivOverlay = Layer.extend({ var bottom = this._containerBottom = -offset.y, left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x; - // bottom position the popup in case the height of the popup changes (images loading etc) + // bottom position the overlay in case the height of the overlay changes (images loading etc) this._container.style.bottom = bottom + 'px'; this._container.style.left = left + 'px'; }, diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 810a3791750..cb4dbbd7fd6 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -40,6 +40,14 @@ export var Popup = DivOverlay.extend({ // @section // @aka Popup options options: { + // @option pane: String = 'popupPane' + // `Map pane` where the popup will be added. + pane: 'popupPane', + + // @option offset: Point = Point(0, 7) + // The offset of the popup position. + offset: [0, 7], + // @option maxWidth: Number = 300 // Max width of the popup, in pixels. maxWidth: 300, From 911f578a608d71e0d67341fbfe871215ab30941d Mon Sep 17 00:00:00 2001 From: Falke Design Date: Thu, 16 Dec 2021 12:48:50 +0100 Subject: [PATCH 284/306] Replace http with https (#7860) --- spec/suites/layer/tile/TileLayerSpec.js | 2 +- src/control/Control.Layers.js | 2 +- src/core/Util.js | 2 +- src/dom/DomEvent.Pointer.js | 2 +- src/dom/PosAnimation.js | 2 +- src/geo/crs/CRS.Earth.js | 2 +- src/geo/crs/CRS.js | 2 +- src/geo/projection/index.js | 2 +- src/geometry/LineUtil.js | 6 +++--- src/layer/GeoJSON.js | 10 +++++----- src/layer/ImageOverlay.js | 2 +- src/layer/tile/TileLayer.WMS.js | 2 +- src/layer/tile/TileLayer.js | 6 +++--- src/layer/vector/Canvas.js | 2 +- src/layer/vector/Polyline.js | 2 +- src/layer/vector/SVG.js | 2 +- src/map/Map.js | 2 +- src/map/Map.methodOptions.leafdoc | 4 ++-- 18 files changed, 27 insertions(+), 27 deletions(-) diff --git a/spec/suites/layer/tile/TileLayerSpec.js b/spec/suites/layer/tile/TileLayerSpec.js index 1793ddccb6f..84fde9ef1eb 100644 --- a/spec/suites/layer/tile/TileLayerSpec.js +++ b/spec/suites/layer/tile/TileLayerSpec.js @@ -1,7 +1,7 @@ describe('TileLayer', function () { var div, map; - // Placekitten via http://placekitten.com/attribution.html + // Placekitten via https://placekitten.com/attribution.html // Image licensed under CC-by-sa by http://flickr.com/photos/lachlanrogers/ var placeKitten = "data:image/jpeg;base64," + diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 429ede0521e..f5718709d03 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -9,7 +9,7 @@ import * as DomUtil from '../dom/DomUtil'; * @aka L.Control.Layers * @inherits Control * - * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](http://leafletjs.com/examples/layers-control/)). Extends `Control`. + * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](https://leafletjs.com/examples/layers-control/)). Extends `Control`. * * @example * diff --git a/src/core/Util.js b/src/core/Util.js index 526d97c26c0..ac4fcdfd850 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -197,7 +197,7 @@ export function indexOf(array, el) { // mobile devices (by setting image `src` to this string). export var emptyImageUrl = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='; -// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/ +// inspired by https://paulirish.com/2011/requestanimationframe-for-smart-animating/ function getPrefixed(name) { return window['webkit' + name] || window['moz' + name] || window['ms' + name]; diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index 312c978021b..0f179d453ac 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -25,7 +25,7 @@ var _pointers = {}; var _pointerDocListener = false; // Provides a touch events wrapper for (ms)pointer events. -// ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 +// ref https://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 export function addPointerListener(obj, type, handler) { if (type === 'touchstart') { diff --git a/src/dom/PosAnimation.js b/src/dom/PosAnimation.js index 05290c11394..fb442268c4e 100644 --- a/src/dom/PosAnimation.js +++ b/src/dom/PosAnimation.js @@ -25,7 +25,7 @@ export var PosAnimation = Evented.extend({ // @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number) // Run an animation of a given element to a new position, optionally setting // duration in seconds (`0.25` by default) and easing linearity factor (3rd - // argument of the [cubic bezier curve](http://cubic-bezier.com/#0,0,.5,1), + // argument of the [cubic bezier curve](https://cubic-bezier.com/#0,0,.5,1), // `0.5` by default). run: function (el, newPos, duration, easeLinearity) { this.stop(); diff --git a/src/geo/crs/CRS.Earth.js b/src/geo/crs/CRS.Earth.js index 6ecff658929..b32b026b1d6 100755 --- a/src/geo/crs/CRS.Earth.js +++ b/src/geo/crs/CRS.Earth.js @@ -16,7 +16,7 @@ export var Earth = Util.extend({}, CRS, { // Mean Earth Radius, as recommended for use by // the International Union of Geodesy and Geophysics, - // see http://rosettacode.org/wiki/Haversine_formula + // see https://rosettacode.org/wiki/Haversine_formula R: 6371000, // distance between two geographical points using spherical law of cosines approximation diff --git a/src/geo/crs/CRS.js b/src/geo/crs/CRS.js index d1ca4ed6a12..bfbdae6ac9d 100644 --- a/src/geo/crs/CRS.js +++ b/src/geo/crs/CRS.js @@ -10,7 +10,7 @@ import * as Util from '../../core/Util'; * Object that defines coordinate reference systems for projecting * geographical points into pixel (screen) coordinates and back (and to * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See - * [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system). + * [spatial reference system](https://en.wikipedia.org/wiki/Spatial_reference_system). * * Leaflet defines the most usual CRSs by default. If you want to use a * CRS not defined by default, take a look at the diff --git a/src/geo/projection/index.js b/src/geo/projection/index.js index b577d6b5e58..c64664e5172 100644 --- a/src/geo/projection/index.js +++ b/src/geo/projection/index.js @@ -2,7 +2,7 @@ * @class Projection * An object with methods for projecting geographical coordinates of the world onto - * a flat surface (and back). See [Map projection](http://en.wikipedia.org/wiki/Map_projection). + * a flat surface (and back). See [Map projection](https://en.wikipedia.org/wiki/Map_projection). * @property bounds: Bounds * The bounds (specified in CRS units) where the projection is valid diff --git a/src/geometry/LineUtil.js b/src/geometry/LineUtil.js index 8e291259f3d..4dcaa76b0db 100644 --- a/src/geometry/LineUtil.js +++ b/src/geometry/LineUtil.js @@ -14,11 +14,11 @@ import * as Util from '../core/Util'; // @function simplify(points: Point[], tolerance: Number): Point[] // Dramatically reduces the number of points in a polyline while retaining // its shape and returns a new array of simplified points, using the -// [Douglas-Peucker algorithm](http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm). +// [Ramer-Douglas-Peucker algorithm](https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm). // Used for a huge performance boost when processing/displaying Leaflet polylines for // each zoom level and also reducing visual noise. tolerance affects the amount of // simplification (lesser value means higher quality but slower and with more points). -// Also released as a separated micro-library [Simplify.js](http://mourner.github.com/simplify-js/). +// Also released as a separated micro-library [Simplify.js](https://mourner.github.io/simplify-js/). export function simplify(points, tolerance) { if (!tolerance || !points.length) { return points.slice(); @@ -47,7 +47,7 @@ export function closestPointOnSegment(p, p1, p2) { return _sqClosestPointOnSegment(p, p1, p2); } -// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm +// Ramer-Douglas-Peucker simplification, see https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm function _simplifyDP(points, sqTolerance) { var len = points.length, diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index 9e96fc2adca..230c15c9de4 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -315,13 +315,13 @@ var PointToGeoJSON = { // @section Other methods // @method toGeoJSON(precision?: Number|false): Object // Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`. -// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature). +// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature). Marker.include(PointToGeoJSON); // @namespace CircleMarker // @method toGeoJSON(precision?: Number|false): Object // Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`. -// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature). +// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature). Circle.include(PointToGeoJSON); CircleMarker.include(PointToGeoJSON); @@ -329,7 +329,7 @@ CircleMarker.include(PointToGeoJSON); // @namespace Polyline // @method toGeoJSON(precision?: Number|false): Object // Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`. -// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature). +// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature). Polyline.include({ toGeoJSON: function (precision) { var multi = !LineUtil.isFlat(this._latlngs); @@ -346,7 +346,7 @@ Polyline.include({ // @namespace Polygon // @method toGeoJSON(precision?: Number|false): Object // Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`. -// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature). +// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature). Polygon.include({ toGeoJSON: function (precision) { var holes = !LineUtil.isFlat(this._latlngs), @@ -383,7 +383,7 @@ LayerGroup.include({ // @method toGeoJSON(precision?: Number|false): Object // Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`. - // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `FeatureCollection`, `GeometryCollection`, or `MultiPoint`). + // Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `FeatureCollection`, `GeometryCollection`, or `MultiPoint`). toGeoJSON: function (precision) { var type = this.feature && this.feature.geometry && this.feature.geometry.type; diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index d7bc95960e4..75667fe33f5 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -14,7 +14,7 @@ import * as DomUtil from '../dom/DomUtil'; * @example * * ```js - * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg', + * var imageUrl = 'https://maps.lib.utexas.edu/maps/historical/newark_nj_1922.jpg', * imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]]; * L.imageOverlay(imageUrl, imageBounds).addTo(map); * ``` diff --git a/src/layer/tile/TileLayer.WMS.js b/src/layer/tile/TileLayer.WMS.js index 679440483d9..b7f671d6ab4 100644 --- a/src/layer/tile/TileLayer.WMS.js +++ b/src/layer/tile/TileLayer.WMS.js @@ -28,7 +28,7 @@ export var TileLayerWMS = TileLayer.extend({ // @aka TileLayer.WMS options // If any custom options not documented here are used, they will be sent to the // WMS server as extra parameters in each request URL. This can be useful for - // [non-standard vendor WMS parameters](http://docs.geoserver.org/stable/en/user/services/wms/vendor.html). + // [non-standard vendor WMS parameters](https://docs.geoserver.org/stable/en/user/services/wms/vendor.html). defaultWmsParams: { service: 'WMS', request: 'GetMap', diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index ec38a36e5d5..2b1f553ef2c 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -23,7 +23,7 @@ import * as DomUtil from '../../dom/DomUtil'; * A string of the following form: * * ``` - * 'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png' + * 'https://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png' * ``` * * `{s}` means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; `a`, `b` or `c` by default, can be omitted), `{z}` — zoom level, `{x}` and `{y}` — tile coordinates. `{r}` can be used to add "@2x" to the URL to load retina tiles. @@ -31,7 +31,7 @@ import * as DomUtil from '../../dom/DomUtil'; * You can use custom keys in the template, which will be [evaluated](#util-template) from TileLayer options, like this: * * ``` - * L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'}); + * L.tileLayer('https://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'}); * ``` */ @@ -142,7 +142,7 @@ export var TileLayer = GridLayer.extend({ /* Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons - http://www.w3.org/TR/WCAG20-TECHS/H67 + https://www.w3.org/TR/WCAG20-TECHS/H67 */ tile.alt = ''; diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index baa8255b661..6a8521b6471 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -13,7 +13,7 @@ import {Bounds} from '../../geometry/Bounds'; * Allows vector layers to be displayed with [``](https://developer.mozilla.org/docs/Web/API/Canvas_API). * Inherits `Renderer`. * - * Due to [technical limitations](http://caniuse.com/#search=canvas), Canvas is not + * Due to [technical limitations](https://caniuse.com/canvas), Canvas is not * available in all web browsers, notably IE8, and overlapping geometries might * not display properly in some edge cases. * diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index 003eaf82643..317c583fa87 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -114,7 +114,7 @@ export var Polyline = Path.extend({ }, // @method getCenter(): LatLng - // Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the polyline. + // Returns the center ([centroid](https://en.wikipedia.org/wiki/Centroid)) of the polyline. getCenter: function () { // throws error when not yet added to map as this center calculation requires projected coordinates if (!this._map) { diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index e4b07895053..41434533003 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -17,7 +17,7 @@ export var create = Browser.vml ? vmlCreate : svgCreate; * Allows vector layers to be displayed with [SVG](https://developer.mozilla.org/docs/Web/SVG). * Inherits `Renderer`. * - * Due to [technical limitations](http://caniuse.com/#search=svg), SVG is not + * Due to [technical limitations](https://caniuse.com/svg), SVG is not * available in all web browsers, notably Android 2.x and 3.x. * * Although SVG is not available on IE7 and IE8, these browsers support diff --git a/src/map/Map.js b/src/map/Map.js index 60b5cd1d745..06deb2606e4 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -1338,7 +1338,7 @@ export var Map = Evented.extend({ var pos = this._getMapPanePos(); if (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) { // https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have - // a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/ + // a pixel offset on very high values, see: https://jsfiddle.net/dg6r5hhb/ this._resetView(this.getCenter(), this.getZoom()); } }, diff --git a/src/map/Map.methodOptions.leafdoc b/src/map/Map.methodOptions.leafdoc index c8abbe1df50..a625fee8c78 100644 --- a/src/map/Map.methodOptions.leafdoc +++ b/src/map/Map.methodOptions.leafdoc @@ -31,7 +31,7 @@ Maximum age of detected location. If less than this amount of milliseconds passed since last geolocation response, `locate` will return a cached location. @option enableHighAccuracy: Boolean = false -Enables high accuracy, see [description in the W3C spec](http://dev.w3.org/geo/api/spec-source.html#high-accuracy). +Enables high accuracy, see [description in the W3C spec](https://w3c.github.io/geolocation-api/#enablehighaccuracy-member). @@ -72,7 +72,7 @@ Duration of animated panning, in seconds. @option easeLinearity: Number = 0.25 The curvature factor of panning animation easing (third parameter of the -[Cubic Bezier curve](http://cubic-bezier.com/)). 1.0 means linear animation, +[Cubic Bezier curve](https://cubic-bezier.com/)). 1.0 means linear animation, and the smaller this number, the more bowed the curve. @option noMoveStart: Boolean = false From d7bf36c06c3ba9977fa43b9dd77b7ccee30e243f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Dec 2021 17:52:17 +0200 Subject: [PATCH 285/306] Bump eslint from 8.4.1 to 8.5.0 (#7873) Bumps [eslint](https://github.com/eslint/eslint) from 8.4.1 to 8.5.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.4.1...v8.5.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0cff1ac6d52..be07a3e4195 100644 --- a/package-lock.json +++ b/package-lock.json @@ -847,9 +847,9 @@ } }, "node_modules/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-TxU/p7LB1KxQ6+7aztTnO7K0i+h0tDi81YRY9VzB6Id71kNz+fFYnf5HD5UOQmxkzcoa0TlVZf9dpMtUv0GpWg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", + "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.0.5", @@ -3925,9 +3925,9 @@ "dev": true }, "eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-TxU/p7LB1KxQ6+7aztTnO7K0i+h0tDi81YRY9VzB6Id71kNz+fFYnf5HD5UOQmxkzcoa0TlVZf9dpMtUv0GpWg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", + "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", "dev": true, "requires": { "@eslint/eslintrc": "^1.0.5", From 1d3e3a083361c52fb1d0b8104452afa0679eeee5 Mon Sep 17 00:00:00 2001 From: Jan Jaap van Deursen Date: Mon, 20 Dec 2021 17:12:50 +0100 Subject: [PATCH 286/306] Remove will-change (#7872) Prevent browser (mostly Firefox) resource depletion by premature optimization usage of `will-change`. At the municipality of Amsterdam, we're heavily relying on Leaflet and having map instances open regularly leads to degraded performance in Firefox, because of the use of `will-change`. --- dist/leaflet.css | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index d740ea9a9d8..411231a1530 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -171,9 +171,6 @@ /* zoom and fade animations */ -.leaflet-fade-anim .leaflet-tile { - will-change: opacity; - } .leaflet-fade-anim .leaflet-popup { opacity: 0; -webkit-transition: opacity 0.2s linear; @@ -188,9 +185,7 @@ -ms-transform-origin: 0 0; transform-origin: 0 0; } -.leaflet-zoom-anim .leaflet-zoom-animated { - will-change: transform; - } + .leaflet-zoom-anim .leaflet-zoom-animated { -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); From c9f8650a7359e6752b80d6a1e1778cc0278c644c Mon Sep 17 00:00:00 2001 From: Wong Hoi Sing Edison Date: Wed, 22 Dec 2021 18:50:12 +0800 Subject: [PATCH 287/306] Add drustack/Leaflet.ResetView to plugins (#7874) A reset view control for Leaflet. Design for [Drupal Leaflet Module](https://www.drupal.org/project/leaflet) integration. Signed-off-by: Wong Hoi Sing Edison --- .../drustack--leaflet.resetview.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 docs/_plugins/bookmarked-pan-zoom/drustack--leaflet.resetview.md diff --git a/docs/_plugins/bookmarked-pan-zoom/drustack--leaflet.resetview.md b/docs/_plugins/bookmarked-pan-zoom/drustack--leaflet.resetview.md new file mode 100644 index 00000000000..d7b39a20925 --- /dev/null +++ b/docs/_plugins/bookmarked-pan-zoom/drustack--leaflet.resetview.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.ResetView +category: bookmarked-pan-zoom +repo: https://github.com/drustack/Leaflet.ResetView +author: Wong Hoi Sing Edison +author-url: https://github.com/hswong3i +demo: https://drustack.github.io/Leaflet.ResetView/ +compatible-v0: false +compatible-v1: true +--- + +A reset view control for Leaflet. Design for [Drupal Leaflet Module](https://www.drupal.org/project/leaflet) integration. From d52d2fa341af4c120262b24a12592cfc3f66020e Mon Sep 17 00:00:00 2001 From: Wong Hoi Sing Edison Date: Wed, 22 Dec 2021 18:51:30 +0800 Subject: [PATCH 288/306] Add drustack/Leaflet.SyncView to plugins (#7875) A sync view control for Leaflet. Design for [Drupal Leaflet Module](https://www.drupal.org/project/leaflet) integration. Signed-off-by: Wong Hoi Sing Edison --- .../drustack--leaflet.syncview.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 docs/_plugins/interactive-pan-zoom/drustack--leaflet.syncview.md diff --git a/docs/_plugins/interactive-pan-zoom/drustack--leaflet.syncview.md b/docs/_plugins/interactive-pan-zoom/drustack--leaflet.syncview.md new file mode 100644 index 00000000000..11596cdd412 --- /dev/null +++ b/docs/_plugins/interactive-pan-zoom/drustack--leaflet.syncview.md @@ -0,0 +1,12 @@ +--- +name: Leaflet.SyncView +category: interactive-pan-zoom +repo: https://github.com/drustack/Leaflet.SyncView +author: Wong Hoi Sing Edison +author-url: https://github.com/hswong3i +demo: https://drustack.github.io/Leaflet.SyncView/ +compatible-v0: false +compatible-v1: true +--- + +A sync view control for Leaflet. Design for [Drupal Leaflet Module](https://www.drupal.org/project/leaflet) integration. From ab9c909ecfbc330e3346b571860a584d92662dae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Dec 2021 12:10:40 +0000 Subject: [PATCH 289/306] Bump rollup from 2.61.1 to 2.62.0 Bumps [rollup](https://github.com/rollup/rollup) from 2.61.1 to 2.62.0. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v2.61.1...v2.62.0) --- updated-dependencies: - dependency-name: rollup dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index be07a3e4195..392db56cbfb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2613,9 +2613,9 @@ } }, "node_modules/rollup": { - "version": "2.61.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.1.tgz", - "integrity": "sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==", + "version": "2.62.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.62.0.tgz", + "integrity": "sha512-cJEQq2gwB0GWMD3rYImefQTSjrPYaC6s4J9pYqnstVLJ1CHa/aZNVkD4Epuvg4iLeMA4KRiq7UM7awKK6j7jcw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5295,9 +5295,9 @@ } }, "rollup": { - "version": "2.61.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.61.1.tgz", - "integrity": "sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==", + "version": "2.62.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.62.0.tgz", + "integrity": "sha512-cJEQq2gwB0GWMD3rYImefQTSjrPYaC6s4J9pYqnstVLJ1CHa/aZNVkD4Epuvg4iLeMA4KRiq7UM7awKK6j7jcw==", "dev": true, "requires": { "fsevents": "~2.3.2" From de29669d39689705c797ef7e4aee770c95a1c1ec Mon Sep 17 00:00:00 2001 From: Gagaro Date: Mon, 3 Jan 2022 13:23:51 +0100 Subject: [PATCH 290/306] Add django-leaflet in frameworks-build-systems documentation. (#7885) --- .../frameworks-build-systems/django-leaflet.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 docs/_plugins/frameworks-build-systems/django-leaflet.md diff --git a/docs/_plugins/frameworks-build-systems/django-leaflet.md b/docs/_plugins/frameworks-build-systems/django-leaflet.md new file mode 100644 index 00000000000..360be657065 --- /dev/null +++ b/docs/_plugins/frameworks-build-systems/django-leaflet.md @@ -0,0 +1,12 @@ +--- +name: Django Leaflet +category: frameworks-build-systems +repo: https://github.com/makinacorpus/django-leaflet +author: Makina Corpus +author-url: https://makina-corpus.com/ +demo: +compatible-v0: true +compatible-v1: true +--- + +Use Leaflet in your **Django** projects. Includes admin integration, form widget, template tags, and much more! From e9bc85952d955347bbfd0a2d7909fdc51f08a48a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jan 2022 12:11:14 +0000 Subject: [PATCH 291/306] Bump eslint from 8.5.0 to 8.6.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.5.0 to 8.6.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.5.0...v8.6.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 392db56cbfb..47881f01b08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -203,9 +203,9 @@ } }, "node_modules/acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -847,9 +847,9 @@ } }, "node_modules/eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", - "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", + "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.0.5", @@ -864,7 +864,7 @@ "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.1.0", - "espree": "^9.2.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -969,12 +969,12 @@ } }, "node_modules/espree": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", - "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "dependencies": { - "acorn": "^8.6.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^3.1.0" }, @@ -3419,9 +3419,9 @@ } }, "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, "acorn-jsx": { @@ -3925,9 +3925,9 @@ "dev": true }, "eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", - "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", + "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", "dev": true, "requires": { "@eslint/eslintrc": "^1.0.5", @@ -3942,7 +3942,7 @@ "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.1.0", - "espree": "^9.2.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4021,12 +4021,12 @@ "dev": true }, "espree": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", - "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "requires": { - "acorn": "^8.6.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^3.1.0" } From e0c92a310cf0f0ab252b7ec0bae1f5624805106d Mon Sep 17 00:00:00 2001 From: Geoapify <60292923+geoapify@users.noreply.github.com> Date: Mon, 10 Jan 2022 17:38:02 +0100 Subject: [PATCH 292/306] Add Leaflet Geoapify Address Search plugin (#7896) --- .../geocoding/leaflet-geoapify-address-search.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 docs/_plugins/geocoding/leaflet-geoapify-address-search.md diff --git a/docs/_plugins/geocoding/leaflet-geoapify-address-search.md b/docs/_plugins/geocoding/leaflet-geoapify-address-search.md new file mode 100644 index 00000000000..35ac5c4bef5 --- /dev/null +++ b/docs/_plugins/geocoding/leaflet-geoapify-address-search.md @@ -0,0 +1,11 @@ +--- +name: Leaflet Geoapify Address Search +category: geocoding +repo: https://github.com/geoapify/leaflet-address-search-plugin +author: Geoapify +author-url: https://github.com/geoapify +demo: https://geoapify.github.io/leaflet-address-search-plugin/ +compatible-v0: +compatible-v1: true +--- +Adds an Address Autocomplete field to the map, powered by Geoapify. From 10d003152a0fe2d060833555765f38cc75624726 Mon Sep 17 00:00:00 2001 From: tmiaa <95731292+tmiaa@users.noreply.github.com> Date: Mon, 10 Jan 2022 18:07:16 +0100 Subject: [PATCH 293/306] Update marker: role=button, alt=marker (#7895) * Update marker: default role=button, default alt=marker * fix marker test Co-authored-by: Vladimir Agafonkin --- spec/suites/layer/marker/MarkerSpec.js | 4 ++-- src/layer/marker/Marker.js | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js index 8453c721246..bfce336e70e 100644 --- a/spec/suites/layer/marker/MarkerSpec.js +++ b/spec/suites/layer/marker/MarkerSpec.js @@ -190,12 +190,12 @@ describe("Marker", function () { expect(marker._shadow.parentNode).to.be(map._panes.shadowPane); }); - it("sets the alt attribute to an empty string when no alt text is passed", function () { + it("sets the alt attribute to a default value when no alt text is passed", function () { var marker = L.marker([0, 0], {icon: icon1}); map.addLayer(marker); var icon = marker._icon; expect(icon.hasAttribute('alt')).to.be(true); - expect(icon.alt).to.be(''); + expect(icon.alt).to.be('Marker'); }); it("doesn't set the alt attribute for DivIcons", function () { diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 077b0f15eac..5f36dd5feb6 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -40,9 +40,9 @@ export var Marker = Layer.extend({ // Text for the browser tooltip that appear on marker hover (no tooltip by default). title: '', - // @option alt: String = '' + // @option alt: String = 'Marker' // Text for the `alt` attribute of the icon image (useful for accessibility). - alt: '', + alt: 'Marker', // @option zIndexOffset: Number = 0 // By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively). @@ -225,6 +225,7 @@ export var Marker = Layer.extend({ if (options.keyboard) { icon.tabIndex = '0'; + icon.setAttribute('role', 'button'); } this._icon = icon; From 64d886686ae73b3ccd6cca46b6fdd03e24a1f6de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jan 2022 19:07:45 +0200 Subject: [PATCH 294/306] Bump rollup from 2.62.0 to 2.63.0 (#7897) Bumps [rollup](https://github.com/rollup/rollup) from 2.62.0 to 2.63.0. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v2.62.0...v2.63.0) --- updated-dependencies: - dependency-name: rollup dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 47881f01b08..77326537e6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2613,9 +2613,9 @@ } }, "node_modules/rollup": { - "version": "2.62.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.62.0.tgz", - "integrity": "sha512-cJEQq2gwB0GWMD3rYImefQTSjrPYaC6s4J9pYqnstVLJ1CHa/aZNVkD4Epuvg4iLeMA4KRiq7UM7awKK6j7jcw==", + "version": "2.63.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.63.0.tgz", + "integrity": "sha512-nps0idjmD+NXl6OREfyYXMn/dar3WGcyKn+KBzPdaLecub3x/LrId0wUcthcr8oZUAcZAR8NKcfGGFlNgGL1kQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5295,9 +5295,9 @@ } }, "rollup": { - "version": "2.62.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.62.0.tgz", - "integrity": "sha512-cJEQq2gwB0GWMD3rYImefQTSjrPYaC6s4J9pYqnstVLJ1CHa/aZNVkD4Epuvg4iLeMA4KRiq7UM7awKK6j7jcw==", + "version": "2.63.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.63.0.tgz", + "integrity": "sha512-nps0idjmD+NXl6OREfyYXMn/dar3WGcyKn+KBzPdaLecub3x/LrId0wUcthcr8oZUAcZAR8NKcfGGFlNgGL1kQ==", "dev": true, "requires": { "fsevents": "~2.3.2" From 32783c970f6d84f7408ab19e09a73f54a7ff4a2f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jan 2022 19:07:57 +0200 Subject: [PATCH 295/306] Bump karma from 6.3.9 to 6.3.10 (#7898) Bumps [karma](https://github.com/karma-runner/karma) from 6.3.9 to 6.3.10. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v6.3.9...v6.3.10) --- updated-dependencies: - dependency-name: karma dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 77326537e6d..21927354036 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1699,9 +1699,9 @@ "dev": true }, "node_modules/karma": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.9.tgz", - "integrity": "sha512-E/MqdLM9uVIhfuyVnrhlGBu4miafBdXEAEqCmwdEMh3n17C7UWC/8Kvm3AYKr91gc7scutekZ0xv6rxRaUCtnw==", + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.10.tgz", + "integrity": "sha512-Ofv+sgrkT8Czo6bzzQCvrwVyRSG8/3e7RbawEuxjfsINony+IR/S2csNRUFgPNfmWvju+dqi/MzQGOJ2LnlmfQ==", "dev": true, "dependencies": { "body-parser": "^1.19.0", @@ -4577,9 +4577,9 @@ "dev": true }, "karma": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.9.tgz", - "integrity": "sha512-E/MqdLM9uVIhfuyVnrhlGBu4miafBdXEAEqCmwdEMh3n17C7UWC/8Kvm3AYKr91gc7scutekZ0xv6rxRaUCtnw==", + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.10.tgz", + "integrity": "sha512-Ofv+sgrkT8Czo6bzzQCvrwVyRSG8/3e7RbawEuxjfsINony+IR/S2csNRUFgPNfmWvju+dqi/MzQGOJ2LnlmfQ==", "dev": true, "requires": { "body-parser": "^1.19.0", From 2e205bf5ac80603936c6bc5e414aae3a56e6ce40 Mon Sep 17 00:00:00 2001 From: David Rivera Morales <68245315+MxDui@users.noreply.github.com> Date: Thu, 13 Jan 2022 10:59:12 -0600 Subject: [PATCH 296/306] Improve site accesibility (#7901) * Improve site accesibility * Prettier formatting reverted * Removed typo in docs/docs/css/main.css --- docs/_layouts/v2.html | 127 ++++++++++++++++++++++------------------- docs/docs/css/main.css | 4 +- 2 files changed, 69 insertions(+), 62 deletions(-) diff --git a/docs/_layouts/v2.html b/docs/_layouts/v2.html index a3d7692991b..d380cc1e47e 100644 --- a/docs/_layouts/v2.html +++ b/docs/_layouts/v2.html @@ -1,5 +1,5 @@ - + {% capture title %}{% if page.title %}{{ page.title }} - {% elsif post.title %}{{ post.title }} - {% endif %}{% endcapture %} @@ -11,7 +11,7 @@ - + @@ -58,70 +58,77 @@ -

      Leaflet

      -

      an open-source JavaScript library
      for mobile-friendly interactive maps

      - - - -
      +
      +

      Leaflet

      +

      an open-source JavaScript library
      for mobile-friendly interactive maps

      +
      + + + +
      {{ content }} - -
      + - +
      Enter Move Exit Click
      Triangle 1:
      listens(<String> type)listens(<String> type, <Boolean> propagate?) Boolean

      Returns true if a particular event type has any listeners attached to it.

      +

      Returns true if a particular event type has any listeners attached to it. The verification can optionally be propagated, it will return true if parents have the listener attached to it.

      listens(<String> type)listens(<String> type, <Boolean> propagate?) Boolean

      Returns true if a particular event type has any listeners attached to it.

      +

      Returns true if a particular event type has any listeners attached to it. The verification can optionally be propagated, it will return true if parents have the listener attached to it.

      listens(<String> type)listens(<String> type, <Boolean> propagate?) Boolean

      Returns true if a particular event type has any listeners attached to it.

      +

      Returns true if a particular event type has any listeners attached to it. The verification can optionally be propagated, it will return true if parents have the listener attached to it.

      listens(<String> type)listens(<String> type, <Boolean> propagate?) Boolean

      Returns true if a particular event type has any listeners attached to it.

      +

      Returns true if a particular event type has any listeners attached to it. The verification can optionally be propagated, it will return true if parents have the listener attached to it.

      listens(<String> type)listens(<String> type, <Boolean> propagate?) Boolean

      Returns true if a particular event type has any listeners attached to it.

      +

      Returns true if a particular event type has any listeners attached to it. The verification can optionally be propagated, it will return true if parents have the listener attached to it.

      listens(<String> type)listens(<String> type, <Boolean> propagate?) Boolean

      Returns true if a particular event type has any listeners attached to it.

      +

      Returns true if a particular event type has any listeners attached to it. The verification can optionally be propagated, it will return true if parents have the listener attached to it.