libreoffice-online/loleaflet/reference.html
Alexandru Vlăduţu c4adca9978 tdf#129979: loleaflet send postMessage on cancel for password protected files
Change-Id: Ied484ee8cce185c707d16c5181ca9246f69bdea2
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/86679
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
2020-01-16 17:27:08 +01:00

9587 lines
310 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<title>Documentation - Leaflet - a JavaScript library for interactive maps</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" />
<link rel="stylesheet" href="docs/css/normalize.css" />
<link rel="stylesheet" href="docs/css/main.css" />
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,400italic,700,300' rel='stylesheet' type='text/css'>
<script src="docs/highlight/highlight.pack.js"></script>
<script src="docs/js/jquery-2.1.4.min.js"></script>
<link rel="stylesheet" href="docs/highlight/styles/github-gist.css" />
</head>
<body class="api-page">
<div class="container">
<h2>API Reference</h2>
<div id="toc" class="clearfix">
<div class="toc-col map-col">
<h4>Map</h4>
<ul>
<li><a href="#map-usage">Usage example</a></li>
<li><a href="#map-constructor">Creation</a></li>
<li><a href="#map-options">Options</a></li>
<li><a href="#map-events">Events</a></li>
</ul>
<h4>Map Methods</h4>
<ul>
<li><a href="#map-set-methods">Modifying map state</a></li>
<li><a href="#map-get-methods">Getting map state</a></li>
<li><a href="#map-stuff-methods">Layers and controls</a></li>
<li><a href="#map-conversion-methods">Conversion methods</a></li>
<li><a href="#map-misc-methods">Other methods</a></li>
</ul>
<h4>Map Misc</h4>
<ul>
<li><a href="#map-properties">Properties</a></li>
<li><a href="#map-panes">Panes</a></li>
</ul>
</div>
<div class="toc-col">
<h4 style="color:red;">LOLeaflet API</h4>
<ul>
<li><a href="#loleaflet-initialization">Initialization</a></li>
<li><a href="#loleaflet-general">General</a></li>
<li><a href="#loleaflet-toolbar">Toolbar</a></li>
<li><a href="#loleaflet-page">Page oriented</a></li>
<li><a href="#loleaflet-part">Part oriented</a></li>
<li><a href="#loleaflet-events">Events</a></li>
<li><a href="#loleaflet-object-values">Object values</a></li>
<li><a href="#loleaflet-uno-commands">Uno commands</a></li>
</ul>
<h4 style="color:red;">PostMessage API</h4>
<ul>
<li><a href="#loleaflet-postmessage-initialization">Initialization</a></li>
<li><a href="#loleaflet-postmessage-query">Query API</a></li>
<li><a href="#loleaflet-postmessage-sessions">Session Management</a></li>
<li><a href="#loleaflet-postmessage-actions">Actions</a></li>
<li><a href="#loleaflet-postmessage-misc">Miscellaneous</a></li>
</ul>
<h4>UI Layers</h4>
<ul>
<li><a href="#marker">Marker</a></li>
<li><a href="#popup">Popup</a></li>
</ul>
<h4>Raster Layers</h4>
<ul>
<li><a href="#tilelayer">TileLayer</a></li>
<li><a href="#tilelayer-wms">TileLayer.WMS</a></li>
<li><a href="#imageoverlay">ImageOverlay</a></li>
</ul>
<h4>Vector Layers</h4>
<ul>
<li><a href="#path">Path</a></li>
<li><a href="#polyline">Polyline</a></li>
<li><a href="#polygon">Polygon</a></li>
<li><a href="#rectangle">Rectangle</a></li>
<li><a href="#circle">Circle</a></li>
<li><a href="#circlemarker">CircleMarker</a></li>
</ul>
</div>
<div class="toc-col">
<h4>Other Layers</h4>
<ul>
<li><a href="#layergroup">LayerGroup</a></li>
<li><a href="#featuregroup">FeatureGroup</a></li>
<li><a href="#geojson">GeoJSON</a></li>
<li><a href="#gridlayer">GridLayer</a></li>
</ul>
<h4>Basic Types</h4>
<ul>
<li><a href="#latlng">LatLng</a></li>
<li><a href="#latlngbounds">LatLngBounds</a></li>
<li><a href="#point">Point</a></li>
<li><a href="#bounds">Bounds</a></li>
<li><a href="#icon">Icon</a></li>
<li><a href="#divicon">DivIcon</a></li>
</ul>
<h4>Controls</h4>
<ul>
<li><a href="#control-zoom">Zoom</a></li>
<li><a href="#control-attribution">Attribution</a></li>
<li><a href="#control-layers">Layers</a></li>
<li><a href="#control-scale">Scale</a></li>
</ul>
</div>
<div class="toc-col">
<h4>Shared Methods</h4>
<ul>
<li><a href="#events">Event</a></li>
<li><a href="#layers">Layer</a></li>
<li><a href="#popups">Popup</a></li>
</ul>
<h4>Utility</h4>
<ul>
<li><a href="#browser">Browser</a></li>
<li><a href="#util">Util</a></li>
<li><a href="#transformation">Transformation</a></li>
<li><a href="#lineutil">LineUtil</a></li>
<li><a href="#polyutil">PolyUtil</a></li>
</ul>
<h4>DOM Utility</h4>
<ul>
<li><a href="#domevent">DomEvent</a></li>
<li><a href="#domutil">DomUtil</a></li>
<li><a href="#posanimation">PosAnimation</a></li>
<li><a href="#draggable">Draggable</a></li>
</ul>
</div>
<div class="toc-col last-col">
<h4>Base Classes</h4>
<ul>
<li><a href="#class">Class</a></li>
<li><a href="#evented">Evented</a></li>
<li><a href="#layer">Layer</a></li>
<li><a href="#control">Control</a></li>
<li><a href="#handler">Handler</a></li>
<!--<li><a class="nodocs" href="#">IFeature</a></li>-->
<li><a href="#projection">Projection</a></li>
<li><a href="#crs">CRS</a></li>
</ul>
<h4>Misc</h4>
<ul>
<li><a href="#event-objects">Event objects</a></li>
<li><a href="#global">global switches</a></li>
<li><a href="#noconflict">noConflict</a></li>
<li><a href="#version">version</a></li>
</ul>
</div>
</div>
<!--<a href="#toc" id="back-to-top">&uarr;</a>-->
<hr />
<p>This reference reflects <strong>LOLeaflet master</strong>.</p>
<h2 id="map-class">Map</h2>
<p>The central class of the API &mdash; it is used to create a map on a page and manipulate it.</p>
<h3 id="map-usage">Usage example</h3>
<pre><code class="javascript">// initialize the map on the "map" div with a server and document URL
var map = L.map('map', {
doc: 'file:///path/to/document',
server: 'wss://localhost'
});</code></pre>
<h3 id="map-constructor" class="left">Creation</h3>
<table data-id='map'>
<tr>
<th>Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.map</b>(
<nobr>&lt;HTMLElement|String&gt; <i>id</i>,</nobr>
<nobr>&lt;<a href="#map-options">Map options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Instantiates a map object given a div element (or its id) and optionally an object literal with map options described below.</td>
</tr>
</table>
<h3 id="map-options">Options</h3>
<h4>Map State Options</h4>
<table data-id='map'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>center</b></code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td><code><span class="literal">[0, 0]</span></code></td>
<td>Initial geographical center of the map.</td>
</tr>
<tr>
<td><code><b>zoom</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">10</span></code></td>
<td>Initial map zoom.</td>
</tr>
<tr>
<td><code><b>layers</b></code></td>
<td><code><a href="#layer">Layer</a>[]</code></td>
<td><code><span class="literal">null</span></code></td>
<td>Layers that will be added to the map initially.</td>
</tr>
<tr>
<td><code><b>minZoom</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">1</span></code></td>
<td>Minimum zoom level of the map. Overrides any <code>minZoom</code> set on map layers.</td>
</tr>
<tr>
<td><code><b>maxZoom</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">20</span></code></td>
<td>Maximum zoom level of the map. This overrides any <code>maxZoom</code> set on map layers.</td>
</tr>
<tr id="map-maxbounds">
<td><code><b>maxBounds</b></code></td>
<td><code><a href="#latlngbounds">LatLngBounds</a></code></td>
<td><code><span class="literal">null</span></code></td>
<td>When 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 <a href="#map-setmaxbounds">setMaxBounds</a> method.</td>
</tr>
<tr id="map-maxbounds">
<td><code><b>maxBoundsViscosity</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">0.0</span></code></td>
<td>If <code>maxBounds</code> is set, this options will control how solid the bounds are when dragging the map around. The default value of <span class="number">0.0</span> allows the user to drag outside the bounds at normal speed, higher values will slow down map dragging outside bounds, and <span class="number">1.0</span> makes the bounds fully solid, preventing the user from dragging outside the bounds.</td>
</tr>
<tr>
<td><code><b>crs</b></code></td>
<td><code><a href="#crs">CRS</a></code></td>
<td><code>L.CRS.<br/>Simple</code></td>
<td>Coordinate Reference System to use. Don't change this if you're not sure what it means.</td>
</tr>
<tr>
<td><code><b>renderer</b></code></td>
<td><code>Renderer</code></td>
<td><code>depends</code></td>
<td>The default method for drawing vector layers on the map. <code>L.SVG</code> or <code>L.Canvas</code> by default depending on browser support.</td>
</tr>
</table>
<h4>Interaction Options</h4>
<table data-id='map'>
<tr>
<th class="width140">Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>editing</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>Whether the document is in editing or viewing mode.</td>
</tr>
<tr>
<td><code><b>readOnly</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>Whether the document is read-only.</td>
</tr>
<tr>
<td><code><b>print</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>Whether the print handler is active (for Chrome).</td>
</tr>
<tr>
<td><code><b>dragging</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Whether the map be draggable with mouse/touch or not.</td>
</tr>
<tr>
<td><code><b>wheelDebounceTime</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">40</span></code></td>
<td>Limits 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.</td>
</tr>
<tr>
<td><code><b>doubleClickZoom</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>Whether the map can be zoomed in by double clicking on it and zoomed out by double clicking while holding shift. If passed <code><span class="string">'center'</span></code>, double-click zoom will zoom to the center of the view regardless of where the mouse was.</td>
</tr>
<tr>
<td><code><b>boxZoom</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Whether the map can be zoomed to a rectangular area specified by dragging the mouse while pressing shift.</td>
</tr>
<tr>
<td><code><b>tap</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Enables mobile hacks for supporting instant taps (fixing 200ms click delay on iOS/Android) and touch holds (fired as <code>contextmenu</code> events).</td>
</tr>
<tr>
<td><code><b>tapTolerance</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">15</span></code></td>
<td>The max number of pixels a user can shift his finger during touch for it to be considered a valid tap.</td>
</tr>
<tr>
<td><code><b>trackResize</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Whether the map automatically handles browser window resize to update itself.</td>
</tr>
<tr>
<td><code><b>worldCopyJump</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>With 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.</td>
</tr>
<tr>
<td><code><b>closePopupOnClick</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Set it to <code><span class="literal">false</span></code> if you don't want popups to close when user clicks the map.</td>
</tr>
<tr>
<td><code><b>bounceAtZoomLimits</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Set it to <code><span class="literal">false</span></code> if you don't want the map to zoom beyond min/max zoom and then bounce back when pinch-zooming.</td>
</tr>
</table>
<h4>Keyboard Navigation Options</h4>
<table data-id='map'>
<tr>
<th class="width140">Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>keyboard</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Makes the map focusable and allows users to navigate the map with keyboard arrows and <code>+</code>/<code>-</code> keys.</td>
</tr>
<tr>
<td><code><b>keyboardPanOffset</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">20</span></code></td>
<td>Amount of pixels to pan when pressing an arrow key.</td>
</tr>
<tr>
<td><code><b>keyboardZoomOffset</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">1</span></code></td>
<td>Number of zoom levels to change when pressing <code>+</code> or <code>-</code> key.</td>
</tr>
</table>
<h4>Panning Inertia Options</h4>
<table data-id='map'>
<tr>
<th class="width140">Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>inertia</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>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.</td>
</tr>
<tr>
<td><code><b>inertiaDeceleration</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">3000</span></code></td>
<td>The rate with which the inertial movement slows down, in pixels/second<sup>2</sup>.</td>
</tr>
<tr>
<td><code><b>inertiaMaxSpeed</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">1500</span></code></td>
<td>Max speed of the inertial movement, in pixels/second.</td>
</tr>
<tr>
<td><code><b>inertiaThreshold</b></code></td>
<td><code>Number</code></td>
<td><code>depends</code></td>
<td>Number of milliseconds that should pass between stopping the movement and releasing the mouse or touch to prevent inertial movement. <code><span class="number">32</span></code> for touch devices and <code><span class="number">14</span></code> for the rest by default.</td>
</tr>
</table>
<h4>Animation options</h4>
<table data-id='map'>
<tr>
<th class="width140">Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>fadeAnimation</b></code></td>
<td><code>Boolean</code></td>
<td>false</td>
<td>Whether the tile fade animation is enabled. By default it's disabled because it produces a bad effect when editing.</td>
</tr>
<tr>
<td><code><b>zoomAnimation</b></code></td>
<td><code>Boolean</code></td>
<td>depends</td>
<td>Whether the tile zoom animation is enabled. By default it's enabled in all browsers that support CSS3 Transitions except Android.</td>
</tr>
<tr>
<td><code><b>zoomAnimationThreshold</b></code></td>
<td><code>Number</code></td>
<td><span class="number">4</span></td>
<td>Won't animate zoom if the zoom difference exceeds this value.</td>
</tr>
<tr>
<td><code><b>markerZoomAnimation</b></code></td>
<td><code>Boolean</code></td>
<td>depends</td>
<td>Whether 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.</td>
</tr>
</table>
<h3 id="map-events">Events</h3>
<p>You can subscribe to the following events using <a href="#events">these methods</a>.</p>
<table data-id='map'>
<tr>
<th>Event</th>
<th>Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>click</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user clicks (or taps) the map.</td>
</tr>
<tr>
<td><code><b>dblclick</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user double-clicks (or double-taps) the map.</td>
</tr>
<tr>
<td><code><b>mousedown</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user pushes the mouse button on the map.</td>
</tr>
<tr>
<td><code><b>mouseup</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user releases the mouse button on the map.</td>
</tr>
<tr>
<td><code><b>mouseover</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the mouse enters the map.</td>
</tr>
<tr>
<td><code><b>mouseout</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the mouse leaves the map.</td>
</tr>
<tr>
<td><code><b>mousemove</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired while the mouse moves over the map.</td>
</tr>
<tr>
<td><code><b>contextmenu</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired 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).</td>
</tr>
<tr>
<td><code><b>focus</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the user focuses the map either by tabbing to it or clicking/panning.</td>
</tr>
<tr>
<td><code><b>blur</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the map loses focus.</td>
</tr>
<tr>
<td><code><b>preclick</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired before mouse click on the map (sometimes useful when you want something to happen on click before any existing click handlers start running).</td>
</tr>
<tr>
<td><code><b>load</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the map is initialized (when its center and zoom are set for the first time).</td>
</tr>
<tr>
<td><code><b>unload</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the map is destroyed with <a href="#map-remove">remove</a> method.</td>
</tr>
<tr id="map-viewreset">
<td><code><b>viewreset</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the map needs to redraw its content (this usually happens on map zoom or load). Very useful for creating custom overlays.</td>
</tr>
<tr>
<td><code><b>movestart</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the view of the map starts changing (e.g. user starts dragging the map).</td>
</tr>
<tr>
<td><code><b>move</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired on any movement of the map view.</td>
</tr>
<tr id="map-moveend">
<td><code><b>moveend</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the view of the map stops changing (e.g. user stopped dragging the map).</td>
</tr>
<tr>
<td><code><b>dragstart</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the user starts dragging the map.</td>
</tr>
<tr>
<td><code><b>drag</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired repeatedly while the user drags the map.</td>
</tr>
<tr>
<td><code><b>dragend</b></code></td>
<td><code><a href="#dragend-event">DragEndEvent</a></code></td>
<td>Fired when the user stops dragging the map.</td>
</tr>
<tr>
<td><code><b>zoomstart</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the map zoom is about to change (e.g. before zoom animation).</td>
</tr>
<tr>
<td><code><b>zoomend</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the map zoom changes.</td>
</tr>
<tr>
<td><code><b>zoomlevelschange</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the number of zoomlevels on the map is changed due to adding or removing a layer.</td>
</tr>
<tr>
<td><code><b>resize</b></code></td>
<td><code><a href="#resize-event">ResizeEvent</a></code></td>
<td>Fired when the map is resized.</td>
</tr>
<tr>
<td><code><b>autopanstart</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the map starts autopanning when opening a popup.</td>
</tr>
<tr>
<td><code><b>layeradd</b></code></td>
<td><code><a href="#layer-event">LayerEvent</a></code></td>
<td>Fired when a new layer is added to the map.</td>
</tr>
<tr>
<td><code><b>layerremove</b></code></td>
<td><code><a href="#layer-event">LayerEvent</a></code></td>
<td>Fired when some layer is removed from the map.</td>
</tr>
<tr>
<td><code><b>baselayerchange</b></code></td>
<td><code><a href="#layer-event">LayerEvent</a></code></td>
<td>Fired when the base layer is changed through the <a href="#control-layers">layer control</a>.</td>
</tr>
<tr>
<td><code><b>overlayadd</b></code></td>
<td><code><a href="#layer-event">LayerEvent</a></code></td>
<td>Fired when an overlay is selected through the <a href="#control-layers">layer control</a>.</td>
</tr>
<tr>
<td><code><b>overlayremove</b></code></td>
<td><code><a href="#layer-event">LayerEvent</a></code></td>
<td>Fired when an overlay is deselected through the <a href="#control-layers">layer control</a>.</td>
</tr>
<tr>
<td><code><b>locationfound</b></code></td>
<td><code><a href="#location-event">LocationEvent</a></code></td>
<td>Fired when geolocation (using the <a href="#map-locate">locate</a> method) went successfully.</td>
</tr>
<tr>
<td><code><b>locationerror</b></code></td>
<td><code><a href="#error-event">ErrorEvent</a></code></td>
<td>Fired when geolocation (using the <a href="map-locate">locate</a> method) failed.</td>
</tr>
<tr>
<td><code><b>popupopen</b></code></td>
<td><code><a href="#popup-event">PopupEvent</a></code></td>
<td>Fired when a popup is opened (using <code>openPopup</code> method).</td>
</tr>
<tr>
<td><code><b>popupclose</b></code></td>
<td><code><a href="#popup-event">PopupEvent</a></code></td>
<td>Fired when a popup is closed (using <code>closePopup</code> method).</td>
</tr>
</table>
<h3 id="map-set-methods">Methods for Modifying Map State</h3>
<table data-id='map'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>setView</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>center</i>,</nobr>
<nobr>&lt;Number&gt; <i>zoom?</i>,</nobr>
<nobr>&lt;<a href="#map-zoompanoptions">zoom/pan options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the view of the map (geographical center and zoom) with the given animation options.</td>
</tr>
<tr>
<td><code><b>setZoom</b>(
<nobr>&lt;Number&gt; <i>zoom</i></nobr>,
<nobr>&lt;<a href="#map-zoomoptions">zoom options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the zoom of the map.</td>
</tr>
<tr>
<td><code><b>zoomIn</b>(
<nobr>&lt;Number&gt; <em>delta?</em></nobr>,
<nobr>&lt;<a href="#map-zoomoptions">zoom options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Increases the zoom of the map by <code>delta</code> (<code><span class="number">1</span></code> by default).</td>
</tr>
<tr>
<td><code><b>zoomOut</b>(
<nobr>&lt;Number&gt; <em>delta?</em></nobr>,
<nobr>&lt;<a href="#map-zoomoptions">zoom options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Decreases the zoom of the map by <code>delta</code> (<code><span class="number">1</span></code> by default).</td>
</tr>
<tr>
<td><code><b>setZoomAround</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i>, </nobr>
<nobr>&lt;Number&gt; <i>zoom</i></nobr>,
<nobr>&lt;<a href="#map-zoomoptions">zoom options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Zooms the map while keeping a specified point on the map stationary (e.g. used internally for scroll zoom and double-click zoom).</td>
</tr>
<tr id="map-fitbounds">
<td><code><b>fitBounds</b>(
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>bounds</i></nobr>,
<nobr>&lt;<a href="#map-fitboundsoptions">fitBounds options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets a map view that contains the given geographical bounds with the maximum zoom level possible.</td>
</tr>
<tr id="map-fitworld">
<td><code><b>fitWorld</b>(
<nobr>&lt;<a href="#map-fitboundsoptions">fitBounds options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets a map view that mostly contains the whole world with the maximum zoom level possible.</td>
</tr>
<tr>
<td><code><b>panTo</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i></nobr>,
<nobr>&lt;<a href="#map-panoptions">pan options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Pans the map to a given center. Makes an animated pan if new center is not more than one screen away from the current one.</td>
</tr>
<tr id="map-paninsidebounds">
<td><code><b>panInsideBounds</b>(
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>bounds</i></nobr>,
<nobr>&lt;<a href="#map-panoptions">pan options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>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.</td>
</tr>
<tr>
<td><code><b>panBy</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i></nobr>,
<nobr>&lt;<a href="#map-panoptions">pan options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Pans the map by a given number of pixels (animated).</td>
</tr>
<tr>
<td><code><b>invalidateSize</b>(
<nobr>&lt;Boolean&gt; <i>animate</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Checks if the map container size changed and updates the map if so &mdash; call it after you've changed the map size dynamically, also animating pan by default.</td>
</tr>
<tr>
<td><code><b>invalidateSize</b>(
<nobr>&lt;<a href="#map-zoompanoptions">zoom/pan options</a>&gt; <i>options</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Checks if the map container size changed and updates the map if so &mdash; call it after you've changed the map size dynamically, also animating pan by default. If <code>options.pan</code> is <code><span class="literal">false</span></code>, panning will not occur. If <code>options.debounceMoveend</code> is <code><span class="literal">true</span></code>, it will delay <code>moveend</code> event so that it doesn't happen often even if the method is called many times in a row.</td>
</tr>
<tr id="map-setmaxbounds">
<td><code><b>setMaxBounds</b>(
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>bounds</i></nobr><!--,
<nobr>&lt;<a href="#map-zoompanoptions">zoom/pan options</a>&gt; <i>options?</i> )</nobr>-->
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Restricts the map view to the given bounds (see <a href="#map-maxbounds">map maxBounds</a> option)<!--, animating the map view if bounds are changed. The given animation options are passed through to `setView` or `panInsideBounds`, depending on map zoom level, and can be used to control how the map animates during this change-->.</td>
</tr>
<tr id="map-locate">
<td><code><b>locate</b>(
<nobr>&lt;<a href="#map-locate-options">Locate options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Tries to locate the user using the <a href="https://en.wikipedia.org/wiki/W3C_Geolocation_API">Geolocation API</a>, firing a <code>locationfound</code> event with location data on success or a <code>locationerror</code> 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). See <a href="#map-locate-options">Locate options</a> for more details.</td>
</tr>
<tr>
<td><code><b>stopLocate</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Stops watching location previously initiated by <code><b>map.locate</b>({watch: true})</code> and aborts resetting the map view if <code>map.locate</code> was called with <code>{setView: true}</code>.</td>
</tr>
<tr id="map-remove">
<td><code><b>remove</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Destroys the map and clears all related event listeners.</td>
</tr>
<tr id="map-flyto">
<td><code><b>flyTo</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i></nobr>,
<nobr>&lt;Number&gt; <i>zoom?</i>,</nobr>
<nobr>&lt;<a href="#map-zoompanoptions">zoom/pan options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the view of the map (geographical center and zoom) performing a smooth pan-zoom animation.</td>
</tr>
<tr>
<td><code><b>flyToBounds</b>(
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>bounds</i></nobr>,
<nobr>&lt;<a href="#map-fitboundsoptions">fitBounds options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the view of the map with a smooth animation like <a href="#map-flyto">flyTo</a>, but takes a bounds parameter like <a href="#map-fitbounds">fitBounds</a>.</td>
</tr>
</table>
<h3 id="map-get-methods">Methods for Getting Map State</h3>
<table data-id='map'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>getCenter</b>()</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the geographical center of the map view.</td>
</tr>
<tr>
<td><code><b>getZoom</b>()</code></td>
<td><code>Number</code></td>
<td>Returns the current zoom of the map view.</td>
</tr>
<tr>
<td><code><b>getMinZoom</b>()</code></td>
<td><code>Number</code></td>
<td>Returns the minimum zoom level of the map.</td>
</tr>
<tr>
<td><code><b>getMaxZoom</b>()</code></td>
<td><code>Number</code></td>
<td>Returns the maximum zoom level of the map.</td>
</tr>
<tr>
<td><code><b>getBounds</b>()</code></td>
<td><code><a href="#latlngbounds">LatLngBounds</a></code></td>
<td>Returns the LatLngBounds of the current map view.</td>
</tr>
<tr>
<td><code><b>getBoundsZoom</b>(
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>bounds</i>,</nobr>
<nobr>&lt;Boolean&gt; <i>inside?</i> )</nobr>
</code></td>
<td><code>Number</code></td>
<td>Returns the maximum zoom level on which the given bounds fit to the map view in its entirety. If <code>inside</code> (optional) is set to <code><span class="literal">true</span></code>, the method instead returns the minimum zoom level on which the map view fits into the given bounds in its entirety.</td>
</tr>
<tr>
<td><code><b>getSize</b>()</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the current size of the map container.</td>
</tr>
<tr>
<td><code><b>getPixelBounds</b>()</code></td>
<td><code><a href="#bounds">Bounds</a></code></td>
<td>Returns the bounds of the current map view in projected pixel coordinates (sometimes useful in layer and overlay implementations).</td>
</tr>
<tr>
<td><code><b>getPixelOrigin</b>()</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the projected pixel coordinates of the top left point of the map layer (useful in custom layer and overlay implementations).</td>
</tr>
<tr>
<td><code><b>getPixelWorldBounds</b>(
<nobr>&lt;Number&gt; <i>zoom?</i></nobr> )
</code></td>
<td><code><a href="#bounds">Bounds</a></code></td>
<td>Returns the world's bounds in pixel coordinates for zoom level <code>zoom</code>. If <code>zoom</code> is omitted, the map's
current zoom is used.</td>
</tr>
</table>
<h3 id="map-stuff-methods">Methods for Layers and Controls</h3>
<table data-id='map'>
<tr>
<th class="width250">Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr id="map-addlayer">
<td><code><b>addLayer</b>(
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i></nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds the given layer to the map.</td>
</tr>
<tr>
<td><code><b>removeLayer</b>(
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes the given layer from the map.</td>
</tr>
<tr>
<td><code><b>hasLayer</b>(
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the given layer is currently added to the map.</td>
</tr>
<tr>
<td><code><b>eachLayer</b>(
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Iterates over the layers of the map, optionally specifying context of the iterator function.
<pre><code>map.eachLayer(function (layer) {
layer.bindPopup('Hello');
});</code></pre>
</td>
</tr>
<tr id="map-openpopup">
<td><code><b>openPopup</b>(
<nobr>&lt;<a href="#popup">Popup</a>&gt; <i>popup</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).</td>
</tr>
<tr id="map-openpopup2">
<td><code><b>openPopup</b>(
<nobr>&lt;String&gt; <i>html</i> </nobr> | <nobr>&lt;HTMLElement&gt; <i>el</i>,
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i></nobr>,
<nobr>&lt;<a href="#popup-options">Popup options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Creates a popup with the specified options and opens it in the given point on a map.</td>
</tr>
<tr id="map-closepopup">
<td><code><b>closePopup</b>(
<nobr>&lt;<a href="#popup">Popup</a>&gt; <i>popup?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Closes the popup previously opened with <a href="#map-openpopup">openPopup</a> (or the given one).</td>
</tr>
<tr id="map-addcontrol">
<td><code><b>addControl</b>(
<nobr>&lt;<a href="#control">IControl</a>&gt; <i>control</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds the given control to the map.</td>
</tr>
<tr>
<td><code><b>removeControl</b>(
<nobr>&lt;<a href="#control">IControl</a>&gt; <i>control</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes the given control from the map.</td>
</tr>
<tr>
<td><code><b>getRenderer</b>(
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i>)</nobr>
</code></td>
<td><code><span class="keyword">Renderer</span></code></td>
<td>Returns the renderer for the given layer.</td>
</tr>
</table>
<h3 id="map-conversion-methods">Conversion Methods</h3>
<table data-id='map'>
<tr>
<th class="width200">Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>latLngToLayerPoint</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the map layer point that corresponds to the given geographical coordinates (useful for placing overlays on the map).</td>
</tr>
<tr>
<td><code><b>layerPointToLatLng</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the geographical coordinates of a given map layer point.</td>
</tr>
<tr>
<td><code><b>containerPointToLayerPoint</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Converts the point relative to the map container to a point relative to the map layer.</td>
</tr>
<tr>
<td><code><b>layerPointToContainerPoint</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Converts the point relative to the map layer to a point relative to the map container.</td>
</tr>
<tr>
<td><code><b>latLngToContainerPoint</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the map container point that corresponds to the given geographical coordinates.</td>
</tr>
<tr>
<td><code><b>containerPointToLatLng</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the geographical coordinates of a given map container point.</td>
</tr>
<tr>
<td><code><b>project</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i>,</nobr>
<nobr>&lt;Number&gt; <i>zoom?</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Projects the given geographical coordinates to absolute pixel coordinates for the given zoom level (current zoom level by default).</td>
</tr>
<tr>
<td><code><b>unproject</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i>,</nobr>
<nobr>&lt;Number&gt; <i>zoom?</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Projects the given absolute pixel coordinates to geographical coordinates for the given zoom level (current zoom level by default).</td>
</tr>
<tr>
<td><code><b>mouseEventToContainerPoint</b>(
<nobr>&lt;MouseEvent&gt; <i>event</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the pixel coordinates of a mouse click (relative to the top left corner of the map) given its event object.</td>
</tr>
<tr>
<td><code><b>mouseEventToLayerPoint</b>(
<nobr>&lt;MouseEvent&gt; <i>event</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the pixel coordinates of a mouse click relative to the map layer given its event object.</td>
</tr>
<tr>
<td><code><b>mouseEventToLatLng</b>(
<nobr>&lt;MouseEvent&gt; <i>event</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the geographical coordinates of the point the mouse clicked on given the click's event object.</td>
</tr>
<tr>
<td><code><b>wrapLatLng</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns a <code>LatLng</code> where <code>lat</code> and <code>lng</code> has been wrapped according to the map's CRS's <code><a href="#crs-wraplat">wrapLat</a></code> and <code><a href="#crs-wraplng">wrapLng</a></code> properties, if they are outside the CRS's bounds.</td>
</tr>
<tr>
<td><code><b>distance</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng1</i>,</nobr>
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng2</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the distance in meters between two geographic coordinates in the map's CRS.</td>
</tr>
</table>
<h3 id="map-misc-methods">Other Methods</h3>
<table data-id='map'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>getContainer</b>()</code></td>
<td><code>HTMLElement</code></td>
<td>Returns the container element of the map.</td>
</tr>
<tr>
<td><code><b>createPane</b>(
<nobr>&lt;String&gt; <i>name</i>, </nobr> <nobr>&lt;HTMLElement&gt; <i>container?</i>
)</code></td>
<td><a href="#map-panes"><code>MapPane</code></a></td>
<td>Creates a pane with the given name. Created panes will be given a generated class based on the name like <code class="css"><span class="selector">.leaflet-pane-name</span></code>"</td>
</tr>
<tr>
<td><code><b>getPane</b>(
<nobr>&lt;String&gt; <i>name</i>
)</code></td>
<td><a href="#map-panes"><code>MapPane</code></a></td>
<td>Returns the HTML element representing the named map pane.</td>
</tr>
<tr>
<td><code><b>getPanes</b>()</code></td>
<td><code><a href="#map-panes">MapPanes</a></code></td>
<td>Returns an object with different map panes (to render overlays in).</td>
</tr>
<tr>
<td><code><b>whenReady</b>(
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr></code></td>
<td><code>this</code></td>
<td>Runs the given callback when the map gets initialized with a place and zoom, or immediately if it happened already, optionally passing a function context.</td>
</tr>
</table>
<h3 id="map-locate-options">Locate options</h3>
<table data-id='map'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>watch</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code>, starts continuous watching of location changes (instead of detecting it once) using W3C <code>watchPosition</code> method. You can later stop watching using <code><b>map.stopLocate</b>()</code> method.</td>
</tr>
<tr>
<td><code><b>setView</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code>, automatically sets the map view to the user location with respect to detection accuracy, or to world view if geolocation failed.</td>
</tr>
<tr>
<td><code><b>maxZoom</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">Infinity</span></code></td>
<td>The maximum zoom for automatic view setting when using `setView` option.</td>
</tr>
<tr>
<td><code><b>timeout</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">10000</span></code></td>
<td>Number of milliseconds to wait for a response from geolocation before firing a <code>locationerror</code> event.</td>
</tr>
<tr>
<td><code><b>maximumAge</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">0</span></code></td>
<td>Maximum age of detected location. If less than this amount of milliseconds passed since last geolocation response, <code>locate</code> will return a cached location.</td>
</tr>
<tr>
<td><code><b>enableHighAccuracy</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>Enables high accuracy, see <a href="http://dev.w3.org/geo/api/spec-source.html#high-accuracy">description in the W3C spec</a>.</td>
</tr>
</table>
<h3 id="map-zoompanoptions">Zoom/pan options</h3>
<table data-id='map'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>reset</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code>, the map view will be completely reset (without any animations).</td>
</tr>
<tr>
<td><code><b>pan</b></code></td>
<td><code><a href="#map-panoptions">pan options</a></code></td>
<td><code>-</code></td>
<td>Sets the options for the panning (without the zoom change) if it occurs.</td>
</tr>
<tr>
<td><code><b>zoom</b></code></td>
<td><code><a href="#map-zoomoptions">zoom options</a></code></td>
<td><code>-</code></td>
<td>Sets the options for the zoom change if it occurs.</td>
</tr>
<tr>
<td><code><b>animate</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">-</span></code></td>
<td>An equivalent of passing <code>animate</code> to both zoom and pan options (see below).</td>
</tr>
</table>
<h3 id="map-panoptions">Pan options</h3>
<table data-id='map'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>animate</b></code></td>
<td><code>Boolean</code></td>
<td><code>-</code></td>
<td>If <code><span class="literal">true</span></code>, panning will always be animated if possible. If <code><span class="literal">false</span></code>, 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).</td>
</tr>
<tr>
<td><code><b>duration</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">0.25</span></code></td>
<td>Duration of animated panning.</td>
</tr>
<tr>
<td><code><b>easeLinearity</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">0.25</span></code></td>
<td>The curvature factor of panning animation easing (third parameter of the <a href="http://cubic-bezier.com/">Cubic Bezier curve</a>). <span class="number">1.0</span> means linear animation, the less the more bowed the curve.</td>
</tr>
<tr>
<td><code><b>noMoveStart</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code>, panning won't fire <code>movestart</code> event on start (used internally for panning inertia).</td>
</tr>
</table>
<h3 id="map-zoomoptions">Zoom options</h3>
<table data-id='map'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>animate</b></code></td>
<td><code>Boolean</code></td>
<td><code>-</code></td>
<td>If not specified, zoom animation will happen if the zoom origin is inside the current view. If <code><span class="literal">true</span></code>, the map will attempt animating zoom disregarding where zoom origin is. Setting <code><span class="literal">false</span></code> will make it always reset the view completely without animation.</td>
</tr>
</table>
<h3 id="map-fitboundsoptions">fitBounds options</h3>
<p>The same as <a href="#map-zoompanoptions">zoom/pan options</a> and additionally:</p>
<table data-id='map'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>paddingTopLeft</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td><code><nobr>[<span class="number">0</span>, <span class="number">0</span>]</nobr></code></td>
<td>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.</td>
</tr>
<tr>
<td><code><b>paddingBottomRight</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td><code><nobr>[<span class="number">0</span>, <span class="number">0</span>]</nobr></code></td>
<td>The same for bottom right corner of the map.</td>
</tr>
<tr>
<td><code><b>padding</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td><code><nobr>[<span class="number">0</span>, <span class="number">0</span>]</nobr></code></td>
<td>Equivalent of setting both top left and bottom right padding to the same value.</td>
</tr>
<tr>
<td><code><b>maxZoom</b></code></td>
<td><code>Number</code></td>
<td><code><nobr><span class="literal">null</span></nobr></code></td>
<td>The maximum possible zoom to use.</td>
</tr>
</table>
<h3 id="map-properties">Properties</h3>
<p>Map properties include interaction handlers that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging or touch zoom (see <a href="#handler">IHandler</a> methods). Example:</p>
<pre><code class="javascript">map.doubleClickZoom.disable();</code></pre>
<p>You can also access default map controls like attribution control through map properties:</p>
<pre><code class="javascript">map.attributionControl.addAttribution("Earthquake data &amp;copy; GeoNames");</code></pre>
<table data-id='map'>
<tr>
<th class="minwidth">Property</th>
<th class="minwidth">Type</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>dragging</b></code></td>
<td><a href="#handler"><code>IHandler</code></a></td>
<td>Map dragging handler (by both mouse and touch).</td>
</tr>
<tr>
<td><code><b>touchZoom</b></code></td>
<td><a href="#handler"><code>IHandler</code></a></td>
<td>Touch zoom handler.</td>
</tr>
<tr>
<td><code><b>doubleClickZoom</b></code></td>
<td><a href="#handler"><code>IHandler</code></a></td>
<td>Double click zoom handler.</td>
</tr>
<tr>
<td><code><b>scrollWheelZoom</b></code></td>
<td><a href="#handler"><code>IHandler</code></a></td>
<td>Scroll wheel zoom handler.</td>
</tr>
<tr>
<td><code><b>boxZoom</b></code></td>
<td><a href="#handler"><code>IHandler</code></a></td>
<td>Box (shift-drag with mouse) zoom handler.</td>
</tr>
<tr>
<td><code><b>keyboard</b></code></td>
<td><a href="#handler"><code>IHandler</code></a></td>
<td>Keyboard navigation handler.</td>
</tr>
<tr>
<td><code><b>tap</b></code></td>
<td><a href="#handler"><code>IHandler</code></a></td>
<td>Mobile touch hacks (quick tap and touch hold) handler.</td>
</tr>
<tr>
<td><code><b>attributionControl</b></code></td>
<td><a href="#control-attribution"><code>Control.Attribution</code></a></td>
<td>Attribution control.</td>
</tr>
</table>
<h3 id="map-panes">Map Panes</h3>
<p>Panes are DOM elements used to control the ordering of layers on the map. You can access panes with <a href="#map-getpane">map.getPane</a> or <a href="#map-getpanes">map.getPanes</a>methods. New panes can be created with the <a href="#map-getpane">map.createPane</a> method.</p>
<p>Every map has the following panes that differ only in zIndex.</p>
<table data-id='map'>
<tr>
<th class="width100">Pane</th>
<th class="width100">Type</th>
<th class="width100">Z Index</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>mapPane</b></code></td>
<td><code>HTMLElement</code></td>
<td><code class="javascript"><span class="string">'auto'</span></code></td>
<td>Pane that contains all other map panes.</td>
</tr>
<tr>
<td><code><b>tilePane</b></code></td>
<td><code>HTMLElement</code></td>
<td><code class="javascript"><span class="number">2</span></code></td>
<td>Pane for tile layers.</td>
</tr>
<tr>
<td><code><b>overlayPane</b></code></td>
<td><code>HTMLElement</code></td>
<td><code class="javascript"><span class="number">4</span></code></td>
<td>Pane for overlays like polylines and polygons.</td>
</tr>
<tr>
<td><code><b>shadowPane</b></code></td>
<td><code>HTMLElement</code></td>
<td><code class="javascript"><span class="number">5</span></code></td>
<td>Pane for overlay shadows (e.g. marker shadows).</td>
</tr>
<tr>
<td><code><b>markerPane</b></code></td>
<td><code>HTMLElement</code></td>
<td><code class="javascript"><span class="number">6</span></code></td>
<td>Pane for marker icons.</td>
</tr>
<tr>
<td><code><b>popupPane</b></code></td>
<td><code>HTMLElement</code></td>
<td><code class="javascript"><span class="number">7</span></code></td>
<td>Pane for popups.</td>
</tr>
</table>
<h2 id="loleaflet-initialization">Initialization</h2>
<h3>Usage example</h3>
<pre><code class="javascript">
var map = L.map('map', {
doc: 'file:///path/to/document',
server: 'wss://localhost',
documentContainer: 'document-container'
});</code></pre>
<h3 class="left">Creation</h3>
<table data-id='map'>
<tr>
<th>Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.map</b>(
<nobr>&lt;HTMLElement|String&gt; <i>id</i>,</nobr>
<nobr>&lt;<a href="#map-options">Map options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Instantiates a map object given a div element (or its id) and optionally an object literal with map options described below.</td>
</tr>
</table>
<h3>Options</h3>
<h4>These are the options intended to be used for loleaflet, using any additional options from Leaflet might cause some
unexpected behaviour.</h4>
<table data-id='map'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>doc</b></code></td>
<td><code>String</code></td>
<td><code><span class="literal">undefined</span></code></td>
<td>Document URL, the server should be able to access the document.</td>
</tr>
<tr>
<td><code><b>server</b></code></td>
<td><code>String</code></td>
<td><code><span class="literal">undefined</span></code></td>
<td>The websocket server hosting loolwsd using the <code>ws:</code> protocol.
Example: wss://localhost:9980</td>
</tr>
<tr>
<td><code><b>webserver</b></code></td>
<td><code>String</code></td>
<td><code><span class="literal">undefined</span></code></td>
<td>The webserver access to hosting loolwsd. Normally it is
derived from 'server', but can be overridden with an own
value in case of proxying. Example: http://localhost:9980</td>
</tr>
<tr>
<td><code><b>permission</b></code></td>
<td><code>String</code></td>
<td><code><span class="literal">'view'</span></code></td>
<td>The document's <a href="#documentpermission-values">permission</a>.</td>
</tr>
<tr>
<td><code><b>timestamp</b></code></td>
<td><code>String</code></td>
<td><code><span class="literal">undefined</span></code></td>
<td>A timestamp of the last modification to the document.</td>
</tr>
<tr>
<td><code><b>documentContainer</b></code></td>
<td><code>String / DOM element</code></td>
<td><code><span class="literal">undefined</span></code></td>
<td>An outer div, containing the map div, that is used internally for the creation of the toolbar.</td>
</tr>
<tr>
<td><code><b>toolbarContainer</b></code></td>
<td><code>String / DOM element</code></td>
<td><code><span class="literal">undefined</span></code></td>
<td>A div used by the default toolbar elements (bold, italic, search, etc.) in loleaflet. If you implement
your own toolbar and use controls that do not require a toolbar (like the dialog or scroll control) you
can ignore this.</td>
</tr>
<tr>
<td><code><b>renderingOptions</b></code></td>
<td><code>Object</code></td>
<td><code><span class="literal">undefined</span></code></td>
<td>Enables the continuous, web view, of the document, see the UNO commands below for this parameter.</td>
</tr>
<tr>
<td><code><b>print</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Whether the print handler is active (for Chrome).</td>
</tr>
<tr>
<td><code><b>autoFitWidth</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Whether the document is automatically zoomed so that the width fits the viewing area when
the window is resized. The document will not be zoomed in more than map.options.zoom.</td>
</tr>
<tr>
<td><code><b>zoom</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">10</span></code></td>
<td>Default zoom level in which the document will be loaded.</td>
</tr>
<tr>
<td><code><b>tileWidthTwips</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">3840</span></code></td>
<td>Default tile width in twips (how much of the document is covered horizontally in a 256x256 pixels tile).
Unless you know what you are doing, this should not be modified;
this means twips value for 256 pixels at 96dpi.</td>
</tr>
<tr>
<td><code><b>tileHeightTwips</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">3840</span></code></td>
<td>Default tile height in twips (how much of the document is covered vertically in a 256x256 pixels tile).
Unless you know what you are doing, this should not be modified;
this means twips value for 256 pixels at 96dpi.</td>
</tr>
<tr>
<td><code><b>defaultZoom</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">10</span></code></td>
<td>The zoom level at which the tile size in twips equals the default size (3840 x 3840).
Unless you know what you are doing, this should not be modified.</td>
</tr>
<tr>
<td><code><b>cursorURL</b></code></td>
<td><code>String</code></td>
<td><code><span class="literal">undefined</span></code></td>
<td>The path (local to the server) where custom cursor files are stored.</td>
</tr>
</table>
<h2 id="loleaflet-general">General</h2>
<p>General methods for document interaction.</p>
<table data-id='map'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>search</b>(
<nobr>&lt;String&gt; <i>phrase</i>,</nobr>
<nobr>&lt;Boolean&gt; <i>backward?</i> )</nobr>
</code></td>
<td><code>undefined</code></td>
<td>Searches for the given phrase downward from the current top border of the viewing area.
Or backwards if specified.</td>
</tr>
<tr>
<td><code><b>highlightAll</b>(
<nobr>&lt;String&gt; <i>phrase</i>,</nobr>
</code></td>
<td><code>undefined</code></td>
<td>Highlights all the occurrences of the given phrase. Please note that
this adds an extra layer for the highlights, so it is possible to
see both all the highlighted phrase, and the current selection at
the same time.</td>
</tr>
<tr>
<td><code><b>setPermission</b>(
<nobr>&lt;<a href="#documentpermission-values">DocumentPermissionValues</a>&gt; <i>documenPermission</i>)</nobr>
</code></td>
<td><code>undefined</code></td>
<td>Sets the permission of the document.</td>
</tr>
<tr>
<td><code><b>getDocSize</b>()</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the document size.</td>
</tr>
<tr>
<td><code><b>getDocType</b>()</code></td>
<td><code><nobr><a href="#documenttype-values">DocumentTypeValues</a></nobr></code></td>
<td>Returns the document type.</td>
</tr>
<tr>
<td><code><b>getPageSizes</b>()</code></td>
<td><code><nobr>{twips: <a href="#bounds">[Bounds]</a>,<br>
pixels: <a href="#bounds">[Bounds]</a>}</nobr></code></td>
<td>Returns an object describing the size of each page in twips and pixels.</td>
</tr>
<tr>
<td><code><b>scroll</b>(
<nobr>&lt;Number&gt;<i>x</i>,</nobr>
<nobr>&lt;Number&gt;<i>y</i>,</nobr>
<nobr>&lt;<a href="#scroll-options">ScrollOptions</a>&gt;<i>Options</i>)</nobr>
</code></td>
<td><code><nobr>undefined</nobr></code></td>
<td>Scroll right by 'x' and down by 'y' (or left and up if negative).</td>
</tr>
<tr>
<td><code><b>scrollDown</b>(
<nobr>&lt;Number&gt;<i>y</i>,</nobr>
<nobr>&lt;<a href="#scroll-options">ScrollOptions</a>&gt;<i>Options</i>)</nobr>
</code></td>
<td><code><nobr>undefined</nobr></code></td>
<td>Scroll down by 'y' (or up if negative).</td>
</tr>
<tr>
<td><code><b>scrollRight</b>(
<nobr>&lt;Number&gt;<i>x</i>,</nobr>
<nobr>&lt;<a href="#scroll-options">ScrollOptions</a>&gt;<i>Options</i>)</nobr>
</code></td>
<td><code><nobr>undefined</nobr></code></td>
<td>Scroll right by 'x' (or left if negative).</td>
</tr>
<tr>
<td><code><b>scrollTop</b>(
<nobr>&lt;Number&gt;<i>y</i>,</nobr>
<nobr>&lt;<a href="#scroll-options">ScrollOptions</a>&gt;<i>Options</i>)</nobr>
</code></td>
<td><code><nobr>undefined</nobr></code></td>
<td>Scroll to 'y' offset relative to the beginning of the document.</td>
</tr>
<tr>
<td><code><b>scrollLeft</b>(
<nobr>&lt;Number&gt;<i>x</i>,</nobr>
<nobr>&lt;<a href="#scroll-options">ScrollOptions</a>&gt;<i>Options</i>)</nobr>
</code></td>
<td><code><nobr>undefined</nobr></code></td>
<td>Scroll to 'x' offset relative to the beginning of the document.</td>
</tr>
<tr>
<td><code><b>scrollOffset</b>()</code></td>
<td><code><nobr><a href="#point">Point</a></nobr></code></td>
<td>Returns the scroll offset relative to the beginning of the document.</td>
</tr>
<tr>
<td><code><b>getPreview</b>(
&lt;Object&gt;<i>id</i>,<br>
&lt;Number&gt;<i>index</i>,<br>
&lt;Number&gt;<i>maxWidth</i>,<br>
&lt;Number&gt;<i>maxHeight</i>,<br>
<nobr>&lt;<a href="#getpreview-options">PreviewOptions</a>&gt;<i>options?</i>)</nobr>
</code></td>
<td><code>undefined</code></td>
<td>Triggers the creation of a preview with the given id, of maximum maxWidth X maxHeight size, of the
page / part with number 'index', keeping the original ratio.</td>
</tr>
<tr>
<td><code><b>getCustomPreview</b>(
&lt;Object&gt;<i>id</i>,<br>
&lt;Number&gt;<i>part</i>,<br>
&lt;Number&gt;<i>width</i>,<br>
&lt;Number&gt;<i>height</i>,<br>
&lt;Twips&gt;<i>tilePosX</i>,<br>
&lt;Twips&gt;<i>tilePosY</i>,<br>
&lt;Twips&gt;<i>tileWidth</i>,<br>
&lt;Twips&gt;<i>tileHeight</i>,<br>
<nobr>&lt;<a href="#getpreview-options">PreviewOptions</a>&gt;<i>options?</i>)</nobr>
</code></td>
<td><code>undefined</code></td>
<td>Triggers the creation of a preview with the given id, of width X height size, of the
[(tilePosX,tilePosY), (tilePosX + tileWidth, tilePosY + tileHeight)] section of the document.</td>
</tr>
<tr>
<td><code><b>removePreviewUpdate</b>(
<nobr>&lt;Object&gt;<i>id</i>)</nobr>
</code></td>
<td><code>undfined</code></td>
<td>Cancels the automatic update for the preview defined by 'id'.</td>
</tr>
<tr>
<td><code><b>fitWidthZoom</b>(
<nobr>&lt;Number&gt;<i>maxZoom</i>)</nobr>
</code></td>
<td><code>undfined</code></td>
<td>Zooms in or out so that the document's width fits the viewing area. The document will not zoom in more
than `maxZoom` if the parameter is provided.</td>
</tr>
</table>
<h3 id="scroll-options">ScrollOptions</h3>
<table data-id='values'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>update</b></code></td>
<td><code>Boolean</code></td>
<td>Whether the <a href="#updatescrolloffset-event">update-scroll-offset</a> event is fired.</td>
</tr>
</table>
<h3 id="getpreview-options">PreviewOptions</h3>
<table data-id='values'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>autoUpdate</b></code></td>
<td><code>Boolean</code></td>
<td>Whether a new preview is generated automatically when it becomes
invalid.</td>
</tr>
<tr>
<td><code><b>broadcast</b></code></td>
<td><code>Boolean</code></td>
<td>Whether new preview should be broadcasted to other clients of same
document.</td>
</tr>
</table>
<h2 id="loleaflet-toolbar">Toolbar</h2>
<p>Toolbar methods.</p>
<table data-id='map'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>getToolbarCommandValues</b>(
<nobr>&lt;<a href="#toolbarcommand-values">ToolbarCommandValues</a>&gt; <i>unoCommand</i>)</nobr>
</code></td>
<td><code>Object</code></td>
<td>Returns a JSON mapping of the possible values.</td>
</tr>
<tr>
<td><code><b>toggleCommandState</b>(
<nobr>&lt;<a href="#commandstatechanged-values">CommandValues</a>&gt; <i>unoCommand</i>)</nobr>
</code></td>
<td><code>undefined</code></td>
<td>Toggles the state for the given UNO command.</td>
</tr>
<tr>
<td><code><b>saveAs</b>(
<nobr>&lt;String&gt;<i>url</i>,</nobr>
<nobr>&lt;String&gt;<i>format?</i>,</nobr>
<nobr>&lt;String&gt;<i>options?</i>)</nobr>
</code></td>
<td><code>undefined</code></td>
<td>Save the document as "format" at the given URL by applying the filter options.</td>
</tr>
<tr>
<td><code><b>downloadAs</b>(
<nobr>&lt;String&gt;<i>name</i>,</nobr>
<nobr>&lt;String&gt;<i>format?</i>,</nobr>
<nobr>&lt;String&gt;<i>options?</i>)</nobr>
</code></td>
<td><code>undefined</code></td>
<td>Download the document as "format" with the name "name" by applying the filter options.</td>
</tr>
<tr>
<td><code><b>print</b>()</code></td>
<td><code>undefined</code></td>
<td>Opens the browser's print dialog or prompts the user to download a PDF version of the document.</td>
</tr>
<tr>
<td><code><b>cellEnterString</b>(
<nobr>&lt;String&gt;<i>formula</i>)</nobr></code></td>
<td><code>undefined</code></td>
<td>Enters a string of text in the selected cell.</td>
</tr>
<tr>
<td><code><b>insertFile</b>(
<nobr>&lt;File&gt;<i>file</i>)</nobr></code></td>
<td><code>undefined</code></td>
<td>Insert a file (graphic) in the document.</td>
</tr>
<tr>
<td><code><b>applyFont</b>(
<nobr>&lt;String&gt;<i>fontName</i>)</nobr></code></td>
<td><code>undefined</code></td>
<td>Applies a font.</td>
</tr>
<tr>
<td><code><b>applyFontSize</b>(
<nobr>&lt;Number&gt;<i>fontSize</i>)</nobr></code></td>
<td><code>undefined</code></td>
<td>Applies a font size.</td>
</tr>
<tr>
<td><code><b>applyStyle</b>(
<nobr>&lt;String&gt;<i>style</i>,</nobr>
<nobr>&lt;String&gt;<i>styleFamily</i>)</nobr></code></td>
<td><code>undefined</code></td>
<td>Applies a style from a style family.</td>
</tr>
<tr>
<td><code><b>renderFont</b>(
<nobr>&lt;String&gt;<i>fontName</i>)</nobr></code></td>
<td><code>undefined</code></td>
<td>Renders the given font in the smallest rectangle it can fit in.</td>
</tr>
<tr>
<td><code><b>sendUnoCommand</b>(
<nobr>&lt;<a href="#loleaflet-uno-commands">String</a>&gt; <i>unoCommand</i>,</nobr>
<nobr>&lt;<a href="#loleaflet-uno-commands">Object</a>&gt; <i>param</i>)</nobr></code></td>
<td><code>undefined</code></td>
<td>Sends a <a href="#loleaflet-uno-commands">uno command</a> with the given parameter to LOKit.</td>
</tr>
</table>
<h2 id="loleaflet-page">Page oriented</h2>
<p>Methods for page oriented documents.</p>
<table data-id='map'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>getCurrentPageNumber</b>()</code></td>
<td><code>Number</code></td>
<td>Number of the current page.</td>
</tr>
<tr>
<td><code><b>getNumberOfPages</b>()</code></td>
<td><code>Number</code></td>
<td>Total number of pages.</td>
</tr>
<tr>
<td><code><b>goToPage</b>(
<nobr>&lt;Number&gt;<i>pageNumber</i>)</nobr>
</code></td>
<td><code>undfined</code></td>
<td>Scrolls to the beginning of the given page.</td>
</tr>
</table>
<h2 id="loleaflet-part">Part oriented</h2>
<p>Methods for page oriented documents.</p>
<table data-id='map'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>getCurrentPartNumber</b>()</code></td>
<td><code>Number</code></td>
<td>Number of the current part.</td>
</tr>
<tr>
<td><code><b>getNumberOfParts</b>()</code></td>
<td><code>Number</code></td>
<td>Total number of parts.</td>
</tr>
<tr>
<td><code><b>setPart</b>(
<nobr>&lt;Number&gt;<i>partNumber</i>)</nobr>
</code></td>
<td><code>undfined</code></td>
<td>Select a specific part.</td>
</tr>
</table>
<h2 id="loleaflet-events">Events</h2>
<p>You can subscribe to the following events using <a href="#events">these methods</a>.</p>
<table data-id='map'>
<tr>
<th>Event</th>
<th>Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>cellformula</b></code></td>
<td><code><a href="#cellformula-event">CellFormulaEvent</a></code></td>
<td>Fired when the content of the selected cell changes.</td>
</tr>
<tr>
<td><code><b>commandresult</b></code></td>
<td><code><a href="#commandresult-event">CommandResultEvent</a></code></td>
<td>Fired when a dispatched uno command or the 'saveas' command has finished.</td>
</tr>
<tr>
<td><code><b>commandstatechanged</b></code></td>
<td><code><a href="#commandstatechanged-event">CommandStateChangedEvent</a></code></td>
<td>Fired when the state of a command such as .uno:Bold changes.</td>
</tr>
<tr>
<td><code><b>locontextmenu</b></code></td>
<td><code><a href="#locontextmenu-event">LOContextMenuEvent</a></code></td>
<td>Fired when the user's action invoked a context menu (via a
right-click). It contains the structure of the menu.</td>
</tr>
<tr>
<td><code><b>docsize</b></code></td>
<td><code><a href="#docsize-event">DocumentSizeEvent</a></code></td>
<td>Fired when the document size changes.</td>
</tr>
<tr>
<td><code><b>error</b></code></td>
<td><code><a href="#error-event">ErrorEvent</a></code></td>
<td>Fired on server or client error.</td>
</tr>
<tr>
<td><code><b>hyperlinkclicked</b></code></td>
<td><code><a href="#hyperlinkclicked-event">HyperlinkClickedEvent</a></code></td>
<td>Fired when the user clicks a hyperlink in the document.</td>
</tr>
<tr>
<td><code><b>pagenumberchanged</b></code></td>
<td><code><a href="#pagenumberchanged-event">PageNumberChangedEvent</a></code></td>
<td>Fired when the number of pages changes.</td>
</tr>
<tr>
<td><code><b>print</b></code></td>
<td><code><a href="#print-event">PrintEvent</a></code></td>
<td>Fired when the URL for the PDF export is ready.</td>
</tr>
<tr>
<td><code><b>renderfont</b></code></td>
<td><code><a href="#renderfont-event">RenderFontEvent</a></code></td>
<td>Fired when the font rendering is ready.</td>
</tr>
<tr>
<td><code><b>search</b></code></td>
<td><code><a href="#search-event">SearchEvent</a></code></td>
<td>Fired when the search result is ready.</td>
</tr>
<tr>
<td><code><b>scrollby</b></code></td>
<td><code><a href="#scrollby-event">ScrollByEvent</a></code></td>
<td>Fired when the document is panned with the keyboard.</td>
</tr>
<tr>
<td><code><b>scrollto</b></code></td>
<td><code><a href="#scrollto-event">ScrollToEvent</a></code></td>
<td>Fired when the cursor goes out of the viewing area.</td>
</tr>
<tr>
<td><code><b>statusindicator</b></code></td>
<td><code><a href="#statusindicator-event">StatusIndicator</a></code></td>
<td>Fired when leaflet is initialized, during document loading or on reconnection.</td>
</tr>
<tr>
<td><code><b>tilepreview</b></code></td>
<td><code><a href="#tilepreview-event">TilePreviewEvent</a></code></td>
<td>Fired when the rendering of a requested preview is ready.</td>
</tr>
<tr>
<td><code><b>updateparts</b></code></td>
<td><code><a href="#updateparts-event">UpdatePartsEvent</a></code></td>
<td>Fired when a new part has been selected.</td>
</tr>
<tr>
<td><code><b>updatepermission</b></code></td>
<td><code><a href="#permission-event">PermissionEvent</a></code></td>
<td>Fired when the document permission changes.</td>
</tr>
<tr>
<td><code><b>updatescrolloffset</b></code></td>
<td><code><a href="#updatescrolloffset-event">UpdateScrollOffsetEvent</a></code></td>
<td>Fired when the document is panned and the scrollbars should be moved along with the document.</td>
</tr>
<tr>
<td><code><b>updatetoolbarcommandvalues</b></code></td>
<td><code><a href="#updatetoolbarcommandvalues-event">UpdateToolbarCommandValuesEvent</a></code></td>
<td>Fired when the document is loaded and contains the available command values for Font, FontSize, Style, etc.</td>
</tr>
</table>
<h3 id="cellformula-event">CellFormulaEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>formula</b></code></td>
<td><code>String</code></td>
<td>The formula from the selected cell.</td>
</tr>
</table>
<h3 id="commandresult-event">CommandResult</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>commandName</b></code></td>
<td><code><a href="#commandstatechanged-values">CommandStateChangedValues</a></code></td>
<td>UNO command or 'saveas'.</td>
</tr>
<tr>
<td><code><b>success</b></code></td>
<td><code>Boolean or undefined</code></td>
<td>Returns the status code of the command execution, or
undefined if the result is not provided, and the command
only indicates that the operation has finished.</td>
</tr>
</table>
<h3 id="commandstatechanged-event">CommandStateChangedEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>commandName</b></code></td>
<td><code><a href="#commandstatechanged-values">CommandStateChangedValues</a></code></td>
<td>UNO command.</td>
</tr>
<tr>
<td><code><b>state</b></code></td>
<td><code><a href="#commandstate-values">CommandStateValues</a></code></td>
<td>UNO command state.</td>
</tr>
</table>
<h3 id="locontextmenu-event">LOContextMenuEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>menu</b></code></td>
<td><code>String</code></td>
<td>List of the menu entries. The structure looks like:<br/>
<code>
{ "text": "label text1", "type": "command", "command": ".uno:Something1", "enabled": "true" },
{ "text": "label text2", "type": "command", "command": ".uno:Something2", "enabled": "false" },
{ "type": "separator" },
{ "text": "label text2", "type": "menu", "menu": [ { ... }, { ... }, ... ] },
...
</code>
</td>
</tr>
</table>
<h3 id="docsize-event">DocumentSizeEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>x</b></code></td>
<td><code>Number</code></td>
<td>Document width in pixels.</td>
</tr>
<tr>
<td><code><b>y</b></code></td>
<td><code>Number</code></td>
<td>Document height in pixels.</td>
</tr>
</table>
<h3 id="error-event">ErrorEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>id</b></code></td>
<td><code>Number</code></td>
<td>Identificator of the error that can be used as indication
of error message to present to the user.</td>
</tr>
<tr>
<td><code><b>msg</b></code></td>
<td><code>String</code></td>
<td>If present, the error message.</td>
</tr>
<tr>
<td><code><b>cmd</b></code></td>
<td><code>String</code></td>
<td>If present, the server command that caused the error.</td>
</tr>
<tr>
<td><code><b>kind</b></code></td>
<td><code>String</code></td>
<td>If present, the kind of error associated with the command.</td>
</tr>
</table>
The <code>id</code> property of ErrorEvent can have the following values:
<table data-id='events'>
<tr>
<th>value</th>
<th>description</th>
</tr>
<tr>
<td><code><b>1</b></code></td>
<td>Internal error. Things still may work to some extent, but
the session becomes unreliable.</td>
</tr>
<tr>
<td><code><b>2</b></code></td>
<td>Document couldn't be loaded.</td>
</tr>
<tr>
<td><code><b>3</b></code></td>
<td>Socket connection error.</td>
</tr>
<tr>
<td><code><b>4</b></code></td>
<td>Socket connection was closed.</td>
</tr>
<tr>
<td><code><b>5</b></code></td>
<td>Document couldn't be saved.</td>
</tr>
</table>
<h3 id="hyperlinkclicked-event">HyperlinkClickedEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>url</b></code></td>
<td><code>String</code></td>
<td>Target URL of the hyperlink that the user clicked in the
document.</td>
</tr>
</table>
<h3 id="pagenumberchanged-event">PageNumberChangedEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>currentPage</b></code></td>
<td><code>Number</code></td>
<td>The current page in the document.</td>
</tr>
<tr>
<td><code><b>pages</b></code></td>
<td><code>Number</code></td>
<td>The number of pages.</td>
</tr>
<tr>
<td><code><b>docType</b></code></td>
<td><code><a href="#documenttype-values">DocumentTypeValues</a></code></td>
<td>The document type.</td>
</tr>
</table>
<h3 id="print-event">PrintEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>url</b></code></td>
<td><code>String</code></td>
<td>An URL for the PDF exported document.</td>
</tr>
</table>
<h3 id="renderfont-event">RenderFontEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>font</b></code></td>
<td><code>String</code></td>
<td>Font name.</td>
</tr>
<tr>
<td><code><b>img</b></code></td>
<td><code>String</code></td>
<td>The image data URL.</td>
</tr>
</table>
<h3 id="search-event">SearchEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>originalPhrase</b></code></td>
<td><code>String</code></td>
<td>The phrase that has been searched for</td>
</tr>
<tr>
<td><code><b>count</b></code></td>
<td><code>Number</code></td>
<td>Number of search results</td>
</tr>
<tr>
<td><code><b>results</b></code></td>
<td><code><a href="#search-result">SearchResult[]</a></code></td>
<td>An array representing the selections of the search results in the document.</td>
</tr>
</table>
<h3 id="scrollby-event">ScrollByEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>x</b></code></td>
<td><code>Number</code></td>
<td>Scroll right by x pixels, or left if negative.</td>
</tr>
<tr>
<td><code><b>y</b></code></td>
<td><code>Number</code></td>
<td>Scroll down by y pixels, or up if negative.</td>
</tr>
</table>
<h3 id="scrollto-event">ScrollToEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>x</b></code></td>
<td><code>Number</code></td>
<td>View's left border position in pixels.</td>
</tr>
<tr>
<td><code><b>y</b></code></td>
<td><code>Number</code></td>
<td>View's top border position in pixels.</td>
</tr>
</table>
<h3 id="statusindicator-event">StatusIndicatorEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>statusType</b></code></td>
<td><code><a href="#statusindicator-values">StatusIndicatorValues</a></code></td>
<td>Status type.</td>
</tr>
<tr>
<td><code><b>value</b></code></td>
<td><code>Number</code></td>
<td>If present, a number for 0 to 100 representing the loading status.</td>
</tr>
</table>
<h3 id="tilepreview-event">TilePreviewEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>tile</b></code></td>
<td><code>Image</code></td>
<td>The actual preview.</td>
</tr>
<tr>
<td><code><b>id</b></code></td>
<td><code>Object</code></td>
<td>Preview id.</td>
</tr>
<tr>
<td><code><b>width</b></code></td>
<td><code>Number</code></td>
<td>Image width.</td>
</tr>
<tr>
<td><code><b>height</b></code></td>
<td><code>Number</code></td>
<td>Image height.</td>
</tr>
<tr>
<td><code><b>docType</b></code></td>
<td><code><a href="#documenttype-values">DocumentTypeValues</a></code></td>
<td>The document type.</td>
</tr>
<tr>
<td><code><b>part</b></code></td>
<td><code>Number</code></td>
<td>If the preview is for a whole part.</td>
</tr>
</table>
<h3 id="updateparts-event">UpdatePartsEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>selectedPart</b></code></td>
<td><code>Number</code></td>
<td>The currently selected part.</td>
</tr>
<tr>
<td><code><b>parts</b></code></td>
<td><code>Number</code></td>
<td>The number of parts in the document.</td>
</tr>
<tr>
<td><code><b>docType</b></code></td>
<td><code><a href="#documenttype-values">DocumentTypeValues</a></code></td>
<td>The document type.</td>
</tr>
<tr>
<td><code><b>partNames</b></code></td>
<td><code>String[]</code></td>
<td>If present, an array containing slides' / spreadsheets' names.</td>
</tr>
</table>
<h3 id="permission-event">PermissionEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>perm</b></code></td>
<td><code><a href="#documentpermission-values">DocumentPermission</a></code></td>
<td>Document permission.</td>
</tr>
</table>
<h3 id="updatescrolloffset-event">UpdateScrollOffsetEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>x</b></code></td>
<td><code>Number</code></td>
<td>Difference in pixels between the document's left border and view's left border.</td>
</tr>
<tr>
<td><code><b>y</b></code></td>
<td><code>Number</code></td>
<td>Difference in pixels between the document's top border and view's top border.</td>
</tr>
</table>
<h3 id="updatetoolbarcommandvalues-event">UpdateToolbarCommandValuesEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>commandName</b></code></td>
<td><code><a href="#toolbarcommand-values">ToolbarCommandValues</a></code></td>
<td>UNO command.</td>
</tr>
<tr>
<td><code><b>commandValues</b></code></td>
<td><code>Object</code></td>
<td>JSON mapping of the possible values.</td>
</tr>
</table>
<h2 id="loleaflet-object-values">Object values</h2>
<p>A list of possible values for different event object properties.</p>
<h3 id="search-result">SearchResult</h3>
<table data-id='values'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>part</b></code></td>
<td><code>Number</code></td>
<td>The part in which the selection lies.</td>
</tr>
<tr>
<td><code><b>rectangles</b></code></td>
<td><code><a href="#bounds">Bounds[]</a></code></td>
<td>Selection bounds in pixels.</td>
</tr>
</table>
<h3 id="documentpermission-values">DocumentPermissionValues</h3>
<table data-id='values'>
<tr>
<th class="width100">value</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>'edit'</b></code></td>
<td><code>String</code></td>
<td>The document can be edited, dragging is disabled and mouse selection is active.</td>
</tr>
<tr>
<td><code><b>'view'</b></code></td>
<td><code>String</code></td>
<td>The document is in viewing mode, dragging is enabled by default and by clicking in it, editing mode is entered.</td>
</tr>
<tr>
<td><code><b>'readonly'</b></code></td>
<td><code>String</code></td>
<td>The document is in read-only mode, dragging is enabled by default.</td>
</tr>
</table>
<h3 id="commandstatechanged-values">CommandStateChangedValues</h3>
<table data-id='values'>
<tr>
<th class="width100">value</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>'.uno:Bold'</b></code></td>
<td><code>String</code></td>
<td>Bold.</td>
</tr>
<tr>
<td><code><b>'.uno:Italic'</b></code></td>
<td><code>String</code></td>
<td>Italic.</td>
</tr>
<tr>
<td><code><b>'.uno:Underline'</b></code></td>
<td><code>String</code></td>
<td>Underline.</td>
</tr>
<tr>
<td><code><b>'.uno:Strikeout'</b></code></td>
<td><code>String</code></td>
<td>Strikeout.</td>
</tr>
<tr>
<td><code><b>'.uno:LeftPara'</b></code></td>
<td><code>String</code></td>
<td>Align left.</td>
</tr>
<tr>
<td><code><b>'.uno:CenterPara'</b></code></td>
<td><code>String</code></td>
<td>Center horizontally.</td>
</tr>
<tr>
<td><code><b>'.uno:RightPara'</b></code></td>
<td><code>String</code></td>
<td>Align right.</td>
</tr>
<tr>
<td><code><b>'.uno:JustifyPara'</b></code></td>
<td><code>String</code></td>
<td>Justified.</td>
</tr>
<tr>
<td><code><b>'.uno:IncrementIndent'</b></code></td>
<td><code>String</code></td>
<td>Increment indent.</td>
</tr>
<tr>
<td><code><b>'.uno:DecrementIndent'</b></code></td>
<td><code>String</code></td>
<td>Decrement indent.</td>
</tr>
<tr>
<td><code><b>'.uno:StyleApply'</b></code></td>
<td><code>String</code></td>
<td>Style related uno command.</td>
</tr>
<tr>
<td><code><b>'.uno:CharFontName'</b></code></td>
<td><code>String</code></td>
<td>Font related uno command.</td>
</tr>
<tr>
<td><code><b>'.uno:FontHeight'</b></code></td>
<td><code>String</code></td>
<td>Font size related uno command.</td>
</tr>
<tr>
<td><code><b>'.uno:ModifiedStatus'</b></code></td>
<td><code>String</code></td>
<td>If the document is now marked as modified. The value is
'true' when the document is marked as modified, and
'false' the user e.g. undoes all the changes or
saves the document.</td>
</tr>
</table>
<h3 id="commandstate-values">CommandStateValues</h3>
<table data-id='values'>
<tr>
<th class="width100">value</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>'true'</b></code></td>
<td><code>String</code></td>
<td>For '.uno:Bold', '.uno:Italic', etc.</td>
</tr>
<tr>
<td><code><b>'false'</b></code></td>
<td><code>String</code></td>
<td>For '.uno:Bold', '.uno:Italic', etc.</td>
</tr>
<tr>
<td><code><b>styleName</b></code></td>
<td><code>String</code></td>
<td>For '.uno:StyleApply'.</td>
</tr>
<tr>
<td><code><b>fontName</b></code></td>
<td><code>String</code></td>
<td>For '.uno:CharFontName'.</td>
</tr>
<tr>
<td><code><b>fontSize</b></code></td>
<td><code>String</code></td>
<td>For '.uno:FontHeight'.</td>
</tr>
</table>
<h3 id="documenttype-values">DocumentTypeValues</h3>
<table data-id='values'>
<tr>
<th class="width100">value</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>'text'</b></code></td>
<td><code>String</code></td>
<td>Text document, usually handled by Writer.</td>
</tr>
<tr>
<td><code><b>'presentation'</b></code></td>
<td><code>String</code></td>
<td>Text document, usually handled by Impress.</td>
</tr>
<tr>
<td><code><b>'spreadsheet'</b></code></td>
<td><code>String</code></td>
<td>Text document, usually handled by Calc.</td>
</tr>
<tr>
<td><code><b>'drawing'</b></code></td>
<td><code>String</code></td>
<td>Text document, usually handled by Draw.</td>
</tr>
<tr>
<td><code><b>'other'</b></code></td>
<td><code>String</code></td>
<td>Other document type.</td>
</tr>
</table>
<h3 id="statusindicator-values">StatusIndicatorValues</h3>
<table data-id='values'>
<tr>
<th class="width100">value</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>'start'</b></code></td>
<td><code>String</code></td>
<td>Fired when the progress broadcast is being started.</td>
</tr>
<tr>
<td><code><b>'setvalue'</b></code></td>
<td><code>String</code></td>
<td>Set a value between 0 and 100.</td>
</tr>
<tr>
<td><code><b>'finish'</b></code></td>
<td><code>String</code></td>
<td>The progress is at 100%.</td>
</tr>
<tr>
<td><code><b>'loleafletloaded'</b></code></td>
<td><code>String</code></td>
<td>Fired when the code has been initialized.</td>
</tr>
<tr>
<td><code><b>'alltilesloaded'</b></code></td>
<td><code>String</code></td>
<td>Fired when all empty tiles have been loaded (fired several times).</td>
</tr>
<tr>
<td><code><b>'initializationcomplete'</b></code></td>
<td><code>String</code></td>
<td>Fired when everything that is needed for operating on the
document is ready: this._docLayer is defined,
statusindicatorfinish was received, .uno:StyleApply was
received, .uno:CharFontName was received, and
updatepermission was received.</td>
</tr>
</table>
<h3 id="toolbarcommand-values">ToolbarCommandValues</h3>
<table data-id='values'>
<tr>
<th class="width100">value</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>'.uno:StyleApply'</b></code></td>
<td><code>String</code></td>
<td>Style related uno command.</td>
</tr>
<tr>
<td><code><b>'.uno:CharFontName'</b></code></td>
<td><code>String</code></td>
<td>Font related uno command.</td>
</tr>
</table>
<h2 id="loleaflet-uno-commands">Object values</h2>
<p>A list of common uno commands with their additional parameters.</p>
<pre><code class="javascript">map.sendUnoCommand('.uno:Bold')</code></pre>
<pre><code class="javascript">map.sendUnoCommand('.uno:Color',
{
"Color": {
"type": "long",
"value": 16750848
}
})</code></pre>
<table data-id='values' id='uno-commands-table'>
<tr>
<th class="width100">command</th>
<th class="width100">parameter</th>
<th>description</th>
</tr>
</table>
<h2 id="loleaflet-postmessage">PostMessage API</h2>
<p>PostMessage API is used to interact with parent frame when loleaflet is
enclosed in one. This is useful for hosts wanting to
integrate LibreOffice Online in them.</p>
<p>This API is mostly based
on <a href="https://wopi.readthedocs.io/en/latest/scenarios/postmessage.html">WOPI
specification</a> with few extensions/modifications. All messages sent are
in this form :
<pre><code class="javascript">
{
"MessageId": "&lt;MessageId&gt;",
"SendTime": "&lt;Timestamp when message is sent&gt;",
"Values": {
"&lt;key&gt;": "&lt;value&gt;"
}
}
</code></pre>
SendTime is the timestamp returned by browsers' Date.now(). The post messages
sent from the WOPI host should also be in same form.
</p>
<p>It is to be noted that as mentioned in WOPI specs, loleaflet frame will
ignore all post messages coming from the host frame
if <code>Host_PostmessageReady</code> has not been received. Further, since
for embedding LibreOffice Online as an iframe WOPI implementation is a must,
it is required that 'PostMessageOrigin' property is present in
WOPI host's CheckFileInfo response. Otherwise, no post messages will be
emitted.
<br/>
<h3 id="loleaflet-postmessage-initialization">Initialization</h3>
Editor to WOPI host
<table data-id='postmessage-initialization-from-editor'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>App_LoadingStatus</b></code></td>
<td><code>
<nobr>Status: &lt;String&gt;</nobr>
<nobr>DocumentLoadedTime: &lt;Timestamp&gt;</nobr>
<nobr>Features: &lt;Dict&gt;</nobr>
</code></td>
<td>If Status is <i>Frame_Ready</i>, loleaflet frame is loaded and UI
can be shown. <br/>
Accompanying keys: <i>Features</i>: This client's capabilities.
Supported values are: <i>VersionStates</i>. Tells the host that client supports different version states. See <a href="#loleaflet-postmessage-versioning">Version Restore</a> for more details.<br/>
When Status is <i>Document_Loaded</i>, document has been completely
loaded and host can also start using PostMessage API.<br/>
Accompanying keys:
<i>DocumentLoadedTime</i><br/>
When Status is <i>Failed</i>, document hasn't been loaded but host can show the loleaflet frame to present an error for a user.
</td>
</tr>
</table>
WOPI host to editor
<table data-id='postmessage-initialization-to-editor'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>Host_PostmessageReady</b></code></td>
<td><code>
</code></td>
<td>
See WOPI docs for detail.
</td>
</tr>
</table>
<h3 id="loleaflet-postmessage-query">Query</h3>
You can query data from the editor using post message API. All responses are
returned with query's MessageId suffixed with '_Resp' as shown below
<br/><br/>
Getters<br/>
WOPI Host to Editor
<table data-id='postmessage-query-getters'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>Get_Views</b></code></td>
<td><code>
</code></td>
<td>
Queries the editor for currently active views of the document. Response is returned in form of <code>Get_Views_Resp</code>
</td>
</tr>
<tr>
<td><code><b>Get_Export_Formats</b></code></td>
<td><code>
</code></td>
<td>
Queries the editor for all the supported export formats for currently opened document.
</td>
</tr>
</table>
Getters response<br/>
Editor to WOPI host
<table data-id='postmessage-query-getters-resp'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>Get_Views_Resp</b></code></td>
<td><code>
<nobr>ViewId: &lt;Number&gt;</nobr>
<nobr>UserId: &lt;String&gt;</nobr>
<nobr>UserName: &lt;String&gt;</nobr>
<nobr>Color: &lt;Number&gt;</nobr>
<nobr>ReadOnly: &lt;Boolean&gt;</nobr>
<nobr>IsCurrentView: &lt;Boolean&gt;</nobr>
</code></td>
<td>Give details of all current views when queried using <code>Get_Views</code>
</td>
</tr>
<tr>
<td><code><b>Get_Export_Formats_Resp</b></code></td>
<td><code>
<nobr>Label: &lt;String&gt;</nobr>
<nobr>Format: &lt;String&gt;</nobr>
</code></td>
<td>
Response to query <code>Get_Export_Formats</code>.
Label would contain a localised string explaining about the format.
Format is the file extension of the format which is required while requesting
export of the document.
</td>
</tr>
</table>
<h3 id="loleaflet-postmessage-sessions">Session Management</h3>
<h4>WOPI Host to editor</h4>
<table data-id='postmessage-sessions-management'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>Action_RemoveView</b></code></td>
<td><code>
<nobr>ViewId: &lt;Number&gt;</nobr>
</code></td>
<td>Remove the session</code>.
</td>
</tr>
</table>
<h4>Editor to WOPI Host</h4>
<table data-id='postmessage-sessions'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>View_Added</b></code></td>
<td><code>
<nobr>ViewId: &lt;Number&gt;</nobr>
<nobr>UserId: &lt;String&gt;</nobr>
<nobr>UserName: &lt;String&gt;</nobr>
<nobr>Color: &lt;Number&gt;</nobr>
<nobr>ReadOnly: &lt;Boolean&gt;</nobr>
<nobr>Deprecated: true;</nobr>
</code></td>
<td>A new member is added. ViewId is unique integer
identifying a session/view. UserId is user identity. UserName is
display name of the user. Color is RGB color integer
value. ReadOnly tells if the new view is opened as readonly.<br/>
This message is <strong>deprecated</strong>, instead implement just
handling of Views_List which holds the same payload as
<code>Get_Views_Resp</code>.
</td>
</tr>
<tr>
<td><code><b>View_Removed</b></code></td>
<td><code>
<nobr>ViewId: &lt;Number&gt;</nobr>
<nobr>Deprecated: true;</nobr>
</code></td>
<td>View with <code>ViewId</code> has closed the document.<br/>
This message is <strong>deprecated</strong>, instead implement just
handling of Get_Views_Resp and if you need the info which view has
been added / removed, check against the previous state.<br/>
This message is <strong>deprecated</strong>, instead implement just
handling of Views_List which holds the same payload as
<code>Get_Views_Resp</code>.
</td>
</tr>
<tr>
<td><code><b>Views_List</b></code></td>
<td>See <code>Get_Views_Resp</code>.</td>
<td>Complete information about the currently connected views.
</td>
</tr>
</table>
<h3 id="loleaflet-postmessage-actions">Actions</h3>
<h4>WOPI host to editor</h4>
<table data-id='postmessage-actions'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>Action_Save</b></code></td>
<td><code>
<nobr>DontTerminateEdit: &lt;boolean&gt;</nobr>
<nobr>DontSaveIfUnmodified: &lt;boolean&gt;</nobr>
<nobr>Notify: &lt;boolean&gt;</nobr>
<nobr>ExtendedData: &lt;String&gt;</nobr>
</code></td>
<td>Saves the document.<br/>
<code>DontTerminateEdit</code> is relevant for spreadsheets where saving
a document can terminate the edit mode (text cursor dissappearing). Setting this to
true won't terminate the edit mode and can be used to save document without disrupting
user's editing session in spreadsheets.<br/>
<code>DontSaveIfUnmodified</code> prevents loolwsd to save the file back to storage if document is
unmodified (only cursor position changed etc.) but still saved. This can be helpful
to prevent creating unnecessary file revisions.<br/>
<code>Notify</code> when present and set to true notifies the
host when document is saved. See <code>Action_Save_Resp</code>
for details.<br/>
<code>ExtendedData</code> optional data carried over to the WOPI host if provided
in the X-LOOL-WOPI-ExtendedData header. The contents are preserved as-is,
however, care must be taken to avoid using anything that HTTP headers do
not allow, also, special values such as new-line, null character, non-printable
characters, etc. are not allowed. The client can use this to pass multiple values
to the WOPI host which can then act on them.<br/>
</td>
</tr>
<tr>
<td><code><b>Action_SaveAs</b></code></td>
<td><code>
<nobr>Filename: &lt;String&gt;</nobr>
<nobr>Notify: &lt;boolean&gt;</nobr>
</code></td>
<td>Creates copy of the document with given Filename.<br/>
<code>Filename</code> is the requested filename for the new file.<br/>
<code>Notify</code> when present and set to true notifies the
host when document is saved. See <code>Action_Save_Resp</code>
for details.
</td>
</tr>
<tr>
<td><code><b>Action_FollowUser</b></code></td>
<td><code>
<nobr>Follow: &lt;Boolean&gt;</nobr>
<nobr>ViewId: &lt;Number&gt;</nobr>
</code></td>
<td>Turn on or off the follow user feature.<br/>
When <code>Follow</code> is set to true or is not defined enables following the editor, disables following when set to false.<br/>
When <code>Follow</code> is set to true or is not defined <code>ViewId</code> parameter specifies user to follow. When <code>ViewId</code> is not defined, the current editor is followed.<br/>
</td>
</tr>
<tr>
<td><code><b>Action_Close</b></code></td>
<td><code>
</code></td>
<td>
Closes the document.
</td>
</tr>
<tr>
<td><code><b>Action_Print</b></code></td>
<td><code>
</code></td>
<td>
Prints the document.
</td>
</tr>
<tr>
<td><code><b>Action_Export</b></code></td>
<td><code>
<nobr>Format: &lt;String&gt;</nobr>
</code></td>
<td>
Downloads the document in format specified by <code>Format</code>. Format must be from the list returned
in <code>Get_Export_Formats</code>
</td>
</tr>
<tr>
<td><code><b>Action_ShowBusy</b></code></td>
<td><code>
<nobr>Label: &lt;String&gt;</nobr>
</code></td>
<td>
Shows an in-progress overlay, just like what appears when saving
the doument, with the given Label.
</td>
</tr>
<tr>
<td><code><b>Action_HideBusy</b></code></td>
<td/>
<td>
Hides any in-progress overlay, if present.
</td>
</tr>
</table>
<h4>WOPI editor to host (Response)</h4>
<table data-id='postmessage-actions-response'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>Action_Save_Resp</b></code></td>
<td><code>
<nobr>success: &lt;boolean&gt;</nobr>
<nobr>result: &lt;string&gt;</nobr>
</code></td>
<td>Acknowledgement when save finishes.<br/>
<code>success</code> tells if LOOL was able to save the document
successfully. When this is false, then another
parameter, <code>result</code> is present which contains the
reason that document was not saved.
In case, document was not saved because it was not modified,
then this parameter contains the string 'unmodified'. In this
case, WOPI hosts can be sure that there are no changes pending
in the document to be saved to the storage.
This response is only emitted if <code>Notify</code> parameter
is mentioned by <code>Action_Save</code> PostMessage API.
</td>
</tr>
<tr>
<td><code><b>FollowUser_Changed</b></code></td>
<td><code>
<nobr>FollowedViewId: &lt;Number&gt;</nobr>
<nobr>IsFollowUser: &lt;Boolean&gt;</nobr>
<nobr>IsFollowEditor: &lt;Boolean&gt;</nobr>
</code></td>
<td>Notification about current following state.<br/>
<code>FollowedViewId</code> tells which user is followed. <code>IsFollowUser</code> determines if following the specific user is
activated. <code>IsFollowEditor</code> determines if following the editor is
activated. If both <code>IsFollowUser</code> & <code>IsFollowEditor</code> are false then following is
inactive.
</td>
</tr>
</table>
<h3 id="loleaflet-postmessage-versioning">Version Restore</h3>
<h4>WOPI host to editor</h4>
<table data-id="postmessage-versioning-to-editor">
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>Host_VersionRestore</b></code></td>
<td><code>
<nobr>Status: &lt;string&gt;</nobr>
</code></td>
<td>
Only possible value of Status (for now) is <code>Pre_Restore</code>.
This message is sent by the host <b>before</b> actually restoring the document
and <b>after</b> user showed the intent to restore the document. This is so such
that if there are any unsaved changes, Online can save them to storage before
document is restored.
</td>
</tr>
</table>
<h4>Editor to WOPI host</h4>
<table data-id="postmessage-versioning-to-host">
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>App_VersionRestore</b></code></td>
<td><code>
<nobr>Status: &lt;string&gt;</nobr>
</code></td>
<td>
This is the reply for the Host_VersionRestore message. Possible values for <code>Status</code>
(for now) is: <code>Pre_Restore_Ack</code>. It means that host can go ahead with restoring the
document to an earlier revision.
</td>
</tr>
</table>
<h5>Note</h5>
<p>These messages are only emitted if <i>App_LoadingStatus</i> contains <i>VersionStates</i> in <i>Features</i>. Otherwise, host can immediately restore the version to earlier revision.</p>
<h3 id='loleaflet-postmessage-misc'>Miscellaneous</h3>
<h4>WOPI host to editor</h4>
<table data-id='postmessage-misc-to-editor'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>Insert_Button</b></code></td>
<td><code>
<nobr>id: &lt;string&gt;</nobr><br/>
<nobr>imgurl: &lt;string&gt;</nobr><br/>
<nobr>hint: &lt;string&gt;</nobr><br/>
<nobr>mobile: &lt;boolean&gt;</nobr><br/>
<nobr>label: &lt;string&gt;</nobr><br/>
<nobr>insertBefore: &lt;string&gt;</nobr><br/>
<nobr>unoCommand: &lt;string&gt;</nobr><br/>
</code></td>
<td>
Inserts a button to the top toolbar.
It responds with <code>Clicked_Button</code> post message event
on which hosts can react accordingly
(except when the <code>unoCommand</code> property is set).<br/>
<code>id</code> parameter is a unique id of the toolbar
button. It is recommended to prefix such ids given here with
some host namespace so that it doesn't conflict with existing
toolbar IDs. In case of conflict, button is not added.<br/>
<code>imgurl</code> parameter is the link to the image that
will be set as button image in the toolbar. The ideal size of
the image is 24x24px. The image must be hosted on the host URL
to not violate Content-Security-Policy.<br/>
<code>hint</code> This is used as a tooltip of the
button.<br/>
<code>mobile</code> Whether the button should be shown when
the interface switches to mobile mode.<br/>
<code>label</code> When a readonly document is opened, we
don't have the toolbar at all. In this case, this newly added
button is present in file menubar. The text against this label
is used as text of the menubar item.<br/>
<code>insertBefore</code> Specify the position where the button
should be inserted.
<code>insertBefore</code> is the button ID (see <a href="#toolbar-button-ids">Finding toolbar button IDs</a>).
<code>unoCommand</code> UNO Command to be executed on button click
(<a href="https://wiki.documentfoundation.org/Development/DispatchCommands">Reference</a>). When this property
is set, no 'Clicked_Button' response is sent. The button click will be handled by LibreOffice.
</td>
</tr>
<tr>
<td><code><b>Hide_Button</b></code></td>
<td>
<code><nobr>id: &lt;string&gt;</nobr></code>
</td>
<td>
Hides a button from the toolbar.<br/>
<code>id</code> is the button ID (see <a href="#toolbar-button-ids">Finding toolbar button IDs</a>).
</td>
</tr>
<tr>
<td><code><b>Show_Button</b></code></td>
<td>
<code><nobr>id: &lt;string&gt;</nobr></code>
</td>
<td>
Hides a button from the toolbar.<br/>
<code>id</code> is the button ID (see <a href="#toolbar-button-ids">Finding toolbar button IDs</a>).
</td>
</tr>
<tr>
<td><code><b>Remove_Button</b></code></td>
<td>
<code><nobr>id: &lt;string&gt;</nobr></code>
</td>
<td>
Removes a button from the toolbar.<br/>
<code>id</code> is the button ID (see <a href="#toolbar-button-ids">Finding toolbar button IDs</a>).
</td>
</tr>
<tr>
<td><code><b>Remove_Statusbar_Element</b></code></td>
<td>
<code><nobr>id: &lt;string&gt;</nobr></code>
</td>
<td>
Removes an element from the statusbar.<br/>
<code>id</code> is the element ID (see <a href="#statusbar-element-ids">Finding statusbar element IDs</a>).
</td>
</tr>
<tr>
<td><code><b>Hide_Menubar</b></code></td>
<td></td>
<td>
Hides the menu bar.
</td>
</tr>
<tr>
<td><code><b>Show_Menubar</b></code></td>
<td></td>
<td>
Shows the menu bar.
</td>
</tr>
<tr>
<td><code><b>Grab_Focus</b></code></td>
<td></td>
<td>
This restores focus to the application, activating it, and removing any overlay
indicating quiescence, and re-connecting to the server if necessary. Useful after leaving
the application for a lengthy period, or when wanting to restore browser focus after
presenting an overlayed dialog.
</td>
</tr>
<td><code><b>Hide_Ruler</b></code></td>
<td></td>
<td>
Hides the horizontal document ruler (Writer only)
</td>
</tr>
<tr>
<td><code><b>Show_Ruler</b></code></td>
<td></td>
<td>
Shows the horizontal document ruler (Writer only)
</td>
</tr>
<tr>
<td><code><b>Hide_Button</b></code></td>
<td>
<code><nobr>id: &lt;string&gt;</nobr></code>
</td>
<td>
Hides a button from the toolbar.<br/>
<code>id</code> is the button ID as defined in the
<a href="https://opengrok.libreoffice.org/search?project=online&q=&defs=createToolbar">createToolbar</a>
function in <a href="https://opengrok.libreoffice.org/xref/online/loleaflet/js/toolbar.js">loleaflet/js/toolbar.js</a>.
</td>
</tr>
<tr>
<td><code><b>Show_Button</b></code></td>
<td>
<code><nobr>id: &lt;string&gt;</nobr></code>
</td>
<td>
Shows a button from the toolbar.<br/>
<code>id</code> is the button ID as defined in the
<a href="https://opengrok.libreoffice.org/search?project=online&q=&defs=createToolbar">createToolbar</a>
function in <a href="https://opengrok.libreoffice.org/xref/online/loleaflet/js/toolbar.js">loleaflet/js/toolbar.js</a>.
</td>
</tr>
<tr>
<td><code><b>Hide_Menu_Item</b></code></td>
<td>
<code><nobr>id: &lt;string&gt;</nobr></code>
</td>
<td>
Hides an item from the menu.<br/>
<code>id</code> is the item ID as defined in the
<a href="https://opengrok.libreoffice.org/xref/online/loleaflet/src/control/Control.Menubar.js">loleaflet/src/control/Control.Menubar.js</a>.
</td>
</tr>
<tr>
<td><code><b>Show_Menu_Item</b></code></td>
<td>
<code><nobr>id: &lt;string&gt;</nobr></code>
</td>
<td>
Shows an item from the menu.<br/>
<code>id</code> is the item ID as defined in the
<a href="https://opengrok.libreoffice.org/xref/online/loleaflet/src/control/Control.Menubar.js">loleaflet/src/control/Control.Menubar.js</a>.
</td>
</tr>
<tr>
<td><code><b>Disable_Default_UIAction</b></code></td>
<td>
<code><nobr>action: &lt;string&gt;</nobr></code>
<code><nobr>disable: &lt;Boolean&gt;</nobr></code>
</td>
<td>
Disable the default handler and action for a UI command.<br/>
<code>action</code> is the action name to enable/disable the
default action for.<br/>
<code>disable</code> controls whether to disable (true) or
enable (false) the default action.<br/>
When set to true, the given UI command will only issue a postMessage
without invoking the default action, leaving it up to the client
to intercept the postMessage event and handle as necessary.
Notice that some actions do not have any default handler to
begin with (such as UI_SaveAs and UI_Share) and therefore this
will have no effect on them; they only issue postMessage notification
anyway without taking any action beyond that.<br/>
For example, UI_Save will be issued for invoking the save
command (from the menu, toolbar, or keyboard shortcut) and no
action will take place if 'UI_Save' is disabled via
the Disable_Default_UIAction command. Clients who disable
UI_Save should then issue Action_Save themselves, when and
if they desire to save the document.
Similarly, when disabling UI_Close, the document will not
close upon invoking the UI_Close action, instead a postMessage
notification will be issued and it will be up to the client
to issue Action_Close when they desire.<br/>
Clients must be careful not to issue duplicate actions when
the default handler is enabled, instead, they should only
issue actions themselves when the default is disabled.
Note: currently only UI_Save and UI_Close are supported.<br/>
</td>
</tr>
</table>
<h5><a name="toolbar-button-ids">Finding toolbar button IDs</a></h5>
<p>Toolbar button IDs are defined in the <a href="https://opengrok.libreoffice.org/search?project=online&q=&defs=createToolbar">createToolbar</a>
function in <a href="https://opengrok.libreoffice.org/xref/online/loleaflet/src/control/Control.Toolbar.js">Control.Toolbar.js</a>.
Note that they usually don't change but there is no guarantee that they are stable.</p>
<h5><a name="statusbar-element-ids">Finding statusbar element IDs</a></h5>
<p>Statusbar button IDs are defined in the <a href="https://opengrok.libreoffice.org/search?project=online&q=&defs=onDocLayerInit">onDocLayerInit</a>
function in <a href="https://opengrok.libreoffice.org/xref/online/loleaflet/src/control/Control.Toolbar.js">Control.Toolbar.js</a>.
Note that they usually don't change but there is no guarantee that they are stable.</p>
<h4>Editor to WOPI host</h4>
<table data-id='postmessage-misc-to-host'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>Clicked_Button</b></code></td>
<td><code>
<nobr>id: &lt;string&gt;</nobr>
</code></td>
<td>
This event is emitted when the custom button added
via <code>Insert_Button</code> API above is clicked.
</td>
</tr>
<tr>
<td><code><b>Download_As</b></code></td>
<td><code>
<nobr>Type: 'print'|'slideshow'|'export'</nobr><br/>
<nobr>URL: &lt;string&gt;</nobr><br/>
</code></td>
<td>
This event is emitted when the user chooses 'Print' or 'Show
slideshow' or 'Download As [some type'] and the integration
indicates via DownloadAsPostMessage in the CheckFileInfo that it
wants to handle the downloading of pdf for printing or svg for
slideshows or experted document.
This is in situations when the integration cannot rely on browser's
support for downloading like in mobile apps that use the Online in
a WebView.
</td>
</tr>
<tr>
<td><code><b>UI_CreateFile</b></code></td>
<td></td>
<td>
Requests WOPI host to open a new browser tab and create a new
document. The document type is passed as DocumentType
argument, and cand be 'text', 'spreadsheet', 'presentation' or
'drawing'.
</td>
</tr>
<tr>
<td><code><b>UI_SaveAs</b></code></td>
<td></td>
<td>
Requests WOPI host to create appropriate UI, so that the user can choose
path and File name for creating a copy of the current file.
Response to this query is sent via <code>Action_SaveAs</code> message.
</td>
</tr>
<tr>
<td><code><b>UI_Cancel_Password</b></code></td>
<td></td>
<td>
Notifies WOPI host that the user clicked on the 'cancel' option when opening
a password protected file, instead of providing the password to decrypt it.
</td>
</tr>
<tr>
<td><code><b>Doc_ModifiedStatus</b></code></td>
<td></td>
<td>
Notification to update the modified status of the document.
Values.Modified will be true, if the document has been modified
since the last save, otherwise, it will be false if the document
has been saved.
Note that this notification may be published without a change
from the prior value, so care must be taken to check the Values.Modified
value and not assume the notifiaction itself implies the
modified state of the document on its own.
</td>
</tr>
</table>
<h3 id='loleaflet-postmessage-python'>Calling Python scripts</h3>
<h4>WOPI host to editor</h4>
<table data-id='postmessage-python-to-editor'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>CallPythonScript</b></code></td>
<td><code>
<nobr>ScriptFile: &lt;string&gt;</nobr><br/>
<nobr>Function: &lt;string&gt;</nobr>
<nobr>Values: &lt;object&gt;</nobr>
</code></td>
<td>
Calls a Python script. The Values parameter contains an
object with named parameters that are passed to the script.
</td>
</tr>
</table>
<h4>Editor to WOPI host</h4>
<table data-id='postmessage-python-to-host'>
<tr>
<th>MessageId</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>CallPythonScript-Result</b></code></td>
<td><code>
<nobr>commandName: &lt;string&gt;</nobr>
<nobr>Values: &lt;object&gt;</nobr>
</code></td>
<td>
Returns the result of a Python script. The URL of the script called
is in the commandName parameter.
</td>
</tr>
</table>
<h2 id="marker">Marker</h2>
<p>Used to put markers on the map. Extends <a href="#layer">Layer</a>.</p>
<pre><code class="javascript">L.marker([50.5, 30.5]).addTo(map);</code></pre>
<h3>Creation</h3>
<table data-id='marker'>
<tr>
<th class="width200">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.marker</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i>,</nobr>
<nobr>&lt;<a href="#marker-options">Marker options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Instantiates a Marker object given a geographical point and optionally an options object.</td>
</tr>
</table>
<h3 id="marker-options">Options</h3>
<table data-id='marker'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>icon</b></code></td>
<td><code><a href="#icon">L.Icon</a></code></td>
<td>*</td>
<td>Icon class to use for rendering the marker. See <a href="#icon">Icon documentation</a> for details on how to customize the marker icon. Set to <code>new L.Icon.Default()</code> by default.</td>
</tr>
<tr>
<td><code><b>interactive</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>If <code><span class="literal">false</span></code>, the marker will not emit mouse events and will act as a part of the underlying map.</td>
</tr>
<tr>
<td><code><b>draggable</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>Whether the marker is draggable with mouse/touch or not.</td>
</tr>
<tr>
<td><code><b>keyboard</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Whether the marker can be tabbed to with a keyboard and clicked by pressing enter.</td>
</tr>
<tr>
<td><code><b>title</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">''</span></code></td>
<td>Text for the browser tooltip that appear on marker hover (no tooltip by default).</td>
</tr>
<tr>
<td><code><b>alt</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">''</span></code></td>
<td>Text for the <code>alt</code> attribute of the icon image (useful for accessibility).</td>
</tr>
<tr id="marker-zindexoffset">
<td><code><b>zIndexOffset</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">0</span></code></td>
<td>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 <code>1000</code> (or high negative value, respectively).</td>
</tr>
<tr>
<td><code><b>opacity</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">1.0</span></code></td>
<td>The opacity of the marker.</td>
</tr>
<tr>
<td><code><b>riseOnHover</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code>, the marker will get on top of others when you hover the mouse over it.</td>
</tr>
<tr>
<td><code><b>riseOffset</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">250</span></code></td>
<td>The z-index offset used for the <code>riseOnHover</code> feature.</td>
</tr>
<tr>
<td><code><b>pane</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'markerPane'</span></code></td>
<td><a href="#map-panes">Map pane</a> where the markers icon will be added.</td>
</tr>
<tr>
<td><code><b>shadowPane</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'shadowPane'</span></code></td>
<td><a href="#map-panes">Map pane</a> where the markers shadow will be added.</td>
</tr>
</table>
<h3>Events</h3>
<p>You can subscribe to the following events using <a href="#events">these methods</a>.</p>
<table data-id='marker'>
<tr>
<th class="width100">Event</th>
<th class="width100">Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>click</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user clicks (or taps) the marker.</td>
</tr>
<tr>
<td><code><b>dblclick</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user double-clicks (or double-taps) the marker.</td>
</tr>
<tr>
<td><code><b>mousedown</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user pushes the mouse button on the marker.</td>
</tr>
<tr>
<td><code><b>mouseover</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the mouse enters the marker.</td>
</tr>
<tr>
<td><code><b>mouseout</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the mouse leaves the marker.</td>
</tr>
<tr>
<td><code><b>contextmenu</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user right-clicks on the marker.</td>
</tr>
<tr>
<td><code><b>dragstart</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the user starts dragging the marker.</td>
</tr>
<tr>
<td><code><b>drag</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired repeatedly while the user drags the marker.</td>
</tr>
<tr>
<td><code><b>dragend</b></code></td>
<td><code><a href="#dragend-event">DragEndEvent</a></code></td>
<td>Fired when the user stops dragging the marker.</td>
</tr>
<tr>
<td><code><b>move</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as <code>oldLatLng, latlng</code>.</td>
</tr>
<tr>
<td><code><b>add</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the marker is added to the map.</td>
</tr>
<tr>
<td><code><b>remove</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the marker is removed from the map.</td>
</tr>
<tr>
<td><code><b>popupopen</b></code></td>
<td><code><a href="#popup-event">PopupEvent</a></code></td>
<td>Fired when a popup bound to the marker is open.</td>
</tr>
<tr>
<td><code><b>popupclose</b></code></td>
<td><code><a href="#popup-event">PopupEvent</a></code></td>
<td>Fired when a popup bound to the marker is closed.</td>
</tr>
</table>
<h3>Methods</h3>
<p>In addition to <a href="#layers">shared layer methods</a> like <code>addTo()</code> and <code>remove()</code> and <a href="#popups">popup methods</a> like <code>bindPopup()</code> you can also use the following methods:</p>
<table data-id='marker'>
<tr>
<th class="width250">Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>getLatLng</b>()</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the current geographical position of the marker.</td>
</tr>
<tr>
<td><code><b>setLatLng</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Changes the marker position to the given point.</td>
</tr>
<tr>
<td><code><b>setIcon</b>(
<nobr>&lt;<a href="#icon">Icon</a>&gt; <i>icon</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Changes the marker icon.</td>
</tr>
<tr>
<td><code><b>setZIndexOffset</b>(
<nobr>&lt;Number&gt; <i>offset</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Changes the <a href="#marker-zindexoffset">zIndex offset</a> of the marker.</td>
</tr>
<tr>
<td><code><b>setOpacity</b>(
<nobr>&lt;Number&gt; <i>opacity</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Changes the opacity of the marker.</td>
</tr>
<tr>
<td><code><b>update</b>()</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Updates the marker position, useful if coordinates of its <code>latLng</code> object were changed directly.</td>
</tr>
<tr id="marker-togeojson">
<td><code><b>toGeoJSON</b>()</code></td>
<td><code>Object</code></td>
<td>Returns a <a href="http://en.wikipedia.org/wiki/GeoJSON">GeoJSON</a> representation of the marker (GeoJSON Point Feature).</td>
</tr>
</table>
<h3 id="marker-interaction-handlers">Interaction handlers</h3>
<p>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 <a href="#handler">IHandler</a> methods). Example:</p>
<pre><code class="javascript">marker.dragging.disable();</code></pre>
<table data-id='marker'>
<tr>
<th class="width100">Property</th>
<th class="width100">Type</th>
<th>Description</th>
</tr>
<tr>
<td>dragging</td>
<td><a href="#handler"><code>IHandler</code></a></td>
<td>Marker dragging handler (by both mouse and touch).</td>
</tr>
</table>
<h2 id="popup">Popup</h2>
<p>Used to open popups in certain places of the map. Use <a href="#map-openpopup">Map#openPopup</a> to open popups while making sure that only one popup is open at one time (recommended for usability), or use <a href="#map-addlayer">Map#addLayer</a> to open as many as you want.</p>
<h3>Usage example</h3>
<p>If you want to just bind a popup to marker click and then open it, it's really easy:</p>
<pre><code class="javascript">marker.bindPopup(popupContent).openPopup();</code></pre>
<p>Path overlays like polylines also have a <code>bindPopup</code> method. Here's a more complicated way to open a popup on a map:</p>
<pre><code class="javascript">var popup = L.popup()
.setLatLng(latlng)
.setContent('&lt;p&gt;Hello world!&lt;br /&gt;This is a nice popup.&lt;/p&gt;')
.openOn(map);</code></pre>
<h3>Creation</h3>
<table data-id='popup'>
<tr>
<th>Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.popup</b>(
<nobr>&lt;<a href="#popup-options">Popup options</a>&gt; <i>options?</i>,</nobr>
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>source?</i> )</nobr>
</code></td>
<td>Instantiates a Popup object given an optional options object that describes its appearance and location and an optional source object that is used to tag the popup with a reference to the Layer to which it refers.</td>
</tr>
</table>
<h3 id="popup-options">Options</h3>
<table data-id='popup'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>maxWidth</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">300</span></code></td>
<td>Max width of the popup.</td>
</tr>
<tr>
<td><code><b>minWidth</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">50</span></code></td>
<td>Min width of the popup.</td>
</tr>
<tr>
<td><code><b>maxHeight</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">null</span></code></td>
<td>If set, creates a scrollable container of the given height inside a popup if its content exceeds it.</td>
</tr>
<tr>
<td><code><b>autoPan</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Set it to <code><span class="literal">false</span></code> if you don't want the map to do panning animation to fit the opened popup.</td>
</tr>
<tr>
<td><code><b>keepInView</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>Set it to <code><span class="literal">true</span></code> if you want to prevent users from panning the popup off of the screen while it is open.</td>
</tr>
<tr>
<td><code><b>closeButton</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Controls the presence of a close button in the popup.</td>
</tr>
<tr>
<td><code><b>offset</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td><code><nobr>Point(<span class="number">0</span>, <span class="number">6</span>)</nobr>
</code></td>
<td>The offset of the popup position. Useful to control the anchor of the popup when opening it on some overlays.</td>
</tr>
<tr>
<td><code><b>autoPanPaddingTopLeft</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td><code><span class="literal">null</span></code></td>
<td>The margin between the popup and the top left corner of the map view after autopanning was performed.</td>
</tr>
<tr>
<td><code><b>autoPanPaddingBottomRight</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td><code><span class="literal">null</span></code></td>
<td>The margin between the popup and the bottom right corner of the map view after autopanning was performed.</td>
</tr>
<tr>
<td><code><b>autoPanPadding</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td><code><nobr>Point(<span class="number">5</span>, <span class="number">5</span>)</nobr></code></td>
<td>Equivalent of setting both top left and bottom right autopan padding to the same value.</td>
</tr>
<tr>
<td><code><b>zoomAnimation</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Whether to animate the popup on zoom. Disable it if you have problems with Flash content inside popups.</td>
</tr>
<tr>
<td><code><b>closeOnClick</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">null</span></code></td>
<td>Set it to <code><span class="literal">false</span></code> if you want to override the default behavior of the popup closing when user clicks the map (set globally by the <code>Map</code> <code>closePopupOnClick</code> option).</td>
</tr>
<tr>
<td><code><b>className</b></code></td>
<td><code>String</code></td>
<td><code class="javascript"><span class="string">''</span></code></td>
<td>A custom class name to assign to the popup.</td>
</tr>
</table>
<h3>Events</h3>
<table data-id='popup'>
<tr>
<th>Event</th>
<th>Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>add</b></code></td>
<td><code><a href="#popup-event">PopupEvent</a></code></td>
<td>Fired when the popup is added to the map.</td>
</tr>
<tr>
<td><code><b>remove</b></code></td>
<td><code><a href="#popup-event">PopupEvent</a></code></td>
<td>Fired when the popup is removed from the map.</td>
</tr>
</table>
<h3>Methods</h3>
<p>In addition to <a href="#layers">shared layer methods</a> like <code>addTo()</code> and <code>remove()</code> you can also use the following methods:</p>
<table data-id='popup'>
<tr>
<th class="width250">Method</th>
<th class="minwidth">Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>openOn</b>(
<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds the popup to the map and closes the previous one. The same as <code>map.openPopup(popup)</code>.</td>
</tr>
<tr>
<td><code><b>setLatLng</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the geographical point where the popup will open.</td>
</tr>
<tr>
<td><code><b>getLatLng</b>()</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the geographical point of popup.</td>
</tr>
<tr>
<td><code><b>setContent</b>(
<nobr>&lt;String|HTMLElement|Function&gt; <i>htmlContent</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>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 <code>String</code> or <code>HTMLElement</code> to be used in the popup.</td>
</tr>
<tr>
<td><code><b>getContent</b>()</code></td>
<td><code>&lt;String|HTMLElement&gt;</code></td>
<td>Returns the content of the popup.</td>
</tr>
<tr>
<td><code><b>update</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded.</td>
</tr>
</table>
<h2 id="tilelayer">TileLayer</h2>
<p>Used to load and display tile layers on the map. Extends <a href="#layer">Layer</a>.</p>
<h3>Usage example</h3>
<pre><code class="javascript">L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map);</code></pre>
<h3>Creation</h3>
<table data-id='tilelayer'>
<tr>
<th class="width250">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.tileLayer</b>(
<nobr>&lt;String&gt; <i><a href="#url-template">urlTemplate</a></i>,</nobr>
<nobr>&lt;<a href="#tilelayer-options">TileLayer options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Instantiates a tile layer object given a <a href="#url-template">URL template</a> and optionally an options object.</td>
</tr>
</table>
<h3 id="url-template">URL template</h3>
<p>A string of the following form:</p>
<pre><code class="javascript">'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'</code></pre>
<p><code>{s}</code> means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; <code>a</code>, <code>b</code> or <code>c</code> by default, can be omitted), <code>{z}</code> &mdash; zoom level, <code>{x}</code> and <code>{y}</code> &mdash; tile coordinates. <code>{r}</code> can be used to add <code>@2x</code> to the URL to load retina tiles.</p>
<p>You can use custom keys in the template, which will be <a href="#util-template">evaluated</a> from TileLayer options, like this:</p>
<pre><code class="javascript">L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});</code></pre>
<h3 id="tilelayer-options">Options</h3>
<table data-id='tilelayer'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>minZoom</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">0</span></code></td>
<td>Minimum zoom number.</td>
</tr>
<tr>
<td><code><b>maxZoom</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">18</span></code></td>
<td>Maximum zoom number.</td>
</tr>
<tr>
<td><code><b>maxNativeZoom</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">null</span></code></td>
<td>Maximum zoom number the tiles source has available. If it is specified, the tiles on all zoom levels higher than <code>maxNativeZoom</code> will be loaded from <code>maxZoom</code> level and auto-scaled.</td>
</tr>
<tr>
<td><code><b>tileSize</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">256</span></code></td>
<td>Tile size (width and height in pixels, assuming tiles are square).</td>
</tr>
<tr>
<td><code><b>subdomains</b></code></td>
<td><code>String</code> or <code>String[]</code></td>
<td><code><span class="string">'abc'</span></code></td>
<td>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.</td>
</tr>
<tr>
<td><code><b>errorTileUrl</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">''</span></code></td>
<td>URL to the tile image to show in place of the tile that failed to load.</td>
</tr>
<tr>
<td><code><b>attribution</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">''</span></code></td>
<td>e.g. "&copy; Mapbox" &mdash; the string used by the attribution control, describes the layer data.</td>
</tr>
<tr>
<td><code><b>tms</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code>, inverses Y axis numbering for tiles (turn this on for TMS services).</td>
</tr>
<tr>
<td><code><b>continuousWorld</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If set to <code><span class="literal">true</span></code>, the tile coordinates won't be wrapped by world width (-180 to 180 longitude) or clamped to lie within world height (-90 to 90). Use this if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor or photo maps).</td>
</tr>
<tr>
<td><code><b>noWrap</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If set to <code><span class="literal">true</span></code>, the tiles just won't load outside the world width (-180 to 180 longitude) instead of repeating.</td>
</tr>
<tr>
<td><code><b>zoomOffset</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">0</span></code></td>
<td>The zoom number used in tile URLs will be offset with this value.</td>
</tr>
<tr>
<td><code><b>zoomReverse</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If set to <code><span class="literal">true</span></code>, the zoom number used in tile URLs will be reversed (<code>maxZoom - zoom</code> instead of <code>zoom</code>)</td>
</tr>
<tr>
<td><code><b>opacity</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">1.0</span></code></td>
<td>The opacity of the tile layer.</td>
</tr>
<tr>
<td><code><b>zIndex</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">null</span></code></td>
<td>The explicit zIndex of the tile layer. Not set by default.</td>
</tr>
<tr>
<td><code><b>updateInterval</b></code></td>
<td><code>Number</code></td>
<td><code class="javascript"><span class="number">200</span></code></td>
<td>Tiles will not update more then once every <code>updateInterval</code>.</td>
</tr>
<tr>
<td><code><b>unloadInvisibleTiles</b></code></td>
<td><code>Boolean</code></td>
<td>depends</td>
<td>If <code><span class="literal">true</span></code>, all the tiles that are not visible after panning are removed (for better performance). <code><span class="literal">true</span></code> by default on mobile WebKit, otherwise <code><span class="literal">false</span></code>.</td>
</tr>
<tr>
<td><code><b>updateWhenIdle</b></code></td>
<td><code>Boolean</code></td>
<td>depends</td>
<td>If <code><span class="literal">false</span></code>, new tiles are loaded during panning, otherwise only after it (for better performance). <code><span class="literal">true</span></code> by default on mobile WebKit, otherwise <code><span class="literal">false</span></code>.</td>
</tr>
<tr>
<td><code><b>detectRetina</b></code></td>
<td><code><code>Boolean</code></code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code> 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.</td>
</tr>
<tr>
<td><code><b>reuseTiles</b></code></td>
<td><code><code>Boolean</code></code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code>, all the tiles that are not visible after panning are placed in a reuse queue from which they will be fetched when new tiles become visible (as opposed to dynamically creating new ones). This will in theory keep memory usage low and eliminate the need for reserving new memory whenever a new tile is needed.</td>
</tr>
<tr>
<td><code><b>bounds</b></code></td>
<td><code><a href="#latlngbounds">LatLngBounds</a></code></td>
<td><code><span class="literal">null</span></code></td>
<td>When this option is set, the TileLayer only loads tiles that are in the given geographical bounds.</td>
</tr>
<tr>
<td><code><b>crossOrigin</b></code></td>
<td><code><code>Boolean</code></code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code>, all tiles will have their <code>crossOrigin</code> attribute set to <code>''</code>. This is needed if you want to access tile pixel data.</td>
</tr>
</table>
<h3>Events</h3>
<p>You can subscribe to the following events using <a href="#events">these methods</a>.</p>
<table data-id='tilelayer'>
<tr>
<th class="width100">Event</th>
<th class="width100">Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>loading</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the tile layer starts loading tiles.</td>
</tr>
<tr>
<td><code><b>load</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the tile layer loaded all visible tiles.</td>
</tr>
<tr>
<td><code><b>tileloadstart</b></code></td>
<td><code><a href="#tile-event">TileEvent</a></code></td>
<td>Fired when a tile is requested and starts loading.</td>
</tr>
<tr>
<td><code><b>tileload</b></code></td>
<td><code><a href="#tile-event">TileEvent</a></code></td>
<td>Fired when a tile loads.</td>
</tr>
<tr>
<td><code><b>tileunload</b></code></td>
<td><code><a href="#tile-event">TileEvent</a></code></td>
<td>Fired when a tile is removed (e.g. when you have <code>unloadInvisibleTiles</code> on).</td>
</tr>
<tr>
<td><code><b>tileerror</b></code></td>
<td><code><a href="#tileerror-event">TileEvent</a></code></td>
<td>Fired when there is an error loading a tile.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='tilelayer'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>addTo</b>(
<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds the layer to the map.</td>
</tr>
<tr>
<td><code><b>bringToFront</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Brings the tile layer to the top of all tile layers.</td>
</tr>
<tr>
<td><code><b>bringToBack</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Brings the tile layer to the bottom of all tile layers.</td>
</tr>
<tr>
<td><code><b>setOpacity</b>(
<nobr>&lt;Number&gt; <i>opacity</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Changes the opacity of the tile layer.</td>
</tr>
<tr>
<td><code><b>setZIndex</b>(
<nobr>&lt;Number&gt; <i>zIndex</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the zIndex of the tile layer.</td>
</tr>
<tr>
<td><code><b>redraw</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Causes the layer to clear all the tiles and request them again.</td>
</tr>
<tr>
<td><code><b>setUrl</b>(
<nobr>&lt;String&gt; <i><a href="#url-template">urlTemplate</a></i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Updates the layer's URL template and redraws it.</td>
</tr>
<tr>
<td><code><b>getContainer</b>()</nobr>
</code></td>
<td><code>HTMLElement</code></td>
<td>Returns the HTML element that contains the tiles for this layer.</td>
</tr>
</table>
<h2 id="tilelayer-wms">TileLayer.WMS</h2>
<p>Used to display WMS services as tile layers on the map. Extends <a href="#tilelayer">TileLayer</a>.</p>
<h3>Usage example</h3>
<pre><code class="javascript">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 &copy; 2012 IEM Nexrad"
});</code></pre>
<h3>Creation</h3>
<table data-id='tilelayer-wms'>
<tr>
<th class="width250">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.tileLayer.wms</b>(
<nobr>&lt;String&gt; <i>baseUrl</i></nobr>,
<nobr>&lt;<a href="#tilelayer-wms-options">TileLayer.WMS options</a>&gt; <i>options</i> )</nobr></code></td>
<td>Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.</td>
</tr>
</table>
<h3 id="tilelayer-wms-options">Options</h3>
<p>Includes all <a href="#tilelayer-options">TileLayer options</a> and additionally:</p>
<table data-id='tilelayer-wms'>
<tr>
<th class="width100">Option</th>
<th class="width100">Type</th>
<th class="width100">Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>layers</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">''</span></code></td>
<td><b>(required)</b> Comma-separated list of WMS layers to show.</td>
</tr>
<tr>
<td><code><b>styles</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">''</span></code></td>
<td>Comma-separated list of WMS styles.</td>
</tr>
<tr>
<td><code><b>format</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'image/jpeg'</span></code></td>
<td>WMS image format (use <code><span class="string">'image/png'</span></code> for layers with transparency).</td>
</tr>
<tr>
<td><code><b>transparent</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code>, the WMS service will return images with transparency.</td>
</tr>
<tr>
<td><code><b>version</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'1.1.1'</span></code></td>
<td>Version of the WMS service to use.</td>
</tr>
<tr>
<td><code><b>crs</b></code></td>
<td><code><a href="#crs">CRS</a></code></td>
<td><code><span class="literal">null</span></code></td>
<td>Coordinate Reference System to use for the WMS requests, defaults to map CRS. Don't change this if you're not sure what it means.</td>
</tr>
<tr>
<td><code><b>uppercase</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code>, WMS request parameter keys will be uppercase.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='tilelayer-wms'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>setParams</b>(
<nobr>&lt;<a href="#tilelayer-wms-options">WMS parameters</a>&gt; <i>params</i></nobr>,
<nobr>&lt;Boolean&gt; <i>noRedraw?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Merges an object with the new parameters and re-requests tiles on the current screen (unless <code>noRedraw</code> was set to <code><span class="literal">true</span></code>).</td>
</tr>
</table>
<h2 id="imageoverlay">ImageOverlay</h2>
<p>Used to load and display a single image over specific bounds of the map. Extends <a href="#layer">Layer</a>.</p>
<h3>Usage example</h3>
<pre><code class="javascript">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);</code></pre>
<h3>Creation</h3>
<table data-id='imageoverlay'>
<tr>
<th class="width250">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.ImageOverlay</b>(
<nobr>&lt;String&gt; <i>imageUrl</i></nobr>,
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>bounds</i></nobr>,
<nobr>&lt;<a href="#imageoverlay-options">ImageOverlay options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Instantiates an image overlay object given the URL of the image and the geographical bounds it is tied to.</td>
</tr>
</table>
<h3 id="imageoverlay-options">Options</h3>
<table data-id='imageoverlay'>
<tr>
<th>Option</th>
<th>Type</th>
<th class="minwidth">Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>opacity</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">1.0</span></code></td>
<td>The opacity of the image overlay.</td>
</tr>
<tr>
<td><code><b>attribution</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">''</span></code></td>
<td>The attribution text of the image overlay.</td>
</tr>
</table>
<h3 id="imageoverlay-methods">Methods</h3>
<table data-id='imageoverlay'>
<tr>
<th class="width250">Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>addTo</b>(
<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds the overlay to the map.</td>
</tr>
<tr>
<td><code><b>setOpacity</b>(
<nobr>&lt;Number&gt; <i>opacity</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the opacity of the overlay.</td>
</tr>
<tr>
<td><code><b>setUrl</b>(
<nobr>&lt;String&gt; <i>imageUrl</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Changes the URL of the image.</td>
</tr>
<tr>
<td><code><b>bringToFront</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Brings the layer to the top of all overlays.</td>
</tr>
<tr>
<td><code><b>bringToBack</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Brings the layer to the bottom of all overlays.</td>
</tr>
</table>
<h2 id="path">Path</h2>
<p>An abstract class that contains options and constants shared between vector overlays (Polygon, Polyline, Circle). Do not use it directly. Extends <a href="#layer">Layer</a>.</p>
<h3 id="path-options">Options</h3>
<table data-id='path'>
<tr>
<th>Option</th>
<th>Type</th>
<th class="minwidth">Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>stroke</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Whether to draw stroke along the path. Set it to <code><span class="literal">false</span></code> to disable borders on polygons or circles.</td>
</tr>
<tr>
<td><code><b>color</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'#3388ff'</span></code></td>
<td>Stroke color.</td>
</tr>
<tr>
<td><code><b>weight</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">3</span></code></td>
<td>Stroke width in pixels.</td>
</tr>
<tr>
<td><code><b>opacity</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">1</span></code></td>
<td>Stroke opacity.</td>
</tr>
<tr>
<td><code><b>fill</b></code></td>
<td><code>Boolean</code></td>
<td>depends</td>
<td>Whether to fill the path with color. Set it to <code><span class="literal">false</span></code> to disable filling on polygons or circles.</td>
</tr>
<tr>
<td><code><b>fillColor</b></code></td>
<td><code>String</code></td>
<td>same as color</td>
<td>Fill color.</td>
</tr>
<tr>
<td><code><b>fillOpacity</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">0.2</span></code></td>
<td>Fill opacity.</td>
</tr>
<tr>
<td><code><b>fillRule</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'evenodd'</span></code></td>
<td>A string that defines <a href="https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule">how the inside of a shape</a> is determined.</td>
</tr>
<tr>
<td><code><b>dashArray</b></code></td>
<td><code>String</code></td>
<td><code><span class="literal">null</span></code></td>
<td>A string that defines the stroke <a href="https://developer.mozilla.org/en/SVG/Attribute/stroke-dasharray">dash pattern</a>. Doesn't work on canvas-powered layers (e.g. Android 2).</td>
</tr>
<tr>
<td><code><b>lineCap</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'round'</span></code></td>
<td>A string that defines <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap">shape to be used at the end</a> of the stroke.</td>
</tr>
<tr>
<td><code><b>lineJoin</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'round'</span></code></td>
<td>A string that defines <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin">shape to be used at the corners</a> of the stroke.</td>
</tr>
<tr>
<td><code><b>interactive</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>If <code><span class="literal">false</span></code>, the vector will not emit mouse events and will act as a part of the underlying map.</td>
</tr>
<tr>
<td><code><b>renderer</b></code></td>
<td><code>Renderer</code></td>
<td><code>depends</code></td>
<td><code>L.SVG</code> or <code>L.Canvas</code> by default depending on browser support.</td>
</tr>
<tr>
<td><code><b>pointerEvents</b></code></td>
<td><code>String</code></td>
<td><code><span class="literal">null</span></code></td>
<td>Sets the <code>pointer-events</code> attribute on the path if SVG renderer is used.</td>
</tr>
<tr>
<td><code><b>className</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">''</span></code></td>
<td>Custom class name set on an element.</td>
</tr>
</table>
<h3>Events</h3>
<p>You can subscribe to the following events using <a href="#events">these methods</a>.</p>
<table data-id='path'>
<tr>
<th class="width100">Event</th>
<th class="width100">Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>click</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user clicks (or taps) the object.</td>
</tr>
<tr>
<td><code><b>dblclick</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user double-clicks (or double-taps) the object.</td>
</tr>
<tr>
<td><code><b>mousedown</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user pushes the mouse button on the object.</td>
</tr>
<tr>
<td><code><b>mouseover</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the mouse enters the object.</td>
</tr>
<tr>
<td><code><b>mouseout</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the mouse leaves the object.</td>
</tr>
<tr>
<td><code><b>contextmenu</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user pushes the right mouse button on the object, prevents default browser context menu from showing if there are listeners on this event.</td>
</tr>
<tr>
<td><code><b>add</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the path is added to the map.</td>
</tr>
<tr>
<td><code><b>remove</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the path is removed from the map.</td>
</tr>
<tr>
<td><code><b>popupopen</b></code></td>
<td><code><a href="#popup-event">PopupEvent</a></code></td>
<td>Fired when a popup bound to the path is open.</td>
</tr>
<tr>
<td><code><b>popupclose</b></code></td>
<td><code><a href="#popup-event">PopupEvent</a></code></td>
<td>Fired when a popup bound to the path is closed.</td>
</tr>
</table>
<h3 id="path-methods">Methods</h3>
<p>In addition to <a href="#layers">shared layer methods</a> like <code>addTo()</code> and <code>remove()</code> and <a href="#popups">popup methods</a> like <code>bindPopup()</code> you can also use the following methods:</p>
<table data-id='path'>
<tr>
<th class="width250">Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr id="path-openpopup">
<td><code><b>openPopup</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Opens the popup previously bound by the <a href="#path-bindpopup">bindPopup</a> method in the given point, or in one of the path's points if not specified.</td>
</tr>
<tr id="path-setstyle">
<td><code><b>setStyle</b>(
<nobr>&lt;<a href="#path-options">Path options</a>&gt; <i>object</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Changes the appearance of a Path based on the options in the <a href="#path-options">Path options</a> object.</td>
</tr>
<tr id="path-getbounds">
<td><code><b>getBounds</b>()</code></td>
<td><code><a href="#latlngbounds">LatLngBounds</a></code></td>
<td>Returns the LatLngBounds of the path.</td>
</tr>
<tr>
<td><code><b>bringToFront</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Brings the layer to the top of all path layers.</td>
</tr>
<tr>
<td><code><b>bringToBack</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Brings the layer to the bottom of all path layers.</td>
</tr>
<tr>
<td><code><b>redraw</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.</td>
</tr>
</table>
<h3>Static properties</h3>
<table data-id='path'>
<tr>
<th>Constant</th>
<th>Type</th>
<th>Value</th>
<th>Description</th>
</tr>
<tr>
<td><code>SVG</code></td>
<td><code>Boolean</code></td>
<td>depends</td>
<td>True if SVG is used for vector rendering (true for most modern browsers).</td>
</tr>
<tr>
<td><code>VML</code></td>
<td><code>Boolean</code></td>
<td>depends</td>
<td>True if VML is used for vector rendering (IE 6-8).</td>
</tr>
<tr>
<td><code>CANVAS</code></td>
<td><code>Boolean</code></td>
<td>depends</td>
<td>True if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable <code>L_PREFER_CANVAS</code> to <code><span class="literal">true</span></code> <em>before</em> the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow.</td>
</tr>
<tr>
<td><code>CLIP_PADDING</code></td>
<td><code>Number</code></td>
<td><nobr><code><span class="number">0.5</span></code> for SVG</nobr><br /><nobr><code><span class="number">0.02</span></code> for VML</nobr></td>
<td>How much to extend the clip area around the map view (relative to its size, e.g. 0.5 is half the screen in each direction). Smaller values mean that you will see clipped ends of paths while you're dragging the map, and bigger values decrease drawing performance.</td>
</tr>
</table>
<h2 id="polyline">Polyline</h2>
<p>A class for drawing polyline overlays on a map. Extends <a href="#path">Path</a>. Use <a href="#map-addlayer">Map#addLayer</a> to add it to the map.</p>
<h3>Usage example</h3>
<pre><code class="javascript">// create a red polyline from an array of LatLng points
var latlngs = [
[-122.68, 45.51],
[-122.43, 37.77],
[-118.2, 34.04]
];
var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
// zoom the map to the polyline
map.fitBounds(polyline.getBounds());</code></pre>
<p>You can also pass a multi-dimensional array to represent a <code>MultiPolyline</code> shape:</p>
<pre><code class="javascript">// create a red polyline from an array of arrays of LatLng points
var latlngs = [
[[-122.68, 45.51],
[-122.43, 37.77],
[-118.2, 34.04]],
[[-73.91, 40.78],
[-87.62, 41.83],
[-96.72, 32.76]]
];</code></pre>
<h3>Creation</h3>
<table data-id='polyline'>
<tr>
<th class="width250">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.polyline</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>[]&gt; <i>latlngs</i></nobr>,
<nobr>&lt;<a href="#polyline-options">Polyline options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Instantiates a polyline object given an array of geographical points and optionally an options object. You can create a <code>Polyline</code> object with multiple separate lines (<code>MultiPolyline</code>) by passing an array of arrays of geographic points.</td>
</tr>
</table>
<h3 id="polyline-options">Options</h3>
<p>You can use <a href="#path-options">Path options</a> and additionally the following options:</p>
<table data-id='polyline'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>smoothFactor</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">1.0</span></code></td>
<td>How much to simplify the polyline on each zoom level. More means better performance and smoother look, and less means more accurate representation.</td>
</tr>
<tr>
<td><code><b>noClip</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>Disabled polyline clipping.</td>
</tr>
</table>
<h3>Methods</h3>
<p>In addition to <a href="#path-methods">Path methods</a> like <code>redraw()</code> and <code>bringToFront()</code>, <a href="#layers">shared layer methods</a> like <code>addTo()</code> and <code>remove()</code> and <a href="#popups">popup methods</a> like <code>bindPopup()</code> you can also use the following methods:</p>
<table data-id='polyline'>
<tr>
<th class="width250">Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>addLatLng</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i></nobr>,
<nobr>&lt;<a href="#latlng">LatLng</a>[]&gt; <i>latlngs</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>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 <code>LatLng</code> array (that you can earlier access with <a href="#polyline-getlatlngs">getLatLngs</a>).</td>
</tr>
<tr>
<td><code><b>setLatLngs</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>[]&gt; <i>latlngs</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Replaces all the points in the polyline with the given array of geographical points.</td>
</tr>
<tr>
<td><code><b>getLatLngs</b>()</code></td>
<td><code><a href="#latlng">LatLng</a>[]</code></td>
<td>Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.</td>
</tr>
<tr>
<td><code><b>isEmpty</b>()</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the Polyline has no LatLng.</td>
</tr>
<tr id="path-getbounds">
<td><code><b>getBounds</b>()</code></td>
<td><code><a href="#latlngbounds">LatLngBounds</a></code></td>
<td>Returns the LatLngBounds of the polyline.</td>
</tr>
<tr id="path-getcenter">
<td><code><b>getCenter</b>()</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the center (<a href="http://en.wikipedia.org/wiki/Centroid">centroid</a>) of the polyline.</td>
</tr>
<tr id="polyline-togeojson">
<td><code><b>toGeoJSON</b>()</code></td>
<td><code>Object</code></td>
<td>Returns a <a href="http://en.wikipedia.org/wiki/GeoJSON">GeoJSON</a> representation of the polyline (GeoJSON LineString Feature).</td>
</tr>
</table>
<h2 id="polygon">Polygon</h2>
<p>A class for drawing polygon overlays on a map. Extends <a href="#polyline">Polyline</a>. Use <a href="#map-addlayer">Map#addLayer</a> to add it to the map.</p>
<p>Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one &mdash; it's better to filter out such points.</p>
<h3>Usage example</h3>
<pre><code class="javascript">// create a red polygon from an array of LatLng points
var latlngs = [[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]];
var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
// zoom the map to the polygon
map.fitBounds(polygon.getBounds());</code></pre>
<p>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:</p>
<pre><code class="javascript">
var latlngs = [
[[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]], // outer ring
[[-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29]] // hole
];</code></pre>
<p>Additionally, you can pass a multi-dimensional array to represent a <code>MultiPolygon</code> shape.</p>
<pre><code class="javascript">
var latlngs = [
[ // first polygon
[[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]], // outer ring
[[-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29]] // hole
],
[ // second polygon
[[-109.05, 37],[-109.03, 41],[-102.05, 41],[-102.04, 37],[-109.05, 38]]
]
];</code></pre>
<h3>Creation</h3>
<table data-id='polygon'>
<tr>
<th>Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.polygon</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>[]&gt; <i>latlngs</i></nobr>,
<nobr>&lt;<a href="#polyline-options">Polyline options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside. You can create a a <code>Polygon</code> with multiple separate shapes (<code>MultiPolygon</code>) by passing an array of <code>Polygon</code> coordinates.</td>
</tr>
</table>
<h3>Methods</h3>
<p>In addition to <a href="#path-methods">Path methods</a> like <code>redraw()</code> and <code>bringToFront()</code>, <a href="#polyline-methods">Polyline methods</a> like <code>setLatLngs()</code> and <code>getLatLngs()</code>, <a href="#layers">shared layer methods</a> like <code>addTo()</code> and <code>remove()</code> and <a href="#popups">popup methods</a> like <code>bindPopup()</code> you can also use the following methods:</p>
<table data-id='polygon'>
<tr>
<th class="width250">Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr id="polygon-togeojson">
<td><code><b>toGeoJSON</b>()</code></td>
<td><code>Object</code></td>
<td>Returns a <a href="http://en.wikipedia.org/wiki/GeoJSON">GeoJSON</a> representation of the polygon (GeoJSON Polygon Feature).</td>
</tr>
</table>
<h2 id="rectangle">Rectangle</h2>
<p>A class for drawing rectangle overlays on a map. Extends <a href="#polygon">Polygon</a>. Use <a href="#map-addlayer">Map#addLayer</a> to add it to the map.</p>
<h3>Usage example</h3>
<pre><code class="javascript">// 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);</code></pre>
<h3>Creation</h3>
<table data-id='rectangle'>
<tr>
<th class="width250">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.rectangle</b>(
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>bounds</i></nobr>,
<nobr>&lt;<a href="#path-options">Path options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Instantiates a rectangle object with the given geographical bounds and optionally an options object.</td>
</tr>
</table>
<h3>Methods</h3>
<p>In addition to <a href="#path-methods">Path methods</a> like <code>redraw()</code> and <code>bringToFront()</code>, <a href="#layers">shared layer methods</a> like <code>addTo()</code> and <code>remove()</code> and <a href="#popups">popup methods</a> like <code>bindPopup()</code> you can also use the following methods:</p>
<table data-id='rectangle'>
<tr>
<th class="width250">Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>setBounds</b>(
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>bounds</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Redraws the rectangle with the passed bounds.</td>
</tr>
</table>
<h2 id="circle">Circle</h2>
<p>A class for drawing circle overlays on a map. Extends <a href="#circlemarker">CircleMarker</a>. Use <a href="#map-addlayer">Map#addLayer</a> to add it to the map.</p>
<pre><code class="javascript">L.circle([50.5, 30.5], 200).addTo(map);</code></pre>
<h3>Creation</h3>
<table data-id='circle'>
<tr>
<th>Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.circle</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i></nobr>,
<nobr>&lt;Number&gt; <i>radius</i></nobr>,
<nobr>&lt;<a href="#path-options">Path options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Instantiates a circle object given a geographical point, a radius in meters and optionally an options object.</td>
</tr>
</table>
<h3>Methods</h3>
<p>In addition to <a href="#path-methods">Path methods</a> like <code>redraw()</code> and <code>bringToFront()</code>, <a href="#layers">shared layer methods</a> like <code>addTo()</code> and <code>remove()</code> and <a href="#popups">popup methods</a> like <code>bindPopup()</code> you can also use the following methods:</p>
<table data-id='circle'>
<tr>
<th class="width200">Method</th>
<th class="minwidth">Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>getLatLng</b>()</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the current geographical position of the circle.</td>
</tr>
<tr>
<td><code><b>getRadius</b>()</code></td>
<td><code>Number</code></td>
<td>Returns the current radius of a circle. Units are in meters.</td>
</tr>
<tr>
<td><code><b>setLatLng</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the position of a circle to a new location.</td>
</tr>
<tr>
<td><code><b>setRadius</b>(
<nobr>&lt;Number&gt; <i>radius</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the radius of a circle. Units are in meters.</td>
</tr>
<tr id="circle-togeojson">
<td><code><b>toGeoJSON</b>()</code></td>
<td><code>Object</code></td>
<td>Returns a <a href="http://en.wikipedia.org/wiki/GeoJSON">GeoJSON</a> representation of the circle (GeoJSON Point Feature).</td>
</tr>
</table>
<h2 id="circlemarker">CircleMarker</h2>
<p>A circle of a fixed size with radius specified in pixels. Extends <a href="#path">Path</a>. Use <a href="#map-addlayer">Map#addLayer</a> to add it to the map.</p>
<h3>Creation</h3>
<table data-id='circlemarker'>
<tr>
<th class="width200">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.circleMarker</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i></nobr>,
<nobr>&lt;<a href="#path-options">Path options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Instantiates a circle marker given a geographical point and optionally an options object. The default radius is 10 and can be altered by passing a "radius" member in the path options object.</td>
</tr>
</table>
<h3>Methods</h3>
<p>In addition to <a href="#path-methods">Path methods</a> like <code>redraw()</code> and <code>bringToFront()</code>, <a href="#layers">shared layer methods</a> like <code>addTo()</code> and <code>remove()</code> and <a href="#popups">popup methods</a> like <code>bindPopup()</code> you can also use the following methods:</p>
<table data-id='circlemarker'>
<tr>
<th class="width200">Method</th>
<th class="minwidth">Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>setLatLng</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the position of a circle marker to a new location.</td>
</tr>
<tr>
<td><code><b>setRadius</b>(
<nobr>&lt;Number&gt; <i>radius</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the radius of a circle marker. Units are in pixels.</td>
</tr>
<tr id="circlemarker-togeojson">
<td><code><b>toGeoJSON</b>()</code></td>
<td><code>Object</code></td>
<td>Returns a <a href="http://en.wikipedia.org/wiki/GeoJSON">GeoJSON</a> representation of the circle marker (GeoJSON Point Feature).</td>
</tr>
</table>
<h2 id="layergroup">LayerGroup</h2>
<p>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 <a href="#layer">Layer</a>.</p>
<pre><code class="javascript">L.layerGroup([marker1, marker2])
.addLayer(polyline)
.addTo(map);</code></pre>
<h3>Creation</h3>
<table data-id='layergroup'>
<tr>
<th class="width250">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.LayerGroup</b>(
<nobr>&lt;<a href="#layer">Layer</a>[]&gt; <i>layers?</i> )</nobr>
</code></td>
<td>Create a layer group, optionally given an initial set of layers.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='layergroup'>
<tr>
<th class="width200">Method</th>
<th class="minwidth">Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>addTo</b>(
<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds the group of layers to the map.</td>
</tr>
<tr>
<td><code><b>addLayer</b>(
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds a given layer to the group.</td>
</tr>
<tr>
<td><code><b>removeLayer</b>(
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes a given layer from the group.</td>
</tr>
<tr>
<td><code><b>removeLayer</b>(
<nobr>&lt;String&gt; <i>id</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes a given layer of the given id from the group.</td>
</tr>
<tr>
<td><code><b>hasLayer</b>(
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the given layer is currently added to the group.</td>
</tr>
<tr>
<td><code><b>getLayer</b>(
<nobr>&lt;String&gt; <i>id</i> )</nobr>
</code></td>
<td><code><a href="#layer">Layer</a></code></td>
<td>Returns the layer with the given id.</td>
</tr>
<tr>
<td><code><b>getLayers</b>()</code></td>
<td><code>Array</code></td>
<td>Returns an array of all the layers added to the group.</td>
</tr>
<tr>
<td><code><b>clearLayers</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes all the layers from the group.</td>
</tr>
<tr>
<td><code><b>eachLayer</b>(
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Iterates over the layers of the group, optionally specifying context of the iterator function.
<pre><code>group.eachLayer(function (layer) {
layer.bindPopup('Hello');
});</code></pre>
</td>
</tr>
<tr id="layergroup-togeojson">
<td><code><b>toGeoJSON</b>()</code></td>
<td><code>Object</code></td>
<td>Returns a <a href="http://en.wikipedia.org/wiki/GeoJSON">GeoJSON</a> representation of the layer group (GeoJSON FeatureCollection).</td>
</tr>
</table>
<h2 id="featuregroup">FeatureGroup</h2>
<p>Extended <a href="#layergroup">layerGroup</a> that also has mouse events (propagated from members of the group) and a shared bindPopup method. Extends <a href="#layer">Layer</a>.</p>
<pre><code class="javascript">L.featureGroup([marker1, marker2, polyline])
.bindPopup('Hello world!')
.on('click', function() { alert('Clicked on a group!'); })
.addTo(map);</code></pre>
<h3>Creation</h3>
<table data-id='featuregroup'>
<tr>
<th class="width300">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.featureGroup</b>(
<nobr>&lt;<a href="#layer">Layer</a>[]&gt; <i>layers?</i> )</nobr>
</code></td>
<td>Create a layer group, optionally given an initial set of layers.</td>
</tr>
</table>
<h3>Methods</h3>
<p>In addition to <a href="#layers">shared layer methods</a> like <code class="javascript">addTo()</code> and <code class="javascript">remove()</code> and <a href="#popups">popup methods</a> like <code class="javascript">bindPopup()</code> you can also use the following methods:</p>
<table data-id='featuregroup'>
<tr>
<th class="width250">Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>getBounds</b>()</code></td>
<td><code><a href="#latlngbounds">LatLngBounds</a></code></td>
<td>Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).</td>
</tr>
<tr>
<td><code><b>setStyle</b>(
<nobr>&lt;<a href="#path-options">Path options</a>&gt; <i>style</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the given path options to each layer of the group that has a <code>setStyle</code> method.</td>
</tr>
<tr>
<td><code><b>bringToFront</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Brings the layer group to the top of all other layers.</td>
</tr>
<tr>
<td><code><b>bringToBack</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Brings the layer group to the bottom of all other layers.</td>
</tr>
</table>
<h3>Events</h3>
<p>You can subscribe to the following events using <a href="#events">these methods</a>.</p>
<table data-id='featuregroup'>
<tr>
<th class="width100">Event</th>
<th class="width100">Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>click</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user clicks (or taps) the group.</td>
</tr>
<tr>
<td><code><b>dblclick</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user double-clicks (or double-taps) the group.</td>
</tr>
<tr>
<td><code><b>mouseover</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the mouse enters the group.</td>
</tr>
<tr>
<td><code><b>mouseout</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the mouse leaves the group.</td>
</tr>
<tr>
<td><code><b>mousemove</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired while the mouse moves over the layers of the group.</td>
</tr>
<tr>
<td><code><b>contextmenu</b></code></td>
<td><code><a href="#mouse-event">MouseEvent</a></code></td>
<td>Fired when the user right-clicks on one of the layers.</td>
</tr>
<tr>
<td><code><b>layeradd</b></code></td>
<td><code><a href="#layer-event">LayerEvent</a></code></td>
<td>Fired when a layer is added to the group.</td>
</tr>
<tr>
<td><code><b>layerremove</b></code></td>
<td><code><a href="#layer-event">LayerEvent</a></code></td>
<td>Fired when a layer is removed from the map.</td>
</tr>
</table>
<h2 id="geojson">GeoJson</h2>
<p>Represents a <a href="http://geojson.org/geojson-spec.html">GeoJSON</a> object or an array of GeoJSON objects. Allows you to parse GeoJSON data and display it on the map. Extends <a href="#featuregroup">FeatureGroup</a>.</p>
<pre><code class="javascript">L.geoJson(data, {
style: function (feature) {
return {color: feature.properties.color};
}
}).bindPopup(function (layer) {
return layer.feature.properties.description;
}).addTo(map);</code></pre>
<p>Each feature layer created by it gets a <code>feature</code> property that links to the GeoJSON feature data the layer was created from (so that you can access its properties later).</p>
<h3>Creation</h3>
<table data-id='geojson'>
<tr>
<th>Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.geoJson</b>(
<nobr>&lt;Object&gt; <i>geojson?</i></nobr>,
<nobr>&lt;<a href="#geojson-options">GeoJSON options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Creates a GeoJSON layer. Optionally accepts an object in <a href="http://geojson.org/geojson-spec.html">GeoJSON format</a> to display on the map (you can alternatively add it later with <code>addData</code> method) and an options object.</td>
</tr>
</table>
<h3 id="geojson-options">Options</h3>
<table data-id='geojson'>
<tr>
<th>Option</th>
<th>Description</th>
</tr>
<tr id="geojson-pointtolayer">
<td><code><b>pointToLayer</b>(
<nobr>&lt;GeoJSON&gt; <i>featureData</i></nobr>,
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td>Function that will be used for creating layers for GeoJSON points (if not specified, simple markers will be created).</td>
</tr>
<tr id="geojson-style">
<td><code><b>style</b>(
<nobr>&lt;GeoJSON&gt; <i>featureData</i> )</nobr>
</code></td>
<td>Function that will be used to get style options for vector layers created for GeoJSON features.</td>
</tr>
<tr id="geojson-oneachfeature">
<td><code><b>onEachFeature</b>(
<nobr>&lt;GeoJSON&gt; <i>featureData</i></nobr>,
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i> )</nobr>
</code></td>
<td>Function that will be called on each created feature layer. Useful for attaching events and popups to features.</td>
</tr>
<tr id="geojson-filter">
<td><code><b>filter</b>(
<nobr>&lt;GeoJSON&gt; <i>featureData</i></nobr>,
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i> )</nobr>
</code></td>
<td>Function that will be used to decide whether to show a feature or not.</td>
</tr>
<tr id="geojson-coordstolatlng">
<td><code><b>coordsToLatLng</b>(
<nobr>&lt;Array&gt; <i>coords</i></nobr> )</nobr>
</code></td>
<td>Function that will be used for converting GeoJSON coordinates to <a href="#latlng">LatLng</a> points (if not specified, coords will be assumed to be WGS84 &mdash; standard <code>[longitude, latitude]</code> values in degrees).</td>
</tr>
</table>
<p>Additionally accepts all <a href="#path-options">Path options</a> for polylines and polygons.</p>
<h3>Methods</h3>
<p>In addition to <a href="#layers">shared layer methods</a> like <code class="javascript">addTo()</code> and <code class="javascript">remove()</code> and <a href="#popups">popup methods</a> like <code class="javascript">bindPopup()</code> you can also use the following methods:</p>
<table data-id='geojson'>
<tr>
<th class="width250">Method</th>
<th class="minwidth">Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>addData</b>(
<nobr>&lt;GeoJSON&gt; <i>data</i> )</nobr>
</code></td>
<td><code>this</code></td>
<td>Adds a GeoJSON object to the layer.</td>
</tr>
<tr id="geojson-setstyle">
<td><code><b>setStyle</b>(
<nobr>&lt;Function&gt; <i><a href="#geojson-style">style</a></i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Changes styles of GeoJSON vector layers with the given style function.</td>
</tr>
<tr id="geojson-resetstyle">
<td><code><b>resetStyle</b>(
<nobr>&lt;<a href="#path">Path</a>&gt; <i>layer</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.</td>
</tr>
</table>
<h3>Static methods</h3>
<table data-id='geojson'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>geometryToLayer</b>(
<nobr>&lt;GeoJSON&gt; <i>featureData</i></nobr>,
<nobr>&lt;<a href="#geojson-pointtolayer">Function</a>&gt; <i>pointToLayer?</i> )</nobr>
</code></td>
<td><code><a href="#layer">Layer</a></code></td>
<td>Creates a layer from a given GeoJSON feature.</td>
</tr>
<tr>
<td><code><b>coordsToLatLng</b>(
<nobr>&lt;Array&gt; <i>coords</i></nobr>,
<nobr>&lt;Boolean&gt; <i>reverse?</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Creates a LatLng object from an array of 2 numbers (latitude, longitude) used in GeoJSON for points. If <code>reverse</code> is set to <code><span class="literal">true</span></code>, the numbers will be interpreted as (longitude, latitude).</td>
</tr>
<tr>
<td><code><b>coordsToLatLngs</b>(
<nobr>&lt;Array&gt; <i>coords</i></nobr>,
<nobr>&lt;Number&gt; <i>levelsDeep?</i></nobr>,
<nobr>&lt;Boolean&gt; <i>reverse?</i> )</nobr>
</code></td>
<td><code>Array</code></td>
<td>Creates a multidimensional array of LatLng objects from a GeoJSON coordinates array. <code>levelsDeep</code> specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). If <code>reverse</code> is set to <code><span class="literal">true</span></code>, the numbers will be interpreted as (longitude, latitude).</td>
</tr>
</table>
<h2 id="gridlayer">GridLayer</h2>
<p>Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces <code>TileLayer.Canvas</code>.</p>
<p>GridLayer can be extended to create a tiled grid of HTML Elements like <code>&lt;canvas&gt;</code>, <code>&lt;img&gt;</code> or <code>&lt;div&gt;</code>.GridLayer will handle creating and animating these DOM elements for you.</p>
<h3>Synchronous usage example</h3>
<p>To create a custom layer, extend GridLayer and implement the <code>createTile()</code> method, which will be passed a <a href="#point">Point</a> object with the <code>x</code>, <code>y</code>, and <code>z</code> (zoom level) coordinates to draw your tile.</p>
<pre><code class="javascript">var CanvasLayer = L.GridLayer.extend({
createTile: function(coords){
// create a &lt;canvas&gt; 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 = canvas.getContext('2d');
// return the tile so it can be rendered on screen
return tile;
}
});</code></pre>
<h3>Asynchronous usage example</h3>
<p>Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile has finished drawing it must be passed to the <code>done()</code> callback.</p>
<pre><code class="javascript">var CanvasLayer = L.GridLayer.extend({
// createTile has a 'done' parameter when on async mode
createTile: function(coords, done){
var error;
// create a &lt;canvas&gt; 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;
// For this example simply wait one second before tile is ready
window.setTimeout(function(){
// draw something and pass the tile to the done() callback
done(error, tile);
}, 1000);
// return the tile so its progress can be tracked
return tile;
}
});</code></pre>
<h3>Constructor</h3>
<table>
<tr>
<th>Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code>L.gridLayer(&lt;<a href="#gridlayer-options">GridLayer options</a>&gt; <i>options</i>?)</code></td>
<td>Creates a new instance of GridLayer with the supplied options.</td>
</tr>
</table>
<h3 id="gridlayer-options">Options</h3>
<table>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default value</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>maxZoom</b></code></td>
<td><code>Number</code></td>
<td><code class="javascript"><span class="string">'tilePane'</span></code></td>
<td>The <a href="#map-panes">map pane</a> the layer will be added to.</td>
</tr>
<tr>
<td><code><b>tileSize</b></code></td>
<td><code>Number</code> or <code><a href="#point">Point</a></code></td>
<td><code class="javascript"><span class="number">256</span></code></td>
<td>Width and height of tiles in the grid. Use a number if width and height are equal, or <code>L.point(width, height)</code> otherwise.</td>
</tr>
<tr>
<td><code><b>opacity</b></code></td>
<td><code>Number</code></td>
<td><code class="javascript"><span class="number">1</span></code></td>
<td>Opacity of the tiles. Can be used in the <code>createTile()</code> function.</td>
</tr>
<tr>
<td><code><b>unloadInvisibleTiles</b></code></td>
<td><code>Boolean</code></td>
<td>depends</td>
<td>If <code><span class="literal">true</span></code>, all the tiles that are not visible after panning are removed (for better performance). <code><span class="literal">true</span></code> by default on mobile WebKit, otherwise <code><span class="literal">false</span></code>.</td>
</tr>
<tr>
<td><code><b>updateWhenIdle</b></code></td>
<td><code>Boolean</code></td>
<td>depends</td>
<td>If <code><span class="literal">false</span></code>, new tiles are loaded during panning, otherwise only after it (for better performance). <code><span class="literal">true</span></code> by default on mobile WebKit, otherwise <code><span class="literal">false</span></code>.</td>
</tr>
<tr>
<td><code><b>updateInterval</b></code></td>
<td><code>Number</code></td>
<td><code class="javascript"><span class="number">200</span></code></td>
<td>Tiles will not update more then once every <code>updateInterval</code>.</td>
</tr>
<tr>
<td><code><b>zIndex</b></code></td>
<td><code>Number</code></td>
<td><code><span class="literal">null</span></code></td>
<td>The explicit zIndex of the tile layer. Not set by default.</td>
</tr>
<tr>
<td><code><b>bounds</b></code></td>
<td><code><a href="latlngbounds">LatLngBounds</a></code></td>
<td><code><span class="literal">null</span></code></td>
<td>If set tiles will only be loaded inside inside the set <a href="latlngbounds">LatLngBounds</a>.</td>
</tr>
<tr>
<td><code><b>bounds</b></code></td>
<td><code><a href="latlngbounds">LatLngBounds</a></code></td>
<td><code><span class="literal">null</span></code></td>
<td>If set tiles will only be loaded inside inside the set <a href="latlngbounds">LatLngBounds</a>.</td>
</tr>
<tr>
<td><code><b>minZoom</b></code></td>
<td><code>Number</code></td>
<td><code class="javascript"><span class="number">0</span></code></td>
<td>The minimum zoom level that tiles will be loaded at. By default the entire map.</td>
</tr>
</table>
<h3>Methods</h3>
<table>
<tr>
<td><code><b>bringToFront</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Brings the tile layer to the top of all tile layers.</td>
</tr>
<tr>
<td><code><b>bringToBack</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Brings the tile layer to the bottom of all tile layers.</td>
</tr>
<tr>
<td><code><b>setOpacity</b>(
<nobr>&lt;Number&gt; <i>opacity</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Changes the opacity of the tile layer.</td>
</tr>
<tr>
<td><code><b>setZIndex</b>(
<nobr>&lt;Number&gt; <i>zIndex</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the zIndex of the tile layer.</td>
</tr>
<tr>
<td><code><b>redraw</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Causes the layer to clear all the tiles and request them again.</td>
</tr>
<tr>
<td><code><b>getContainer</b>()</nobr>
</code></td>
<td><code>HTMLElement</code></td>
<td>Returns the HTML element that contains the tiles for this layer.</td>
</tr>
<tr>
<td><code><b>getTileSize</b>()</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Normalizes the <code>tileSize</code> option into a point. Used by the <code>createTile()</code> method.</td>
</tr>
</table>
<h3>Events</h3>
<table data-id='tilelayer'>
<tr>
<th class="width100">Event</th>
<th class="width100">Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>loading</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the tile layer starts loading tiles.</td>
</tr>
<tr>
<td><code><b>load</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the tile layer loaded all visible tiles.</td>
</tr>
<tr>
<td><code><b>tileloadstart</b></code></td>
<td><code><a href="#tile-event">TileEvent</a></code></td>
<td>Fired when a tile is requested and starts loading.</td>
</tr>
<tr>
<td><code><b>tileload</b></code></td>
<td><code><a href="#tile-event">TileEvent</a></code></td>
<td>Fired when a tile loads.</td>
</tr>
<tr>
<td><code><b>tileunload</b></code></td>
<td><code><a href="#tile-event">TileEvent</a></code></td>
<td>Fired when a tile is removed (e.g. when you have <code>unloadInvisibleTiles</code> on).</td>
</tr>
<tr>
<td><code><b>tileerror</b></code></td>
<td><code><a href="#tileerror-event">TileEvent</a></code></td>
<td>Fired when there is an error loading a tile.</td>
</tr>
</table>
<h2 id="latlng">LatLng</h2>
<p>Represents a geographical point with a certain latitude and longitude.</p>
<pre><code class="javascript">var latlng = L.latLng(50.5, 30.5);</code></pre>
<p>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:</p>
<pre><code>map.panTo([50, 30]);
map.panTo({lon: 30, lat: 50});
map.panTo({lat: 50, lng: 30});
map.panTo(L.latLng(50, 30));</code></pre>
<h3>Creation</h3>
<table data-id='latlng'>
<tr>
<th class="width200">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.latLng</b>(
<nobr>&lt;Number&gt; <i>latitude</i></nobr>,
<nobr>&lt;Number&gt; <i>longitude</i></nobr>,
<nobr>&lt;Number&gt; <i>altitude?</i> )</nobr>
</code></td>
<td>Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).</td>
</tr>
</table>
<h3>Properties</h3>
<table data-id='latlng'>
<tr>
<th class="width100">Property</th>
<th class="width100">Type</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>lat</b></code></td>
<td><code>Number</code></td>
<td>Latitude in degrees.</td>
</tr>
<tr>
<td><code><b>lng</b></code></td>
<td><code>Number</code></td>
<td>Longitude in degrees.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='latlng'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>distanceTo</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>otherLatlng</i> )</nobr>
</code></td>
<td><code>Number</code></td>
<td>Returns the distance (in meters) to the given LatLng calculated using the Haversine formula. See <a href="http://en.wikipedia.org/wiki/Haversine_formula">description on Wikipedia</a></td>
</tr>
<tr>
<td><code><b>equals</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>otherLatlng</i>, </nobr>
<nobr>&lt;Number&gt; <i>maxMargin?</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> 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 <code>maxMargin</code> to a small number.</td>
</tr>
<tr>
<td><code><b>toString</b>()</code></td>
<td><code>String</code></td>
<td>Returns a string representation of the point (for debugging purposes).</td>
</tr>
<tr>
<td><code><b>wrap</b>(
<nobr>&lt;Number&gt; <i>left</i></nobr>,
<nobr>&lt;Number&gt; <i>right</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns a new <code>LatLng</code> object with the longitude wrapped around <code>left</code> and <code>right</code> boundaries (<code><span class="number">-180</span></code> to <code><span class="number">180</span></code> by default).</td>
</tr>
</table>
<h2 id="latlngbounds">LatLngBounds</h2>
<p>Represents a rectangular geographical area on a map.</p>
<pre><code class="javascript">var southWest = L.latLng(40.712, -74.227),
northEast = L.latLng(40.774, -74.125),
bounds = L.latLngBounds(southWest, northEast);</code></pre>
<p>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:</p>
<pre><code class="javascript">map.fitBounds([
[40.712, -74.227],
[40.774, -74.125]
]);</code></pre>
<h3>Creation</h3>
<table data-id='latlngbounds'>
<tr>
<th class="width250">Factory</th>
<th>Description</th>
</tr>
<tr>
<td>
<code><b>L.latLngBounds</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>southWest</i></nobr>,
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>northEast</i></nobr> )</code>
</td>
<td>Creates a latLngBounds object by defining south-west and north-east corners of the rectangle.</td>
</tr>
<tr>
<td><code><b>L.latLngBounds</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>[]&gt; <i>latlngs</i> )</nobr>
</code></td>
<td>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 <a href="#map-fitbounds">fitBounds</a>.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='latlngbounds'>
<tr>
<th class="width300">Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>extend</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>|<a href="#latlngbounds">LatLngBounds</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Extends the bounds to contain the given point or bounds.</td>
</tr>
<tr>
<td><code><b>getSouthWest</b>()</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the south-west point of the bounds.</td>
</tr>
<tr>
<td><code><b>getNorthEast</b>()</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the north-east point of the bounds.</td>
</tr>
<tr>
<td><code><b>getNorthWest</b>()</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the north-west point of the bounds.</td>
</tr>
<tr>
<td><code><b>getSouthEast</b>()</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the south-east point of the bounds.</td>
</tr>
<tr>
<td><code><b>getWest</b>()</code></td>
<td><code>Number</code></td>
<td>Returns the west longitude of the bounds.</td>
</tr>
<tr>
<td><code><b>getSouth</b>()</code></td>
<td><code>Number</code></td>
<td>Returns the south latitude of the bounds.</td>
</tr>
<tr>
<td><code><b>getEast</b>()</code></td>
<td><code>Number</code></td>
<td>Returns the east longitude of the bounds.</td>
</tr>
<tr>
<td><code><b>getNorth</b>()</code></td>
<td><code>Number</code></td>
<td>Returns the north latitude of the bounds.</td>
</tr>
<tr>
<td><code><b>getCenter</b>()</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns the center point of the bounds.</td>
</tr>
<tr>
<td><code><b>contains</b>(
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>otherBounds</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the rectangle contains the given one.</td>
</tr>
<tr>
<td><code><b>contains</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the rectangle contains the given point.</td>
</tr>
<tr>
<td><code><b>intersects</b>(
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>otherBounds</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.</td>
</tr>
<tr>
<td><code><b>overlaps</b>(
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>otherBounds</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.</td>
</tr>
<tr>
<td><code><b>equals</b>(
<nobr>&lt;<a href="#latlngbounds">LatLngBounds</a>&gt; <i>otherBounds</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the rectangle is equivalent (within a small margin of error) to the given bounds.</td>
</tr>
<tr>
<td><code><b>toBBoxString</b>()</code></td>
<td><code>String</code></td>
<td>Returns a string with bounding box coordinates in a <code><span class="string">'southwest_lng,southwest_lat,northeast_lng,northeast_lat'</span></code> format. Useful for sending requests to web services that return geo data.</td>
</tr>
<tr>
<td><code><b>pad</b>(
<nobr>&lt;Number&gt; <i>bufferRatio</i> )</nobr>
</code></td>
<td><code><a href="#latlngbounds">LatLngBounds</a></code></td>
<td>Returns bigger bounds created by extending the current bounds by a given percentage in each direction.</td>
</tr>
<tr>
<td><code><b>isValid</b>()</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the bounds are properly initialized.</td>
</tr>
</table>
<h2 id="point">Point</h2>
<p>Represents a point with x and y coordinates in pixels.</p>
<pre><code>var point = L.point(200, 300);</code></pre>
<p>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:</p>
<pre><code>map.panBy([200, 300]);
map.panBy(L.point(200, 300));</code></pre>
<h3>Creation</h3>
<table data-id='point'>
<tr>
<th class="width250">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.point</b>(
<nobr>&lt;Number&gt; <i>x</i>, &lt;Number&gt; <i>y</i></nobr>,
<nobr>&lt;Boolean&gt; <i>round?</i> )</nobr>
</code></td>
<td>Creates a Point object with the given <code>x</code> and <code>y</code> coordinates. If optional <code>round</code> is set to <code><span class="literal">true</span></code>, rounds the <code>x</code> and <code>y</code> values.</td>
</tr>
</table>
<h3>Properties</h3>
<table data-id='point'>
<tr>
<th class="width100">Property</th>
<th class="width100">Type</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>x</b></code></td>
<td><code>Number</code></td>
<td>The x coordinate.</td>
</tr>
<tr>
<td><code><b>y</b></code></td>
<td><code>Number</code></td>
<td>The y coordinate.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='point'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>add</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>otherPoint</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the result of addition of the current and the given points.</td>
</tr>
<tr>
<td><code><b>subtract</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>otherPoint</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the result of subtraction of the given point from the current.</td>
</tr>
<tr>
<td><code><b>multiplyBy</b>(
<nobr>&lt;Number&gt; <i>number</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the result of multiplication of the current point by the given number.</td>
</tr>
<tr>
<td><code><b>divideBy</b>(
<nobr>&lt;Number&gt; <i>number</i></nobr>,
<nobr>&lt;Boolean&gt; <i>round?</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the result of division of the current point by the given number. If optional <code>round</code> is set to <code><span class="literal">true</span></code>, returns a rounded result.</td>
</tr>
<tr>
<td><code><b>scaleBy</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>scale</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Multiply each coordinate of the current point by each coordinate of <code>scale</code>. In linear algebra terms, multiply the point by the <a href='https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation'>scaling matrix</a> defined by <code>scale</code>.</td>
</tr>
<tr>
<td><code><b>unscaleBy</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>otherPoint</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Inverse of <code>multiplyCoordinates</code>. Divide each coordinate of the current point by each coordinate of <code>scale</code>.</td>
</tr>
<tr>
<td><code><b>distanceTo</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>otherPoint</i> )</nobr>
</code></td>
<td><code>Number</code></td>
<td>Returns the distance between the current and the given points.</td>
</tr>
<tr>
<td><code><b>clone</b>()</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns a copy of the current point.</td>
</tr>
<tr>
<td><code><b>round</b>()</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns a copy of the current point with rounded coordinates.</td>
</tr>
<tr>
<td><code><b>floor</b>()</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns a copy of the current point with floored coordinates (rounded down).</td>
</tr>
<tr>
<td><code><b>ceil</b>()</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns a copy of the current point with ceiled coordinates (rounded up).</td>
</tr>
<tr>
<td><code><b>equals</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>otherPoint</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the given point has the same coordinates.</td>
</tr>
<tr>
<td><code><b>contains</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>otherPoint</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).</td>
</tr>
<tr>
<td><code><b>toString</b>()</code></td>
<td><code>String</code></td>
<td>Returns a string representation of the point for debugging purposes.</td>
</tr>
</table>
<h2 id="bounds">Bounds</h2>
<p>Represents a rectangular area in pixel coordinates.</p>
<pre><code class="javascript">var p1 = L.point(10, 10),
p2 = L.point(40, 60),
bounds = L.bounds(p1, p2);</code></pre>
<p>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:</p>
<pre><code class="javascript">otherBounds.intersects([[10, 10], [40, 60]]);</code></pre>
<h3>Creation</h3>
<table data-id='bounds'>
<tr>
<th class="width250">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.bounds</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>topLeft</i></nobr>,
<nobr>&lt;<a href="#point">Point</a>&gt; <i>bottomRight</i> )</nobr>
</code></td>
<td>Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).</td>
</tr>
<tr>
<td><code><b>L.bounds</b>(
<nobr>&lt;<a href="#point">Point</a>[]&gt; <i>points</i> )</nobr>
</code></td>
<td>Creates a Bounds object defined by the points it contains.</td>
</tr>
</table>
<h3>Properties</h3>
<table data-id='bounds'>
<tr>
<th class="width100">Property</th>
<th class="width100">Type</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>min</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>The top left corner of the rectangle.</td>
</tr>
<tr>
<td><code><b>max</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>The bottom right corner of the rectangle.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='bounds'>
<tr>
<th class="width250">Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>extend</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i> )</nobr>
</code></td>
<td>-</td>
<td>Extends the bounds to contain the given point.</td>
</tr>
<tr>
<td><code><b>getCenter</b>()</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the center point of the bounds.</td>
</tr>
<tr>
<td><code><b>contains</b>(
<nobr>&lt;<a href="#bounds">Bounds</a>&gt; <i>otherBounds</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the rectangle contains the given one.</td>
</tr>
<tr>
<td><code><b>contains</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the rectangle contains the given point.</td>
</tr>
<tr>
<td><code><b>intersects</b>(
<nobr>&lt;<a href="#bounds">Bounds</a>&gt; <i>otherBounds</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.</td>
</tr>
<tr>
<td><code><b>overlaps</b>(
<nobr>&lt;<a href="#bounds">Bounds</a>&gt; <i>otherBounds</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.</td>
</tr>
<tr>
<td><code><b>isValid</b>()</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the bounds are properly initialized.</td>
</tr>
<tr>
<td><code><b>getSize</b>()</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the size of the given bounds.</td>
</tr>
</table>
<h2 id="icon">Icon</h2>
<p>Represents an icon to provide when creating a marker.</p>
<pre><code class="javascript">var myIcon = L.icon({
iconUrl: 'my-icon.png',
iconRetinaUrl: 'my-icon@2x.png',
iconSize: [38, 95],
iconAnchor: [22, 94],
popupAnchor: [-3, -76],
shadowUrl: 'my-icon-shadow.png',
shadowRetinaUrl: 'my-icon-shadow@2x.png',
shadowSize: [68, 95],
shadowAnchor: [22, 94]
});
L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);</code></pre>
<p><code>L.Icon.Default</code> extends <code>L.Icon</code> and is the blue icon Leaflet uses for markers by default.</p>
<h3>Creation</h3>
<table data-id='icon'>
<tr>
<th class="width250">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.icon</b>(
<nobr>&lt;<a href="#icon-options">Icon options</a>&gt; <i>options</i> )</nobr>
</code></td>
<td>Creates an icon instance with the given options.</td>
</tr>
</table>
<h3 id="icon-options">Options</h3>
<table data-id='icon'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>iconUrl</b></code></td>
<td><code>String</code></td>
<td>(required) The URL to the icon image (absolute or relative to your script path).</td>
</tr>
<tr>
<td><code><b>iconRetinaUrl</b></code></td>
<td><code>String</code></td>
<td>The URL to a retina sized version of the icon image (absolute or relative to your script path). Used for Retina screen devices.</td>
</tr>
<tr>
<td><code><b>iconSize</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Size of the icon image in pixels.</td>
</tr>
<tr>
<td><code><b>iconAnchor</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>The 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.</td>
</tr>
<tr>
<td><code><b>shadowUrl</b></code></td>
<td><code>String</code></td>
<td>The URL to the icon shadow image. If not specified, no shadow image will be created.</td>
</tr>
<tr>
<td><code><b>shadowRetinaUrl</b></code></td>
<td><code>String</code></td>
<td>The URL to the retina sized version of the icon shadow image. If not specified, no shadow image will be created. Used for Retina screen devices.</td>
</tr>
<tr>
<td><code><b>shadowSize</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Size of the shadow image in pixels.</td>
</tr>
<tr>
<td><code><b>shadowAnchor</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>The coordinates of the "tip" of the shadow (relative to its top left corner) (the same as <code>iconAnchor</code> if not specified).</td>
</tr>
<tr>
<td><code><b>popupAnchor</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>The coordinates of the point from which popups will "open", relative to the icon anchor.</td>
</tr>
<tr>
<td><code><b>className</b></code></td>
<td><code>String</code></td>
<td>A custom class name to assign to both icon and shadow images. Empty by default.</td>
</tr>
</table>
<h2 id="divicon">DivIcon</h2>
<p>Represents a lightweight icon for markers that uses a simple <code>div</code> element instead of an image.</p>
<pre><code class="javascript">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);</code></pre>
<p>By default, it has a <code><span class="string">'leaflet-div-icon'</span></code> class and is styled as a little white square with a shadow.</p>
<h3>Creation</h3>
<table data-id='divicon'>
<tr>
<th class="width250">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.divIcon</b>(
<nobr>&lt;<a href="#divicon-options">DivIcon options</a>&gt; <i>options</i> )</nobr>
</code></td>
<td>Creates a div icon instance with the given options.</td>
</tr>
</table>
<h3 id="divicon-options">Options</h3>
<table data-id='divicon'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>iconSize</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Size of the icon in pixels. Can be also set through CSS.</td>
</tr>
<tr>
<td><code><b>iconAnchor</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>The 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.</td>
</tr>
<tr>
<td><code><b>popupAnchor</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>The coordinates of the point from which popups will "open", relative to the icon anchor.</td>
</tr>
<tr>
<td><code><b>className</b></code></td>
<td><code>String</code></td>
<td>A custom class name to assign to the icon. <code><span class="string">'leaflet-div-icon'</span></code> by default.</td>
</tr>
<tr>
<td><code><b>html</b></code></td>
<td><code>String</code></td>
<td>A custom HTML code to put inside the div element, empty by default.</td>
</tr>
</table>
<h2 id="control-attribution">Control.Attribution</h2>
<p>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 <code>attributionControl</code> option to <code><span class="literal">false</span></code>, and it fetches attribution texts from layers with <code>getAttribution</code> method automatically. Extends <a href="#control">Control</a>.</p>
<h3>Creation</h3>
<table data-id='control-attribution'>
<tr>
<th class="width200">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.control.attribution</b>(
<nobr>&lt;<a href="#control-attribution-options">Control.Attribution options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Creates an attribution control.</td>
</tr>
</table>
<h3 id="control-attribution-options">Options</h3>
<table data-id='control-attribution'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>position</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'bottomright'</span></code></td>
<td>The position of the control (one of the map corners). See <a href="#control-positions">control positions</a>.</td>
</tr>
<tr>
<td><code><b>prefix</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'Leaflet'</span></code></td>
<td>The HTML text shown before the attributions. Pass <code><span class="literal">false</span></code> to disable.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='control-attribution'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>setPrefix</b>(
<nobr>&lt;String&gt; <i>prefix</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the text before the attributions.</td>
</tr>
<tr>
<td><code><b>addAttribution</b>(
<nobr>&lt;String&gt; <i>text</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds an attribution text (e.g. <code><span class="string">'Vector data &amp;copy; Mapbox'</span></code>).</td>
</tr>
<tr>
<td><code><b>removeAttribution</b>(
<nobr>&lt;String&gt; <i>text</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes an attribution text.</td>
</tr>
</table>
<h2 id="control-layers">Control.Layers</h2>
<p>The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the <a href="http://leafletjs.com/examples/layers-control.html">detailed example</a>). Extends <a href="#control">Control</a>.</p>
<pre><code>var baseLayers = {
"Mapbox": mapbox,
"OpenStreetMap": osm
};
var overlays = {
"Marker": marker,
"Roads": roadsLayer
};
L.control.layers(baseLayers, overlays).addTo(map);</code></pre>
<h3>Creation</h3>
<table data-id='control-layers'>
<tr>
<th>Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.control.layers</b>(
<nobr>&lt;<a href="#control-layers-config">Layer Config</a>&gt; <i>baseLayers?</i></nobr>,
<nobr>&lt;<a href="#control-layers-config">Layer Config</a>&gt; <i>overlays?</i></nobr>,
<nobr>&lt;<a href="#control-layers-options">Control.Layers options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>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.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='control-layers'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>addBaseLayer</b>(
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i></nobr>,
<nobr>&lt;String&gt; <i>name</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds a base layer (radio button entry) with the given name to the control.</td>
</tr>
<tr>
<td><code><b>addOverlay</b>(
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i></nobr>,
<nobr>&lt;String&gt; <i>name</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds an overlay (checkbox entry) with the given name to the control.</td>
</tr>
<tr>
<td><code><b>removeLayer</b>(
<nobr>&lt;<a href="#layer">Layer</a>&gt; <i>layer</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Remove the given layer from the control.</td>
</tr>
</table>
<h3 id="control-layers-options">Options</h3>
<table data-id='control-layers'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>position</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'topright'</span></code></td>
<td>The position of the control (one of the map corners). See <a href="#control-positions">control positions</a>.</td>
</tr>
<tr>
<td><code><b>collapsed</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>If <code><span class="literal">true</span></code>, the control will be collapsed into an icon and expanded on mouse hover or touch.</td>
</tr>
<tr>
<td><code><b>autoZIndex</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>If <code><span class="literal">true</span></code>, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.</td>
</tr>
</table>
<h3 id="control-layers-config">Layer Config</h3>
<p>An object literal with layer names as keys and layer objects as values:</p>
<pre><code>{
"&lt;someName1&gt;": layer1,
"&lt;someName2&gt;": layer2
}</code></pre>
<p>The layer names can contain HTML, which allows you to add additional styling to the items:</p>
<pre><code>{"&lt;img src='my-layer-icon' /&gt; &lt;span class='my-layer-item'&gt;My Layer&lt;/span&gt;": myLayer}</code></pre>
<h3>Events</h3>
<p>You can subscribe to the following events on the <a href="#map-class">Map</a> object using <a href="#events">these methods</a>.</p>
<table data-id='control-layers'>
<tr>
<th class="width100">Event</th>
<th class="width100">Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>baselayerchange</b></code></td>
<td><code><a href="#layers-control-event">LayersControlEvent</a></code></td>
<td>Fired when the base layer is changed through the control.</td>
</tr>
<tr>
<td><code><b>overlayadd</b></code></td>
<td><code><a href="#layers-control-event">LayersControlEvent</a></code></td>
<td>Fired when an overlay is selected through the control.</td>
</tr>
<tr>
<td><code><b>overlayremove</b></code></td>
<td><code><a href="#layers-control-event">LayersControlEvent</a></code></td>
<td>Fired when an overlay is deselected through the control.</td>
</tr>
</table>
<h2 id="control-scale">Control.Scale</h2>
<p>A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends <a href="#control">Control</a>.</p>
<pre><code>L.control.scale().addTo(map);</code></pre>
<h3>Creation</h3>
<table data-id='control-scale'>
<tr>
<th class="width200">Factory</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.control.scale</b>(
<nobr>&lt;<a href="#control-scale-options">Control.Scale options</a>&gt; <i>options?</i> )</nobr>
</code></td>
<td>Creates an scale control with the given options.</td>
</tr>
</table>
<h3 id="control-scale-options">Options</h3>
<table data-id='control-scale'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>position</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'bottomleft'</span></code></td>
<td>The position of the control (one of the map corners). See <a href="#control-positions">control positions</a>.</td>
</tr>
<tr>
<td><code><b>maxWidth</b></code></td>
<td><code>Number</code></td>
<td><code><span class="number">100</span></code></td>
<td>Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).</td>
</tr>
<tr>
<td><code><b>metric</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Whether to show the metric scale line (m/km).</td>
</tr>
<tr>
<td><code><b>imperial</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code></td>
<td>Whether to show the imperial scale line (mi/ft).</td>
</tr>
<tr>
<td><code><b>updateWhenIdle</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">false</span></code></td>
<td>If <code><span class="literal">true</span></code>, the control is updated on <code>moveend</code>, otherwise it's always up-to-date (updated on <code>move</code>).</td>
</tr>
</table>
<h2 id="events">Events methods</h2>
<p>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 <code><span class="string">'click'</span></code> event).</p>
<h3>Example</h3>
<pre><code class="javascript">map.on('click', function(e) {
alert(e.latlng);
});</code></pre>
<p>Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:</p>
<pre><code>function onClick(e) { ... }
map.on('click', onClick);
map.off('click', onClick);</code></pre>
<h3>Methods</h3>
<table data-id='events'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>on</b>(
<nobr>&lt;String&gt; <i>type</i></nobr>,
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds a listener function (<code>fn</code>) to a particular event type of the object. You can optionally specify the context of the listener (object the <code><span class="keyword">this</span></code> keyword will point to). You can also pass several space-separated types (e.g. <code><span class="string">'click dblclick'</span></code>).</td>
</tr>
<tr>
<td><code><b>once</b>(
<nobr>&lt;String&gt; <i>type</i></nobr>,
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>The same as above except the listener will only get fired once and then removed.</td>
</tr>
<tr>
<td><code><b>on</b>(
<nobr>&lt;Object&gt; <i>eventMap</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds a set of type/listener pairs, e.g. <code>{click: onClick, mousemove: onMouseMove}</code></td>
</tr>
<tr>
<td><code><b>off</b>(
<nobr>&lt;String&gt; <i>type</i></nobr>,
<nobr>&lt;Function&gt; <i>fn?</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to <code>on</code>, you must pass the same context to <code>off</code> in order to remove the listener.</td>
</tr>
<tr>
<td><code><b>off</b>(
<nobr>&lt;Object&gt; <i>eventMap</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes a set of type/listener pairs.</td>
</tr>
<tr>
<td><code><b>off</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes all listeners to all events on the object.</td>
</tr>
<tr>
<td><code><b>listens</b>(
<nobr>&lt;String&gt; <i>type</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if a particular event type has any listeners attached to it.</td>
</tr>
<tr>
<td><code><b>fire</b>(
<nobr>&lt;String&gt; <i>type</i></nobr>,
<nobr>&lt;Object&gt; <i>data?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Fires an event of the specified type. You can optionally provide an data object &mdash; the first argument of the listener function will contain its properties.</td>
</tr>
<tr>
<td><code><b>addEventListener</b>( &hellip; )</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Alias to <code>on</code>.</td>
</tr>
<tr>
<td><code><b>addOneTimeEventListener</b>( &hellip; )</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Alias to <code>once</code>.</td>
</tr>
<tr>
<td><code><b>removeEventListener</b>( &hellip; )</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Alias to <code>off</code>.</td>
</tr>
<tr>
<td><code><b>clearAllEventListeners</b>()</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Alias to <code>off()</code>.</td>
</tr>
<tr>
<td><code><b>hasEventListeners</b>( &hellip; )</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Alias to <code>listens</code>.</td>
</tr>
<tr>
<td><code><b>fireEvent</b>( &hellip; )</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Alias to <code>fire</code>.</td>
</tr>
</table>
<h2 id="layers">Layer methods</h2>
A set of methods inherited from the <a href="#layer">Layer</a> base class that all Leaflet layers use.
<pre><code class="javascript">var layer = L.Marker(latlng).addTo(map);
layer.addTo(map);
layer.remove();</code></pre>
<h3>Methods</h3>
<table data-id="layer">
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>addTo</b>(<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i>)</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Adds the layer to the given map.</td>
</tr>
<tr>
<td><code><b>removeFrom</b>(<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i>)</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Removes the layer to the given map.</td>
</tr>
<tr>
<td><code><b>remove</b>()</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Removes the layer from the map it is currently active on.</td>
</tr>
<tr>
<td><code><b>getPane</b>(<nobr>&lt;String&gt; <i>name?</i>)</nobr></code></td>
<td><code>HTMLElement</code></td>
<td>Returns the <code>HTMLElement</code> representing the named pane on the map. Or if <code>name</code> is omitted the pane for this layer.</td>
</tr>
</table>
<h2 id="popups">Popup methods</h2>
A set of methods inherited from the <a href="#layer">Layer</a> base class that all Leaflet layers use. These methods provide convenient ways of binding popups to any layer.
<pre><code class="javascript">var layer = L.Polgon(latlngs).bindPopup('Hi There!').addTo(map);
layer.openPopup();
layer.closePopup();
</code></pre>
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.
<h3>Methods</h3>
<table>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>bindPopup</b>(<nobr>&lt;String|HTMLElement|Function|<a href="popup">Popup</a>&gt;</nobr> <i>content</i>, <nobr>&lt;<a href="#popup-options">PopupOptions</a>&gt; <i>options?</i>)</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Binds the passed <code>content</code> to the layer and sets up the necessary event listeners. If a <code>Function</code> is passed, the function will receive a layer as the first argument and should return a <code>String</code> or <code>HTMLElement</code>.</td>
<pre><code class="javascript">featureGroup.bindPopup(function(layer){
return "a unique template for this layer.";
});</code></pre>
</tr>
<tr>
<td><code><b>unbindPopup</b>()</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Removes the popup previously bound with <code>bindPopup</code>.</td>
</tr>
<tr>
<td><code><b>openPopup</b>(<a href="#latlng">LatLng</a> <i>latlng?</i>)</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Opens the bound popup at the specified <code>latlng</code> or at the default popup anchor if no <code>latlng</code> is passed.</td>
</tr>
<tr>
<td><code><b>closePopup</b>()</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Closes the popup if it is open.</td>
</tr>
<tr>
<td><code><b>togglePopup</b>()</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Opens or closes the popup depending on its current state.</td>
</tr>
<tr>
<td><code><b>setPopupContent</b>(<nobr>&lt;String|HTMLElement|<a href="popup">Popup</a>&gt;</nobr> <i>content</i>, <nobr>&lt;<a href="#popup-options">PopupOptions</a>&gt; <i>options?</i>)</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Sets the content of the popup.</td>
</tr>
<tr>
<td><code><b>getPopup</b>()</nobr></code></td>
<td><code><a href="#popup">Popup</a></code></td>
<td>Returns the popup bound to this layer.</td>
</tr>
</table>
<h2 id="browser">Browser</h2>
<p>A namespace with properties for browser/feature detection used by Leaflet internally.</p>
<pre><code>if (L.Browser.ie6) {
alert('Upgrade your browser, dude!');
}</code></pre>
<table data-id='browser'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>ie</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for all Internet Explorer versions.</td>
</tr>
<tr>
<td><code><b>ie6</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for Internet Explorer 6.</td>
</tr>
<tr>
<td><code><b>ie7</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for Internet Explorer 7.</td>
</tr>
<tr>
<td><code><b>webkit</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for WebKit-based browsers like Chrome and Safari (including mobile versions).</td>
</tr>
<tr>
<td><code><b>webkit3d</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for WebKit-based browsers that support CSS 3D transformations.</td>
</tr>
<!--<tr>
<td><code><b>gecko</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for Gecko-based browsers like Firefox and Mozilla.</td>
</tr>
<tr>
<td><code><b>opera</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for Opera.</td>
</tr>-->
<tr>
<td><code><b>android</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for Android mobile browser.</td>
</tr>
<tr>
<td><code><b>android23</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for old Android stock browsers (2 and 3).</td>
</tr>
<tr>
<td><code><b>mobile</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for modern mobile browsers (including iOS Safari and different Android browsers).</td>
</tr>
<tr>
<td><code><b>mobileWebkit</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for mobile WebKit-based browsers.</td>
</tr>
<tr>
<td><code><b>mobileOpera</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for mobile Opera.</td>
</tr>
<tr>
<td><code><b>touch</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for all browsers on touch devices.</td>
</tr>
<tr>
<td><code><b>msTouch</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for browsers with Microsoft touch model (e.g. IE10).</td>
</tr>
<tr>
<td><code><b>retina</b></code></td>
<td><code>Boolean</code></td>
<td><code><span class="literal">true</span></code> for devices with Retina screens.</td>
</tr>
</table>
<h2 id="util">Util</h2>
<p>Various utility functions, used by Leaflet internally.</p>
<h3>Methods</h3>
<table data-id='util'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>extend</b>(
<nobr>&lt;Object&gt; <i>dest</i></nobr>,
<nobr>&lt;Object&gt; <i>src?..</i> )</nobr>
</code></td>
<td><code>Object</code></td>
<td>Merges the properties of the <code>src</code> object (or multiple objects) into <code>dest</code> object and returns the latter. Has an <code>L.extend</code> shortcut.</td>
</tr>
<tr>
<td><code><b>bind</b>(
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Object&gt; <i>obj</i></nobr>,
<nobr>&lt;Any&gt; <i>arg1?</i></nobr>,
<nobr>&lt;Any&gt; <i>arg2?</i></nobr>,
<nobr>&lt;Any&gt; <i>arg3?</i></nobr>, &hellip; )
</code></td>
<td><code>Function</code></td>
<td>Returns a function which executes function <code>fn</code> with the given scope <code>obj</code> (so that <code><span class="keyword">this</span></code> keyword refers to <code>obj</code> inside the function code). 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 <code>L.bind</code> shortcut. Works exactly like <a href='https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind'><code>Function.prototype.bind</code></a> in modern browsers compliant with ECMAScript 5.</td>
</tr>
<tr>
<td><code><b>stamp</b>( &lt;Object&gt; <i>obj</i></nobr> )<nobr></code></td>
<td><code>String</code></td>
<td>Applies a unique key to the object and returns that key. Has an <code>L.stamp</code> shortcut.</td>
</tr>
<tr>
<td><code><b>requestAnimFrame</b>(
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i></nobr>,
<nobr>&lt;Boolean&gt; <i>immediate?</i></nobr>,
<nobr>&lt;HTMLElement&gt; <i>element?</i> )</nobr>
</code></td>
<td><code>Number</code></td>
<td>Schedules <code>fn</code> to be executed when the browser repaints. When <code>immediate</code> is set, <code>fn</code> is called immediately if the browser doesn't have native support for <code>requestAnimationFrame</code>, otherwise it's delayed. Returns an id that can be used to cancel the request</td>
</tr>
<tr>
<td><code><b>cancelAnimFrame</b>(
<nobr>&lt;Number&gt; <i>id</i> )</nobr>
</code></td>
<td>-</td>
<td>Cancels a previous request to <code>requestAnimFrame</code>.</td>
</tr>
<tr>
<td><code><b>throttle</b>(
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Number&gt; <i>time</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code>Function</code></td>
<td>Returns a wrapper around the function <code>fn</code> that makes sure it's called not more often than a certain time interval <code>time</code> (in milliseconds), but as fast as possible otherwise (for example, it is used for checking and requesting new tiles while dragging the map), optionally passing the scope (<code>context</code>) in which the function will be called.</td>
</tr>
<tr>
<td><code><b>falseFn</b>()</code></td>
<td><code>Function</code></td>
<td>Returns a function which always returns <code><span class="literal">false</span></code>.</td>
</tr>
<tr>
<td><code><b>formatNum</b>(
<nobr>&lt;Number&gt; <i>num</i></nobr>,
<nobr>&lt;Number&gt; <i>digits</i> )</nobr>
</code></td>
<td><code>Number</code></td>
<td>Returns the number <code>num</code> rounded to <code>digits</code> decimals.</td>
</tr>
<tr>
<td><code><b>wrapNum</b>(
<nobr>&lt;Number&gt; <i>num</i></nobr>,
<nobr>&lt;Array&gt; <i>range</i></nobr>,
<nobr>&lt;Boolean&gt; <i>includeMax</i> )</nobr>
</code></td>
<td><code>Number</code></td>
<td>Returns the number <code>num</code> modulo <code>range</code> in such a way so it lies within <code>range[0]</code> and <code>range[1]</code>. The returned value will be always smaller than <code>range[1]</code> unless <code>includeMax</code> is set to <code><span class="literal">true</span></code>.</td>
</tr>
<tr>
<td><code><b>splitWords</b>(
<nobr>&lt;String&gt; <i>str</i> )</nobr>
</code></td>
<td><code>String[]</code></td>
<td>Trims and splits the string on whitespace and returns the array of parts.</td>
</tr>
<tr>
<td><code><b>setOptions</b>(
<nobr>&lt;Object&gt; <i>obj</i></nobr>,
<nobr>&lt;Object&gt; <i>options</i> )</nobr>
</code></td>
<td><code>Object</code></td>
<td>Merges the given properties to the <code>options</code> of the <code>obj</code> object, returning the resulting options. See <a href="#class-options">Class options</a>. Has an <code>L.setOptions</code> shortcut.</td>
</tr>
<tr>
<td><code><b>getParamString</b>(
<nobr>&lt;Object&gt; <i>obj</i> )</nobr>
</code></td>
<td><code>String</code></td>
<td>Converts an object into a parameter URL string, e.g. <nobr><code>{a: "foo", b: "bar"}</code></nobr> translates to <code><span class="string">'?a=foo&amp;b=bar'</span></code>.</td>
</tr>
<tr id="util-template">
<td><code><b>template</b>(
<nobr>&lt;String&gt; <i>str</i>, &lt;Object&gt; <i>data</i> )</nobr>
</code></td>
<td><code>String</code></td>
<td>Simple templating facility, accepts a template string of the form <code><span class="string">'Hello {a}, {b}'</span></code> and a data object like <code>{a: 'foo', b: 'bar'}</code>, returns evaluated string (<code><span class="string">'Hello foo, bar'</span></code>). You can also specify functions instead of strings for data values &mdash; they will be evaluated passing <code>data</code> as an argument.</td>
</tr>
<tr>
<td><code><b>isArray</b>(
<nobr>&lt;Object&gt; <i>obj</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the given object is an array.</td>
</tr>
<tr>
<td><code><b>trim</b>(
<nobr>&lt;String&gt; <i>str</i> )</nobr>
</code></td>
<td><code>String</code></td>
<td>Trims the whitespace from both ends of the string and returns the result.</td>
</tr>
</table>
<h3>Properties</h3>
<table data-id='util'>
<tr>
<th>Property</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>emptyImageUrl</b></code></td>
<td><code>String</code></td>
<td>Data 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 <code>src</code> to this string).</td>
</tr>
</table>
<h2 id="transformation">Transformation</h2>
<p>Represents an affine transformation: a set of coefficients <code>a</code>, <code>b</code>, <code>c</code>, <code>d</code> for transforming a point of a form <code>(x, y)</code> into <code>(a*x + b, c*y + d)</code> and doing the reverse. Used by Leaflet in its projections code.</p>
<pre><code>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)
</code></pre>
<h3>Creation</h3>
<table data-id='transformation'>
<tr>
<th class="width250">Creation</th>
<th>Description</th>
</tr>
<tr>
<td><code><nobr><span class='keyword'>new</span> <b>L.Transformation</b>(</nobr>
<nobr>&lt;Number&gt; <i>a</i></nobr>,
<nobr>&lt;Number&gt; <i>b</i></nobr>,
<nobr>&lt;Number&gt; <i>c</i></nobr>,
<nobr>&lt;Number&gt; <i>d</i> )</nobr>
</code></td>
<td>Creates a transformation object with the given coefficients.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='transformation'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>transform</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i></nobr>,
<nobr>&lt;Number&gt; <i>scale?</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns a transformed point, optionally multiplied by the given scale. Only accepts real <code>L.Point</code> instances, not arrays.</td>
</tr>
<tr>
<td><code><b>untransform</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i></nobr>,
<nobr>&lt;Number&gt; <i>scale?</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the reverse transformation of the given point, optionally divided by the given scale. Only accepts real <code>L.Point</code> instances, not arrays.</td>
</tr>
</table>
<h2 id="lineutil">LineUtil</h2>
<p>Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.</p>
<h3>Methods</h3>
<table data-id='lineutil'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>simplify</b>(
<nobr>&lt;<a href="#point">Point</a>[]&gt; <i>points</i></nobr>,
<nobr>&lt;Number&gt; <i>tolerance</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a>[]</code></td>
<td>Dramatically reduces the number of points in a polyline while retaining its shape and returns a new array of simplified points. Used for a huge performance boost when processing/displaying Leaflet polylines for each zoom level and also reducing visual noise. <code>tolerance</code> affects the amount of simplification (lesser value means higher quality but slower and with more points). Also released as a separated micro-library <a href="http://mourner.github.com/simplify-js/">Simplify.js</a>.</td>
</tr>
<tr>
<td><code><b>pointToSegmentDistance</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>p</i></nobr>,
<nobr>&lt;<a href="#point">Point</a>&gt; <i>p1</i></nobr>,
<nobr>&lt;<a href="#point">Point</a>&gt; <i>p2</i> )</nobr>
</code></td>
<td><code>Number</code></td>
<td>Returns the distance between point <code>p</code> and segment <code>p1</code> to <code>p2</code>.</td>
</tr>
<tr>
<td><code><b>closestPointOnSegment</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>p</i></nobr>,
<nobr>&lt;<a href="#point">Point</a>&gt; <i>p1</i></nobr>,
<nobr>&lt;<a href="#point">Point</a>&gt; <i>p2</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Returns the closest point from a point <code>p</code> on a segment <code>p1</code> to <code>p2</code>.</td>
</tr>
<tr>
<td><code><b>clipSegment</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>a</i></nobr>,
<nobr>&lt;<a href="#point">Point</a>&gt; <i>b</i></nobr>,
<nobr>&lt;<a href="#bounds">Bounds</a>&gt; <i>bounds</i> )</nobr>
</code></td>
<td><code>-</code></td>
<td>Clips the segment <code>a</code> to <code>b</code> by rectangular bounds (modifying the segment points directly!). Used by Leaflet to only show polyline points that are on the screen or near, increasing performance.</td>
</tr>
</table>
<h2 id="polyutil">PolyUtil</h2>
<p>Various utility functions for polygon geometries.</p>
<h3>Methods</h3>
<table data-id='polylineutil'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>clipPolygon</b>(
<nobr>&lt;<a href="#point">Point</a>[]&gt; <i>points</i></nobr>,
<nobr>&lt;<a href="#bounds">Bounds</a>&gt; <i>bounds</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a>[]</code></td>
<td>Clips the polygon geometry defined by the given points by rectangular bounds. 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.</td>
</tr>
<tr>
<td><code><b>rectanglesToPolygons</b>(
<nobr>&lt;<a href="#rectangle">Rectangles</a>[]&gt; <i>rectangles</i></nobr>,
<nobr>&lt;<a href="#tilelayer">TileLayer</a>&gt; <i>tilelayer</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a>[]</code></td>
<td>Accepts a array of rectangles and convert that into a polygon. Returned value consists of an array of <a href="#latlng">LatLng</a> pairs.</td>
</tr>
</table>
<h2 id="domevent">DomEvent</h2>
<p>Utility functions to work with the DOM events, used by Leaflet internally.</p>
<h3>Methods</h3>
<table data-id='domevent'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>on</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;String&gt; <i>types</i></nobr>,
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds a listener function (<code>fn</code>) to a particular DOM event type of the element <code>el</code>. You can optionally specify the context of the listener (object the <code><span class="keyword">this</span></code> keyword will point to). You can also pass several space-separated types (e.g. <code><span class="string">'click dblclick'</span></code>).</td>
</tr>
<tr>
<td><code><b>on</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;Object&gt; <i>eventMap</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds a set of type/listener pairs, e.g. <code>{click: onClick, mousemove: onMouseMove}</code></td>
</tr>
<tr>
<td><code><b>off</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;String&gt; <i>types</i></nobr>,
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes 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 <code>on</code>, you must pass the same context to <code>off</code> in order to remove the listener.</td>
</tr>
<tr>
<td><code><b>off</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;Object&gt; <i>eventMap</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes a set of type/listener pairs.</td>
</tr> <tr>
<td><code><b>addListener</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;String&gt; <i>types</i></nobr>,
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Alias to <code>on</code>.</td>
</tr>
<tr>
<td><code><b>removeListener</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;String&gt; <i>types</i></nobr>,
<nobr>&lt;Function&gt; <i>fn</i></nobr>,
<nobr>&lt;Object&gt; <i>context?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Alias to <code>off</code>.</td>
</tr>
<tr>
<td><code><b>stopPropagation</b>(
<nobr>&lt;DOMEvent&gt; <i>e</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Stop the given event from propagation to parent elements. Used inside the listener functions:
<pre><code>L.DomEvent.addListener(div, 'click', function (e) {
L.DomEvent.stopPropagation(e);
});</code></pre>
</td>
</tr>
<tr>
<td><code><b>preventDefault</b>(
<nobr>&lt;DOMEvent&gt; <i>e</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Prevents the default action of the event from happening (such as following a link in the <code>href</code> of the <code>a</code> element, or doing a <code>POST</code> request with page reload when <code>form</code> is submitted). Use it inside listener functions.</td>
</tr>
<tr>
<td><code><b>stop</b>(
<nobr>&lt;DOMEvent&gt; <i>e</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Does <code>stopPropagation</code> and <code>preventDefault</code> at the same time.</td>
</tr>
<tr>
<td><code><b>disableClickPropagation</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds <code>stopPropagation</code> to the element's <code><span class="string">'click'</span></code>, <code><span class="string">'doubleclick'</span></code>, <code><span class="string">'mousedown'</span></code> and <code><span class="string">'touchstart'</span></code> events.</td>
</tr>
<tr>
<td><code><b>getMousePosition</b>(
<nobr>&lt;DOMEvent&gt; <i>e</i></nobr>,
<nobr>&lt;HTMLElement&gt; <i>container?</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Gets normalized mouse position from a DOM event relative to the container or to the whole page if not specified.</td>
</tr>
<tr>
<td><code><b>getWheelDelta</b>(
<nobr>&lt;DOMEvent&gt; <i>e</i> )</nobr>
</code></td>
<td><code>Number</code></td>
<td>Gets normalized wheel delta from a <code>mousewheel</code> DOM event.</td>
</tr>
</table>
<h2 id="domutil">DomUtil</h2>
<p>Utility functions to work with the DOM tree, used by Leaflet internally.</p>
<h3>Methods</h3>
<table data-id='domutil'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>get</b>(
<nobr>&lt;String or HTMLElement&gt; <i>id</i> )</nobr>
</code></td>
<td><code>HTMLElement</code></td>
<td>Returns an element with the given id if a string was passed, or just returns the element if it was passed directly.</td>
</tr>
<tr>
<td><code><b>getStyle</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;String&gt; <i>style</i> )</nobr>
</code></td>
<td><code>String</code></td>
<td>Returns the value for a certain style attribute on an element, including computed values or values set through CSS.</td>
</tr>
<tr>
<td><code><b>setStyle</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;String&gt; <i>style</i> )</nobr>
<nobr>&lt;String&gt; <i>value</i> )</nobr>
</code></td>
<td><code>String</code></td>
<td>Sets the value for a certain style attribute on an element, including computed values or values set through CSS.</td>
</tr>
<tr>
<td><code><b>create</b>(
<nobr>&lt;String&gt; <i>tagName</i></nobr>,
<nobr>&lt;String&gt; <i>className</i></nobr>,
<nobr>&lt;HTMLElement&gt; <i>container?</i> )</nobr>
</code></td>
<td><code>HTMLElement</code></td>
<td>Creates an element with <code>tagName</code>, sets the <code>className</code>, and optionally appends it to <code>container</code> element.</td>
</tr>
<tr>
<td><code><b>createWithId</b>(
<nobr>&lt;String&gt; <i>tagName</i></nobr>,
<nobr>&lt;String&gt; <i>Id</i></nobr>,
<nobr>&lt;HTMLElement&gt; <i>container?</i> )</nobr>
</code></td>
<td><code>HTMLElement</code></td>
<td>Creates an element with <code>tagName</code>, sets the <code>id</code>, and optionally appends it to <code>container</code> element.</td>
</tr>
<tr>
<td><code><b>remove</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i> )</nobr>
</code></td>
<td>-</td>
<td>Removes <code>el</code> from its parent element.</td>
</tr>
<tr>
<td><code><b>empty</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i> )</nobr>
</code></td>
<td>-</td>
<td>Removes all of <code>el</code>'s children elements from <code>el</code>.</td>
</tr>
<tr>
<td><code><b>disableTextSelection</b>()</code></td>
<td>-</td>
<td>Makes sure text cannot be selected, for example during dragging.</td>
</tr>
<tr>
<td><code><b>enableTextSelection</b>()</code></td>
<td>-</td>
<td>Makes text selection possible again.</td>
</tr>
<tr>
<td><code><b>hasClass</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;String&gt; <i>name</i> )</nobr>
</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the element class attribute contains <code>name</code>.</td>
</tr>
<tr>
<td><code><b>falseFn</b>()</code></td>
<td><code>Function</code></td>
<td>Always returns <code><span class="literal">false</span></code>.</td>
</tr>
<tr>
<td><code><b>addClass</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;String&gt; <i>name</i> )</nobr>
</code></td>
<td>-</td>
<td>Adds <code>name</code> to the element's class attribute.</td>
</tr>
<tr>
<td><code><b>removeClass</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;String&gt; <i>name</i> )</nobr>
</code></td>
<td>-</td>
<td>Removes <code>name</code> from the element's class attribute.</td>
</tr>
<tr>
<td><code><b>getClass</b>(
<nobr>&lt;Element&gt; <i>el</i> )</nobr>
</code></td>
<td>&lt;String&gt;</td>
<td>Returns the element's CSS class (for HTML elements) or SVG class (for SVG elements).</td>
</tr>
<tr>
<td><code><b>setClass</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;String&gt; <i>name</i> )</nobr>
</code></td>
<td>-</td>
<td>Sets the element's CSS class (for HTML elements) or SVG class (for SVG elements).</td>
</tr>
<tr>
<td><code><b>setOpacity</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;Number&gt; <i>value</i> )</nobr>
</code></td>
<td>-</td>
<td>Set the opacity of an element (including old IE support). Value must be from <code>0</code> to <code>1</code>.</td>
</tr>
<tr>
<td><code><b>testProp</b>(
<nobr>&lt;String[]&gt; <i>props</i> )</nobr>
</code></td>
<td><code>String</code> or <code><span class="literal">false</span></code></td>
<td>Goes 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 <code><span class="literal">false</span></code>. Useful for vendor-prefixed styles like <code>transform</code>.</td>
</tr>
<tr>
<td><code><b>setTransform</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;<a href="#point">Point</a>&gt; <i>offset</i></nobr>,
<nobr>&lt;Number&gt; <i>scale?</i> )</nobr>
</code></td>
<td>-</td>
<td>Resets the 3D CSS transform of <code>el</code> so it is translated by <code>offset</code> and optionally scaled by <code>scale</code>. Does not have an effect if the browser doesn't support 3D CSS transforms.</td>
</tr>
<tr>
<td><code><b>setPosition</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i></nobr>,
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i> )</nobr>
</code></td>
<td>-</td>
<td>Sets the position of an element to coordinates specified by <code>point</code>, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers).</td>
</tr>
<tr>
<td><code><b>getPosition</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i> )</nobr>
</code></td>
<td><a href="#point">Point</a></td>
<td>Returns the coordinates of an element previously positioned with <code>setPosition</code>.</td>
</tr>
<tr>
<td><code><b>disableImageDrag</b>()</nobr></code></td>
<td>-</td>
<td>Prevents the user from generating <code>dragstart</code> DOM events, usually generated when the user drags an image. Used internally by Leaflet to override the behaviour of any click-and-drag interaction on the map. Affects drag interactions on the whole document.</td>
</tr>
<tr>
<td><code><b>enableImageDrag</b>()</nobr></code></td>
<td>-</td>
<td>Cancels the effects of a previous <a href="#domutil-disableimagedrag">L.DomUtil.disableImageDrag</a>.</td>
</tr>
<tr>
<td><code><b>preventOutline</b>(
<nobr>&lt;HTMLElement&gt; <i>el</i> )</nobr>
</code></td>
<td>-</td>
<td>Makes the <a href="https://developer.mozilla.org/docs/Web/CSS/outline">outline</a> of the element <code>el</code> invisible. Used internally by Leaflet to prevent focusable elements from displaying an outline when the user performs a drag interaction on them.</td>
</tr>
<tr>
<td><code><b>restoreOutline</b>()</nobr></code></td>
<td>-</td>
<td>Cancels the effects of a previous <a href="#domutil-preventoutline">L.DomUtil.preventOutline</a>.</td>
</tr>
</table>
<h3>Properties</h3>
<table data-id='domutil'>
<tr>
<th>Property</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>TRANSITION</b></nobr>
</code></td>
<td><code>String</code></td>
<td>Vendor-prefixed transition style name (e.g. <code><span class="string">'webkitTransition'</span></code> for WebKit).</td>
</tr>
<tr>
<td><code><b>TRANSFORM</b></nobr>
</code></td>
<td><code>String</code></td>
<td>Vendor-prefixed transform style name.</td>
</tr>
</table>
<h2 id="posanimation">PosAnimation</h2>
<p>Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.</p>
<pre><code class="javascript">var fx = new L.PosAnimation();
fx.run(el, [300, 500], 0.5);</code></pre>
<h3>Creation</h3>
<table data-id='posanimation'>
<tr>
<th class="width200">Creation</th>
<th>Description</th>
</tr>
<tr>
<td><code><span class='keyword'>new</span> <b>L.PosAnimation</b>()</code></td>
<td>Creates a PosAnimation object.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='posanimation'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>run</b>(
<nobr>&lt;HTMLElement&gt; <i>element</i>,</nobr>
<nobr>&lt;<a href="#point">Point</a>&gt; <i>newPos</i></nobr>,
<nobr>&lt;Number&gt; <i>duration?</i></nobr>,
<nobr>&lt;Number&gt; <i>easeLinearity?</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Run an animation of a given element to a new position, optionally setting duration in seconds (<code><span class="number">0.25</span></code> by default) and easing linearity factor (3rd argument of the <a href="http://cubic-bezier.com/#0,0,.5,1">cubic bezier curve</a>, <code><span class="number">0.5</span></code> by default)</td>
</tr>
</table>
<h3>Events</h3>
<p>You can subscribe to the following events using <a href="#events">these methods</a>.</p>
<table data-id='posanimation'>
<tr>
<th class="width100">Event</th>
<th class="width100">Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>start</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the animation starts.</td>
</tr>
<tr>
<td><code><b>step</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired continuously during the animation.</td>
</tr>
<tr>
<td><code><b>end</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the animation ends.</td>
</tr>
</table>
<h2 id="draggable">Draggable</h2>
<p>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 <a href="#domutil-setposition">DomUtil#setPosition</a></p>
<pre><code class="javascript">var draggable = new L.Draggable(elementToDrag);
draggable.enable();
</code></pre>
<h3>Creation</h3>
<table data-id='draggable'>
<tr>
<th class="width200">Creation</th>
<th>Description</th>
</tr>
<tr>
<td><code><b><span class='keyword'>new</span> L.Draggable</b>(
<nobr>&lt;HTMLElement&gt; <i>element</i>,</nobr>
<nobr>&lt;HTMLElement&gt; <i>dragHandle?</i> )</nobr>
</code></td>
<td>Creates a Draggable object for moving the given element when you start dragging the <code>dragHandle</code> element (equals the element itself by default).</td>
</tr>
</table>
<h3>Events</h3>
<p>You can subscribe to the following events using <a href="#events">these methods</a>.</p>
<table data-id='draggable'>
<tr>
<th class="width100">Event</th>
<th class="width100">Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>dragstart</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired when the dragging starts.</td>
</tr>
<tr>
<td><code><b>predrag</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired continuously during dragging <em>before</em> each corresponding update of the element position.</td>
</tr>
<tr>
<td><code><b>drag</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired continuously during dragging.</td>
</tr>
<tr>
<td><code><b>dragend</b></code></td>
<td><code><a href="#dragend-event">DragEndEvent</a></code></td>
<td>Fired when the dragging ends.</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='draggable'>
<tr>
<th class="width100">Method</th>
<th class="width100">Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>enable</b>()</code></td>
<td><code>-</code></td>
<td>Enables the dragging ability.</td>
</tr>
<tr>
<td><code><b>disable</b>()</code></td>
<td><code>-</code></td>
<td>Disables the dragging ability.</td>
</tr>
</table>
<!--<h3>Static Properties</h3>
<table>
<tr>
<th>Property</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>START</b></code></td>
<td><code>String</code></td>
<td>Name of the DOM event that initiates dragging. <code><span class="string">'mousedown'</span></code> for desktop browsers, <code><span class="string">'touchstart'</span></code> for mobile devices.</td>
</tr>
<tr>
<td><code><b>MOVE</b></code></td>
<td><code>String</code></td>
<td>Name of the DOM event for drag moving. <code><span class="string">'mousemove'</span></code> for desktop browsers, <code><span class="string">'touchmove'</span></code> for mobile devices.</td>
</tr>
<tr>
<td><code><b>END</b></code></td>
<td><code>String</code></td>
<td>Name of the DOM event that ends dragging. <code><span class="string">'mouseup'</span></code> for desktop browsers, <code><span class="string">'touchend'</span></code> for mobile devices.</td>
</tr>
</table>-->
<h2 id="class">Class</h2>
<p><code>L.Class</code> powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.</p>
<p>In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization &mdash; <code>options</code>, <code>includes</code> and <code>statics</code>.</p>
<pre><code>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");
</code></pre>
<h3>Class Factories</h3>
<p>You may have noticed that Leaflet objects are created without using the <code>new</code> keyword. This is achieved by complementing each class with a lowercase factory method:</p>
<pre><code>new L.Map('map'); // becomes:
L.map('map');</code></pre>
<p>The factories are implemented very easily, and you can do this for your own classes:</p>
<pre><code>L.map = function (id, options) {
return new L.Map(id, options);
};</code></pre>
<h3>Inheritance</h3>
<p>You use <code>L.Class.extend</code> to define new classes, but you can use the same method on any class to inherit from it:</p>
<pre><code>var MyChildClass = MyClass.extend({
// ... new properties and methods
});</code></pre>
<p>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 <code>extend</code>. It will also properly react to <code>instanceof</code>:</p>
<pre><code>var a = new MyChildClass();
a instanceof MyChildClass; // true
a instanceof MyClass; // true
</code></pre>
<p>You can call parent methods (including constructor) from corresponding child ones (as you do with <code>super</code> calls in other languages) by accessing parent class prototype and using JavaScript's <code>call</code> or <code>apply</code>:</p>
<pre><code>var MyChildClass = MyClass.extend({
initialize: function () {
MyClass.prototype.initialize.call("Yo");
},
greet: function (name) {
MyClass.prototype.greet.call(this, 'bro ' + name + '!');
}
});
var a = new MyChildClass();
a.greet('Jason'); // alerts "Yo, bro Jason!"</code></pre>
<h3 id="class-options">Options</h3>
<p><code>options</code> is a special property that unlike other objects that you pass to <code>extend</code> will be merged with the parent one instead of overriding it completely, which makes managing configuration of objects and default values convenient:</p>
<pre><code>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</code></pre>
<p>There's also <code>L.Util.setOptions</code>, a method for conveniently merging options passed to constructor with the defaults defined in the class:</p>
<pre><code>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}</code></pre>
<h3>Includes</h3>
<p><code>includes</code> is a special class property that merges all specified objects into the class (such objects are called mixins).</p>
<pre><code> var MyMixin = {
foo: function () { ... },
bar: 5
};
var MyClass = L.Class.extend({
includes: MyMixin
});
var a = new MyClass();
a.foo();</code></pre>
<p>You can also do such includes in runtime with the <code>include</code> method:</p>
<pre><code><b>MyClass.include</b>(MyMixin);</code></pre>
<h3>Statics</h3>
<p><code>statics</code> is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:</p>
<pre><code>var MyClass = L.Class.extend({
statics: {
FOO: 'bar',
BLA: 5
}
});
MyClass.FOO; // 'bar'</code></pre>
<h3>Constructor Hooks</h3>
<p>If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for <code>L.Polyline</code>). Leaflet comes with a way to do it easily using the <code>addInitHook</code> method:</p>
<pre><code>MyClass.addInitHook(function () {
// ... do something in constructor additionally
// e.g. add event listeners, set custom properties etc.
});</code></pre>
<p>You can also use the following shortcut when you just need to make one additional method call:</p>
<pre><code>MyClass.addInitHook('methodName', arg1, arg2, &hellip;);</code></pre>
<h2 id="evented">Evented</h2>
<p>When creating a plugin you may want your code to have access to the <a href="#events">event methods</a>. By extending the <code>Evented</code> class you can create a class which inherits event-related methods like <code>on</code>, <code>off</code> and <code>fire</code></p>
<pre><code>MyEventedClass = L.Evented.extend({
fire: function(){
this.fire('custom', {
// you can attach optional data to an event as an object
});
}
});
var myEvents = new MyEventedClass();
myEvents.on('custom', function(e){
// e.type will be 'custom'
// anything else you passed in the
});
myEvents.fire();</code></pre>
You can still use the old-style `L.Mixin.Events` for backward compatibility.
<pre><code>// this class will include all event methods
MyEventedClass = L.Class.extend({
includes: L.Mixin.Events
});</code></pre>
<h2 id="layer">Layer</h2>
<p>The base class for all Leaflet layers that implements basic shared methods and functionality. Can be extended to create custom layers by extending <code>L.Layer</code> and implementing the <code>onAdd</code> and <code>onRemove</code> methods.</p>
<h3>Implementing Custom Layers</h3>
<p>Custom layers should extend the <code>L.Layer</code> base class. <code>L.Layer</code> provides convenience methods for your layer like <code>addTo(map)</code>, <code>removeFrom(map)</code> and <code>getPane()</code>.</p>
<p>The most important things know about when implementing custom layers are Map <a href="#map-viewreset">viewreset</a> event and <a href="#map-latlngtolayerpoint">latLngToLayerPoint</a> method. <code>viewreset</code> is fired when the map needs to reposition its layers (e.g. on zoom), and <code>latLngToLayerPoint</code> is used to get coordinates for the layer's new position.</p>
<p>Another event often used in layer implementations is <a href="#map-moveend">moveend</a> which fires after any movement of the map (panning, zooming, etc.).</p>
<p>Another thing to note is that you'll usually need to add <code>leaflet-zoom-hide</code> class to the DOM elements you create for the layer so that it hides during zoom animation. Implementing zoom animation for custom layers is a complex topic and will be documented separately in future, but meanwhile you can take a look at how it's done for Leaflet layers (e.g. <code>ImageOverlay</code>) in the source.</p>
<h3>Methods</h3>
<p>Every layer should extend from <code>L.Layer</code> and implement the following methods:</p>
<table data-id="layer">
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>onAdd</b>(<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i>)</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Should contain code that creates DOM elements for the overlay, adds them to <a href="#map-panes">map panes</a> where they should belong and puts listeners on relevant map events. Called on <code>map.addLayer(layer)</code>.</td>
</tr>
<tr>
<td><code><b>onRemove</b>(<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i>)</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Should contain all clean up code that removes the overlay's elements from the DOM and removes listeners previously added in onAdd. Called on <code>map.removeLayer(layer)</code>.</td>
</tr>
<tr>
<td><code><b>getEvents</b>()</nobr></code></td>
<td><code class="javascript">Object</code></td>
<td>This optional method should return an object like <code>{ viewreset: this._reset }</code>for <a href="#events-addeventlistener">addEventListener</a>. These events will be automatically added and removed from the map with your layer.</td>
</tr>
</table>
<h3>Custom Layer Example</h3>
<p>Here's how a custom layer implementation usually looks:</p>
<pre><code>var MyCustomLayer = L.Layer.extend({
initialize: function (latlng) {
// save position of the layer or any options from the constructor
this._latlng = latlng;
},
// these events will be added and removed from the map with the layer
getEvents: function(){
return {
viewreset: this._reset
}
},
onAdd: function (map) {
// create a DOM element and put it into one of the map panes, by default the overlayPane
this._el = L.DomUtil.create('div', 'my-custom-layer leaflet-zoom-hide');
this.getPane().appendChild(this._el);
// add a viewreset event listener for updating layer's position, do the latter
this._reset();
},
onRemove: function (map) {
// remove layer's DOM elements and listeners
this.getPane().removeChild(this._el);
},
_reset: function () {
// update layer's position
var pos = this._map.latLngToLayerPoint(this._latlng);
L.DomUtil.setPosition(this._el, pos);
}
});
var myLayer = new MyCustomLayer(latlng).addTo(map);
</code></pre>
<h3 id="layer-options">Inherited Options</h3>
<p>Classes extending from <code>L.Layer</code> will also inherit the following options:</p>
<table data-id="layer">
<tr>
<th>Option</th>
<th>Type</th>
<th>Default value</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>pane</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'overlayPane'</span></code></td>
<td>By default the layer will be added to the maps <a href="#map-overlaypane">overlay pane</a>. Overriding this option will cause the layer to be placed on another pane by default.</td>
</tr>
</table>
<h3>Inherited Events</h3>
<p>Classes extending from <code>L.Layer</code> will also fire the following events:</p>
<table data-id="layer">
<tr>
<th>Event</th>
<th>Data</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>add</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired after the layer is added to a map.</td>
</tr>
<tr>
<td><code><b>remove</b></code></td>
<td><code><a href="#event">Event</a></code></td>
<td>Fired after the layer is removed from a map.</td>
</tr>
</table>
<h3>Inherited Methods</h3>
<p>Classes extending from <code>L.Layer</code> will also inherit the following methods:</p>
<table data-id="layer">
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>addTo</b>(<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i>)</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Adds the layer to the given map.</td>
</tr>
<tr>
<td><code><b>removeFrom</b>(<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i>)</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Removes the layer to the given map.</td>
</tr>
<tr>
<td><code><b>remove</b>()</nobr></code></td>
<td><code class="javascript"><span class="keyword">this</span></code></td>
<td>Removes the layer from the map it is currently active on.</td>
</tr>
<tr>
<td><code><b>getPane</b>(<nobr>&lt;String&gt; <i>name?</i>)</nobr></code></td>
<td><code>HTMLElement</code></td>
<td>Returns the <code>HTMLElement</code> representing the named pane on the map. Or if <code>name</code> is omitted the pane for this layer.</td>
</tr>
</table>
<h2 id="control">Control</h2>
<p>Controls represents a UI element in one of the corners of the map. Implemented by <a href="#control-zoom">zoom</a>, <a href="#control-attribution">attribution</a>, <a href="#control-scale">scale</a> and <a href="#control-layers">layers</a> controls. Can be used to create custom controls by extending <code> L.Control</code> and implementing the <code>onAdd</code> and <code>onRemove</code> methods.</p>
<h3>Methods</h3>
<p>Every control in Leaflet should extend from <a href="#control">Control</a> class and additionally have the following methods:</p>
<table data-id='icontrol'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>onAdd</b>(
<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i> )</nobr>
</code></td>
<td><code>HTMLElement</code></td>
<td>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 <code>map.addControl(control)</code> or <code>control.addTo(map)</code>.</td>
</tr>
<tr>
<td><code><b>onRemove</b>(
<nobr>&lt;<a href="#map-class">Map</a>&gt; <i>map</i> )</nobr>
</code></td>
<td>-</td>
<td>Optional, should contain all clean up code (e.g. removes control's event listeners). Called on <code>map.removeControl(control)</code> or <code>control.removeFrom(map)</code>. The control's DOM container is removed automatically.</td>
</tr>
</table>
<h3>Custom Control Example</h3>
<pre><code>var MyControl = L.Control.extend({
options: {
position: 'topright'
},
onAdd: function (map) {
// create the control container with a particular class name
var container = L.DomUtil.create('div', 'my-custom-control');
// ... initialize other DOM elements, add listeners, etc.
return container;
}
});
map.addControl(new MyControl());
</code></pre>
<p>If specify your own constructor for the control, you'll also probably want to process options properly:</p>
<pre><code>var MyControl = L.Control.extend({
initialize: function (foo, options) {
// ...
L.Util.setOptions(this, options);
},
// ...
});</code></pre>
<p>This will allow you to pass options like <code>position</code> when creating the control instances:</p>
<pre><code>map.addControl(new MyControl('bar', {position: 'bottomleft'}));</code></pre>
<h3>Options</h3>
<p>Classes extending from <code>L.Control</code> will also inherit the following options:</p>
<table data-id='control'>
<tr>
<th>Option</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>position</b></code></td>
<td><code>String</code></td>
<td><code><span class="string">'topright'</span></code></td>
<td>The initial position of the control (one of the map corners). See <a href="#control-positions">control positions</a>.</td>
</tr>
</table>
<h3>Inherited Methods</h3>
<p>Classes extending from <code>L.Control</code> will also inherit the following methods:</p>
<table data-id='control'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>setPosition</b>(
<nobr>&lt;String&gt; <i>position</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Sets the position of the control. See <a href="#control-positions">control positions</a>.</td>
</tr>
<tr>
<td><code><b>getPosition</b>()</code></td>
<td><code>String</code></td>
<td>Returns the current position of the control.</td>
</tr>
<tr>
<td><code><b>addTo</b>(
<nobr>&lt;<a href="#map">Map</a>&gt; <i>map</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Adds the control to the map.</td>
</tr>
<tr>
<td><code><b>removeFrom</b>(
<nobr>&lt;<a href="#map">Map</a>&gt; <i>map</i> )</nobr>
</code></td>
<td><code><span class="keyword">this</span></code></td>
<td>Removes the control from the map.</td>
</tr>
<tr>
<td><code><b>getContainer</b>()</code></td>
<td><code>HTMLElement</code></td>
<td>Returns the HTML container of the control.</td>
</tr>
</table>
<h3 id="control-positions">Control Positions</h3>
<p>Control positions (map corner to put a control to) are set using strings. Margins between controls and the map border are set with CSS, so that you can easily override them.</p>
<table data-id='control'>
<tr>
<th class="minwidth">Position</th>
<th>Description</th>
</tr>
<tr>
<td><code><span class="string">'topleft'</span></code></td>
<td>Top left of the map.</td>
</tr>
<tr>
<td><code><span class="string">'topright'</span></code></td>
<td>Top right of the map.</td>
</tr>
<tr>
<td><code><span class="string">'bottomleft'</span></code></td>
<td>Bottom left of the map.</td>
</tr>
<tr>
<td><code><span class="string">'bottomright'</span></code></td>
<td>Bottom right of the map.</td>
</tr>
</table>
<h2 id="handler">Handler</h2>
<p>Implemented by <a href="#map-interaction-handlers">map interaction handlers</a>.</p>
<table data-id='handler'>
<tr>
<th class="width100">Method</th>
<th class="width100">Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>enable</b>()</code></td>
<td>-</td>
<td>Enables the handler.</td>
</tr>
<tr>
<td><code><b>disable</b>()</code></td>
<td>-</td>
<td>Disables the handler.</td>
</tr>
<tr>
<td><code><b>enabled</b>()</code></td>
<td><code>Boolean</code></td>
<td>Returns <code><span class="literal">true</span></code> if the handler is enabled.</td>
</tr>
</table>
<h2 id="projection">Projection</h2>
<p>An object with methods for projecting geographical coordinates of the world onto a flat surface (and back). See <a href="http://en.wikipedia.org/wiki/Map_projection">Map projection</a>.</p>
<h3>Properties</h3>
<table data-id='projection'>
<tr>
<th>Property</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>bounds</b></code></td>
<td><code><a href="#latlngbounds">LatLngBounds</a></code></td>
<td>The bounds where the projection is valid</td>
</tr>
</table>
<h3>Methods</h3>
<table data-id='projection'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>project</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Projects geographical coordinates into a 2D point.</td>
</tr>
<tr>
<td><code><b>unproject</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>The inverse of <code>project</code>. Projects a 2D point into geographical location.</td>
</tr>
</table>
<h3>Defined Projections</h3>
<p>Leaflet comes with a set of already defined projections out of the box:</p>
<table data-id='projections'>
<tr>
<th>Projection</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.Projection.SphericalMercator</b></code></td>
<td>Spherical Mercator projection &mdash; 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 <code>EPSG:3857</code> CRS.</td>
</tr>
<tr>
<td><code><b>L.Projection.Mercator</b></code></td>
<td>Elliptical Mercator projection &mdash; more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the <code>EPSG:3395</code> CRS.</td>
</tr>
<tr>
<td><code><b>L.Projection.LonLat</b></code></td>
<td>Equirectangular, or Plate Carree projection &mdash; the most simple projection, mostly used by GIS enthusiasts. Directly maps <code>x</code> as longitude, and <code>y</code> as latitude. Also suitable for flat worlds, e.g. game maps. Used by the <code>EPSG:3395</code> and <code>Simple</code> CRS.</td>
</tr>
</table>
<h2 id="crs">CRS</h2>
<p>Defines coordinate reference systems for projecting geographical points into pixel (screen) coordinates and back (and to coordinates in other units for WMS services). See <a href="http://en.wikipedia.org/wiki/Coordinate_reference_system">Spatial reference system</a>.</p>
<h3>Methods</h3>
<table data-id='crs'>
<tr>
<th>Method</th>
<th>Returns</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>latLngToPoint</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i></nobr>,
<nobr>&lt;Number&gt; <i>zoom</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Projects geographical coordinates on a given zoom into pixel coordinates.</td>
</tr>
<tr>
<td><code><b>pointToLatLng</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i></nobr>,
<nobr>&lt;Number&gt; <i>zoom</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>The inverse of <code>latLngToPoint</code>. Projects pixel coordinates on a given zoom into geographical coordinates.</td>
</tr>
<tr>
<td><code><b>project</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Projects geographical coordinates into coordinates in units accepted for this CRS (e.g. meters for <code>EPSG:3857</code>, for passing it to WMS services).</td>
</tr>
<tr>
<td><code><b>unproject</b>(
<nobr>&lt;<a href="#point">Point</a>&gt; <i>point</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Given a projected coordinate returns the corresponding <code>LatLng</code>. The inverse of <code><a href="#crs-project">project</a></code>.</td>
</tr>
<tr>
<td><code><b>scale</b>(
<nobr>&lt;Number&gt; <i>zoom</i> )</nobr>
</code></td>
<td><code>Number</code></td>
<td>Returns the scale used when transforming projected coordinates into pixel coordinates for a particular zoom. For example, it returns <code>256 * 2^zoom</code> for Mercator-based CRS.</td>
</tr>
<tr>
<td><code><b>getProjectedBounds</b>(
<nobr>&lt;Number&gt; <i>zoom</i> )</nobr>
</code></td>
<td><code><a href="#bounds">Bounds</a></code></td>
<td>Returns the projection's bounds scaled and transformed for the provided <code>zoom</code>.</td>
</tr>
<tr>
<td><code><b>distance</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng1</i>,</nobr>
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng2</i> )</nobr>
</code></td>
<td><code>Number</code></td>
<td>Returns the distance in meters between two geographic coordinates in this CRS.</td>
</tr>
<tr>
<td><code><b>wrapLatLng</b>(
<nobr>&lt;<a href="#latlng">LatLng</a>&gt; <i>latlng</i> )</nobr>
</code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Returns a <code>LatLng</code> where <code>lat</code> and <code>lng</code> has been wrapped according to the CRS's <code>wrapLat</code> and <code>wrapLng</code> properties, if they are outside the CRS's bounds.</td>
</tr>
</table>
<h3>Properties</h3>
<table data-id='crs'>
<tr>
<th>Property</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>projection</b></code></td>
<td><code><a href="#projection">IProjection</a></code></td>
<td>Projection that this CRS uses.</td>
</tr>
<tr>
<td><code><b>transformation</b></code></td>
<td><code><a href="#transformation">Transformation</a></code></td>
<td>Transformation that this CRS uses to turn projected coordinates into screen coordinates for a particular tile service.</td>
</tr>
<tr>
<td><code><b>code</b></code></td>
<td><code>String</code></td>
<td>Standard code name of the CRS passed into WMS services (e.g. <code><span class="string">'EPSG:3857'</span></code>).</td>
</tr>
<tr>
<td><code><b>wrapLat</b></code></td>
<td><code>Number[]</code></td>
<td>Latitude bounds, lower followed by upper, at which latitudes should wrap around, or <code>null</code> to disable wrapping</td>
</tr>
<tr>
<td><code><b>wrapLng</b></code></td>
<td><code>Number[]</code></td>
<td>Longitude bounds, lower followed by upper, at which longitudes should wrap around, or <code>null</code> to disable wrapping</td>
</tr>
<tr>
<td><code><b>infinite</b></code></td>
<td><code>Boolean</code></td>
<td><code>true</code> if the CRS bounds should be ignored; coordinates in an infinite CRS will not be wrapped</td>
</tr>
</table>
<h3>Defined CRS</h3>
<p>Leaflet comes with a set of already defined CRS to use out of the box:</p>
<table data-id='defined-crs'>
<tr>
<th>Projection</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L.CRS.Earth</b></code></td>
<td>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>code</code>, <code>projection</code> or
<code>transformation</code>.</td>
</tr>
<tr>
<td><code><b>L.CRS.EPSG3857</b></code></td>
<td>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 <code>crs</code> option.</td>
</tr>
<tr>
<td><code><b>L.CRS.EPSG4326</b></code></td>
<td>A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.</td>
</tr>
<tr>
<td><code><b>L.CRS.EPSG3395</b></code></td>
<td>Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.</td>
</tr>
<tr>
<td><code><b>L.CRS.Simple</b></code></td>
<td>A simple CRS that maps longitude and latitude into <code>x</code> and <code>y</code> directly. May be used for maps of flat surfaces (e.g. game maps). Note that the <code>y</code> axis should still be inverted (going from bottom to top).</td>
</tr>
</table>
<p>If you want to use some obscure CRS not listed here, take a look at the <a href="https://github.com/kartena/Proj4Leaflet">Proj4Leaflet</a> plugin.</p>
<h2 id="event-objects">Event objects</h2>
<p>Event object is an object that you receive as an argument in a listener function when some event is fired, containing useful information about that event. For example:</p>
<pre><code class="javascript">map.on('click', function(e) {
alert(e.latlng); // e is an event object (MouseEvent in this case)
});</code></pre>
<h3 id="event">Event</h3>
<p>The base event object. All other event objects contain these properties too.</p>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>type</b></code></td>
<td><code>String</code></td>
<td>The event type (e.g. <code><span class="string">'click'</span></code>).</td>
</tr>
<tr>
<td><code><b>target</b></code></td>
<td><code>Object</code></td>
<td>The object that fired the event.</td>
</tr>
</table>
<h3 id="mouse-event">MouseEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>latlng</b></code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>The geographical point where the mouse event occurred.</td>
</tr>
<tr>
<td><code><b>layerPoint</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Pixel coordinates of the point where the mouse event occurred relative to the map layer.</td>
</tr>
<tr>
<td><code><b>containerPoint</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>Pixel coordinates of the point where the mouse event occurred relative to the map сontainer.</td>
</tr>
<tr>
<td><code><b>originalEvent</b></code></td>
<td><code>DOMMouseEvent</code></td>
<td>The original DOM mouse event fired by the browser.</td>
</tr>
</table>
<h3 id="location-event">LocationEvent</h3>
<table data-id='events'>
<tr>
<th class="width100">property</th>
<th>type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>latlng</b></code></td>
<td><code><a href="#latlng">LatLng</a></code></td>
<td>Detected geographical location of the user.</td>
</tr>
<tr>
<td><code><b>bounds</b></code></td>
<td><code><a href="#latlngbounds">LatLngBounds</a></code></td>
<td>Geographical bounds of the area user is located in (with respect to the accuracy of location).</td>
</tr>
<tr>
<td><code><b>accuracy</b></code></td>
<td><code>Number</code></td>
<td>Accuracy of location in meters.</td>
</tr>
<tr>
<td><code><b>altitude</b></code></td>
<td><code>Number</code></td>
<td>Height of the position above the WGS84 ellipsoid in meters.</td>
</tr>
<tr>
<td><code><b>altitudeAccuracy</b></code></td>
<td><code>Number</code></td>
<td>Accuracy of altitude in meters.</td>
</tr>
<tr>
<td><code><b>heading</b></code></td>
<td><code>Number</code></td>
<td>The direction of travel in degrees counting clockwise from true North.</td>
</tr>
<tr>
<td><code><b>speed</b></code></td>
<td><code>Number</code></td>
<td>Current velocity in meters per second.</td>
</tr>
<tr>
<td><code><b>timestamp</b></code></td>
<td><code>Number</code></td>
<td>The time when the position was acquired.</td>
</tr>
</table>
<h3 id="error-event">ErrorEvent</h3>
<table data-id='error-event'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>message</b></code></td>
<td><code>String</code></td>
<td>Error message.</td>
</tr>
<tr>
<td><code><b>code</b></code></td>
<td><code>Number</code></td>
<td>Error code (if applicable).</td>
</tr>
</table>
<h3 id="layer-event">LayerEvent</h3>
<table data-id='layer-event'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>layer</b></code></td>
<td><code><a href="#layer">Layer</a></code></td>
<td>The layer that was added or removed.</td>
</tr>
</table>
<h3 id="layers-control-event">LayersControlEvent</h3>
<table data-id='layer-control-event'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>layer</b></code></td>
<td><code><a href="#layer">Layer</a></code></td>
<td>The layer that was added or removed.</td>
</tr>
<tr>
<td><code><b>name</b></code></td>
<td><code>String</code></td>
<td>The name of the layer that was added or removed.</td>
</tr>
</table>
<h3 id="tile-event">TileEvent</h3>
<table data-id='tile-event'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>tile</b></code></td>
<td><code>HTMLElement</code></td>
<td>The tile element (image).</td>
</tr>
</table>
<h3 id="tileerror-event">TileErrorEvent</h3>
<table data-id='tileerror-event'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>tile</b></code></td>
<td><code>HTMLElement</code></td>
<td>The tile element (image).</td>
</tr>
</table>
<h3 id="resize-event">ResizeEvent</h3>
<table data-id='resize-event'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>oldSize</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>The old size before resize event.</td>
</tr>
<tr>
<td><code><b>newSize</b></code></td>
<td><code><a href="#point">Point</a></code></td>
<td>The new size after the resize event.</td>
</tr>
</table>
<h3 id="geojson-event">GeoJSON event</h3>
<table data-id='geojson-event'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>layer</b></code></td>
<td><code><a href="#layer">Layer</a></code></td>
<td>The layer for the GeoJSON feature that is being added to the map.</td>
</tr>
<tr>
<td><code><b>properties</b></code></td>
<td><code>Object</code></td>
<td>GeoJSON properties of the feature.</td>
</tr>
<tr>
<td><code><b>geometryType</b></code></td>
<td><code>String</code></td>
<td>GeoJSON geometry type of the feature.</td>
</tr>
<tr>
<td><code><b>id</b></code></td>
<td><code>String</code></td>
<td>GeoJSON ID of the feature (if present).</td>
</tr>
</table>
<h3 id="popup-event">Popup event</h3>
<table data-id='popup-event'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>popup</b></code></td>
<td><code><a href="#popup">Popup</a></code></td>
<td>The popup that was opened or closed.</td>
</tr>
</table>
<h3 id="dragend-event">DragEndEvent</h3>
<table data-id='layer-event'>
<tr>
<th class="width100">property</th>
<th class="width100">type</th>
<th>description</th>
</tr>
<tr>
<td><code><b>distance</b></code></td>
<td><code>Number</code></td>
<td>The distance in pixels the draggable element was moved by.</td>
</tr>
</table>
<h2 id="global">Global Switches</h2>
<p>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 <code><span class="literal">true</span></code> <em>before</em> including Leaflet on the page, like this:</p>
<pre><code>&lt;script&gt;L_PREFER_CANVAS = true;&lt;/script&gt;
&lt;script src="leaflet.js"&gt;&lt;/script&gt;</code></pre>
<table data-id='global'>
<tr>
<th>Switch</th>
<th>Description</th>
</tr>
<tr>
<td><code><b>L_PREFER_CANVAS</b></code></td>
<td>Forces Leaflet to use the Canvas back-end (if available) for vector layers instead of SVG. This can increase performance considerably in some cases (e.g. many thousands of circle markers on the map).</td>
</tr>
<tr>
<td><code><b>L_NO_TOUCH</b></code></td>
<td>Forces Leaflet to not use touch events even if it detects them.</td>
</tr>
<tr>
<td><code><b>L_DISABLE_3D</b></code></td>
<td>Forces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.</td>
</tr>
</table>
<h2 id="noconflict">noConflict</h2>
<p>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:</p>
<pre><code>// L points to some other library
...
// you include Leaflet, it replaces the L variable to Leaflet namespace
var Leaflet = L.noConflict();
// now L points to that other library again, and you can use Leaflet.Map etc.</code></pre>
<h2 id="version">version</h2>
<p>A constant that represents the Leaflet version in use.</p>
<pre><code>L.version // contains "0.5" (or whatever version is currently in use)</code></pre>
<script>
var tables = document.getElementsByTagName('table');
for (var i = 0, len = tables.length; i < len; i++) {
var id = tables[i].getAttribute('data-id'),
tds = tables[i].getElementsByTagName('td');
for (var j = 0, tdLen = tds.length; j < tdLen; j++) {
if (tds[j].cellIndex === 0) {
tds[j].parentNode.id = id + '-' + (tds[j].textContent || tds[j].innerText).split('(')[0].toLowerCase();
tds[j].parentNode.onclick = function(e) {
if (e.offsetX < 0) {
window.location.hash = '#' + this.id;
}
};
}
}
}
</script>
<div class="footer">
<p>&copy; 2015 <a href="http://agafonkin.com/en">Vladimir Agafonkin</a>. Maps &copy; <a href="http://openstreetmap.org/copyright">OpenStreetMap</a> contributors.</p>
</div>
</div>
<script>
hljs.configure({tabReplace: ' '});
hljs.initHighlighting();
(function () {
if (document.body.className.indexOf('api-page') !== -1) {
var headers = document.getElementsByTagName('h2');
for (var i = 0, len = headers.length; i < len; i++) {
if (headers[i].id) {
headers[i].onclick = function(e) {
if (e.offsetX < 0) {
window.location.hash = '#' + this.id;
}
};
}
}
}
})();
</script>
<script>
var unoCommands = [
{
header: 'Global operations',
},
{
uno: '.uno:Redo',
parameter: null,
description: 'Redo.'
},
{
uno: '.uno:Save',
parameter: null,
description: 'Save the document.'
},
{
uno: '.uno:Undo',
parameter: null,
description: 'Undo.'
},
{
header: 'Text formatting',
},
{
uno: '.uno:BackColor',
parameter: {
'BackColor': {
type: 'long',
value: 16750848
}
},
description: 'Apply a highlighting color for a text document (the value can be obtained by converting the base 16 color to base 10).'
},
{
uno: '.uno:CharBackgroundExt',
parameter: null,
description: '.uno:CharBackgroundExt is supplementary to .uno:BackColor. When .uno:BackColor is set, Writer turns into a "watercan" mode, where the user directly marks parts of the text with the wanted background color. ' +
'.uno:CharBackgroundExt then controls this watercan mode - dispatching it toggles the watercan mode on/off, and also the StateChanged events reflect the on/off mode accordingly.'
},
{
uno: '.uno:BackgroundColor',
parameter: {
'BackgroundColor': {
type: 'long',
value: 16750848
}
},
description: 'Apply a highlighting color for a spreadsheet document (the value can be obtained by converting the base 16 color to base 10).'
},
{
uno: '.uno:Bold',
parameter: null,
description: 'Bold.'
},
{
uno: '.uno:CharBackColor',
parameter: {
'CharBackColor': {
type: 'long',
value: 16750848
}
},
description: 'Apply a font color for a presentation document (the value can be obtained by converting the base 16 color to base 10).'
},
{
uno: '.uno:CharFontName',
parameter: {
'CharFontName.FamilyName': {
type: 'string',
value: 'Arial'
}
},
description: 'Apply font.'
},
{
uno: '.uno:Color',
parameter: {
'Color': {
type: 'long',
value: 16750848
}
},
description: 'Apply a font color for a non-text document, like a spreadsheet, presentation, etc (the value can be obtained by converting the base 16 color to base 10).'
},
{
uno: '.uno:FontColor',
parameter: {
'FontColor': {
type: 'long',
value: 16750848
}
},
description: 'Apply a font color for a text document (the value can be obtained by converting the base 16 color to base 10).'
},
{
uno: '.uno:FontHeight',
parameter: {
'FontHeight.Height': {
type: 'float',
value: '11.5'
}
},
description: 'Apply font size.'
},
{
uno: '.uno:Italic',
parameter: null,
description: 'Italic.'
},
{
uno: '.uno:OutlineFont',
parameter: null,
description: 'Outline.'
},
{
uno: '.uno:Shadowed',
parameter: null,
description: 'Shadowed.'
},
{
uno: '.uno:SubScript',
parameter: null,
description: 'Subscript.'
},
{
uno: '.uno:SuperScript',
parameter: null,
description: 'Superscript.'
},
{
uno: '.uno:Strikeout',
parameter: null,
description: 'Strikeout / strike-through.'
},
{
uno: '.uno:Underline',
parameter: null,
description: 'Underline.'
},
{
header: 'Paragraph formatting',
},
{
uno: '.uno:CenterPara',
parameter: null,
description: 'Center horizontally.'
},
{
uno: '.uno:DecrementIndent',
parameter: null,
description: 'Decrement paragraph indentation.'
},
{
uno: '.uno:DefaultBullet',
parameter: null,
description: 'Bullets ON/OFF.'
},
{
uno: '.uno:DefaultNumbering',
parameter: null,
description: 'Numbering ON/OFF.'
},
{
uno: '.uno:IncrementIndent',
parameter: null,
description: 'Increment paragraph indentation.'
},
{
uno: '.uno:JustifyPara',
parameter: null,
description: 'Justified.'
},
{
uno: '.uno:LeftPara',
parameter: null,
description: 'Align left.'
},
{
uno: '.uno:RightPara',
parameter: null,
description: 'Align right.'
},
{
uno: '.uno:SetHyperlink',
parameter: {
'Hyperlink.Text': {
type: 'string',
value: 'some text'
},
'Hyperlink.URL': {
type: 'string',
value: 'url'
}
},
description: 'Creates a hyperlink. If Hyperlink.Text is not specified, the hyperlink will be set for the current ' +
'selection. Hyperlink.URL can be a web URL or a bookmark from the document.'
},
{
header: 'Comments',
},
{
uno: '.uno:DeleteComment',
parameter: null,
description: 'Delete comment.'
},
{
uno: '.uno:InsertAnnotation',
parameter: {
'Author': {
type: 'string',
value: 'A U Thor'
}
},
description: 'Insert comment.'
},
{
header: 'Fields',
},
{
uno: '.uno:InsertPageNumberField',
parameter: null,
description: 'Insert Page Number field.'
},
{
uno: '.uno:InsertPageCountField',
parameter: null,
description: 'Insert Page Count field.'
},
{
uno: '.uno:DateField',
parameter: null,
description: 'Insert Date field.'
},
{
uno: '.uno:TimeField',
parameter: null,
description: 'Insert Time field.'
},
{
uno: '.uno:TitleField',
parameter: null,
description: 'Insert Title field.'
},
{
uno: '.uno:AuthorField',
parameter: null,
description: 'Insert Author field.'
},
{
uno: '.uno:TopicField',
parameter: null,
description: 'Insert Topic field.'
},
{
header: 'Styles',
},
{
uno: '.uno:DeleteStyle',
parameter: null,
description: 'Delete the current style.'
},
{
uno: '.uno:FormatPaintbrush',
parameter: null,
description: 'Copy format of the selected text to another text.'
},
{
uno: '.uno:ResetAttributes',
parameter: null,
description: 'Clear direct formating.'
},
{
uno: '.uno:StyleApply',
parameter: {
'Style': {
type: 'string',
value: 'Title'
},
'FamilyName': {
type: 'string',
value: 'ParagraphStyles'
}
},
description: 'Apply style from style family.'
},
{
uno: '.uno:StyleUpdateByExample',
parameter: null,
description: 'Update the current style to match the selected text.'
},
{
header: 'Tables (in a text document)',
},
{
uno: '.uno:InsertColumnsAfter',
parameter: null,
description: 'Insert column after the current cursor position.',
},
{
uno: '.uno:InsertColumnsBefore',
parameter: null,
description: 'Insert column before the current cursor position.',
},
{
uno: '.uno:InsertRowsAfter',
parameter: null,
description: 'Insert row after the current cursor position.',
},
{
uno: '.uno:InsertRowsBefore',
parameter: null,
description: 'Insert row before the current cursor position.',
},
{
uno: '.uno:InsertTable',
parameter: {
'Columns': {
'type': 'long',
'value': 6
},
'Rows': {
'type': "long",
'value': 10
}
},
description: 'Insert table with the given dimensions.'
},
{
uno: '.uno:DeleteTable',
parameter: null,
description: 'Delete table at the current cursor position.'
},
{
uno: '.uno:DeleteColumns',
parameter: null,
description: 'Delete the current column.'
},
{
uno: '.uno:DeleteRows',
parameter: null,
description: 'Delete the current row.'
},
{
header: 'Tables (in presentations)',
},
{
uno: '.uno:InsertColumns',
parameter: null,
description: 'Insert column after the current cursor position.',
},
{
uno: '.uno:InsertRows',
parameter: null,
description: 'Insert row after the current cursor position.',
},
{
uno: '.uno:InsertTable',
parameter: {
'Columns': {
'type': 'long',
'value': 6
},
'Rows': {
'type': "long",
'value': 10
}
},
description: 'Insert table with the given dimensions.'
},
{
uno: '.uno:DeleteColumns',
parameter: null,
description: 'Delete the current column.'
},
{
uno: '.uno:DeleteRows',
parameter: null,
description: 'Delete the current row.'
},
{
header: 'Text document-related',
},
{
uno: '.uno:UpdateAllIndexes',
parameter: null,
description: 'Update all Table of X (Content etc.) Useful for general menus / toolbars.'
},
{
uno: '.uno:UpdateCurIndex',
parameter: null,
description: 'Update the current Table of X (Content etc.) "Current" means the one in where the cursor is located, useful for context menus.'
},
{
header: 'Spreadsheet-related',
},
{
uno: '.uno:DeleteColumns',
parameter: null,
description: 'Delete the current column.'
},
{
uno: '.uno:DeleteRows',
parameter: null,
description: 'Delete the current row.'
},
{
uno: '.uno:EnterString',
parameter: {
'StringName': {
type: 'string',
value: '=SUM()'
}
},
description: 'Enters the string in the selected cell.'
},
{
uno: '.uno:Insert',
parameter: {
'Name': {
'type': 'string',
'value': 'Sheet Name'
},
'Index': {
'type': 'long',
'value': 0
}
},
description: 'Inserts a new sheet to the spreadsheet. The "Name" parameter can be left as empty string, in that case the sheet name will be generated. The "Index" parameter means the position where it should be inserted - "1" means adding as the 1st sheet, etc. 0 is special, and means adding as the last sheet.'
},
{
uno: '.uno:InsertColumns',
parameter: null,
description: 'Insert column after the current cursor position.',
},
{
uno: '.uno:InsertRows',
parameter: null,
description: 'Insert row before the current cursor position.',
},
{
uno: '.uno:Name',
parameter: {
'Name': {
'type': 'string',
'value': 'Sheet Name'
},
'Index': {
'type': 'long',
'value': 1
}
},
description: 'Rename the given sheet in the spreadsheet. The "Index" parameter means the position of the sheet - "1" means the 1st sheet, etc.'
},
{
uno: '.uno:Remove',
parameter: {
'Index': {
'type': 'long',
'value': 5
}
},
description: 'Remove the given sheet from the spreadsheet. The "Index" parameter means the position - "1" means the 1st sheet, etc.'
},
{
uno: '.uno:SortAscending',
parameter: null,
description: 'Sort the current selection ascending.'
},
{
uno: '.uno:SortDescending',
parameter: null,
description: 'Sort the current selection descending.'
},
{
header: 'Presentation-related',
},
{
uno: '.uno:AssignLayout',
parameter: {
'WhatLayout': {
'type': 'long',
'value': 19
}
},
description: 'Changes the layout of the current slide. Possible values of "WhatLayout" are: <ul>' +
'<li>20 - Blank</li>' +
'<li>19 - Title</li>' +
'<li>0 - Title, Text</li>' +
'<li>1 - Title, Content</li>' +
'<li>32 - Centered Text</li>' +
'<li>3 - Title, 2 Content</li>' +
'<li>12 - Title, Content and 2 Content on Right</li>' +
'<li>15 - Title, 2 Content on Left and Content</li>' +
'<li>14 - Title, Content above Content</li>' +
'<li>16 - Title, 2 Content above Content</li>' +
'<li>18 - Title, 4 Content</li>' +
'<li>34 - Title, 6 Content</li>' +
'<li>28 - Title, Content (Vertical)</li>' +
'<li>27 - Title, Content over Content (Vertical)</li>' +
'<li>29 - Title, Vertical Content</li>' +
'<li>30 - Title, 2 Vertical Content</li></ul>'
},
{
header: 'Appearance options',
},
{
uno: '.uno:HideWhitespace',
parameter: {
'type': 'boolean',
'value': 'false'
},
description: 'Continous web view of the document.'
},
{
uno: '.uno:ShowBorderShadow',
parameter: {
'type': 'boolean',
'value': 'true'
},
description: 'Paint a shadow around Write page / Impress slide border.'
},
{
header: 'Calling Python scripts',
},
{
uno: 'vnd.sun.star.script:&lt;filename&gt;$&lt;function&gt;?language=Python&location=share',
parameter: {
'sheet': {'type': 'string', 'value': 'Sheet1'},
'x0': {'type': 'long', 'value': 1},
'y0': {'type': 'long', 'value': 2},
'width': {'type': 'long', 'value': 3},
'height': {'type': 'long', 'value': 4},
'name': {'type': 'string', 'value': 'Alice'}
},
description: 'Calls a Python script. The parameter example here are those taken by the DefineNamedRange function in the NamedRanges.py file.'
},
];
$(document).ready(function() {
var table = $('#uno-commands-table');
unoCommands.forEach(function (unoCommand) {
if ('header' in unoCommand) {
table.append(
'<tr>' +
' <td colspan="3"><b>' + unoCommand.header + '</b></td>' +
'</tr>');
}
else {
table.append(
'<tr>' +
' <td><code><b>' + unoCommand.uno + '</b></code></td>' +
' <td><code><pre>' + JSON.stringify(unoCommand.parameter, null, 2) + '</pre></code></td>' +
' <td>' + unoCommand.description + '</td>' +
'</tr>');
}
});
});
</script>
<script type="text/javascript" src="docs/js/docs.js"></script>
</body>
</html>