@nextgis/leaflet-map-adapter 1.11.10 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"leaflet-map-adapter.esm-bundler.prod.js","sources":["../src/utils/convertMapClickEvent.ts","../src/controls/createControl.ts","../src/utils/boundsToArray.ts","../src/utils/geometries.ts","../src/utils/detectType.ts","../src/layer-adapters/BaseAdapter.ts","../src/utils/callAjax.ts","../src/layer-adapters/ImageAdapter/ImageOverlay.ts","../src/layer-adapters/ImageAdapter/ImageLayer.ts","../src/utils/makeRemoteTileLayer.ts","../../utils/src/debounce.ts","../src/layer-adapters/TileAdapter/TileLayer.ts","../src/layer-adapters/TileAdapter/TileAdapter.ts","../src/layer-adapters/WmsAdapter/WmsLayer.ts","../src/utils/arrayToBoundsExpression.ts","../src/LeafletMapAdapter.ts","../src/controls/createButtonControl.ts","../src/layer-adapters/GeoJsonAdapter.ts","../src/utils/createMouseEvent.ts","../src/layer-adapters/ImageAdapter/ImageAdapter.ts","../src/layer-adapters/WmsAdapter/WmsAdapter.ts","../src/layer-adapters/OsmAdapter.ts","../src/controls/Attribution.ts","../src/index.ts"],"sourcesContent":["import type { LeafletMouseEvent } from 'leaflet';\n\nimport type { MapClickEvent } from '@nextgis/webmap';\n\nexport function convertMapClickEvent(evt: LeafletMouseEvent): MapClickEvent {\n const coord = evt.containerPoint;\n const latLng = evt.latlng;\n const { lat, lng } = latLng;\n return {\n latLng,\n lngLat: [lng, lat],\n pixel: { left: coord.x, top: coord.y },\n source: evt,\n };\n}\n","import { Control, DomEvent } from 'leaflet';\nimport type {\n MapControl,\n CreateControlOptions,\n MapAdapter,\n} from '@nextgis/webmap';\n\nexport function createControl(\n control: MapControl,\n options: CreateControlOptions = {},\n map: MapAdapter,\n): Control {\n const C = Control.extend({\n onAdd() {\n const element = document.createElement('div');\n const content = control.onAdd(map);\n element.classList.add('leaflet-control');\n if (options.bar) {\n element.classList.add('leaflet-bar');\n }\n if (options.addClass) {\n element.classList.add(options.addClass);\n }\n if (!options.margin && !options.bar) {\n element.style.marginBottom = '0px';\n element.style.marginTop = '0px';\n element.style.marginLeft = '0px';\n element.style.marginRight = '0px';\n }\n if (content) {\n element.appendChild(content);\n }\n\n DomEvent.disableClickPropagation(element);\n\n return element;\n },\n onRemove() {\n control.onRemove();\n },\n });\n return new C();\n}\n","import type { LatLngBounds } from 'leaflet';\nimport type { LngLatBoundsArray } from '@nextgis/utils';\n\nexport function boundsToArray(bounds: LatLngBounds): LngLatBoundsArray {\n const ne = bounds.getNorthEast();\n const sw = bounds.getSouthWest();\n return [sw.lng, sw.lat, ne.lng, ne.lat];\n}\n","import { GeoJSON } from 'leaflet';\nimport { boundsToArray } from './boundsToArray';\n\nimport type {\n Feature,\n GeoJsonObject,\n FeatureCollection,\n GeometryCollection,\n GeoJsonGeometryTypes,\n} from 'geojson';\nimport type { LatLngBounds } from 'leaflet';\nimport type { FeaturePosition, VectorAdapterLayerType } from '@nextgis/webmap';\nimport type { LngLatArray, LngLatBoundsArray } from '@nextgis/utils';\n\nexport const typeAlias: {\n [key in GeoJsonGeometryTypes]: VectorAdapterLayerType;\n} = {\n Point: 'point',\n LineString: 'line',\n MultiPoint: 'point',\n Polygon: 'polygon',\n MultiLineString: 'line',\n MultiPolygon: 'polygon',\n GeometryCollection: 'polygon',\n};\n\nexport const PAINT = {\n stroke: false,\n opacity: 1,\n};\n\nexport const backAliases: {\n [key in VectorAdapterLayerType]?: GeoJsonGeometryTypes[];\n} = {};\n\nfor (const a in typeAlias) {\n const layerType = typeAlias[a as GeoJsonGeometryTypes];\n const backAlias = backAliases[layerType] || [];\n backAlias.push(a as GeoJsonGeometryTypes);\n backAliases[layerType] = backAlias;\n}\n\nexport function geometryFilter(\n geometry: GeoJsonGeometryTypes,\n type: VectorAdapterLayerType,\n): boolean {\n const geoJsonGeometry = backAliases[type] || [];\n return geoJsonGeometry.indexOf(geometry) !== -1;\n}\n\nexport function filterGeometries(\n data: GeoJsonObject,\n type: VectorAdapterLayerType,\n): GeoJsonObject | false {\n if (data.type === 'FeatureCollection') {\n const _data = data as FeatureCollection;\n _data.features = _data.features.filter((f) =>\n geometryFilter(f.geometry.type, type),\n );\n } else if (data.type === 'Feature') {\n const allow = geometryFilter((data as Feature).geometry.type, type);\n if (!allow) {\n return false;\n }\n } else if (data.type === 'GeometryCollection') {\n const _data = data as GeometryCollection;\n _data.geometries = _data.geometries.filter((g) =>\n geometryFilter(g.type, type),\n );\n }\n return data;\n}\n\nfunction featuresBounds(features: Feature | Feature[]): LatLngBounds {\n const geoJsonLayer = new GeoJSON();\n const features_ = Array.isArray(features) ? features : [features];\n features_.forEach((f) => geoJsonLayer.addData(f));\n return geoJsonLayer.getBounds();\n}\n\nexport function getFeaturesBounds(\n features: Feature | Feature[],\n): LngLatBoundsArray {\n return boundsToArray(featuresBounds(features));\n}\n\nexport function getFeaturesCenter(features: Feature | Feature[]): LngLatArray {\n const { lat, lng } = featuresBounds(features).getCenter();\n return [lng, lat];\n}\n\nexport function createFeaturePositionOptions(\n features: Feature | Feature[],\n): FeaturePosition {\n return {\n getBounds: () => getFeaturesBounds(features),\n getCenter: () => getFeaturesCenter(features),\n };\n}\n","import type {\n GeoJsonObject,\n GeoJsonGeometryTypes,\n FeatureCollection,\n Feature,\n GeometryCollection,\n} from 'geojson';\n\nfunction findMostFrequentGeomType(\n arr: GeoJsonGeometryTypes[],\n): GeoJsonGeometryTypes {\n const counts: { [x: string]: number } = {};\n for (let fry = 0; fry < arr.length; fry++) {\n counts[arr[fry]] = 1 + (counts[arr[fry]] || 0);\n }\n let maxName = '';\n for (const c in counts) {\n const maxCount = maxName ? counts[maxName] : 0;\n if (counts[c] > maxCount) {\n maxName = c;\n }\n }\n return maxName as GeoJsonGeometryTypes;\n}\n\nexport function detectType(geojson: GeoJsonObject): GeoJsonGeometryTypes {\n let geometry: GeoJsonGeometryTypes;\n if (geojson.type === 'FeatureCollection') {\n const featuresTypes = (geojson as FeatureCollection).features.map(\n (f) => f.geometry.type,\n );\n geometry = findMostFrequentGeomType(featuresTypes);\n } else if (geojson.type === 'GeometryCollection') {\n const geometryTypes = (geojson as GeometryCollection).geometries.map(\n (g) => g.type,\n );\n geometry = findMostFrequentGeomType(geometryTypes);\n } else if (geojson.type === 'Feature') {\n geometry = (geojson as Feature).geometry.type;\n } else {\n geometry = geojson.type;\n }\n return geometry;\n}\n","import { MainLayerAdapter, AdapterOptions } from '@nextgis/webmap';\nimport { Map } from 'leaflet';\n\nexport class BaseAdapter<O extends AdapterOptions = AdapterOptions, L = any>\n implements MainLayerAdapter<Map, L, O>\n{\n layer?: L;\n protected pane = 'order-0';\n\n constructor(public map: L.Map, public options: O) {\n if (options.order !== undefined) {\n const pane = 'order-' + options.order;\n let exist = map.getPane(pane);\n if (!exist) {\n exist = map.createPane(pane);\n }\n exist.style.zIndex = String(Math.round(options.order * 100));\n this.pane = pane;\n }\n }\n\n addLayer(options: O): L | Promise<L> | undefined {\n Object.assign(this.options, options);\n return undefined;\n }\n}\n","export function callAjax(\n src: string,\n callback: (resp: any) => any,\n headers: Record<string, any>,\n): () => void {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', src);\n xhr.responseType = 'arraybuffer';\n for (const h in headers) {\n xhr.setRequestHeader(h, headers[h]);\n }\n xhr.onload = function () {\n const arrayBufferView = new Uint8Array(this.response);\n const blob = new Blob([arrayBufferView], { type: 'image/png' });\n // @ts-ignore for typedoc\n const urlCreator = window.URL || window.webkitURL;\n const imageUrl = urlCreator.createObjectURL(blob);\n callback(imageUrl);\n };\n xhr.send();\n return () => {\n xhr.abort();\n };\n}\n","import {\n ImageOverlay as LImageOverlay,\n LatLngBoundsExpression,\n ImageOverlayOptions,\n} from 'leaflet';\nimport { callAjax } from '../../utils/callAjax';\n\ntype IOptions = ImageOverlayOptions & { headers?: any };\n\nexport class ImageOverlay extends LImageOverlay {\n private _abort: (() => void)[] = [];\n\n constructor(\n imageUrl: string,\n bounds: LatLngBoundsExpression,\n options?: IOptions,\n ) {\n super(imageUrl, bounds, options);\n }\n\n cancelLoad(): void {\n if (this._abort) {\n this._abort.forEach((x) => x());\n this._abort = [];\n }\n }\n\n _initImage(): void {\n // @ts-ignore\n super._initImage();\n // @ts-ignore\n const headers = this.options.headers;\n if (headers) {\n // @ts-ignore\n const img: HTMLImageElement = this._image;\n const src = img.src;\n img.src = '';\n this._abort.push(\n callAjax(\n src,\n (response) => {\n img.src = response;\n },\n headers,\n ),\n );\n }\n }\n}\n","/*!\n * leaflet.wms.js\n * A collection of Leaflet utilities for working with Web Mapping services.\n * (c) 2014-2016, Houston Engineering, Inc.\n * MIT License\n */\n\nimport { Layer, Util, CRS } from 'leaflet';\nimport { debounce } from '@nextgis/utils';\nimport { ImageOverlay } from './ImageOverlay';\n\ninterface OverlayOptions {\n crs?: null;\n uppercase?: boolean;\n attribution?: string;\n opacity?: number;\n isBack?: boolean;\n minZoom?: number;\n maxZoom?: number;\n zIndex?: number;\n pane?: string;\n headers?: any;\n viewPortBuffer?: number;\n setViewDelay?: number;\n}\n\n/*\n * Overlay:\n * \"Single Tile\" WMS image overlay that updates with map changes.\n * Portions of wms.Overlay are directly extracted from L.TileLayer.WMS.\n * See Leaflet license.\n */\nexport class ImageLayer extends Layer {\n defaultWmsParams = {\n service: 'WMS',\n request: 'GetMap',\n version: '1.1.1',\n layers: '',\n styles: '',\n format: 'image/jpeg',\n transparent: false,\n };\n\n options: OverlayOptions = {\n crs: null,\n uppercase: false,\n attribution: '',\n opacity: 1,\n isBack: false,\n minZoom: 0,\n maxZoom: 18,\n pane: 'tilePane',\n headers: null,\n viewPortBuffer: 0,\n setViewDelay: 100,\n };\n\n private wmsParams: any;\n private _url?: string;\n private _currentUrl?: string;\n private _currentOverlay?: ImageOverlay;\n\n constructor(url: string, options: OverlayOptions) {\n super(options);\n this._url = url;\n\n // Move WMS parameters to params object\n const params: any = {};\n const opts: any = {};\n let opt: keyof OverlayOptions;\n for (opt in options) {\n if (opt in this.options) {\n opts[opt] = options[opt];\n } else {\n params[opt] = options[opt];\n }\n }\n Util.setOptions(this, opts);\n this.wmsParams = Util.extend({}, this.defaultWmsParams, params);\n }\n\n setParams(params: Record<string, any>): void {\n Util.extend(this.wmsParams, params);\n this.update();\n }\n\n getAttribution(): string {\n return this.options.attribution || '';\n }\n\n onAdd(): this {\n this.update();\n return this;\n }\n\n onRemove(map: L.Map): this {\n if (this._currentOverlay) {\n this._currentOverlay.cancelLoad();\n map.removeLayer(this._currentOverlay);\n delete this._currentOverlay;\n }\n if (this._currentUrl) {\n delete this._currentUrl;\n }\n return this;\n }\n\n getEvents(): {\n moveend: () => void;\n } {\n return {\n moveend: debounce(this.update, this.options.setViewDelay),\n };\n }\n\n update(): void {\n if (!this._map) {\n return;\n }\n // Determine image URL and whether it has changed since last update\n this.updateWmsParams();\n const url = this.getImageUrl();\n if (this._currentUrl === url) {\n return;\n }\n this._currentUrl = url;\n\n // Keep current image overlay in place until new one loads\n // (inspired by esri.leaflet)\n const viewPortBuffer = this.options.viewPortBuffer || 0;\n const bounds = this._map.getBounds().pad(viewPortBuffer);\n\n const overlay = new ImageOverlay(url, bounds, {\n opacity: 0,\n pane: this.options.pane,\n headers: this.options.headers,\n });\n overlay.addTo(this._map);\n if (this._currentOverlay) {\n this._currentOverlay.cancelLoad();\n }\n overlay.once(\n 'load',\n () => {\n if (!this._map) {\n return;\n }\n // @ts-ignore\n if (overlay._url !== this._currentUrl) {\n this._map.removeLayer(overlay);\n return;\n } else if (this._currentOverlay) {\n this._map.removeLayer(this._currentOverlay);\n }\n this._currentOverlay = overlay;\n overlay.setOpacity(\n this.options.opacity !== undefined ? this.options.opacity : 1,\n );\n if (this.options.isBack === true) {\n overlay.bringToBack();\n }\n if (this.options.isBack === false) {\n overlay.bringToFront();\n }\n if (this.options.zIndex !== undefined) {\n overlay.setZIndex(this.options.zIndex);\n }\n },\n this,\n );\n const { minZoom, maxZoom } = this.options;\n if (\n (minZoom && this._map.getZoom() < minZoom) ||\n (maxZoom && this._map.getZoom() > maxZoom)\n ) {\n this._map.removeLayer(overlay);\n }\n }\n\n setOpacity(opacity: number): void {\n this.options.opacity = opacity;\n if (this._currentOverlay) {\n this._currentOverlay.setOpacity(opacity);\n }\n }\n\n bringToBack(): void {\n this.options.isBack = true;\n if (this._currentOverlay) {\n this._currentOverlay.bringToBack();\n }\n }\n\n bringToFront(): void {\n this.options.isBack = false;\n if (this._currentOverlay) {\n this._currentOverlay.bringToFront();\n }\n }\n\n setZIndex(zIndex: number): void {\n this.options.zIndex = zIndex;\n if (this._currentOverlay) {\n this._currentOverlay.setZIndex(zIndex);\n }\n }\n\n // See L.TileLayer.WMS: onAdd() & getTileUrl()\n updateWmsParams(map?: L.Map): void {\n if (!map) {\n map = this._map;\n }\n // Compute WMS options\n const viewPortBuffer = this.options.viewPortBuffer || 0;\n const bounds = map.getBounds().pad(viewPortBuffer);\n const size = map.getSize();\n if (this.options.viewPortBuffer !== 0) {\n const factor = viewPortBuffer + 1;\n size.x = Math.ceil(size.x * factor);\n size.y = Math.ceil(size.y * factor);\n }\n const wmsVersion = parseFloat(this.wmsParams.version);\n const crs = this.options.crs || map.options.crs;\n const projectionKey = wmsVersion >= 1.3 ? 'crs' : 'srs';\n if (crs) {\n const nw = crs.project(bounds.getNorthWest());\n const se = crs.project(bounds.getSouthEast());\n\n // Assemble WMS parameter string\n const params: any = {\n width: size.x,\n height: size.y,\n };\n params[projectionKey] = crs.code;\n params.bbox = (\n wmsVersion >= 1.3 && crs === CRS.EPSG4326\n ? [se.y, nw.x, nw.y, se.x]\n : [nw.x, se.y, se.x, nw.y]\n ).join(',');\n\n Util.extend(this.wmsParams, params);\n }\n }\n\n getImageUrl(): string {\n const uppercase = this.options.uppercase || false;\n const pstr = Util.getParamString(this.wmsParams, this._url, uppercase);\n return this._url + pstr;\n }\n}\n","import { DomUtil, GridLayer, Util } from 'leaflet';\nimport { debounce } from '../../../utils/src';\nimport { callAjax } from './callAjax';\n\n// import type { TileLayerOptionsExtended } from './TileAdapter/TileLayer';\n\ntype Constructor = new (...args: any[]) => any;\n\nexport function makeRemote<\n TBase extends Constructor,\n // O extends TileLayerOptionsExtended = TileLayerOptionsExtended\n>(Base: TBase): TBase {\n return class RemoteTileLayer extends Base {\n constructor(...args: any[]) {\n super(...args);\n if (this.options.setViewDelay) {\n // @ts-ignore\n this._update = debounce((...a: any[]) => {\n // @ts-ignore\n GridLayer.prototype._update.call(this, ...a);\n }, this.options.setViewDelay);\n }\n }\n\n createTile(\n coords: Record<string, unknown>,\n done: (error: any, tile: HTMLImageElement) => void,\n ): HTMLImageElement {\n // @ts-ignore\n const url = this.getTileUrl(coords);\n\n const tile = document.createElement('img');\n (tile as any).abort = callAjax(\n url,\n (response) => {\n tile.src = response;\n done(null, tile);\n },\n // @ts-ignore\n this.options.headers,\n );\n\n if (this.options.crossOrigin || this.options.crossOrigin === '') {\n tile.crossOrigin =\n this.options.crossOrigin === true ? '' : this.options.crossOrigin;\n }\n\n tile.alt = '';\n tile.setAttribute('role', 'presentation');\n\n return tile;\n }\n\n _abortLoading() {\n // @ts-ignore\n const tiles = this._tiles;\n // @ts-ignore\n const tileZoom = this._tileZoom;\n for (const i in tiles) {\n if (tiles[i].coords.z !== tileZoom) {\n const tile = tiles[i].el;\n\n tile.onload = Util.falseFn;\n tile.onerror = Util.falseFn;\n if (!tile.complete) {\n if (tile.abort) {\n tile.abort();\n }\n tile.src = Util.emptyImageUrl;\n DomUtil.remove(tile);\n delete tiles[i];\n }\n }\n }\n }\n };\n}\n","// based on https://github.com/bvaughn/debounce-decorator\n\nexport function debounce<T extends (...args: any[]) => void>(\n cb: T,\n wait = 10,\n): T & { clear: () => void } {\n let timeoutId: any;\n\n function wrapper(this: any, ...args: any[]) {\n wrapper.clear();\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n cb.apply(this, args);\n }, wait);\n }\n\n wrapper.clear = function () {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return wrapper as T & { clear: () => void };\n}\n\nexport function DebounceDecorator(wait = 10) {\n return function (\n target: unknown,\n key: string,\n descriptor: PropertyDescriptor,\n ): PropertyDescriptor {\n return {\n configurable: true,\n enumerable: descriptor.enumerable,\n get: function getter() {\n // Attach this function to the instance (not the class)\n Object.defineProperty(this, key, {\n configurable: true,\n enumerable: descriptor.enumerable,\n value: debounce(descriptor.value, wait),\n });\n // @ts-ignore\n return this[key];\n },\n };\n };\n}\n","import { TileLayer as TL } from 'leaflet';\nimport { makeRemote } from '../../utils/makeRemoteTileLayer';\n\nimport type { TileLayerOptions } from 'leaflet';\n\nexport type TileLayerOptionsExtended = TileLayerOptions & {\n headers: Record<string, any>;\n setViewDelay?: number;\n};\n\nclass TileLayerBase extends TL {\n constructor(urlTemplate: string, options?: TileLayerOptionsExtended) {\n super(urlTemplate, options);\n Object.assign(this.options, options);\n }\n}\n\nexport const TileLayer = makeRemote(TileLayerBase);\n","import { TileLayer } from 'leaflet';\nimport { TileLayer as TL } from './TileLayer';\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport type { MainLayerAdapter, TileAdapterOptions } from '@nextgis/webmap';\nimport type { TileLayerOptions } from 'leaflet';\n\nexport class TileAdapter\n extends BaseAdapter<TileAdapterOptions, TileLayer>\n implements MainLayerAdapter\n{\n addLayer(options: TileAdapterOptions): TileLayer | undefined {\n this.options = Object.assign(this.options, options);\n if (options) {\n const { url, ...opt } = options;\n if (url) {\n const tileLayerOptions: TileLayerOptions = {\n pane: this.pane,\n attribution: opt.attribution,\n minZoom: opt.minZoom,\n maxZoom: opt.maxZoom,\n\n ...opt.nativeOptions,\n };\n if (opt.subdomains) {\n tileLayerOptions.subdomains = opt.subdomains;\n }\n let layer;\n if (opt.headers) {\n layer = new TL(url, {\n ...tileLayerOptions,\n headers: opt.headers,\n setViewDelay: opt.setViewDelay,\n });\n } else {\n layer = new TileLayer(url, tileLayerOptions);\n }\n return layer;\n }\n }\n }\n}\n","import { TileLayer } from 'leaflet';\nimport { makeRemote } from '../../utils/makeRemoteTileLayer';\nimport type { WMSOptions } from 'leaflet';\n\ntype LayerOptions = WMSOptions & { headers: any };\n\nclass WmsLayerBase extends TileLayer.WMS {\n constructor(urlTemplate: string, options: LayerOptions) {\n super(urlTemplate, options);\n }\n}\n\nexport const WmsLayer = makeRemote(WmsLayerBase);\n\n// applyMixins(WmsLayer, [RemoteTileLayer]);\n","import type { LatLngBoundsExpression } from 'leaflet';\nimport type { LngLatBoundsArray } from '@nextgis/utils';\n\nexport function arrayToBoundsExpression(\n bounds: LngLatBoundsArray,\n): LatLngBoundsExpression {\n const e = bounds;\n // top, left, bottom, right\n return [\n [e[3], e[0]],\n [e[1], e[2]],\n ];\n}\n","import { EventEmitter } from 'events';\nimport {\n Map,\n Control,\n FitBoundsOptions,\n LatLngBoundsExpression,\n} from 'leaflet';\nimport { convertMapClickEvent } from './utils/convertMapClickEvent';\nimport { createButtonControl } from './controls/createButtonControl';\nimport { AttributionControl } from './controls/Attribution';\nimport { createControl } from './controls/createControl';\nimport { GeoJsonAdapter } from './layer-adapters/GeoJsonAdapter';\nimport { ImageAdapter } from './layer-adapters/ImageAdapter/ImageAdapter';\nimport { TileAdapter } from './layer-adapters/TileAdapter/TileAdapter';\nimport { WmsAdapter } from './layer-adapters/WmsAdapter/WmsAdapter';\nimport { OsmAdapter } from './layer-adapters/OsmAdapter';\n\nimport type {\n Layer,\n GridLayer,\n ControlPosition,\n LeafletMouseEvent,\n} from 'leaflet';\nimport type { LngLatBoundsArray, LngLatArray } from '@nextgis/utils';\nimport type {\n CreateControlOptions,\n ButtonControlOptions,\n LocationEvents,\n LocateOptions,\n MainMapEvents,\n LayerAdapter,\n ViewOptions,\n MapAdapter,\n MapOptions,\n FitOptions,\n MapControl,\n Locate,\n} from '@nextgis/webmap';\nimport { arrayToBoundsExpression } from './utils/arrayToBoundsExpression';\n\nexport type Type<T> = new (...args: any[]) => T;\nexport type UnselectCb = () => void;\nexport type UnselectDef = UnselectCb;\nexport class LeafletMapAdapter implements MapAdapter<Map, any, Control> {\n static layerAdapters: {\n [name: string]: Type<LayerAdapter<Map, any, any>>;\n } = {\n GEOJSON: GeoJsonAdapter,\n IMAGE: ImageAdapter,\n TILE: TileAdapter,\n WMS: WmsAdapter,\n // // MVT: MvtAdapter,\n OSM: OsmAdapter,\n };\n\n static controlAdapters = {\n ZOOM: Control.Zoom,\n ATTRIBUTION: AttributionControl,\n };\n\n static Map = Map;\n\n options: MapOptions = { target: 'map' };\n\n layerAdapters = LeafletMapAdapter.layerAdapters;\n controlAdapters = LeafletMapAdapter.controlAdapters;\n emitter = new EventEmitter();\n map?: Map;\n\n private _resizeObserver?: ResizeObserver;\n private _unselectCb: UnselectDef[] = [];\n private _universalEvents: (keyof MainMapEvents)[] = [\n 'move',\n 'zoom',\n 'moveend',\n 'zoomend',\n 'zoomstart',\n 'movestart',\n ];\n\n create(options: MapOptions): void {\n this.options = { ...options };\n if (this.options.target) {\n const {\n zoom,\n center,\n maxZoom,\n minZoom,\n maxBounds: mb,\n mapAdapterOptions,\n } = this.options;\n this.map = new Map(this.options.target, {\n attributionControl: false,\n zoomControl: false,\n maxBounds: mb ? arrayToBoundsExpression(mb) : undefined,\n maxZoom,\n minZoom,\n center: center && [center[1], center[0]],\n zoom,\n ...mapAdapterOptions,\n });\n // create default pane\n const defPane = this.map.createPane('order-0');\n this.map._addUnselectCb = (def) => {\n this._addUnselectCb(def);\n };\n defPane.style.zIndex = String(0);\n this.emitter.emit('create', this);\n this._addMapListeners();\n }\n }\n\n destroy(): void {\n if (this.map) {\n this.map.remove();\n }\n this._stopWatchSizeChangeToUpdateMinZoom();\n }\n\n getContainer(): HTMLElement | undefined {\n return this.map && this.map.getContainer();\n }\n\n getControlContainer(): HTMLElement {\n const controlContainer = this.map && (this.map as any)._controlContainer;\n if (controlContainer) {\n return controlContainer;\n }\n throw new Error('Leaflet Map is not initialized yet');\n }\n\n setCursor(cursor: string): void {\n if (this.map) {\n this.map.getContainer().style.cursor = cursor;\n }\n }\n\n setView(lngLat: LngLatArray, zoom?: number): void;\n setView(options: ViewOptions): void;\n setView(lngLatOrOpt: LngLatArray | ViewOptions, zoom?: number): void {\n const map = this.map;\n if (!map) return;\n if (Array.isArray(lngLatOrOpt)) {\n const lngLat = lngLatOrOpt;\n const [lng, lat] = lngLat;\n if (this.map) {\n if (typeof zoom === 'number') {\n this.map.setView([lat, lng], zoom, { animate: false });\n } else {\n this.setCenter([lng, lat]);\n }\n }\n } else {\n const { zoom, center, maxBounds, bounds, minZoom, maxZoom } = lngLatOrOpt;\n if (center && zoom !== undefined) {\n this.setView(center, zoom);\n } else {\n if (zoom !== undefined) {\n this.setZoom(zoom);\n }\n if (center) {\n this.setCenter(center);\n }\n }\n if (bounds) {\n this.fitBounds(bounds);\n }\n if (maxBounds !== undefined) {\n if (maxBounds) {\n const b = arrayToBoundsExpression(maxBounds);\n map.setMaxBounds(b);\n map.setMinZoom(map.getBoundsZoom(b));\n this._watchSizeChangeToUpdateMinZoom(b);\n } else {\n // @ts-ignore `null` works for unset maxBounds, but not in typing\n map.setMaxBounds(null);\n this._stopWatchSizeChangeToUpdateMinZoom();\n }\n }\n if (maxZoom !== undefined) {\n map.setMaxZoom(maxZoom);\n }\n if (minZoom !== undefined) {\n this._stopWatchSizeChangeToUpdateMinZoom();\n map.setMinZoom(minZoom);\n }\n }\n }\n\n setCenter(lngLat: LngLatArray): void {\n const [lng, lat] = lngLat;\n if (this.map) {\n this.map.panTo([lat, lng]);\n }\n }\n\n getCenter(): LngLatArray | undefined {\n const map = this.map;\n if (map) {\n const bounds = map.getBounds();\n const center = bounds.getCenter();\n return [center.lng, center.lat];\n }\n }\n\n setZoom(zoom: number): void {\n if (this.map) {\n this.map.setZoom(zoom);\n }\n }\n\n getZoom(): number | undefined {\n return (this.map && this.map.getZoom()) || undefined;\n }\n\n getBounds(): LngLatBoundsArray | undefined {\n if (!this.map) return undefined;\n const b = this.map.getBounds();\n const sw = b.getSouthWest();\n const ne = b.getNorthEast();\n return [sw.lng, sw.lat, ne.lng, ne.lat];\n }\n\n // [west, south, east, north]\n fitBounds(bounds: LngLatBoundsArray, options: FitOptions = {}): void {\n if (this.map) {\n const { maxZoom, offset, padding } = options;\n const opt: FitBoundsOptions = {};\n if (maxZoom) {\n opt.maxZoom = maxZoom;\n }\n if (padding) {\n opt.padding = [padding, padding];\n }\n if (offset) {\n opt.padding = offset;\n }\n\n this.map.fitBounds(arrayToBoundsExpression(bounds), opt);\n }\n }\n\n getLayerAdapter(name: string): Type<LayerAdapter<L.Map, any, any>> {\n return LeafletMapAdapter.layerAdapters[name];\n }\n\n createControl(control: MapControl, options: CreateControlOptions): L.Control {\n return createControl(control, options, this);\n }\n\n createButtonControl(options: ButtonControlOptions): L.Control {\n return createButtonControl(options, this);\n }\n\n addControl(control: Control, position: string): Control | undefined {\n control.options.position = position.replace('-', '') as ControlPosition;\n if (this.map) {\n this.map.addControl(control);\n return control;\n }\n }\n\n removeControl(control: Control): void {\n if (this.map) {\n this.map.removeControl(control);\n }\n }\n\n removeLayer(layer: Layer): void {\n layer && layer.remove && layer.remove();\n }\n\n showLayer(layer: Layer): void {\n if (this.map) {\n layer.addTo(this.map);\n }\n }\n\n hideLayer(layer: Layer): void {\n layer.remove();\n }\n\n setLayerOpacity(layer: GridLayer | Layer, value: number): void {\n if ('setOpacity' in layer) {\n layer.setOpacity(value);\n }\n }\n\n setLayerOrder(\n layer: Layer,\n order: number,\n layers: { [x: string]: LayerAdapter },\n ): void {\n //\n }\n\n onMapClick(evt: LeafletMouseEvent): void {\n const converted = convertMapClickEvent(evt);\n this.emitter.emit('preclick', converted);\n this.emitter.emit('click', converted);\n }\n\n locate(opt: LocateOptions, events?: LocationEvents): Locate {\n const map = this.map;\n if (map) {\n map.locate(opt);\n if (events) {\n const { locationfound, locationerror } = events;\n const locationFound = (e: L.LeafletEvent) => {\n const event = e as L.LocationEvent;\n const lngLat: [number, number] = [event.latlng.lng, event.latlng.lat];\n locationfound({ lngLat });\n };\n if (locationfound !== undefined) {\n map.on('locationfound', locationFound, this);\n }\n if (locationerror) {\n map.on('locationerror', locationerror, this);\n }\n const stop = () => {\n if (locationfound !== undefined) {\n map.off('locationfound', locationFound);\n }\n if (locationerror) {\n map.off('locationerror', locationerror);\n }\n };\n return { stop };\n }\n }\n const stop = () => void 'fake function';\n return { stop };\n }\n\n private _addUnselectCb(cb: UnselectDef) {\n for (const p of this._unselectCb) {\n p();\n }\n this._unselectCb.length = 0;\n this._unselectCb.push(cb);\n }\n\n private _watchSizeChangeToUpdateMinZoom(bounds: LatLngBoundsExpression) {\n this._stopWatchSizeChangeToUpdateMinZoom();\n const container = this.getContainer();\n const map = this.map;\n if (container && map && window.ResizeObserver) {\n this._resizeObserver = new ResizeObserver(() => {\n map.setMinZoom(map.getBoundsZoom(bounds));\n });\n this._resizeObserver.observe(container);\n }\n }\n\n private _stopWatchSizeChangeToUpdateMinZoom() {\n const map = this.map;\n if (map) {\n map.setMinZoom(0);\n }\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n this._resizeObserver = undefined;\n }\n }\n\n private _addMapListeners() {\n const map = this.map;\n if (map) {\n map.on('click', (evt) => {\n this.onMapClick(evt as LeafletMouseEvent);\n });\n this._universalEvents.forEach((e) => {\n map.on(e, () => this.emitter.emit(e, this), map);\n });\n }\n }\n}\n","import { ButtonControlOptions, MapAdapter } from '@nextgis/webmap';\nimport { createControl } from './createControl';\nimport { DomEvent, Control } from 'leaflet';\n\nexport function createButtonControl(\n options: ButtonControlOptions,\n map: MapAdapter,\n): Control {\n const link = document.createElement('a');\n\n const title = options.title || '';\n link.href = '#';\n link.title = title;\n\n link.setAttribute('role', 'button');\n link.setAttribute('aria-label', title);\n\n DomEvent.disableClickPropagation(link);\n DomEvent.on(link, 'click', DomEvent.stop);\n\n if (options.html instanceof HTMLElement) {\n link.appendChild(options.html);\n } else if (typeof options.html === 'string') {\n link.innerHTML = options.html;\n }\n\n const onClick = (e: Event) => {\n e.stopPropagation();\n options.onClick();\n };\n\n return createControl(\n {\n onAdd() {\n if (options.onClick !== undefined) {\n link.addEventListener('click', onClick);\n }\n return link;\n },\n onRemove() {\n const parent = link.parentNode;\n if (parent) {\n parent.removeChild(link);\n }\n if (options.onClick !== undefined) {\n link.removeEventListener('click', onClick);\n }\n },\n },\n { bar: true },\n map,\n );\n}\n","import {\n CircleMarker,\n FeatureGroup,\n DomEvent,\n GeoJSON,\n DivIcon,\n Marker,\n Layer,\n} from 'leaflet';\nimport { debounce, defined } from '@nextgis/utils';\n\nimport { isPaintCallback, isPaint } from '@nextgis/paint';\nimport {\n PAINT,\n typeAlias,\n filterGeometries,\n createFeaturePositionOptions,\n} from '../utils/geometries';\nimport { createMouseEvent } from '../utils/createMouseEvent';\nimport { boundsToArray } from '../utils/boundsToArray';\nimport { detectType } from '../utils/detectType';\nimport { BaseAdapter } from './BaseAdapter';\n\nimport type { GeoJsonObject, Feature, Point } from 'geojson';\nimport type {\n PopupOptions as LPopupOptions,\n CircleMarkerOptions,\n LeafletMouseEvent,\n LatLngExpression,\n GeoJSONOptions,\n LeafletEvent,\n PathOptions,\n LatLng,\n Path,\n Map,\n} from 'leaflet';\nimport type {\n Paint,\n IconPaint,\n PathPaint,\n VectorAdapterLayerPaint,\n} from '@nextgis/paint';\nimport type { LngLatBoundsArray } from '@nextgis/utils';\nimport type {\n VectorAdapterLayerType,\n GeoJsonAdapterOptions,\n PopupOnCloseFunction,\n OnLayerMouseOptions,\n VectorLayerAdapter,\n OnLayerSelectType,\n LayerDefinition,\n DataLayerFilter,\n PopupOptions,\n} from '@nextgis/webmap';\n\nexport type LayerDef = LayerDefinition<Feature, Layer>;\n\nexport class GeoJsonAdapter\n extends BaseAdapter<GeoJsonAdapterOptions>\n implements VectorLayerAdapter<Map>\n{\n layer?: FeatureGroup;\n selected = false;\n\n private paint?: Paint;\n private selectedPaint?: Paint;\n private type?: VectorAdapterLayerType;\n\n private _layers: LayerDef[] = [];\n private _selectedLayers: LayerDef[] = [];\n private _filteredLayers: LayerDef[] = [];\n private _filterFun?: DataLayerFilter<Feature>;\n private _openedPopup: [Layer, PopupOnCloseFunction[], LayerDef][] = [];\n\n private $updateTooltip = debounce(() => {\n this.updateTooltip();\n }, 300);\n\n constructor(map: L.Map, options: GeoJsonAdapterOptions) {\n super(map, options);\n }\n\n addLayer(options: GeoJsonAdapterOptions): FeatureGroup<any> | undefined {\n Object.assign(this.options, options);\n this.paint = options.paint;\n this.layer = new FeatureGroup([], {\n ...options.nativeOptions,\n pane: this.pane,\n });\n this.selectedPaint = options.selectedPaint;\n options.paint = this.paint;\n\n if (options.data) {\n this.addData(options.data);\n }\n\n this._addMapListener();\n\n return this.layer;\n }\n\n beforeRemove(): void {\n this._removeMapListener();\n }\n\n select(findFeatureFun?: DataLayerFilter): void {\n if (findFeatureFun) {\n const def = this._layers.filter(findFeatureFun);\n def.forEach((x) => {\n this._selectLayer(x, 'api');\n });\n } else if (!this.selected) {\n this.selected = true;\n if (this.selectedPaint) {\n this._setPaintEachLayer(this.selectedPaint);\n }\n }\n }\n\n unselect(findFeatureFun?: DataLayerFilter): void {\n if (findFeatureFun) {\n const feature = this._layers.filter(findFeatureFun);\n feature.forEach((x) => {\n this._unSelectLayer(x);\n });\n } else if (this.selected) {\n for (const p of this._openedPopup) {\n this._removePopup(p[0]);\n }\n if (this.paint) {\n this._setPaintEachLayer(this.paint);\n }\n this._selectedLayers.length = 0;\n this.selected = false;\n }\n }\n\n getSelected(): LayerDefinition<Feature, LayerDef>[] {\n return this._selectedLayers.map((x) => {\n return {\n target: this,\n feature: x.feature,\n layer: x,\n ...createFeaturePositionOptions(x.feature),\n };\n });\n }\n\n getFiltered(): LayerDef[] {\n return this._filteredLayers;\n }\n\n filter(fun?: DataLayerFilter): LayerDef[] {\n // Some optimization\n this._filterFun = fun;\n const layer_ = this.layer;\n const map = layer_ && (layer_ as any)._map;\n if (layer_ && map) {\n layer_.remove();\n\n const filteredLayers: LayerDef[] = [];\n this._layers.forEach(({ feature, layer }) => {\n if (layer) {\n const ok = fun\n ? fun({\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n })\n : true;\n if (ok) {\n layer_.addLayer(layer);\n filteredLayers.push({\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n });\n } else {\n layer_.removeLayer(layer);\n }\n }\n });\n this._filteredLayers = filteredLayers;\n\n layer_.addTo(map);\n }\n return this._filteredLayers;\n }\n\n cleanFilter(): void {\n this.filter();\n }\n\n getLayers(): LayerDef[] {\n return this._layers.map(({ layer, feature }) => {\n const visible = layer && !!(layer as any)._map;\n return {\n feature,\n layer,\n visible,\n target: this,\n ...createFeaturePositionOptions(feature),\n };\n });\n }\n\n clearLayer(cb?: (feature: Feature) => boolean): void {\n this.unselect();\n const layer_ = this.layer;\n if (layer_) {\n if (cb) {\n for (let fry = this._layers.length; fry--; ) {\n const def = this._layers[fry];\n if (def) {\n const { feature, layer } = def;\n if (feature && layer) {\n const exist = cb(feature);\n if (exist) {\n layer_.removeLayer(layer);\n this._layers.splice(fry, 1);\n }\n }\n }\n }\n } else {\n layer_.clearLayers();\n this._layers = [];\n }\n }\n }\n\n setData(data: GeoJsonObject): void {\n this.clearLayer();\n this.addData(data);\n }\n\n addData(data: GeoJsonObject | false): void {\n const options = this.options;\n let geoJsonOptions: GeoJSONOptions | undefined;\n if (options) {\n if (data) {\n let type: VectorAdapterLayerType;\n\n if (!options.type) {\n const detectedType = detectType(data);\n type = typeAlias[detectedType];\n } else {\n type = options.type;\n }\n if (this.type && this.type !== type) {\n console.warn('no other data type than layer can be added');\n return;\n }\n this.type = type;\n\n data = filterGeometries(data, type);\n if (data) {\n geoJsonOptions = this._getGeoJsonOptions(options, type);\n }\n }\n new GeoJSON(data || undefined, geoJsonOptions);\n }\n }\n\n openPopup(findFeatureFun: DataLayerFilter, options?: PopupOptions): void {\n if (findFeatureFun) {\n const def = this._layers.filter(findFeatureFun);\n def.forEach((x) => {\n this._openPopup(x, options, 'api');\n });\n }\n }\n\n closePopup(findFeatureFun?: DataLayerFilter): void {\n const popupToClose = findFeatureFun\n ? this._openedPopup.filter((x) => findFeatureFun(x[2]))\n : this._openedPopup;\n\n popupToClose.forEach((x) => {\n this._removePopup(x[0]);\n });\n }\n\n updateTooltip(layerDef?: LayerDefinition): void {\n if (layerDef) {\n this._updateTooltip(layerDef);\n } else {\n this.getLayers().forEach((x) =>\n this._updateTooltip({ feature: x.feature, layer: x.layer }),\n );\n }\n }\n\n /** @deprecated use {@link GeoJsonAdapter.getBounds} instead */\n getExtent(): LngLatBoundsArray | undefined {\n return this.getBounds();\n }\n\n getBounds(): LngLatBoundsArray | undefined {\n if (this.layer) {\n const bounds = this.layer.getBounds();\n if (bounds.isValid()) {\n return boundsToArray(bounds);\n }\n }\n }\n\n setOpacity(value: number): void {\n this.options.opacity = value;\n this.setPaint(this.paint);\n this.setSelectedPaint(this.selectedPaint);\n }\n\n setPaint(paint?: Paint | null): void {\n if (paint) {\n this.paint = paint;\n for (const l of this._layers) {\n this._setPaint(l, paint);\n }\n }\n }\n setSelectedPaint(paint?: Paint | null): void {\n if (paint) {\n this.selectedPaint = paint;\n for (const l of this._selectedLayers) {\n this._setPaint(l, paint);\n }\n }\n }\n updatePaint(paint: Partial<Paint>): void {\n this.paint = { ...this.paint, ...paint } as Paint;\n for (const l of this._layers) {\n this._setPaint(l, this.paint);\n }\n }\n updateSelectedPaint(paint: Partial<Paint>): void {\n this.selectedPaint = { ...this.selectedPaint, ...paint } as Paint;\n for (const l of this._selectedLayers) {\n this._setPaint(l, this.selectedPaint);\n }\n }\n\n private $unselect = () => {\n this.unselect();\n };\n\n private _updateTooltip(layerDef: Pick<LayerDef, 'feature' | 'layer'>) {\n const { feature, layer } = layerDef;\n if (feature && layer && feature.properties && this.options.labelField) {\n layer.unbindTooltip();\n const message = feature.properties[this.options.labelField];\n if (message !== undefined) {\n const permanent = !this.options.labelOnHover;\n\n layer.bindTooltip(String(message), { permanent, sticky: false });\n }\n }\n }\n\n private async _openPopup(\n def: LayerDef,\n options: PopupOptions = {},\n type: OnLayerSelectType,\n latLng?: LatLngExpression,\n ) {\n const { feature, layer } = def;\n const {\n minWidth,\n autoPan,\n maxWidth,\n closeButton: closeButton_,\n } = {\n minWidth: 300,\n ...options,\n };\n const closeButton = closeButton_ ?? !this.options.selectOnHover;\n let popup: Layer;\n const _closeHandlers: PopupOnCloseFunction[] = [];\n const onClose = (handler: PopupOnCloseFunction) => {\n _closeHandlers.push(handler);\n };\n const close = () => {\n if (popup) {\n this._removePopup(popup);\n }\n };\n let content;\n if (options.createPopupContent) {\n content = await options.createPopupContent({\n layer,\n feature,\n target: this,\n type,\n close,\n onClose,\n ...createFeaturePositionOptions(feature),\n });\n } else {\n content = options.popupContent;\n }\n\n if (content && layer) {\n const popupOptions: LPopupOptions = {\n minWidth,\n autoPan,\n // maxWidth,\n closeButton,\n closeOnClick: false,\n autoClose: false,\n };\n if (defined(maxWidth)) {\n popupOptions.maxWidth = maxWidth;\n }\n popup = layer.bindPopup(content, popupOptions);\n\n const unselectOnClose =\n this.options.popupOptions?.unselectOnClose ?? true;\n if (unselectOnClose) {\n const p = layer.getPopup();\n p &&\n p.once(\n 'remove',\n () => {\n close();\n },\n this,\n );\n }\n this._openedPopup.push([popup, _closeHandlers, def]);\n popup.openPopup(latLng);\n }\n }\n\n private _removePopup(popup: Layer) {\n const map = this.map;\n if (map) {\n popup.closePopup().unbindPopup();\n const index = this._openedPopup.findIndex((x) => x[0] === popup);\n if (index !== -1) {\n const unselectOnClose =\n this.options.popupOptions?.unselectOnClose ?? true;\n const [, closeHandlers, def] = this._openedPopup[index];\n for (const h of closeHandlers) {\n h(def);\n }\n closeHandlers.length = 0;\n if (unselectOnClose) {\n this._unSelectLayer(def);\n }\n this._openedPopup.splice(index, 1);\n }\n }\n }\n\n private _setPaintEachLayer(paint: Paint) {\n this._layers.forEach((l) => {\n this._setPaint(l, paint);\n });\n }\n\n private _setPaint(def: LayerDef, paint: Paint) {\n let style: VectorAdapterLayerPaint | undefined = undefined;\n const { layer, feature } = def;\n if (layer && feature) {\n if (isPaintCallback(paint)) {\n style = paint(feature);\n } else if (isPaint(paint)) {\n style = paint;\n }\n if (style) {\n if (this.type === 'point' && style.type === 'icon') {\n const marker = layer as Marker;\n const divIcon = this._createDivIcon(style);\n marker.setIcon(divIcon);\n } else if ('setStyle' in layer) {\n (layer as Path).setStyle(this._preparePaint(style));\n }\n }\n }\n }\n\n private _preparePaint(paint: VectorAdapterLayerPaint): PathOptions {\n if (paint.type !== 'get-paint') {\n // const path: CircleMarkerOptions | PathOptions = paint as CircleMarkerOptions | PathOptions;\n // if (path.opacity) {\n // path.fillOpacity = path.opacity;\n // }\n\n const paintAliases: [keyof PathOptions, keyof PathPaint][] = [\n // ['color', 'color'],\n ['color', 'strokeColor'],\n ['opacity', 'strokeOpacity'],\n ['stroke', 'stroke'],\n ['fillColor', 'fillColor'],\n ['fillOpacity', 'fillOpacity'],\n ['fill', 'fill'],\n ['weight', 'weight'],\n ];\n const aliases: [keyof PathOptions, keyof PathPaint][] =\n this.type === 'line'\n ? [\n ['color', 'strokeColor'],\n ['opacity', 'strokeOpacity'],\n ['weight', 'weight'],\n ]\n : paintAliases;\n\n const readyPaint: PathOptions & CircleMarkerOptions = {};\n\n if ('radius' in paint && typeof paint.radius === 'number') {\n readyPaint.radius = paint.radius;\n }\n for (const [to, from] of aliases) {\n let paintProp = (paint as PathPaint)[from];\n if (\n defined(this.options.opacity) &&\n from.toLowerCase().indexOf('opacity') !== -1\n ) {\n paintProp = Number(paintProp) * this.options.opacity;\n }\n\n if (paintProp !== undefined) {\n Object.defineProperty(readyPaint, to, {\n enumerable: true,\n value: paintProp,\n });\n }\n }\n\n return readyPaint;\n }\n return PAINT;\n }\n\n private _getGeoJsonOptions(\n options: GeoJsonAdapterOptions,\n type: VectorAdapterLayerType,\n ): GeoJSONOptions {\n const paint = options.paint;\n let lopt: GeoJSONOptions = {};\n\n if (typeof paint === 'function') {\n if (type === 'point') {\n // TODO: fix types (@geoman-io/leaflet-geoman-free)\n (lopt as any).pointToLayer = (\n feature: Feature<Point, any>,\n latLng: LatLng,\n ) => {\n const iconOpt = paint(feature);\n const pointToLayer = this._createPaintToLayer(iconOpt as IconPaint);\n return pointToLayer(feature, latLng);\n };\n } else {\n lopt = {\n style: (feature) => {\n if (feature) {\n return this._preparePaint({ ...PAINT, ...paint(feature) });\n } else {\n return this._preparePaint({ ...PAINT, type: 'path' });\n }\n },\n };\n }\n } else {\n lopt = this._createPaintOptions(paint as VectorAdapterLayerPaint, type);\n }\n\n lopt.onEachFeature = (feature: Feature, layer) => {\n this._onEachFeature(feature, layer);\n };\n\n return lopt;\n }\n\n private _onEachFeature(feature: Feature, layer: Layer) {\n const layer_ = this.layer;\n if (layer_) {\n const def = {\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n };\n\n // @ts-ignore\n layer.options.pane = this.pane;\n this._layers.push(def);\n let ok = true;\n if (this._filterFun) {\n ok = this._filterFun(def);\n }\n if (ok) {\n const { popup, popupOptions, selectable, interactive, selectOnHover } =\n this.options;\n // @ts-ignore\n layer.options.interactive = defined(interactive) ? interactive : true;\n layer_.addLayer(layer);\n if (selectable) {\n if (selectOnHover) {\n layer.on('mouseover', () => {\n this._selectLayer(def, 'hover');\n });\n layer.on('mouseout', () => {\n this._unSelectLayer(def);\n });\n } else {\n layer.on(\n 'click',\n (e) => this._selectOnLayerClick(e as LeafletMouseEvent),\n this,\n );\n }\n }\n this._handleMouseEvents(layer);\n // The timeout is needed to display the popup immediately when adding a layer to the map.\n // Without a timeout, the layer may not yet have a _map object\n setTimeout(() => {\n if (popup) {\n this._openPopup(\n {\n target: this,\n layer,\n feature,\n ...createFeaturePositionOptions(feature),\n },\n popupOptions,\n 'api',\n );\n }\n this._updateTooltip({ layer, feature });\n });\n }\n }\n }\n\n private _handleMouseEvents(layer: Layer) {\n const { onClick, onLayerClick, onMouseOut, onMouseOver } = this.options;\n // TODO: remove backward compatibility for onLayerClick\n const onClick_ = onClick || onLayerClick;\n if (onClick_) {\n layer.on(\n 'click',\n (e) => {\n const selected = !!this._getSelected(layer);\n onClick_({\n selected,\n ...this._createMouseEvent(e),\n });\n },\n this,\n );\n }\n if (onMouseOut) {\n layer.on(\n 'mouseout',\n (e) => {\n onMouseOut(this._createMouseEvent(e));\n },\n this,\n );\n }\n if (onMouseOver) {\n layer.on(\n 'mouseover',\n (e) => {\n onMouseOver(this._createMouseEvent(e));\n },\n this,\n );\n }\n }\n\n private _createMouseEvent(source: LeafletEvent): OnLayerMouseOptions {\n return createMouseEvent({\n layer: this,\n source: source as LeafletMouseEvent,\n });\n }\n\n private _getSelected(layer: LayerDef['layer']) {\n return this._selectedLayers.find((x) => x.layer === layer);\n }\n\n private _selectOnLayerClick(e: LeafletMouseEvent) {\n DomEvent.stopPropagation(e);\n const layer = e.target as Layer;\n const feature = (layer as any).feature;\n const def: LayerDef = {\n target: this,\n layer,\n feature,\n ...createFeaturePositionOptions(feature),\n };\n const isSelected = this._getSelected(layer);\n if (isSelected) {\n if (this.options && this.options.unselectOnSecondClick) {\n this._unSelectLayer(isSelected);\n }\n } else {\n this._selectLayer(def, 'click', e.latlng);\n }\n }\n\n private _selectLayer(\n def: LayerDef,\n type: OnLayerSelectType,\n latlng?: LatLngExpression,\n ) {\n this.map._addUnselectCb(() => {\n this._unSelectLayer(def);\n });\n if (this.options && !this.options.multiselect) {\n this._selectedLayers.forEach((x) => this._unSelectLayer(x));\n }\n this._selectedLayers.push(def);\n this.selected = true;\n const { selectedPaint, popupOnSelect, popupOptions } = this.options;\n\n if (selectedPaint && def.layer) {\n this._setPaint(def, selectedPaint);\n }\n if (popupOnSelect) {\n this._openPopup(def, popupOptions, type, latlng);\n }\n if (this.options.onSelect) {\n const features = def.feature ? [def.feature] : [];\n this.options.onSelect({\n type,\n layer: this,\n features,\n ...createFeaturePositionOptions(features),\n });\n }\n }\n\n private _unSelectLayer(def: LayerDef) {\n const index = this._selectedLayers.indexOf(def);\n if (index !== -1) {\n this._selectedLayers.splice(index, 1);\n if (this.options) {\n if (this.options.paint) {\n this._setPaint(def, this.options.paint);\n }\n\n if (this.options.popupOnSelect && def.layer) {\n this._removePopup(def.layer);\n }\n }\n }\n this.selected = this._selectedLayers.length > 0;\n }\n\n private _createDivIcon(icon: IconPaint) {\n const { ...toLIconOpt } = icon;\n return new DivIcon({ className: '', ...toLIconOpt });\n }\n\n private _createPaintToLayer(icon: IconPaint) {\n if (icon && icon.type) {\n if (icon.type === 'icon') {\n const iconClassName = icon.className;\n const html = icon.html;\n if (iconClassName || html) {\n return (geoJsonPoint: any, latlng: LatLngExpression) => {\n const divIcon = this._createDivIcon(icon);\n return new Marker(latlng, { icon: divIcon });\n };\n }\n } else if (icon.type === 'pin') {\n return (geoJsonPoint: any, latlng: LatLngExpression) => {\n // const divIcon = this.createDivIcon(icon);\n return new Marker(latlng);\n };\n }\n }\n return (geoJsonPoint: any, latlng: LatLngExpression) => {\n const p: any = PAINT;\n return new CircleMarker(latlng, this._preparePaint({ ...p, ...icon }));\n };\n }\n\n private _createPaintOptions(\n paintOptions: VectorAdapterLayerPaint,\n type: VectorAdapterLayerType,\n ): GeoJSONOptions {\n const geoJsonOptions: GeoJSONOptions = {};\n const paint = (paintOptions && this._preparePaint(paintOptions)) || {};\n if (paintOptions) {\n geoJsonOptions.style = () => {\n return paint;\n };\n }\n if (type === 'point') {\n (geoJsonOptions as any).pointToLayer = this._createPaintToLayer(\n paintOptions as IconPaint,\n );\n } else if (type === 'line') {\n paint.stroke = true;\n }\n return geoJsonOptions;\n }\n\n private _addMapListener() {\n const map = this.map;\n if (map) {\n const { labelField, labelOnHover, unselectOnClick } = this.options;\n const uoc = unselectOnClick ?? true;\n if (uoc) {\n map.on('click', this.$unselect);\n }\n if (labelField && !labelOnHover) {\n map.on('zoomend', this.$updateTooltip);\n map.on('moveend', this.$updateTooltip);\n }\n }\n }\n\n private _removeMapListener() {\n this.map.off('zoomend', this.$updateTooltip);\n this.map.off('moveend', this.$updateTooltip);\n this.map.off('click', this.$unselect);\n }\n}\n","import { convertMapClickEvent } from './convertMapClickEvent';\nimport { createFeaturePositionOptions } from './geometries';\n\nimport type { LeafletMouseEvent } from 'leaflet';\nimport type { LayerAdapter, OnLayerMouseOptions } from '@nextgis/webmap';\nimport type { LayerDef } from '../layer-adapters/GeoJsonAdapter';\n\nexport interface CreateMouseEventOptions {\n layer: LayerAdapter;\n source: LeafletMouseEvent;\n}\n\nexport function createMouseEvent({\n layer,\n source,\n}: CreateMouseEventOptions): OnLayerMouseOptions {\n const layer_ = source.target as LayerDef;\n const feature = layer_.feature;\n const opt: OnLayerMouseOptions = {\n layer,\n feature,\n event: convertMapClickEvent(source),\n source,\n ...createFeaturePositionOptions(feature),\n };\n return opt;\n}\n","import { MainLayerAdapter } from '@nextgis/webmap';\nimport { ImageLayer } from './ImageLayer';\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport type { Map } from 'leaflet';\nimport type { ImageAdapterOptions } from '@nextgis/webmap';\n\nexport class ImageAdapter\n extends BaseAdapter<ImageAdapterOptions>\n implements MainLayerAdapter<Map>\n{\n layer: any;\n\n addLayer(options: ImageAdapterOptions): any {\n const url = options && options.url;\n if (url) {\n options = { transparent: true, ...options };\n const updateWmsParamsFromOpt = options.updateWmsParams;\n this.layer = new ImageLayer(url, {\n pane: this.pane,\n headers: options.headers,\n setViewDelay: options.setViewDelay,\n /**\n * TODO: safe remove, use only options.nativeOptions\n */\n ...options,\n ...options.params,\n ...options.nativeOptions,\n });\n if (updateWmsParamsFromOpt) {\n const updateWmsParams = this.layer.updateWmsParams;\n this.layer.updateWmsParams = function (map: Map) {\n updateWmsParams.call(this, map);\n this.wmsParams = updateWmsParamsFromOpt(this.wmsParams);\n };\n }\n return this.layer;\n }\n }\n}\n","import { TileLayer } from 'leaflet';\nimport { WmsLayer as WMS } from './WmsLayer';\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport type { MainLayerAdapter, WmsAdapterOptions } from '@nextgis/webmap';\nimport type { WMSOptions } from 'leaflet';\n\nexport class WmsAdapter\n extends BaseAdapter<WmsAdapterOptions, TileLayer.WMS>\n implements MainLayerAdapter\n{\n addLayer(options: WmsAdapterOptions): TileLayer.WMS | undefined {\n Object.assign(this.options, options);\n const { url, ...opt } = options;\n if (url) {\n const layerOptions: WMSOptions = {\n pane: this.pane,\n attribution: opt.attribution,\n minZoom: opt.minZoom,\n maxZoom: opt.maxZoom,\n layers: options.layers,\n format: options.format,\n ...options.nativeOptions,\n };\n let layer;\n if (opt.headers) {\n layer = new WMS(url, { ...layerOptions, headers: opt.headers });\n } else {\n layer = new TileLayer.WMS(url, layerOptions);\n }\n return layer;\n }\n }\n}\n","import { MainLayerAdapter, TileAdapterOptions } from '@nextgis/webmap';\nimport { TileLayer } from 'leaflet';\n\nimport { TileAdapter } from './TileAdapter/TileAdapter';\n\nexport class OsmAdapter extends TileAdapter implements MainLayerAdapter {\n addLayer(options: Omit<TileAdapterOptions, 'url'>): TileLayer | undefined {\n const url = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n return super.addLayer({\n name: 'OpenStreetMap',\n attribution:\n '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors',\n ...options,\n url,\n });\n }\n}\n","import { Control, ControlOptions } from 'leaflet';\nimport { AttributionControlOptions } from '@nextgis/webmap';\n\nexport class AttributionControl extends Control.Attribution {\n // options: AttributionControlOptions\n constructor(options: AttributionControlOptions & ControlOptions) {\n super(options);\n const customAttribution = options && options.customAttribution;\n if (customAttribution) {\n let attributions: string[] = [];\n if (Array.isArray(customAttribution)) {\n attributions = customAttribution;\n } else if (customAttribution) {\n attributions = [customAttribution];\n }\n attributions.forEach((x) => this.addAttribution(x));\n }\n }\n}\n","/**\n * @module leaflet-map-adapter\n */\n\nimport { LeafletMapAdapter } from './LeafletMapAdapter';\n\nexport default LeafletMapAdapter;\n"],"names":["convertMapClickEvent","evt","coord","containerPoint","latLng","latlng","lat","lng","lngLat","pixel","left","x","top","y","source","createControl","control","options","map","Control","extend","onAdd","element","document","createElement","content","classList","add","bar","addClass","margin","style","marginBottom","marginTop","marginLeft","marginRight","appendChild","DomEvent","disableClickPropagation","onRemove","boundsToArray","bounds","ne","getNorthEast","sw","getSouthWest","typeAlias","Point","LineString","MultiPoint","Polygon","MultiLineString","MultiPolygon","GeometryCollection","PAINT","stroke","opacity","backAliases","a","layerType","backAlias","push","geometryFilter","geometry","type","indexOf","featuresBounds","features","geoJsonLayer","GeoJSON","Array","isArray","forEach","f","addData","getBounds","createFeaturePositionOptions","getFeaturesBounds","getCenter","getFeaturesCenter","findMostFrequentGeomType","arr","counts","fry","length","maxName","c","BaseAdapter","constructor","this","undefined","order","pane","exist","getPane","createPane","zIndex","String","Math","round","addLayer","Object","assign","callAjax","src","callback","headers","xhr","XMLHttpRequest","open","responseType","h","setRequestHeader","onload","arrayBufferView","Uint8Array","response","blob","Blob","imageUrl","window","URL","webkitURL","createObjectURL","send","abort","ImageOverlay","LImageOverlay","super","cancelLoad","_abort","_initImage","img","_image","ImageLayer","Layer","url","service","request","version","layers","styles","format","transparent","crs","uppercase","attribution","isBack","minZoom","maxZoom","viewPortBuffer","setViewDelay","_url","params","opts","opt","Util","setOptions","wmsParams","defaultWmsParams","setParams","update","getAttribution","_currentOverlay","removeLayer","_currentUrl","getEvents","moveend","debounce","_map","updateWmsParams","getImageUrl","pad","overlay","addTo","once","setOpacity","bringToBack","bringToFront","setZIndex","getZoom","size","getSize","factor","ceil","wmsVersion","parseFloat","projectionKey","nw","project","getNorthWest","se","getSouthEast","width","height","code","bbox","CRS","EPSG4326","join","pstr","getParamString","makeRemote","Base","args","_update","cb","wait","timeoutId","wrapper","clear","setTimeout","apply","clearTimeout","GridLayer","prototype","call","createTile","coords","done","getTileUrl","tile","crossOrigin","alt","setAttribute","_abortLoading","tiles","_tiles","tileZoom","_tileZoom","i","z","el","falseFn","onerror","complete","emptyImageUrl","DomUtil","remove","TileLayer","TL","urlTemplate","TileAdapter","tileLayerOptions","nativeOptions","layer","subdomains","WmsLayer","WMS","arrayToBoundsExpression","LeafletMapAdapter","target","layerAdapters","controlAdapters","EventEmitter","create","zoom","center","maxBounds","mb","mapAdapterOptions","Map","attributionControl","zoomControl","defPane","_addUnselectCb","def","emitter","emit","_addMapListeners","destroy","_stopWatchSizeChangeToUpdateMinZoom","getContainer","getControlContainer","controlContainer","_controlContainer","Error","setCursor","cursor","setView","lngLatOrOpt","animate","setCenter","setZoom","fitBounds","b","setMaxBounds","setMinZoom","getBoundsZoom","_watchSizeChangeToUpdateMinZoom","setMaxZoom","panTo","offset","padding","getLayerAdapter","name","createButtonControl","link","title","href","on","stop","html","HTMLElement","innerHTML","onClick","e","stopPropagation","addEventListener","parent","parentNode","removeChild","removeEventListener","addControl","position","replace","removeControl","showLayer","hideLayer","setLayerOpacity","value","setLayerOrder","onMapClick","converted","locate","events","locationfound","locationerror","locationFound","off","p","_unselectCb","container","ResizeObserver","_resizeObserver","observe","disconnect","_universalEvents","GEOJSON","updateTooltip","unselect","paint","FeatureGroup","selectedPaint","data","_addMapListener","beforeRemove","_removeMapListener","select","findFeatureFun","_layers","filter","_selectLayer","selected","_setPaintEachLayer","_unSelectLayer","_openedPopup","_removePopup","_selectedLayers","getSelected","feature","getFiltered","_filteredLayers","fun","_filterFun","layer_","filteredLayers","cleanFilter","getLayers","visible","clearLayer","splice","clearLayers","setData","geoJsonOptions","detectedType","geojson","geometries","g","detectType","console","warn","filterGeometries","_getGeoJsonOptions","openPopup","_openPopup","closePopup","layerDef","_updateTooltip","getExtent","isValid","setPaint","setSelectedPaint","l","_setPaint","updatePaint","updateSelectedPaint","properties","labelField","unbindTooltip","message","permanent","labelOnHover","bindTooltip","sticky","minWidth","autoPan","maxWidth","closeButton","closeButton_","selectOnHover","popup","_closeHandlers","onClose","handler","close","createPopupContent","popupContent","popupOptions","closeOnClick","autoClose","defined","bindPopup","unselectOnClose","getPopup","unbindPopup","index","findIndex","closeHandlers","isPaintCallback","isPaint","marker","divIcon","_createDivIcon","setIcon","setStyle","_preparePaint","paintAliases","aliases","readyPaint","radius","to","from","paintProp","toLowerCase","Number","defineProperty","enumerable","lopt","pointToLayer","iconOpt","_createPaintToLayer","_createPaintOptions","onEachFeature","_onEachFeature","ok","selectable","interactive","_selectOnLayerClick","_handleMouseEvents","onLayerClick","onMouseOut","onMouseOver","onClick_","_getSelected","_createMouseEvent","event","createMouseEvent","find","isSelected","unselectOnSecondClick","multiselect","popupOnSelect","onSelect","icon","toLIconOpt","DivIcon","className","geoJsonPoint","Marker","CircleMarker","paintOptions","unselectOnClick","$unselect","$updateTooltip","IMAGE","updateWmsParamsFromOpt","TILE","layerOptions","OSM","ZOOM","Zoom","ATTRIBUTION","Attribution","customAttribution","attributions","addAttribution"],"mappings":"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"}
1
+ {"version":3,"file":"leaflet-map-adapter.esm-bundler.prod.js","sources":["../src/utils/convertMapClickEvent.ts","../src/controls/createControl.ts","../src/controls/Attribution.ts","../src/utils/boundsToArray.ts","../src/utils/geometries.ts","../src/utils/detectType.ts","../src/layer-adapters/BaseAdapter.ts","../src/layer-adapters/GeoJsonAdapter.ts","../src/utils/createMouseEvent.ts","../src/utils/callAjax.ts","../src/layer-adapters/ImageAdapter/ImageOverlay.ts","../src/layer-adapters/ImageAdapter/ImageLayer.ts","../src/layer-adapters/ImageAdapter/ImageAdapter.ts","../../utils/src/debounce.ts","../src/utils/makeRemoteTileLayer.ts","../src/layer-adapters/TileAdapter/TileLayer.ts","../src/layer-adapters/TileAdapter/TileAdapter.ts","../src/layer-adapters/WmsAdapter/WmsLayer.ts","../src/layer-adapters/WmsAdapter/WmsAdapter.ts","../src/layer-adapters/OsmAdapter.ts","../src/utils/arrayToBoundsExpression.ts","../src/LeafletMapAdapter.ts","../src/controls/createButtonControl.ts"],"sourcesContent":["import type { LeafletMouseEvent } from 'leaflet';\n\nimport type { MapClickEvent } from '@nextgis/webmap';\n\nexport function convertMapClickEvent(evt: LeafletMouseEvent): MapClickEvent {\n const coord = evt.containerPoint;\n const latLng = evt.latlng;\n const { lat, lng } = latLng;\n return {\n latLng,\n lngLat: [lng, lat],\n pixel: { left: coord.x, top: coord.y },\n source: evt,\n };\n}\n","import { Control, DomEvent } from 'leaflet';\nimport type {\n MapControl,\n CreateControlOptions,\n MapAdapter,\n} from '@nextgis/webmap';\n\nexport function createControl(\n control: MapControl,\n options: CreateControlOptions = {},\n map: MapAdapter,\n): Control {\n const C = Control.extend({\n onAdd() {\n const element = document.createElement('div');\n const content = control.onAdd(map);\n element.classList.add('leaflet-control');\n if (options.bar) {\n element.classList.add('leaflet-bar');\n }\n if (options.addClass) {\n element.classList.add(options.addClass);\n }\n if (!options.margin && !options.bar) {\n element.style.marginBottom = '0px';\n element.style.marginTop = '0px';\n element.style.marginLeft = '0px';\n element.style.marginRight = '0px';\n }\n if (content) {\n element.appendChild(content);\n }\n\n DomEvent.disableClickPropagation(element);\n\n return element;\n },\n onRemove() {\n control.onRemove();\n },\n });\n return new C();\n}\n","import { Control, ControlOptions } from 'leaflet';\nimport { AttributionControlOptions } from '@nextgis/webmap';\n\nexport class AttributionControl extends Control.Attribution {\n // options: AttributionControlOptions\n constructor(options: AttributionControlOptions & ControlOptions) {\n super(options);\n const customAttribution = options && options.customAttribution;\n if (customAttribution) {\n let attributions: string[] = [];\n if (Array.isArray(customAttribution)) {\n attributions = customAttribution;\n } else if (customAttribution) {\n attributions = [customAttribution];\n }\n attributions.forEach((x) => this.addAttribution(x));\n }\n }\n}\n","import type { LatLngBounds } from 'leaflet';\nimport type { LngLatBoundsArray } from '@nextgis/utils';\n\nexport function boundsToArray(bounds: LatLngBounds): LngLatBoundsArray {\n const ne = bounds.getNorthEast();\n const sw = bounds.getSouthWest();\n return [sw.lng, sw.lat, ne.lng, ne.lat];\n}\n","import { GeoJSON } from 'leaflet';\nimport { boundsToArray } from './boundsToArray';\n\nimport type {\n Feature,\n GeoJsonObject,\n FeatureCollection,\n GeometryCollection,\n GeoJsonGeometryTypes,\n} from 'geojson';\nimport type { LatLngBounds } from 'leaflet';\nimport type { FeaturePosition, VectorAdapterLayerType } from '@nextgis/webmap';\nimport type { LngLatArray, LngLatBoundsArray } from '@nextgis/utils';\n\nexport const typeAlias: {\n [key in GeoJsonGeometryTypes]: VectorAdapterLayerType;\n} = {\n Point: 'point',\n LineString: 'line',\n MultiPoint: 'point',\n Polygon: 'polygon',\n MultiLineString: 'line',\n MultiPolygon: 'polygon',\n GeometryCollection: 'polygon',\n};\n\nexport const PAINT = {\n stroke: false,\n opacity: 1,\n};\n\nexport const backAliases: {\n [key in VectorAdapterLayerType]?: GeoJsonGeometryTypes[];\n} = {};\n\nfor (const a in typeAlias) {\n const layerType = typeAlias[a as GeoJsonGeometryTypes];\n const backAlias = backAliases[layerType] || [];\n backAlias.push(a as GeoJsonGeometryTypes);\n backAliases[layerType] = backAlias;\n}\n\nexport function geometryFilter(\n geometry: GeoJsonGeometryTypes,\n type: VectorAdapterLayerType,\n): boolean {\n const geoJsonGeometry = backAliases[type] || [];\n return geoJsonGeometry.indexOf(geometry) !== -1;\n}\n\nexport function filterGeometries(\n data: GeoJsonObject,\n type: VectorAdapterLayerType,\n): GeoJsonObject | false {\n if (data.type === 'FeatureCollection') {\n const _data = data as FeatureCollection;\n _data.features = _data.features.filter((f) =>\n geometryFilter(f.geometry.type, type),\n );\n } else if (data.type === 'Feature') {\n const allow = geometryFilter((data as Feature).geometry.type, type);\n if (!allow) {\n return false;\n }\n } else if (data.type === 'GeometryCollection') {\n const _data = data as GeometryCollection;\n _data.geometries = _data.geometries.filter((g) =>\n geometryFilter(g.type, type),\n );\n }\n return data;\n}\n\nfunction featuresBounds(features: Feature | Feature[]): LatLngBounds {\n const geoJsonLayer = new GeoJSON();\n const features_ = Array.isArray(features) ? features : [features];\n features_.forEach((f) => geoJsonLayer.addData(f));\n return geoJsonLayer.getBounds();\n}\n\nexport function getFeaturesBounds(\n features: Feature | Feature[],\n): LngLatBoundsArray {\n return boundsToArray(featuresBounds(features));\n}\n\nexport function getFeaturesCenter(features: Feature | Feature[]): LngLatArray {\n const { lat, lng } = featuresBounds(features).getCenter();\n return [lng, lat];\n}\n\nexport function createFeaturePositionOptions(\n features: Feature | Feature[],\n): FeaturePosition {\n return {\n getBounds: () => getFeaturesBounds(features),\n getCenter: () => getFeaturesCenter(features),\n };\n}\n","import type {\n GeoJsonObject,\n GeoJsonGeometryTypes,\n FeatureCollection,\n Feature,\n GeometryCollection,\n} from 'geojson';\n\nfunction findMostFrequentGeomType(\n arr: GeoJsonGeometryTypes[],\n): GeoJsonGeometryTypes {\n const counts: { [x: string]: number } = {};\n for (let fry = 0; fry < arr.length; fry++) {\n counts[arr[fry]] = 1 + (counts[arr[fry]] || 0);\n }\n let maxName = '';\n for (const c in counts) {\n const maxCount = maxName ? counts[maxName] : 0;\n if (counts[c] > maxCount) {\n maxName = c;\n }\n }\n return maxName as GeoJsonGeometryTypes;\n}\n\nexport function detectType(geojson: GeoJsonObject): GeoJsonGeometryTypes {\n let geometry: GeoJsonGeometryTypes;\n if (geojson.type === 'FeatureCollection') {\n const featuresTypes = (geojson as FeatureCollection).features.map(\n (f) => f.geometry.type,\n );\n geometry = findMostFrequentGeomType(featuresTypes);\n } else if (geojson.type === 'GeometryCollection') {\n const geometryTypes = (geojson as GeometryCollection).geometries.map(\n (g) => g.type,\n );\n geometry = findMostFrequentGeomType(geometryTypes);\n } else if (geojson.type === 'Feature') {\n geometry = (geojson as Feature).geometry.type;\n } else {\n geometry = geojson.type;\n }\n return geometry;\n}\n","import type { MainLayerAdapter, AdapterOptions } from '@nextgis/webmap';\nimport type { Map } from 'leaflet';\n\nexport class BaseAdapter<O extends AdapterOptions = AdapterOptions, L = any>\n implements MainLayerAdapter<Map, L, O>\n{\n layer?: L;\n protected pane = 'order-0';\n\n constructor(public map: Map, public options: O) {\n if (options.order !== undefined) {\n const pane = 'order-' + options.order;\n let exist = map.getPane(pane);\n if (!exist) {\n exist = map.createPane(pane);\n }\n exist.style.zIndex = String(Math.round(options.order * 100));\n this.pane = pane;\n }\n }\n\n addLayer(options: O): L | Promise<L> | undefined {\n Object.assign(this.options, options);\n return undefined;\n }\n}\n","import {\n CircleMarker,\n FeatureGroup,\n DomEvent,\n GeoJSON,\n DivIcon,\n Marker,\n Layer,\n} from 'leaflet';\nimport { debounce, defined } from '@nextgis/utils';\n\nimport { isPaintCallback, isPaint } from '@nextgis/paint';\nimport {\n PAINT,\n typeAlias,\n filterGeometries,\n createFeaturePositionOptions,\n} from '../utils/geometries';\nimport { createMouseEvent } from '../utils/createMouseEvent';\nimport { boundsToArray } from '../utils/boundsToArray';\nimport { detectType } from '../utils/detectType';\nimport { BaseAdapter } from './BaseAdapter';\n\nimport type { GeoJsonObject, Feature, Point } from 'geojson';\nimport type {\n PopupOptions as LPopupOptions,\n CircleMarkerOptions,\n LeafletMouseEvent,\n LatLngExpression,\n GeoJSONOptions,\n LeafletEvent,\n PathOptions,\n LatLng,\n Path,\n Map,\n} from 'leaflet';\nimport type {\n Paint,\n IconPaint,\n PathPaint,\n VectorAdapterLayerPaint,\n} from '@nextgis/paint';\nimport type { LngLatBoundsArray } from '@nextgis/utils';\nimport type {\n VectorAdapterLayerType,\n GeoJsonAdapterOptions,\n PopupOnCloseFunction,\n OnLayerMouseOptions,\n VectorLayerAdapter,\n OnLayerSelectType,\n LayerDefinition,\n DataLayerFilter,\n PopupOptions,\n} from '@nextgis/webmap';\n\nexport type LayerDef = LayerDefinition<Feature, Layer>;\n\nexport class GeoJsonAdapter\n extends BaseAdapter<GeoJsonAdapterOptions>\n implements VectorLayerAdapter<Map>\n{\n layer?: FeatureGroup;\n selected = false;\n\n private paint?: Paint;\n private selectedPaint?: Paint;\n private type?: VectorAdapterLayerType;\n\n private _layers: LayerDef[] = [];\n private _selectedLayers: LayerDef[] = [];\n private _filteredLayers: LayerDef[] = [];\n private _filterFun?: DataLayerFilter<Feature>;\n private _openedPopup: [Layer, PopupOnCloseFunction[], LayerDef][] = [];\n\n private $updateTooltip = debounce(() => {\n this.updateTooltip();\n }, 300);\n\n constructor(map: Map, options: GeoJsonAdapterOptions) {\n super(map, options);\n }\n\n addLayer(options: GeoJsonAdapterOptions): FeatureGroup<any> | undefined {\n Object.assign(this.options, options);\n this.paint = options.paint;\n this.layer = new FeatureGroup([], {\n ...options.nativeOptions,\n pane: this.pane,\n });\n this.selectedPaint = options.selectedPaint;\n options.paint = this.paint;\n\n if (options.data) {\n this.addData(options.data);\n }\n\n this._addMapListener();\n\n return this.layer;\n }\n\n beforeRemove(): void {\n this._removeMapListener();\n }\n\n select(findFeatureFun?: DataLayerFilter): void {\n if (findFeatureFun) {\n const def = this._layers.filter(findFeatureFun);\n def.forEach((x) => {\n this._selectLayer(x, 'api');\n });\n } else if (!this.selected) {\n this.selected = true;\n if (this.selectedPaint) {\n this._setPaintEachLayer(this.selectedPaint);\n }\n }\n }\n\n unselect(findFeatureFun?: DataLayerFilter): void {\n if (findFeatureFun) {\n const feature = this._layers.filter(findFeatureFun);\n feature.forEach((x) => {\n this._unSelectLayer(x);\n });\n } else if (this.selected) {\n for (const p of this._openedPopup) {\n this._removePopup(p[0]);\n }\n if (this.paint) {\n this._setPaintEachLayer(this.paint);\n }\n this._selectedLayers.length = 0;\n this.selected = false;\n }\n }\n\n getSelected(): LayerDefinition<Feature, LayerDef>[] {\n return this._selectedLayers.map((x) => {\n return {\n target: this,\n feature: x.feature,\n layer: x,\n ...createFeaturePositionOptions(x.feature),\n };\n });\n }\n\n getFiltered(): LayerDef[] {\n return this._filteredLayers;\n }\n\n filter(fun?: DataLayerFilter): LayerDef[] {\n // Some optimization\n this._filterFun = fun;\n const layer_ = this.layer;\n const map = layer_ && (layer_ as any)._map;\n if (layer_ && map) {\n layer_.remove();\n\n const filteredLayers: LayerDef[] = [];\n this._layers.forEach(({ feature, layer }) => {\n if (layer) {\n const ok = fun\n ? fun({\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n })\n : true;\n if (ok) {\n layer_.addLayer(layer);\n filteredLayers.push({\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n });\n } else {\n layer_.removeLayer(layer);\n }\n }\n });\n this._filteredLayers = filteredLayers;\n\n layer_.addTo(map);\n }\n return this._filteredLayers;\n }\n\n cleanFilter(): void {\n this.filter();\n }\n\n getLayers(): LayerDef[] {\n return this._layers.map(({ layer, feature }) => {\n const visible = layer && !!(layer as any)._map;\n return {\n feature,\n layer,\n visible,\n target: this,\n ...createFeaturePositionOptions(feature),\n };\n });\n }\n\n clearLayer(cb?: (feature: Feature) => boolean): void {\n this.unselect();\n const layer_ = this.layer;\n if (layer_) {\n if (cb) {\n for (let fry = this._layers.length; fry--; ) {\n const def = this._layers[fry];\n if (def) {\n const { feature, layer } = def;\n if (feature && layer) {\n const exist = cb(feature);\n if (exist) {\n layer_.removeLayer(layer);\n this._layers.splice(fry, 1);\n }\n }\n }\n }\n } else {\n layer_.clearLayers();\n this._layers = [];\n }\n }\n }\n\n setData(data: GeoJsonObject): void {\n this.clearLayer();\n this.addData(data);\n }\n\n addData(data: GeoJsonObject | false): void {\n const options = this.options;\n let geoJsonOptions: GeoJSONOptions | undefined;\n if (options) {\n if (data) {\n let type: VectorAdapterLayerType;\n\n if (!options.type) {\n const detectedType = detectType(data);\n type = typeAlias[detectedType];\n } else {\n type = options.type;\n }\n if (this.type && this.type !== type) {\n console.warn('no other data type than layer can be added');\n return;\n }\n this.type = type;\n\n data = filterGeometries(data, type);\n if (data) {\n geoJsonOptions = this._getGeoJsonOptions(options, type);\n }\n }\n new GeoJSON(data || undefined, geoJsonOptions);\n }\n }\n\n openPopup(findFeatureFun: DataLayerFilter, options?: PopupOptions): void {\n if (findFeatureFun) {\n const def = this._layers.filter(findFeatureFun);\n def.forEach((x) => {\n this._openPopup(x, options, 'api');\n });\n }\n }\n\n closePopup(findFeatureFun?: DataLayerFilter): void {\n const popupToClose = findFeatureFun\n ? this._openedPopup.filter((x) => findFeatureFun(x[2]))\n : this._openedPopup;\n\n popupToClose.forEach((x) => {\n this._removePopup(x[0]);\n });\n }\n\n updateTooltip(layerDef?: LayerDefinition): void {\n if (layerDef) {\n this._updateTooltip(layerDef);\n } else {\n this.getLayers().forEach((x) =>\n this._updateTooltip({ feature: x.feature, layer: x.layer }),\n );\n }\n }\n\n /** @deprecated use {@link GeoJsonAdapter.getBounds} instead */\n getExtent(): LngLatBoundsArray | undefined {\n return this.getBounds();\n }\n\n getBounds(): LngLatBoundsArray | undefined {\n if (this.layer) {\n const bounds = this.layer.getBounds();\n if (bounds.isValid()) {\n return boundsToArray(bounds);\n }\n }\n }\n\n setOpacity(value: number): void {\n this.options.opacity = value;\n this.setPaint(this.paint);\n this.setSelectedPaint(this.selectedPaint);\n }\n\n setPaint(paint?: Paint | null): void {\n if (paint) {\n this.paint = paint;\n for (const l of this._layers) {\n this._setPaint(l, paint);\n }\n }\n }\n setSelectedPaint(paint?: Paint | null): void {\n if (paint) {\n this.selectedPaint = paint;\n for (const l of this._selectedLayers) {\n this._setPaint(l, paint);\n }\n }\n }\n updatePaint(paint: Partial<Paint>): void {\n this.paint = { ...this.paint, ...paint } as Paint;\n for (const l of this._layers) {\n this._setPaint(l, this.paint);\n }\n }\n updateSelectedPaint(paint: Partial<Paint>): void {\n this.selectedPaint = { ...this.selectedPaint, ...paint } as Paint;\n for (const l of this._selectedLayers) {\n this._setPaint(l, this.selectedPaint);\n }\n }\n\n private $unselect = () => {\n this.unselect();\n };\n\n private _updateTooltip(layerDef: Pick<LayerDef, 'feature' | 'layer'>) {\n const { feature, layer } = layerDef;\n if (feature && layer && feature.properties && this.options.labelField) {\n layer.unbindTooltip();\n const message = feature.properties[this.options.labelField];\n if (message !== undefined) {\n const permanent = !this.options.labelOnHover;\n\n layer.bindTooltip(String(message), { permanent, sticky: false });\n }\n }\n }\n\n private async _openPopup(\n def: LayerDef,\n options: PopupOptions = {},\n type: OnLayerSelectType,\n latLng?: LatLngExpression,\n ) {\n const { feature, layer } = def;\n const {\n minWidth,\n autoPan,\n maxWidth,\n closeButton: closeButton_,\n } = {\n minWidth: 300,\n ...options,\n };\n const closeButton = closeButton_ ?? !this.options.selectOnHover;\n let popup: Layer;\n const _closeHandlers: PopupOnCloseFunction[] = [];\n const onClose = (handler: PopupOnCloseFunction) => {\n _closeHandlers.push(handler);\n };\n const close = () => {\n if (popup) {\n this._removePopup(popup);\n }\n };\n let content;\n if (options.createPopupContent) {\n content = await options.createPopupContent({\n layer,\n feature,\n target: this,\n type,\n close,\n onClose,\n ...createFeaturePositionOptions(feature),\n });\n } else {\n content = options.popupContent;\n }\n\n if (content && layer) {\n const popupOptions: LPopupOptions = {\n minWidth,\n autoPan,\n // maxWidth,\n closeButton,\n closeOnClick: false,\n autoClose: false,\n };\n if (defined(maxWidth)) {\n popupOptions.maxWidth = maxWidth;\n }\n popup = layer.bindPopup(content, popupOptions);\n\n const unselectOnClose =\n this.options.popupOptions?.unselectOnClose ?? true;\n if (unselectOnClose) {\n const p = layer.getPopup();\n p &&\n p.once(\n 'remove',\n () => {\n close();\n },\n this,\n );\n }\n this._openedPopup.push([popup, _closeHandlers, def]);\n popup.openPopup(latLng);\n }\n }\n\n private _removePopup(popup: Layer) {\n const map = this.map;\n if (map) {\n popup.closePopup().unbindPopup();\n const index = this._openedPopup.findIndex((x) => x[0] === popup);\n if (index !== -1) {\n const unselectOnClose =\n this.options.popupOptions?.unselectOnClose ?? true;\n const [, closeHandlers, def] = this._openedPopup[index];\n for (const h of closeHandlers) {\n h(def);\n }\n closeHandlers.length = 0;\n if (unselectOnClose) {\n this._unSelectLayer(def);\n }\n this._openedPopup.splice(index, 1);\n }\n }\n }\n\n private _setPaintEachLayer(paint: Paint) {\n this._layers.forEach((l) => {\n this._setPaint(l, paint);\n });\n }\n\n private _setPaint(def: LayerDef, paint: Paint) {\n let style: VectorAdapterLayerPaint | undefined = undefined;\n const { layer, feature } = def;\n if (layer && feature) {\n if (isPaintCallback(paint)) {\n style = paint(feature);\n } else if (isPaint(paint)) {\n style = paint;\n }\n if (style) {\n if (this.type === 'point' && style.type === 'icon') {\n const marker = layer as Marker;\n const divIcon = this._createDivIcon(style);\n marker.setIcon(divIcon);\n } else if ('setStyle' in layer) {\n (layer as Path).setStyle(this._preparePaint(style));\n }\n }\n }\n }\n\n private _preparePaint(paint: VectorAdapterLayerPaint): PathOptions {\n if (paint.type !== 'get-paint') {\n // const path: CircleMarkerOptions | PathOptions = paint as CircleMarkerOptions | PathOptions;\n // if (path.opacity) {\n // path.fillOpacity = path.opacity;\n // }\n\n const paintAliases: [keyof PathOptions, keyof PathPaint][] = [\n // ['color', 'color'],\n ['color', 'strokeColor'],\n ['opacity', 'strokeOpacity'],\n ['stroke', 'stroke'],\n ['fillColor', 'fillColor'],\n ['fillOpacity', 'fillOpacity'],\n ['fill', 'fill'],\n ['weight', 'weight'],\n ];\n const aliases: [keyof PathOptions, keyof PathPaint][] =\n this.type === 'line'\n ? [\n ['color', 'strokeColor'],\n ['opacity', 'strokeOpacity'],\n ['weight', 'weight'],\n ]\n : paintAliases;\n\n const readyPaint: PathOptions & CircleMarkerOptions = {};\n\n if ('radius' in paint && typeof paint.radius === 'number') {\n readyPaint.radius = paint.radius;\n }\n for (const [to, from] of aliases) {\n let paintProp = (paint as PathPaint)[from];\n if (\n defined(this.options.opacity) &&\n from.toLowerCase().indexOf('opacity') !== -1\n ) {\n paintProp = Number(paintProp) * this.options.opacity;\n }\n\n if (paintProp !== undefined) {\n Object.defineProperty(readyPaint, to, {\n enumerable: true,\n value: paintProp,\n });\n }\n }\n\n return readyPaint;\n }\n return PAINT;\n }\n\n private _getGeoJsonOptions(\n options: GeoJsonAdapterOptions,\n type: VectorAdapterLayerType,\n ): GeoJSONOptions {\n const paint = options.paint;\n let lopt: GeoJSONOptions = {};\n\n if (typeof paint === 'function') {\n if (type === 'point') {\n // TODO: fix types (@geoman-io/leaflet-geoman-free)\n (lopt as any).pointToLayer = (\n feature: Feature<Point, any>,\n latLng: LatLng,\n ) => {\n const iconOpt = paint(feature);\n const pointToLayer = this._createPaintToLayer(iconOpt as IconPaint);\n return pointToLayer(feature, latLng);\n };\n } else {\n lopt = {\n style: (feature) => {\n if (feature) {\n return this._preparePaint({ ...PAINT, ...paint(feature) });\n } else {\n return this._preparePaint({ ...PAINT, type: 'path' });\n }\n },\n };\n }\n } else {\n lopt = this._createPaintOptions(paint as VectorAdapterLayerPaint, type);\n }\n\n lopt.onEachFeature = (feature: Feature, layer) => {\n this._onEachFeature(feature, layer);\n };\n\n return lopt;\n }\n\n private _onEachFeature(feature: Feature, layer: Layer) {\n const layer_ = this.layer;\n if (layer_) {\n const def = {\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n };\n\n // @ts-ignore\n layer.options.pane = this.pane;\n this._layers.push(def);\n let ok = true;\n if (this._filterFun) {\n ok = this._filterFun(def);\n }\n if (ok) {\n const { popup, popupOptions, selectable, interactive, selectOnHover } =\n this.options;\n // @ts-ignore\n layer.options.interactive = defined(interactive) ? interactive : true;\n layer_.addLayer(layer);\n if (selectable) {\n if (selectOnHover) {\n layer.on('mouseover', () => {\n this._selectLayer(def, 'hover');\n });\n layer.on('mouseout', () => {\n this._unSelectLayer(def);\n });\n } else {\n layer.on(\n 'click',\n (e) => this._selectOnLayerClick(e as LeafletMouseEvent),\n this,\n );\n }\n }\n this._handleMouseEvents(layer);\n // The timeout is needed to display the popup immediately when adding a layer to the map.\n // Without a timeout, the layer may not yet have a _map object\n setTimeout(() => {\n if (popup) {\n this._openPopup(\n {\n target: this,\n layer,\n feature,\n ...createFeaturePositionOptions(feature),\n },\n popupOptions,\n 'api',\n );\n }\n this._updateTooltip({ layer, feature });\n });\n }\n }\n }\n\n private _handleMouseEvents(layer: Layer) {\n const { onClick, onLayerClick, onMouseOut, onMouseOver } = this.options;\n // TODO: remove backward compatibility for onLayerClick\n const onClick_ = onClick || onLayerClick;\n if (onClick_) {\n layer.on(\n 'click',\n (e) => {\n const selected = !!this._getSelected(layer);\n onClick_({\n selected,\n ...this._createMouseEvent(e),\n });\n },\n this,\n );\n }\n if (onMouseOut) {\n layer.on(\n 'mouseout',\n (e) => {\n onMouseOut(this._createMouseEvent(e));\n },\n this,\n );\n }\n if (onMouseOver) {\n layer.on(\n 'mouseover',\n (e) => {\n onMouseOver(this._createMouseEvent(e));\n },\n this,\n );\n }\n }\n\n private _createMouseEvent(source: LeafletEvent): OnLayerMouseOptions {\n return createMouseEvent({\n layer: this,\n source: source as LeafletMouseEvent,\n });\n }\n\n private _getSelected(layer: LayerDef['layer']) {\n return this._selectedLayers.find((x) => x.layer === layer);\n }\n\n private _selectOnLayerClick(e: LeafletMouseEvent) {\n DomEvent.stopPropagation(e);\n const layer = e.target as Layer;\n const feature = (layer as any).feature;\n const def: LayerDef = {\n target: this,\n layer,\n feature,\n ...createFeaturePositionOptions(feature),\n };\n const isSelected = this._getSelected(layer);\n if (isSelected) {\n if (this.options && this.options.unselectOnSecondClick) {\n this._unSelectLayer(isSelected);\n }\n } else {\n this._selectLayer(def, 'click', e.latlng);\n }\n }\n\n private _selectLayer(\n def: LayerDef,\n type: OnLayerSelectType,\n latlng?: LatLngExpression,\n ) {\n (this.map as any)._addUnselectCb(() => {\n this._unSelectLayer(def);\n });\n if (this.options && !this.options.multiselect) {\n this._selectedLayers.forEach((x) => this._unSelectLayer(x));\n }\n this._selectedLayers.push(def);\n this.selected = true;\n const { selectedPaint, popupOnSelect, popupOptions } = this.options;\n\n if (selectedPaint && def.layer) {\n this._setPaint(def, selectedPaint);\n }\n if (popupOnSelect) {\n this._openPopup(def, popupOptions, type, latlng);\n }\n if (this.options.onSelect) {\n const features = def.feature ? [def.feature] : [];\n this.options.onSelect({\n type,\n layer: this,\n features,\n ...createFeaturePositionOptions(features),\n });\n }\n }\n\n private _unSelectLayer(def: LayerDef) {\n const index = this._selectedLayers.indexOf(def);\n if (index !== -1) {\n this._selectedLayers.splice(index, 1);\n if (this.options) {\n if (this.options.paint) {\n this._setPaint(def, this.options.paint);\n }\n\n if (this.options.popupOnSelect && def.layer) {\n this._removePopup(def.layer);\n }\n }\n }\n this.selected = this._selectedLayers.length > 0;\n }\n\n private _createDivIcon(icon: IconPaint) {\n const { ...toLIconOpt } = icon;\n return new DivIcon({ className: '', ...toLIconOpt });\n }\n\n private _createPaintToLayer(icon: IconPaint) {\n if (icon && icon.type) {\n if (icon.type === 'icon') {\n const iconClassName = icon.className;\n const html = icon.html;\n if (iconClassName || html) {\n return (geoJsonPoint: any, latlng: LatLngExpression) => {\n const divIcon = this._createDivIcon(icon);\n return new Marker(latlng, { icon: divIcon });\n };\n }\n } else if (icon.type === 'pin') {\n return (geoJsonPoint: any, latlng: LatLngExpression) => {\n // const divIcon = this.createDivIcon(icon);\n return new Marker(latlng);\n };\n }\n }\n return (geoJsonPoint: any, latlng: LatLngExpression) => {\n const p: any = PAINT;\n return new CircleMarker(latlng, this._preparePaint({ ...p, ...icon }));\n };\n }\n\n private _createPaintOptions(\n paintOptions: VectorAdapterLayerPaint,\n type: VectorAdapterLayerType,\n ): GeoJSONOptions {\n const geoJsonOptions: GeoJSONOptions = {};\n const paint = (paintOptions && this._preparePaint(paintOptions)) || {};\n if (paintOptions) {\n geoJsonOptions.style = () => {\n return paint;\n };\n }\n if (type === 'point') {\n (geoJsonOptions as any).pointToLayer = this._createPaintToLayer(\n paintOptions as IconPaint,\n );\n } else if (type === 'line') {\n paint.stroke = true;\n }\n return geoJsonOptions;\n }\n\n private _addMapListener() {\n const map = this.map;\n if (map) {\n const { labelField, labelOnHover, unselectOnClick } = this.options;\n const uoc = unselectOnClick ?? true;\n if (uoc) {\n map.on('click', this.$unselect);\n }\n if (labelField && !labelOnHover) {\n map.on('zoomend', this.$updateTooltip);\n map.on('moveend', this.$updateTooltip);\n }\n }\n }\n\n private _removeMapListener() {\n this.map.off('zoomend', this.$updateTooltip);\n this.map.off('moveend', this.$updateTooltip);\n this.map.off('click', this.$unselect);\n }\n}\n","import { convertMapClickEvent } from './convertMapClickEvent';\nimport { createFeaturePositionOptions } from './geometries';\n\nimport type { LeafletMouseEvent } from 'leaflet';\nimport type { LayerAdapter, OnLayerMouseOptions } from '@nextgis/webmap';\nimport type { LayerDef } from '../layer-adapters/GeoJsonAdapter';\n\nexport interface CreateMouseEventOptions {\n layer: LayerAdapter;\n source: LeafletMouseEvent;\n}\n\nexport function createMouseEvent({\n layer,\n source,\n}: CreateMouseEventOptions): OnLayerMouseOptions {\n const layer_ = source.target as LayerDef;\n const feature = layer_.feature;\n const opt: OnLayerMouseOptions = {\n layer,\n feature,\n event: convertMapClickEvent(source),\n source,\n ...createFeaturePositionOptions(feature),\n };\n return opt;\n}\n","export function callAjax(\n src: string,\n callback: (resp: any) => any,\n headers: Record<string, any>,\n): () => void {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', src);\n xhr.responseType = 'arraybuffer';\n for (const h in headers) {\n xhr.setRequestHeader(h, headers[h]);\n }\n xhr.onload = function () {\n const arrayBufferView = new Uint8Array(this.response);\n const blob = new Blob([arrayBufferView], { type: 'image/png' });\n // @ts-ignore for typedoc\n const urlCreator = window.URL || window.webkitURL;\n const imageUrl = urlCreator.createObjectURL(blob);\n callback(imageUrl);\n };\n xhr.send();\n return () => {\n xhr.abort();\n };\n}\n","import {\n ImageOverlay as LImageOverlay,\n LatLngBoundsExpression,\n ImageOverlayOptions,\n} from 'leaflet';\nimport { callAjax } from '../../utils/callAjax';\n\ntype IOptions = ImageOverlayOptions & { headers?: any };\n\nexport class ImageOverlay extends LImageOverlay {\n private _abort: (() => void)[] = [];\n\n constructor(\n imageUrl: string,\n bounds: LatLngBoundsExpression,\n options?: IOptions,\n ) {\n super(imageUrl, bounds, options);\n }\n\n cancelLoad(): void {\n if (this._abort) {\n this._abort.forEach((x) => x());\n this._abort = [];\n }\n }\n\n _initImage(): void {\n // @ts-ignore\n super._initImage();\n // @ts-ignore\n const headers = this.options.headers;\n if (headers) {\n // @ts-ignore\n const img: HTMLImageElement = this._image;\n const src = img.src;\n img.src = '';\n this._abort.push(\n callAjax(\n src,\n (response) => {\n img.src = response;\n },\n headers,\n ),\n );\n }\n }\n}\n","/*!\n * leaflet.wms.js\n * A collection of Leaflet utilities for working with Web Mapping services.\n * (c) 2014-2016, Houston Engineering, Inc.\n * MIT License\n */\n\nimport { debounce } from '@nextgis/utils';\nimport { Layer, Util, CRS } from 'leaflet';\nimport { ImageOverlay } from './ImageOverlay';\n\nimport type { Map } from 'leaflet';\n\ninterface OverlayOptions {\n crs?: null;\n uppercase?: boolean;\n attribution?: string;\n opacity?: number;\n isBack?: boolean;\n minZoom?: number;\n maxZoom?: number;\n zIndex?: number;\n pane?: string;\n headers?: any;\n viewPortBuffer?: number;\n setViewDelay?: number;\n}\n\n/*\n * Overlay:\n * \"Single Tile\" WMS image overlay that updates with map changes.\n * Portions of wms.Overlay are directly extracted from L.TileLayer.WMS.\n * See Leaflet license.\n */\nexport class ImageLayer extends Layer {\n defaultWmsParams = {\n service: 'WMS',\n request: 'GetMap',\n version: '1.1.1',\n layers: '',\n styles: '',\n format: 'image/jpeg',\n transparent: false,\n };\n\n options: OverlayOptions = {\n crs: null,\n uppercase: false,\n attribution: '',\n opacity: 1,\n isBack: false,\n minZoom: 0,\n maxZoom: 18,\n pane: 'tilePane',\n headers: null,\n viewPortBuffer: 0,\n setViewDelay: 100,\n };\n\n private wmsParams: any;\n private _url?: string;\n private _currentUrl?: string;\n private _currentOverlay?: ImageOverlay;\n\n constructor(url: string, options: OverlayOptions) {\n super(options);\n this._url = url;\n\n // Move WMS parameters to params object\n const params: any = {};\n const opts: any = {};\n let opt: keyof OverlayOptions;\n for (opt in options) {\n if (opt in this.options) {\n opts[opt] = options[opt];\n } else {\n params[opt] = options[opt];\n }\n }\n Util.setOptions(this, opts);\n this.wmsParams = Util.extend({}, this.defaultWmsParams, params);\n }\n\n setParams(params: Record<string, any>): void {\n Util.extend(this.wmsParams, params);\n this.update();\n }\n\n getAttribution(): string {\n return this.options.attribution || '';\n }\n\n onAdd(): this {\n this.update();\n return this;\n }\n\n onRemove(map: Map): this {\n if (this._currentOverlay) {\n this._currentOverlay.cancelLoad();\n map.removeLayer(this._currentOverlay);\n delete this._currentOverlay;\n }\n if (this._currentUrl) {\n delete this._currentUrl;\n }\n return this;\n }\n\n getEvents(): {\n moveend: () => void;\n } {\n return {\n moveend: debounce(this.update, this.options.setViewDelay),\n };\n }\n\n update(): void {\n if (!this._map) {\n return;\n }\n // Determine image URL and whether it has changed since last update\n this.updateWmsParams();\n const url = this.getImageUrl();\n if (this._currentUrl === url) {\n return;\n }\n this._currentUrl = url;\n\n // Keep current image overlay in place until new one loads\n // (inspired by esri.leaflet)\n const viewPortBuffer = this.options.viewPortBuffer || 0;\n const bounds = this._map.getBounds().pad(viewPortBuffer);\n\n const overlay = new ImageOverlay(url, bounds, {\n opacity: 0,\n pane: this.options.pane,\n headers: this.options.headers,\n });\n overlay.addTo(this._map);\n if (this._currentOverlay) {\n this._currentOverlay.cancelLoad();\n }\n overlay.once(\n 'load',\n () => {\n if (!this._map) {\n return;\n }\n // @ts-ignore\n if (overlay._url !== this._currentUrl) {\n this._map.removeLayer(overlay);\n return;\n } else if (this._currentOverlay) {\n this._map.removeLayer(this._currentOverlay);\n }\n this._currentOverlay = overlay;\n overlay.setOpacity(\n this.options.opacity !== undefined ? this.options.opacity : 1,\n );\n if (this.options.isBack === true) {\n overlay.bringToBack();\n }\n if (this.options.isBack === false) {\n overlay.bringToFront();\n }\n if (this.options.zIndex !== undefined) {\n overlay.setZIndex(this.options.zIndex);\n }\n },\n this,\n );\n const { minZoom, maxZoom } = this.options;\n if (\n (minZoom && this._map.getZoom() < minZoom) ||\n (maxZoom && this._map.getZoom() > maxZoom)\n ) {\n this._map.removeLayer(overlay);\n }\n }\n\n setOpacity(opacity: number): void {\n this.options.opacity = opacity;\n if (this._currentOverlay) {\n this._currentOverlay.setOpacity(opacity);\n }\n }\n\n bringToBack(): void {\n this.options.isBack = true;\n if (this._currentOverlay) {\n this._currentOverlay.bringToBack();\n }\n }\n\n bringToFront(): void {\n this.options.isBack = false;\n if (this._currentOverlay) {\n this._currentOverlay.bringToFront();\n }\n }\n\n setZIndex(zIndex: number): void {\n this.options.zIndex = zIndex;\n if (this._currentOverlay) {\n this._currentOverlay.setZIndex(zIndex);\n }\n }\n\n // See L.TileLayer.WMS: onAdd() & getTileUrl()\n updateWmsParams(map?: Map): void {\n if (!map) {\n map = this._map;\n }\n // Compute WMS options\n const viewPortBuffer = this.options.viewPortBuffer || 0;\n const bounds = map.getBounds().pad(viewPortBuffer);\n const size = map.getSize();\n if (this.options.viewPortBuffer !== 0) {\n const factor = viewPortBuffer + 1;\n size.x = Math.ceil(size.x * factor);\n size.y = Math.ceil(size.y * factor);\n }\n const wmsVersion = parseFloat(this.wmsParams.version);\n const crs = this.options.crs || map.options.crs;\n const projectionKey = wmsVersion >= 1.3 ? 'crs' : 'srs';\n if (crs) {\n const nw = crs.project(bounds.getNorthWest());\n const se = crs.project(bounds.getSouthEast());\n\n // Assemble WMS parameter string\n const params: any = {\n width: size.x,\n height: size.y,\n };\n params[projectionKey] = crs.code;\n params.bbox = (\n wmsVersion >= 1.3 && crs === CRS.EPSG4326\n ? [se.y, nw.x, nw.y, se.x]\n : [nw.x, se.y, se.x, nw.y]\n ).join(',');\n\n Util.extend(this.wmsParams, params);\n }\n }\n\n getImageUrl(): string {\n const uppercase = this.options.uppercase || false;\n const pstr = Util.getParamString(this.wmsParams, this._url, uppercase);\n return this._url + pstr;\n }\n}\n","import { MainLayerAdapter } from '@nextgis/webmap';\nimport { ImageLayer } from './ImageLayer';\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport type { Map } from 'leaflet';\nimport type { ImageAdapterOptions } from '@nextgis/webmap';\n\nexport class ImageAdapter\n extends BaseAdapter<ImageAdapterOptions>\n implements MainLayerAdapter<Map>\n{\n layer: any;\n\n addLayer(options: ImageAdapterOptions): any {\n const url = options && options.url;\n if (url) {\n options = { transparent: true, ...options };\n const updateWmsParamsFromOpt = options.updateWmsParams;\n this.layer = new ImageLayer(url, {\n pane: this.pane,\n headers: options.headers,\n setViewDelay: options.setViewDelay,\n /**\n * TODO: safe remove, use only options.nativeOptions\n */\n ...options,\n ...options.params,\n ...options.nativeOptions,\n });\n if (updateWmsParamsFromOpt) {\n const updateWmsParams = this.layer.updateWmsParams;\n this.layer.updateWmsParams = function (map: Map) {\n updateWmsParams.call(this, map);\n this.wmsParams = updateWmsParamsFromOpt(this.wmsParams);\n };\n }\n return this.layer;\n }\n }\n}\n","// based on https://github.com/bvaughn/debounce-decorator\n\nexport function debounce<T extends (...args: any[]) => void>(\n cb: T,\n wait = 10,\n): T & { clear: () => void } {\n let timeoutId: any;\n\n function wrapper(this: any, ...args: any[]) {\n wrapper.clear();\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n cb.apply(this, args);\n }, wait);\n }\n\n wrapper.clear = function () {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return wrapper as T & { clear: () => void };\n}\n\nexport function DebounceDecorator(wait = 10) {\n return function (\n target: unknown,\n key: string,\n descriptor: PropertyDescriptor,\n ): PropertyDescriptor {\n return {\n configurable: true,\n enumerable: descriptor.enumerable,\n get: function getter() {\n // Attach this function to the instance (not the class)\n Object.defineProperty(this, key, {\n configurable: true,\n enumerable: descriptor.enumerable,\n value: debounce(descriptor.value, wait),\n });\n // @ts-ignore\n return this[key];\n },\n };\n };\n}\n","import { DomUtil, GridLayer, Util } from 'leaflet';\nimport { debounce } from '../../../utils/src';\nimport { callAjax } from './callAjax';\n\n// import type { TileLayerOptionsExtended } from './TileAdapter/TileLayer';\n\ntype Constructor = new (...args: any[]) => any;\n\nexport function makeRemote<\n TBase extends Constructor,\n // O extends TileLayerOptionsExtended = TileLayerOptionsExtended\n>(Base: TBase): TBase {\n return class RemoteTileLayer extends Base {\n constructor(...args: any[]) {\n super(...args);\n if (this.options.setViewDelay) {\n // @ts-ignore\n this._update = debounce((...a: any[]) => {\n // @ts-ignore\n GridLayer.prototype._update.call(this, ...a);\n }, this.options.setViewDelay);\n }\n }\n\n createTile(\n coords: Record<string, unknown>,\n done: (error: any, tile: HTMLImageElement) => void,\n ): HTMLImageElement {\n // @ts-ignore\n const url = this.getTileUrl(coords);\n\n const tile = document.createElement('img');\n (tile as any).abort = callAjax(\n url,\n (response) => {\n tile.src = response;\n done(null, tile);\n },\n // @ts-ignore\n this.options.headers,\n );\n\n if (this.options.crossOrigin || this.options.crossOrigin === '') {\n tile.crossOrigin =\n this.options.crossOrigin === true ? '' : this.options.crossOrigin;\n }\n\n tile.alt = '';\n tile.setAttribute('role', 'presentation');\n\n return tile;\n }\n\n _abortLoading() {\n // @ts-ignore\n const tiles = this._tiles;\n // @ts-ignore\n const tileZoom = this._tileZoom;\n for (const i in tiles) {\n if (tiles[i].coords.z !== tileZoom) {\n const tile = tiles[i].el;\n\n tile.onload = Util.falseFn;\n tile.onerror = Util.falseFn;\n if (!tile.complete) {\n if (tile.abort) {\n tile.abort();\n }\n tile.src = Util.emptyImageUrl;\n DomUtil.remove(tile);\n delete tiles[i];\n }\n }\n }\n }\n };\n}\n","import { TileLayer as TL } from 'leaflet';\nimport { makeRemote } from '../../utils/makeRemoteTileLayer';\n\nimport type { TileLayerOptions } from 'leaflet';\n\nexport type TileLayerOptionsExtended = TileLayerOptions & {\n headers: Record<string, any>;\n setViewDelay?: number;\n};\n\nclass TileLayerBase extends TL {\n constructor(urlTemplate: string, options?: TileLayerOptionsExtended) {\n super(urlTemplate, options);\n Object.assign(this.options, options);\n }\n}\n\nexport const TileLayer = makeRemote(TileLayerBase);\n","import { TileLayer } from 'leaflet';\nimport { TileLayer as TL } from './TileLayer';\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport type { MainLayerAdapter, TileAdapterOptions } from '@nextgis/webmap';\nimport type { TileLayerOptions } from 'leaflet';\n\nexport class TileAdapter\n extends BaseAdapter<TileAdapterOptions, TileLayer>\n implements MainLayerAdapter\n{\n addLayer(options: TileAdapterOptions): TileLayer | undefined {\n this.options = Object.assign(this.options, options);\n if (options) {\n const { url, ...opt } = options;\n if (url) {\n const tileLayerOptions: TileLayerOptions = {\n pane: this.pane,\n attribution: opt.attribution,\n minZoom: opt.minZoom,\n maxZoom: opt.maxZoom,\n\n ...opt.nativeOptions,\n };\n if (opt.subdomains) {\n tileLayerOptions.subdomains = opt.subdomains;\n }\n let layer;\n if (opt.headers) {\n layer = new TL(url, {\n ...tileLayerOptions,\n headers: opt.headers,\n setViewDelay: opt.setViewDelay,\n });\n } else {\n layer = new TileLayer(url, tileLayerOptions);\n }\n return layer;\n }\n }\n }\n}\n","import { TileLayer } from 'leaflet';\nimport { makeRemote } from '../../utils/makeRemoteTileLayer';\nimport type { WMSOptions } from 'leaflet';\n\ntype LayerOptions = WMSOptions & { headers: any };\n\nclass WmsLayerBase extends TileLayer.WMS {\n constructor(urlTemplate: string, options: LayerOptions) {\n super(urlTemplate, options);\n }\n}\n\nexport const WmsLayer = makeRemote(WmsLayerBase);\n\n// applyMixins(WmsLayer, [RemoteTileLayer]);\n","import { TileLayer } from 'leaflet';\nimport { WmsLayer as WMS } from './WmsLayer';\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport type { MainLayerAdapter, WmsAdapterOptions } from '@nextgis/webmap';\nimport type { WMSOptions } from 'leaflet';\n\nexport class WmsAdapter\n extends BaseAdapter<WmsAdapterOptions, TileLayer.WMS>\n implements MainLayerAdapter\n{\n addLayer(options: WmsAdapterOptions): TileLayer.WMS | undefined {\n Object.assign(this.options, options);\n const { url, ...opt } = options;\n if (url) {\n const layerOptions: WMSOptions = {\n pane: this.pane,\n attribution: opt.attribution,\n minZoom: opt.minZoom,\n maxZoom: opt.maxZoom,\n layers: options.layers,\n format: options.format,\n ...options.nativeOptions,\n };\n let layer;\n if (opt.headers) {\n layer = new WMS(url, { ...layerOptions, headers: opt.headers });\n } else {\n layer = new TileLayer.WMS(url, layerOptions);\n }\n return layer;\n }\n }\n}\n","import { MainLayerAdapter, TileAdapterOptions } from '@nextgis/webmap';\nimport { TileLayer } from 'leaflet';\n\nimport { TileAdapter } from './TileAdapter/TileAdapter';\n\nexport class OsmAdapter extends TileAdapter implements MainLayerAdapter {\n addLayer(options: Omit<TileAdapterOptions, 'url'>): TileLayer | undefined {\n const url = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n return super.addLayer({\n name: 'OpenStreetMap',\n attribution:\n '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors',\n ...options,\n url,\n });\n }\n}\n","import type { LatLngBoundsExpression } from 'leaflet';\nimport type { LngLatBoundsArray } from '@nextgis/utils';\n\nexport function arrayToBoundsExpression(\n bounds: LngLatBoundsArray,\n): LatLngBoundsExpression {\n const e = bounds;\n // top, left, bottom, right\n return [\n [e[3], e[0]],\n [e[1], e[2]],\n ];\n}\n","import { EventEmitter } from 'events';\nimport {\n Map,\n Control,\n FitBoundsOptions,\n LatLngBoundsExpression,\n} from 'leaflet';\nimport { convertMapClickEvent } from './utils/convertMapClickEvent';\nimport { createButtonControl } from './controls/createButtonControl';\nimport { AttributionControl } from './controls/Attribution';\nimport { createControl } from './controls/createControl';\nimport { GeoJsonAdapter } from './layer-adapters/GeoJsonAdapter';\nimport { ImageAdapter } from './layer-adapters/ImageAdapter/ImageAdapter';\nimport { TileAdapter } from './layer-adapters/TileAdapter/TileAdapter';\nimport { WmsAdapter } from './layer-adapters/WmsAdapter/WmsAdapter';\nimport { OsmAdapter } from './layer-adapters/OsmAdapter';\n\nimport type {\n Layer,\n GridLayer,\n LeafletEvent,\n LocationEvent,\n ControlPosition,\n LeafletMouseEvent,\n} from 'leaflet';\nimport type { LngLatBoundsArray, LngLatArray } from '@nextgis/utils';\nimport type {\n CreateControlOptions,\n ButtonControlOptions,\n LocationEvents,\n LocateOptions,\n MainMapEvents,\n LayerAdapter,\n ViewOptions,\n MapAdapter,\n MapOptions,\n FitOptions,\n MapControl,\n Locate,\n} from '@nextgis/webmap';\nimport { arrayToBoundsExpression } from './utils/arrayToBoundsExpression';\n\nexport type Type<T> = new (...args: any[]) => T;\nexport type UnselectCb = () => void;\nexport type UnselectDef = UnselectCb;\nexport class LeafletMapAdapter implements MapAdapter<Map, any, Control> {\n static layerAdapters: {\n [name: string]: Type<LayerAdapter<Map, any, any>>;\n } = {\n GEOJSON: GeoJsonAdapter,\n IMAGE: ImageAdapter,\n TILE: TileAdapter,\n WMS: WmsAdapter,\n // // MVT: MvtAdapter,\n OSM: OsmAdapter,\n };\n\n static controlAdapters = {\n ZOOM: Control.Zoom,\n ATTRIBUTION: AttributionControl,\n };\n\n static Map = Map;\n\n options: MapOptions<Map> = { target: 'map' };\n\n layerAdapters = LeafletMapAdapter.layerAdapters;\n controlAdapters = LeafletMapAdapter.controlAdapters;\n emitter = new EventEmitter();\n map?: Map;\n\n private _resizeObserver?: ResizeObserver;\n private _unselectCb: UnselectDef[] = [];\n private _universalEvents: (keyof MainMapEvents)[] = [\n 'move',\n 'zoom',\n 'zoomend',\n 'zoomstart',\n 'moveend',\n 'movestart',\n ];\n private _positionEvents: (keyof MainMapEvents)[] = [\n 'mousemove',\n 'mouseout',\n 'mouseover',\n ];\n\n create(options: MapOptions<Map>): void {\n this.options = { ...options };\n if (this.options.target) {\n const {\n zoom,\n center,\n maxZoom,\n minZoom,\n maxBounds: mb,\n mapAdapterOptions,\n } = this.options;\n\n this.map =\n this.options.map ||\n new Map(this.options.target, {\n attributionControl: false,\n zoomControl: false,\n maxBounds: mb ? arrayToBoundsExpression(mb) : undefined,\n maxZoom,\n minZoom,\n center: center && [center[1], center[0]],\n zoom,\n ...mapAdapterOptions,\n });\n // create default pane\n const defPane = this.map.createPane('order-0');\n (this.map as any)._addUnselectCb = (def: UnselectDef) => {\n this._addUnselectCb(def);\n };\n defPane.style.zIndex = String(0);\n this.emitter.emit('create', this);\n this._addMapListeners();\n }\n }\n\n destroy(): void {\n if (this.map) {\n this.map.remove();\n }\n this._stopWatchSizeChangeToUpdateMinZoom();\n }\n\n getContainer(): HTMLElement | undefined {\n return this.map && this.map.getContainer();\n }\n\n getControlContainer(): HTMLElement {\n const controlContainer = this.map && (this.map as any)._controlContainer;\n if (controlContainer) {\n return controlContainer;\n }\n throw new Error('Leaflet Map is not initialized yet');\n }\n\n setCursor(cursor: string): void {\n if (this.map) {\n this.map.getContainer().style.cursor = cursor;\n }\n }\n\n setView(lngLat: LngLatArray, zoom?: number): void;\n setView(options: ViewOptions): void;\n setView(lngLatOrOpt: LngLatArray | ViewOptions, zoom?: number): void {\n const map = this.map;\n if (!map) return;\n if (Array.isArray(lngLatOrOpt)) {\n const lngLat = lngLatOrOpt;\n const [lng, lat] = lngLat;\n if (this.map) {\n if (typeof zoom === 'number') {\n this.map.setView([lat, lng], zoom, { animate: false });\n } else {\n this.setCenter([lng, lat]);\n }\n }\n } else {\n const { zoom, center, maxBounds, bounds, minZoom, maxZoom } = lngLatOrOpt;\n if (center && zoom !== undefined) {\n this.setView(center, zoom);\n } else {\n if (zoom !== undefined) {\n this.setZoom(zoom);\n }\n if (center) {\n this.setCenter(center);\n }\n }\n if (bounds) {\n this.fitBounds(bounds);\n }\n if (maxBounds !== undefined) {\n if (maxBounds) {\n const b = arrayToBoundsExpression(maxBounds);\n map.setMaxBounds(b);\n map.setMinZoom(map.getBoundsZoom(b));\n this._watchSizeChangeToUpdateMinZoom(b);\n } else {\n // @ts-ignore `null` works for unset maxBounds, but not in typing\n map.setMaxBounds(null);\n this._stopWatchSizeChangeToUpdateMinZoom();\n }\n }\n if (maxZoom !== undefined) {\n map.setMaxZoom(maxZoom);\n }\n if (minZoom !== undefined) {\n this._stopWatchSizeChangeToUpdateMinZoom();\n map.setMinZoom(minZoom);\n }\n }\n }\n\n setCenter(lngLat: LngLatArray): void {\n const [lng, lat] = lngLat;\n if (this.map) {\n this.map.panTo([lat, lng]);\n }\n }\n\n getCenter(): LngLatArray | undefined {\n const map = this.map;\n if (map) {\n const bounds = map.getBounds();\n const center = bounds.getCenter();\n return [center.lng, center.lat];\n }\n }\n\n setZoom(zoom: number): void {\n if (this.map) {\n this.map.setZoom(zoom);\n }\n }\n\n getZoom(): number | undefined {\n return (this.map && this.map.getZoom()) || undefined;\n }\n\n getBounds(): LngLatBoundsArray | undefined {\n if (!this.map) return undefined;\n const b = this.map.getBounds();\n const sw = b.getSouthWest();\n const ne = b.getNorthEast();\n return [sw.lng, sw.lat, ne.lng, ne.lat];\n }\n\n // [west, south, east, north]\n fitBounds(bounds: LngLatBoundsArray, options: FitOptions = {}): void {\n if (this.map) {\n const { maxZoom, offset, padding } = options;\n const opt: FitBoundsOptions = {};\n if (maxZoom) {\n opt.maxZoom = maxZoom;\n }\n if (padding) {\n opt.padding = [padding, padding];\n }\n if (offset) {\n opt.padding = offset;\n }\n\n this.map.fitBounds(arrayToBoundsExpression(bounds), opt);\n }\n }\n\n getLayerAdapter(name: string): Type<LayerAdapter<Map, any, any>> {\n return LeafletMapAdapter.layerAdapters[name];\n }\n\n createControl(control: MapControl, options: CreateControlOptions): Control {\n return createControl(control, options, this);\n }\n\n createButtonControl(options: ButtonControlOptions): Control {\n return createButtonControl(options, this);\n }\n\n addControl(control: Control, position: string): Control | undefined {\n control.options.position = position.replace('-', '') as ControlPosition;\n if (this.map) {\n this.map.addControl(control);\n return control;\n }\n }\n\n removeControl(control: Control): void {\n if (this.map) {\n this.map.removeControl(control);\n }\n }\n\n removeLayer(layer: Layer): void {\n layer && layer.remove && layer.remove();\n }\n\n showLayer(layer: Layer): void {\n if (this.map) {\n layer.addTo(this.map);\n }\n }\n\n hideLayer(layer: Layer): void {\n layer.remove();\n }\n\n setLayerOpacity(layer: GridLayer | Layer, value: number): void {\n if ('setOpacity' in layer) {\n layer.setOpacity(value);\n }\n }\n\n setLayerOrder(\n layer: Layer,\n order: number,\n layers: { [x: string]: LayerAdapter },\n ): void {\n //\n }\n\n onMapClick(evt: LeafletMouseEvent): void {\n const converted = convertMapClickEvent(evt);\n this.emitter.emit('preclick', converted);\n this.emitter.emit('click', converted);\n }\n\n locate(opt: LocateOptions, events?: LocationEvents): Locate {\n const map = this.map;\n if (map) {\n map.locate(opt);\n if (events) {\n const { locationfound, locationerror } = events;\n const locationFound = (e: LeafletEvent) => {\n const event = e as LocationEvent;\n const lngLat: [number, number] = [event.latlng.lng, event.latlng.lat];\n locationfound({ lngLat });\n };\n if (locationfound !== undefined) {\n map.on('locationfound', locationFound, this);\n }\n if (locationerror) {\n map.on('locationerror', locationerror, this);\n }\n const stop = () => {\n if (locationfound !== undefined) {\n map.off('locationfound', locationFound);\n }\n if (locationerror) {\n map.off('locationerror', locationerror);\n }\n };\n return { stop };\n }\n }\n const stop = () => void 'fake function';\n return { stop };\n }\n\n private _addUnselectCb(cb: UnselectDef) {\n for (const p of this._unselectCb) {\n p();\n }\n this._unselectCb.length = 0;\n this._unselectCb.push(cb);\n }\n\n private _watchSizeChangeToUpdateMinZoom(bounds: LatLngBoundsExpression) {\n this._stopWatchSizeChangeToUpdateMinZoom();\n const container = this.getContainer();\n const map = this.map;\n if (container && map && window.ResizeObserver) {\n this._resizeObserver = new ResizeObserver(() => {\n map.setMinZoom(map.getBoundsZoom(bounds));\n });\n this._resizeObserver.observe(container);\n }\n }\n\n private _stopWatchSizeChangeToUpdateMinZoom() {\n const map = this.map;\n if (map) {\n map.setMinZoom(0);\n }\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n this._resizeObserver = undefined;\n }\n }\n\n private _addMapListeners() {\n const map = this.map;\n if (map) {\n map.on('click', (evt) => {\n this.onMapClick(evt as LeafletMouseEvent);\n });\n for (const e of this._universalEvents) {\n map.on(e, () => this.emitter.emit(e, this), map);\n }\n\n for (const e of this._positionEvents) {\n map.on(\n e,\n (evt) =>\n this.emitter.emit(\n e,\n convertMapClickEvent(evt as LeafletMouseEvent),\n ),\n map,\n );\n }\n }\n }\n}\n","import { ButtonControlOptions, MapAdapter } from '@nextgis/webmap';\nimport { createControl } from './createControl';\nimport { DomEvent, Control } from 'leaflet';\n\nexport function createButtonControl(\n options: ButtonControlOptions,\n map: MapAdapter,\n): Control {\n const link = document.createElement('a');\n\n const title = options.title || '';\n link.href = '#';\n link.title = title;\n\n link.setAttribute('role', 'button');\n link.setAttribute('aria-label', title);\n\n if (options.addClass) {\n link.classList.add(options.addClass);\n }\n\n DomEvent.disableClickPropagation(link);\n DomEvent.on(link, 'click', DomEvent.stop);\n\n if (options.html instanceof HTMLElement) {\n link.appendChild(options.html);\n } else if (typeof options.html === 'string') {\n link.innerHTML = options.html;\n }\n\n const onClick = (e: Event) => {\n e.stopPropagation();\n options.onClick();\n };\n\n return createControl(\n {\n onAdd() {\n if (options.onClick !== undefined) {\n link.addEventListener('click', onClick);\n }\n return link;\n },\n onRemove() {\n const parent = link.parentNode;\n if (parent) {\n parent.removeChild(link);\n }\n if (options.onClick !== undefined) {\n link.removeEventListener('click', onClick);\n }\n },\n },\n { bar: true },\n map,\n );\n}\n"],"names":["convertMapClickEvent","evt","coord","containerPoint","latLng","latlng","lngLat","pixel","left","x","top","y","source","createControl","control","options","map","Control","extend","onAdd","element","document","createElement","content","classList","add","bar","addClass","margin","style","marginBottom","marginTop","marginLeft","marginRight","appendChild","DomEvent","disableClickPropagation","onRemove","_super","customAttribution","attributions","Array","isArray","forEach","_this","addAttribution","__extends","Attribution","boundsToArray","bounds","ne","getNorthEast","sw","getSouthWest","lng","lat","typeAlias","Point","LineString","MultiPoint","Polygon","MultiLineString","MultiPolygon","GeometryCollection","PAINT","stroke","opacity","backAliases","a","layerType","backAlias","push","geometryFilter","geometry","type","indexOf","featuresBounds","features","geoJsonLayer","GeoJSON","f","addData","getBounds","createFeaturePositionOptions","getFeaturesBounds","getCenter","_a","getFeaturesCenter","findMostFrequentGeomType","arr","counts","fry","length","maxName","c","this","undefined","order","pane","exist","getPane","createPane","zIndex","String","Math","round","BaseAdapter","Object","assign","debounce","updateTooltip","unselect","GeoJsonAdapter","paint","layer","FeatureGroup","nativeOptions","selectedPaint","data","_addMapListener","_removeMapListener","findFeatureFun","_layers","filter","_selectLayer","selected","_setPaintEachLayer","_unSelectLayer","_openedPopup","_i","_removePopup","_selectedLayers","target","feature","_filteredLayers","fun","_filterFun","layer_","_map","remove","filteredLayers_1","addLayer","removeLayer","addTo","visible","cb","def","splice","clearLayers","clearLayer","geoJsonOptions","detectedType","geojson","geometries","g","detectType","console","warn","_data","filterGeometries","_getGeoJsonOptions","_openPopup","layerDef","_updateTooltip","getLayers","isValid","value","setPaint","setSelectedPaint","_setPaint","__assign","properties","labelField","unbindTooltip","message","permanent","labelOnHover","bindTooltip","sticky","_c","minWidth","autoPan","maxWidth","closeButton","closeButton_","selectOnHover","_closeHandlers","onClose","handler","close","popup","createPopupContent","_d","popupContent","popupOptions","closeOnClick","autoClose","defined","bindPopup","unselectOnClose","p","getPopup","once","openPopup","closePopup","unbindPopup","index","findIndex","closeHandlers","closeHandlers_1","h","l","isPaintCallback","isPaint","marker","divIcon","_createDivIcon","setIcon","setStyle","_preparePaint","aliases","readyPaint","radius","aliases_1","to","from","paintProp","toLowerCase","Number","defineProperty","enumerable","lopt","pointToLayer","iconOpt","_createPaintToLayer","_createPaintOptions","onEachFeature","_onEachFeature","def_1","ok","popup_1","popupOptions_1","selectable","interactive","on","e","_selectOnLayerClick","_handleMouseEvents","setTimeout","onMouseOut","onMouseOver","onClick_","_getSelected","_createMouseEvent","event","createMouseEvent","find","stopPropagation","isSelected","unselectOnSecondClick","_addUnselectCb","multiselect","popupOnSelect","onSelect","icon","toLIconOpt","DivIcon","className","html","geoJsonPoint","Marker","CircleMarker","paintOptions","unselectOnClick","$unselect","$updateTooltip","off","callAjax","src","callback","headers","xhr","XMLHttpRequest","open","responseType","setRequestHeader","onload","arrayBufferView","Uint8Array","response","blob","Blob","imageUrl","window","URL","webkitURL","createObjectURL","send","abort","ImageOverlay","_abort","_initImage","img_1","_image","LImageOverlay","url","service","request","version","layers","styles","format","transparent","crs","uppercase","attribution","isBack","minZoom","maxZoom","viewPortBuffer","setViewDelay","_url","opt","params","opts","Util","setOptions","wmsParams","defaultWmsParams","ImageLayer","update","_currentOverlay","cancelLoad","_currentUrl","moveend","updateWmsParams","getImageUrl","pad","overlay","setOpacity","bringToBack","bringToFront","setZIndex","getZoom","size","getSize","factor","ceil","wmsVersion","parseFloat","projectionKey","nw","project","getNorthWest","se","getSouthEast","width","height","code","bbox","CRS","EPSG4326","join","pstr","getParamString","Layer","ImageAdapter","updateWmsParamsFromOpt_1","updateWmsParams_1","call","wait","timeoutId","wrapper","args","clear","apply","clearTimeout","makeRemote","Base","_update","GridLayer","prototype","RemoteTileLayer","coords","done","getTileUrl","tile","crossOrigin","alt","setAttribute","tiles","_tiles","tileZoom","_tileZoom","i","z","el","falseFn","onerror","complete","emptyImageUrl","DomUtil","TileLayer","urlTemplate","TL","TileAdapter","tileLayerOptions","subdomains","WmsLayer","WMS","WmsAdapter","layerOptions","OsmAdapter","name","arrayToBoundsExpression","LeafletMapAdapter","layerAdapters","controlAdapters","EventEmitter","zoom","center","mb","mapAdapterOptions","Map","attributionControl","zoomControl","maxBounds","defPane","emitter","emit","_addMapListeners","_stopWatchSizeChangeToUpdateMinZoom","getContainer","controlContainer","_controlContainer","Error","cursor","lngLatOrOpt","setView","animate","setCenter","zoom_1","setZoom","fitBounds","b","setMaxBounds","setMinZoom","getBoundsZoom","_watchSizeChangeToUpdateMinZoom","setMaxZoom","panTo","offset","padding","link","title","href","stop","HTMLElement","innerHTML","onClick","addEventListener","parent","parentNode","removeChild","removeEventListener","createButtonControl","position","replace","addControl","removeControl","converted","events","locate","locationfound_1","locationerror_1","locationFound_1","_unselectCb","container","ResizeObserver","_resizeObserver","observe","disconnect","onMapClick","_universalEvents","_positionEvents","_b","GEOJSON","IMAGE","TILE","OSM","ZOOM","Zoom","ATTRIBUTION","AttributionControl"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** Bundle of @nextgis/leaflet-map-adapter; version: 1.11.10; author: NextGIS */
1
+ /** Bundle of @nextgis/leaflet-map-adapter; version: 1.13.0; author: NextGIS */
2
2
  var LeafletMapAdapter = (function () {
3
3
  'use strict';
4
4
 
@@ -14697,6 +14697,9 @@ var LeafletMapAdapter = (function () {
14697
14697
  link.title = title;
14698
14698
  link.setAttribute('role', 'button');
14699
14699
  link.setAttribute('aria-label', title);
14700
+ if (options.addClass) {
14701
+ link.classList.add(options.addClass);
14702
+ }
14700
14703
  leafletSrc.exports.DomEvent.disableClickPropagation(link);
14701
14704
  leafletSrc.exports.DomEvent.on(link, 'click', leafletSrc.exports.DomEvent.stop);
14702
14705
  if (options.html instanceof HTMLElement) {
@@ -16025,18 +16028,25 @@ var LeafletMapAdapter = (function () {
16025
16028
  this._universalEvents = [
16026
16029
  'move',
16027
16030
  'zoom',
16028
- 'moveend',
16029
16031
  'zoomend',
16030
16032
  'zoomstart',
16033
+ 'moveend',
16031
16034
  'movestart',
16032
16035
  ];
16036
+ this._positionEvents = [
16037
+ 'mousemove',
16038
+ 'mouseout',
16039
+ 'mouseover',
16040
+ ];
16033
16041
  }
16034
16042
  LeafletMapAdapter.prototype.create = function (options) {
16035
16043
  var _this = this;
16036
16044
  this.options = __assign({}, options);
16037
16045
  if (this.options.target) {
16038
16046
  var _a = this.options, zoom = _a.zoom, center = _a.center, maxZoom = _a.maxZoom, minZoom = _a.minZoom, mb = _a.maxBounds, mapAdapterOptions = _a.mapAdapterOptions;
16039
- this.map = new leafletSrc.exports.Map(this.options.target, __assign({ attributionControl: false, zoomControl: false, maxBounds: mb ? arrayToBoundsExpression(mb) : undefined, maxZoom: maxZoom, minZoom: minZoom, center: center && [center[1], center[0]], zoom: zoom }, mapAdapterOptions));
16047
+ this.map =
16048
+ this.options.map ||
16049
+ new leafletSrc.exports.Map(this.options.target, __assign({ attributionControl: false, zoomControl: false, maxBounds: mb ? arrayToBoundsExpression(mb) : undefined, maxZoom: maxZoom, minZoom: minZoom, center: center && [center[1], center[0]], zoom: zoom }, mapAdapterOptions));
16040
16050
  // create default pane
16041
16051
  var defPane = this.map.createPane('order-0');
16042
16052
  this.map._addUnselectCb = function (def) {
@@ -16282,9 +16292,22 @@ var LeafletMapAdapter = (function () {
16282
16292
  map.on('click', function (evt) {
16283
16293
  _this.onMapClick(evt);
16284
16294
  });
16285
- this._universalEvents.forEach(function (e) {
16295
+ var _loop_1 = function (e) {
16286
16296
  map.on(e, function () { return _this.emitter.emit(e, _this); }, map);
16287
- });
16297
+ };
16298
+ for (var _i = 0, _a = this._universalEvents; _i < _a.length; _i++) {
16299
+ var e = _a[_i];
16300
+ _loop_1(e);
16301
+ }
16302
+ var _loop_2 = function (e) {
16303
+ map.on(e, function (evt) {
16304
+ return _this.emitter.emit(e, convertMapClickEvent(evt));
16305
+ }, map);
16306
+ };
16307
+ for (var _b = 0, _c = this._positionEvents; _b < _c.length; _b++) {
16308
+ var e = _c[_b];
16309
+ _loop_2(e);
16310
+ }
16288
16311
  }
16289
16312
  };
16290
16313
  LeafletMapAdapter.layerAdapters = {