UNPKG

leaflet

Version:

JavaScript library for mobile-friendly interactive maps

138 lines (113 loc) 3.7 kB
import {Layer} from './Layer.js'; import * as Util from '../core/Util.js'; /* * @class LayerGroup * @inherits Interactive layer * * Used to group several layers and handle them as one. If you add it to the map, * any layers added or removed from the group will be added/removed on the map as * well. Extends `Layer`. * * @example * * ```js * new LayerGroup([marker1, marker2]) * .addLayer(polyline) * .addTo(map); * ``` */ // @constructor LayerGroup(layers?: Layer[], options?: Object) // Create a layer group, optionally given an initial set of layers and an `options` object. export class LayerGroup extends Layer { initialize(layers, options) { // for compatibility of code using `LayerGroup.extend` Util.setOptions(this, options); this._layers = {}; for (const layer of layers ?? []) { this.addLayer(layer); } } // @method addLayer(layer: Layer): this // Adds the given layer to the group. addLayer(layer) { const id = this.getLayerId(layer); this._layers[id] = layer; this._map?.addLayer(layer); return this; } // @method removeLayer(layer: Layer): this // Removes the given layer from the group. // @alternative // @method removeLayer(id: Number): this // Removes the layer with the given internal ID from the group. removeLayer(layer) { const id = layer in this._layers ? layer : this.getLayerId(layer); if (this._map && this._layers[id]) { this._map.removeLayer(this._layers[id]); } delete this._layers[id]; return this; } // @method hasLayer(layer: Layer): Boolean // Returns `true` if the given layer is currently added to the group. // @alternative // @method hasLayer(id: Number): Boolean // Returns `true` if the given internal ID is currently added to the group. hasLayer(layer) { const layerId = typeof layer === 'number' ? layer : this.getLayerId(layer); return layerId in this._layers; } // @method clearLayers(): this // Removes all the layers from the group. clearLayers() { return this.eachLayer(this.removeLayer, this); } // @method invoke(methodName: String, …): this // Calls `methodName` on every layer contained in this group, passing any // additional parameters. Has no effect if the layers contained do not // implement `methodName`. invoke(methodName, ...args) { for (const layer of Object.values(this._layers)) { layer[methodName]?.apply(layer, args); } return this; } onAdd(map) { this.eachLayer(map.addLayer, map); } onRemove(map) { this.eachLayer(map.removeLayer, map); } // @method eachLayer(fn: Function, context?: Object): this // Iterates over the layers of the group, optionally specifying context of the iterator function. // ```js // group.eachLayer(layer => layer.bindPopup('Hello')); // ``` eachLayer(method, context) { for (const layer of Object.values(this._layers)) { method.call(context, layer); } return this; } // @method getLayer(id: Number): Layer // Returns the layer with the given internal ID. getLayer(id) { return this._layers[id]; } // @method getLayers(): Layer[] // Returns an array of all the layers added to the group. getLayers() { const layers = []; this.eachLayer(layers.push, layers); return layers; } // @method setZIndex(zIndex: Number): this // Calls `setZIndex` on every layer contained in this group, passing the z-index. setZIndex(zIndex) { return this.invoke('setZIndex', zIndex); } // @method getLayerId(layer: Layer): Number // Returns the internal ID for a layer getLayerId(layer) { return Util.stamp(layer); } }