@nextgis/leaflet-map-adapter 1.8.1 → 1.9.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,8 +1,8 @@
1
- import{EventEmitter as t}from"events";import{Control as e,DomEvent as s,GeoJSON as i,FeatureGroup as o,DivIcon as n,Marker as r,CircleMarker as a,ImageOverlay as l,Layer as p,Util as c,CRS as h,GridLayer as u,DomUtil as d,TileLayer as m,Map as y}from"leaflet";import{debounce as f,defined as _}from"@nextgis/utils";import{isPaintCallback as g,isPaint as v}from"@nextgis/paint";function P(t){const e=t.containerPoint,s=t.latlng,{lat:i,lng:o}=s;return{latLng:s,lngLat:[o,i],pixel:{left:e.x,top:e.y},source:t}}function L(t,i={},o){return new(e.extend({onAdd(){const e=document.createElement("div"),n=t.onAdd(o);return e.classList.add("leaflet-control"),i.bar&&e.classList.add("leaflet-bar"),i.margin||i.bar||(e.style.marginBottom="0px",e.style.marginTop="0px",e.style.marginLeft="0px",e.style.marginRight="0px"),n&&e.appendChild(n),s.disableClickPropagation(e),e},onRemove(){t.onRemove()}}))}function O(t){const e=t.getNorthEast(),s=t.getSouthWest();return[s.lng,s.lat,e.lng,e.lat]}const b={Point:"point",LineString:"line",MultiPoint:"point",Polygon:"polygon",MultiLineString:"line",MultiPolygon:"polygon",GeometryCollection:"polygon"},C={stroke:!1,opacity:1},x={};for(const t in b){const e=b[t],s=x[e]||[];s.push(t),x[e]=s}function w(t,e){return-1!==(x[e]||[]).indexOf(t)}function k(t){const e=new i;return(Array.isArray(t)?t:[t]).forEach((t=>e.addData(t))),e.getBounds()}function E(t){return{getBounds:()=>function(t){return O(k(t))}(t),getCenter:()=>function(t){const{lat:e,lng:s}=k(t).getCenter();return[s,e]}(t)}}function T(t){const e={};for(let s=0;s<t.length;s++)e[t[s]]=1+(e[t[s]]||0);let s="";for(const t in e){e[t]>(s?e[s]:0)&&(s=t)}return s}class M{constructor(t,e){if(this.map=t,this.options=e,this.pane="order-0",void 0!==e.order){const s="order-"+e.order;let i=t.getPane(s);i||(i=t.createPane(s)),i.style.zIndex=String(Math.round(100*e.order)),this.pane=s}}addLayer(t){Object.assign(this.options,t)}}function S(t,e,s){const i=new XMLHttpRequest;i.open("GET",t),i.responseType="arraybuffer";for(const t in s)i.setRequestHeader(t,s[t]);return i.onload=function(){const t=new Uint8Array(this.response),s=new Blob([t],{type:"image/png"}),i=(window.URL||window.webkitURL).createObjectURL(s);e(i)},i.send(),()=>{i.abort()}}class B extends l{constructor(t,e,s){super(t,e,s),this._abort=[]}cancelLoad(){this._abort&&(this._abort.forEach((t=>t())),this._abort=[])}_initImage(){super._initImage();const t=this.options.headers;if(t){const e=this._image,s=e.src;e.src="",this._abort.push(S(s,(t=>{e.src=t}),t))}}}
1
+ import{EventEmitter as t}from"events";import{Control as e,DomEvent as s,GeoJSON as i,FeatureGroup as o,DivIcon as n,Marker as r,CircleMarker as a,ImageOverlay as l,Layer as p,Util as c,CRS as h,GridLayer as u,DomUtil as d,TileLayer as m,Map as y}from"leaflet";import{debounce as f,defined as _}from"@nextgis/utils";import{isPaintCallback as g,isPaint as v}from"@nextgis/paint";function P(t){const e=t.containerPoint,s=t.latlng,{lat:i,lng:o}=s;return{latLng:s,lngLat:[o,i],pixel:{left:e.x,top:e.y},source:t}}function L(t,i={},o){return new(e.extend({onAdd(){const e=document.createElement("div"),n=t.onAdd(o);return e.classList.add("leaflet-control"),i.bar&&e.classList.add("leaflet-bar"),i.margin||i.bar||(e.style.marginBottom="0px",e.style.marginTop="0px",e.style.marginLeft="0px",e.style.marginRight="0px"),n&&e.appendChild(n),s.disableClickPropagation(e),e},onRemove(){t.onRemove()}}))}function O(t){const e=t.getNorthEast(),s=t.getSouthWest();return[s.lng,s.lat,e.lng,e.lat]}const b={Point:"point",LineString:"line",MultiPoint:"point",Polygon:"polygon",MultiLineString:"line",MultiPolygon:"polygon",GeometryCollection:"polygon"},x={stroke:!1,opacity:1},C={};for(const t in b){const e=b[t],s=C[e]||[];s.push(t),C[e]=s}function w(t,e){return-1!==(C[e]||[]).indexOf(t)}function k(t){const e=new i;return(Array.isArray(t)?t:[t]).forEach((t=>e.addData(t))),e.getBounds()}function E(t){return{getBounds:()=>function(t){return O(k(t))}(t),getCenter:()=>function(t){const{lat:e,lng:s}=k(t).getCenter();return[s,e]}(t)}}function T(t){const e={};for(let s=0;s<t.length;s++)e[t[s]]=1+(e[t[s]]||0);let s="";for(const t in e){e[t]>(s?e[s]:0)&&(s=t)}return s}class M{constructor(t,e){if(this.map=t,this.options=e,this.pane="order-0",void 0!==e.order){const s="order-"+e.order;let i=t.getPane(s);i||(i=t.createPane(s)),i.style.zIndex=String(Math.round(100*e.order)),this.pane=s}}addLayer(t){Object.assign(this.options,t)}}function S(t,e,s){const i=new XMLHttpRequest;i.open("GET",t),i.responseType="arraybuffer";for(const t in s)i.setRequestHeader(t,s[t]);return i.onload=function(){const t=new Uint8Array(this.response),s=new Blob([t],{type:"image/png"}),i=(window.URL||window.webkitURL).createObjectURL(s);e(i)},i.send(),()=>{i.abort()}}class B extends l{constructor(t,e,s){super(t,e,s),this._abort=[]}cancelLoad(){this._abort&&(this._abort.forEach((t=>t())),this._abort=[])}_initImage(){super._initImage();const t=this.options.headers;if(t){const e=this._image,s=e.src;e.src="",this._abort.push(S(s,(t=>{e.src=t}),t))}}}
2
2
  /*!
3
3
  * leaflet.wms.js
4
4
  * A collection of Leaflet utilities for working with Web Mapping services.
5
5
  * (c) 2014-2016, Houston Engineering, Inc.
6
6
  * MIT License
7
- */class Z extends p{constructor(t,e){super(e),this.defaultWmsParams={service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},this.options={crs:null,uppercase:!1,attribution:"",opacity:1,isBack:!1,minZoom:0,maxZoom:18,pane:"tilePane",headers:null,viewPortBuffer:0,setViewDelay:100},this._url=t;const s={},i={};let o;for(o in e)o in this.options?i[o]=e[o]:s[o]=e[o];c.setOptions(this,i),this.wmsParams=c.extend({},this.defaultWmsParams,s)}setParams(t){c.extend(this.wmsParams,t),this.update()}getAttribution(){return this.options.attribution||""}onAdd(){return this.update(),this}onRemove(t){return this._currentOverlay&&(this._currentOverlay.cancelLoad(),t.removeLayer(this._currentOverlay),delete this._currentOverlay),this._currentUrl&&delete this._currentUrl,this}getEvents(){return{moveend:f(this.update,this.options.setViewDelay)}}update(){if(!this._map)return;this.updateWmsParams();const t=this.getImageUrl();if(this._currentUrl===t)return;this._currentUrl=t;const e=this.options.viewPortBuffer||0,s=this._map.getBounds().pad(e),i=new B(t,s,{opacity:0,pane:this.options.pane,headers:this.options.headers});i.addTo(this._map),this._currentOverlay&&this._currentOverlay.cancelLoad(),i.once("load",(()=>{this._map&&(i._url===this._currentUrl?(this._currentOverlay&&this._map.removeLayer(this._currentOverlay),this._currentOverlay=i,i.setOpacity(void 0!==this.options.opacity?this.options.opacity:1),!0===this.options.isBack&&i.bringToBack(),!1===this.options.isBack&&i.bringToFront(),void 0!==this.options.zIndex&&i.setZIndex(this.options.zIndex)):this._map.removeLayer(i))}),this);const{minZoom:o,maxZoom:n}=this.options;(o&&this._map.getZoom()<o||n&&this._map.getZoom()>n)&&this._map.removeLayer(i)}setOpacity(t){this.options.opacity=t,this._currentOverlay&&this._currentOverlay.setOpacity(t)}bringToBack(){this.options.isBack=!0,this._currentOverlay&&this._currentOverlay.bringToBack()}bringToFront(){this.options.isBack=!1,this._currentOverlay&&this._currentOverlay.bringToFront()}setZIndex(t){this.options.zIndex=t,this._currentOverlay&&this._currentOverlay.setZIndex(t)}updateWmsParams(t){t||(t=this._map);const e=this.options.viewPortBuffer||0,s=t.getBounds().pad(e),i=t.getSize();if(0!==this.options.viewPortBuffer){const t=e+1;i.x=Math.ceil(i.x*t),i.y=Math.ceil(i.y*t)}const o=parseFloat(this.wmsParams.version),n=this.options.crs||t.options.crs,r=o>=1.3?"crs":"srs";if(n){const t=n.project(s.getNorthWest()),e=n.project(s.getSouthEast()),a={width:i.x,height:i.y};a[r]=n.code,a.bbox=(o>=1.3&&n===h.EPSG4326?[e.y,t.x,t.y,e.x]:[t.x,e.y,e.x,t.y]).join(","),c.extend(this.wmsParams,a)}}getImageUrl(){const t=c.getParamString(this.wmsParams,this._url,this.options.uppercase||!1);return this._url+t}}function A(t){return class extends t{constructor(...t){super(...t),this.options.setViewDelay&&(this._update=function(t,e=10){let s;function i(...o){i.clear(),s=setTimeout((()=>{s=null,t.apply(this,o)}),e)}return i.clear=function(){s&&(clearTimeout(s),s=null)},i}(((...t)=>{u.prototype._update.call(this,...t)}),this.options.setViewDelay))}createTile(t,e){const s=this.getTileUrl(t),i=document.createElement("img");return i.abort=S(s,(t=>{i.src=t,e(null,i)}),this.options.headers),(this.options.crossOrigin||""===this.options.crossOrigin)&&(i.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),i.alt="",i.setAttribute("role","presentation"),i}_abortLoading(){const t=this._tiles,e=this._tileZoom;for(const s in t)if(t[s].coords.z!==e){const e=t[s].el;e.onload=c.falseFn,e.onerror=c.falseFn,e.complete||(e.abort&&e.abort(),e.src=c.emptyImageUrl,d.remove(e),delete t[s])}}}}const I=A(class extends m{constructor(t,e){super(t,e),Object.assign(this.options,e)}});class F extends M{addLayer(t){if(this.options=Object.assign(this.options,t),t){const{url:e,...s}=t;if(e){const t={pane:this.pane,attribution:s.attribution,minZoom:s.minZoom,maxZoom:s.maxZoom,...s.nativeOptions};let i;return s.subdomains&&(t.subdomains=s.subdomains),i=s.headers?new I(e,{...t,headers:s.headers,setViewDelay:s.setViewDelay}):new m(e,t),i}}}}const W=A(class extends m.WMS{constructor(t,e){super(t,e)}});class U{constructor(){this.options={target:"map"},this.layerAdapters=U.layerAdapters,this.controlAdapters=U.controlAdapters,this.emitter=new t,this._unselectCb=[],this._universalEvents=["move","zoom","moveend","zoomend","zoomstart","movestart"]}create(t){if(this.options={...t},this.options.target){const{zoom:t,center:e,maxZoom:s,minZoom:i,maxBounds:o,mapAdapterOptions:n}=this.options;this.map=new y(this.options.target,{attributionControl:!1,zoomControl:!1,maxBounds:o&&[[o[1],o[0]],[o[3],o[2]]],maxZoom:s,minZoom:i,center:e&&[e[1],e[0]],zoom:t,...n});const r=this.map.createPane("order-0");this.map._addUnselectCb=t=>{this._addUnselectCb(t)},r.style.zIndex=String(0),this.emitter.emit("create",this),this._addMapListeners()}}destroy(){this.map&&this.map.remove()}getContainer(){return this.map&&this.map.getContainer()}getControlContainer(){const t=this.map&&this.map._controlContainer;if(t)return t;throw new Error("Leaflet Map is not initialized yet")}setCursor(t){this.map&&(this.map.getContainer().style.cursor=t)}setView(t,e){const[s,i]=t;this.map&&("number"==typeof e?this.map.setView([i,s],e,{animate:!1}):this.setCenter([s,i]))}setCenter(t){const[e,s]=t;this.map&&this.map.panTo([s,e])}getCenter(){const t=this.map;if(t){const e=t.getBounds().getCenter();return[e.lng,e.lat]}}setZoom(t){this.map&&this.map.setZoom(t)}getZoom(){return this.map&&this.map.getZoom()||void 0}getBounds(){if(!this.map)return;const t=this.map.getBounds(),e=t.getSouthWest(),s=t.getNorthEast();return[e.lng,e.lat,s.lng,s.lat]}fitBounds(t,e={}){if(this.map){const{maxZoom:s,offset:i,padding:o}=e,n={};s&&(n.maxZoom=s),o&&(n.padding=[o,o]),i&&(n.padding=i),this.map.fitBounds([[t[3],t[0]],[t[1],t[2]]],n)}}getLayerAdapter(t){return U.layerAdapters[t]}createControl(t,e){return L(t,e,this)}createButtonControl(t){return function(t,e){const i=document.createElement("a"),o=t.title||"";i.href="#",i.title=o,i.setAttribute("role","button"),i.setAttribute("aria-label",o),s.disableClickPropagation(i),s.on(i,"click",s.stop),t.html instanceof HTMLElement?i.appendChild(t.html):"string"==typeof t.html&&(i.innerHTML=t.html);const n=e=>{e.stopPropagation(),t.onClick()};return L({onAdd:()=>(void 0!==t.onClick&&i.addEventListener("click",n),i),onRemove(){const e=i.parentNode;e&&e.removeChild(i),void 0!==t.onClick&&i.removeEventListener("click",n)}},{bar:!0},e)}(t,this)}addControl(t,e){if(t.options.position=e.replace("-",""),this.map)return this.map.addControl(t),t}removeControl(t){this.map&&this.map.removeControl(t)}removeLayer(t){t&&t.remove&&t.remove()}showLayer(t){this.map&&t.addTo(this.map)}hideLayer(t){t.remove()}setLayerOpacity(t,e){"setOpacity"in t&&t.setOpacity(e)}setLayerOrder(t,e,s){}onMapClick(t){const e=P(t);this.emitter.emit("preclick",e),this.emitter.emit("click",e)}locate(t,e){const s=this.map;if(s&&(s.locate(t),e)){const{locationfound:t,locationerror:i}=e,o=e=>{t({lngLat:[e.latlng.lng,e.latlng.lat]})};void 0!==t&&s.on("locationfound",o,this),i&&s.on("locationerror",i,this);return{stop:()=>{void 0!==t&&s.off("locationfound",o),i&&s.off("locationerror",i)}}}return{stop:()=>{}}}_addUnselectCb(t){for(const t of this._unselectCb)t();this._unselectCb.length=0,this._unselectCb.push(t)}_addMapListeners(){const t=this.map;t&&(t.on("click",(t=>{this.onMapClick(t)})),this._universalEvents.forEach((e=>{t.on(e,(()=>this.emitter.emit(e,this)),t)})))}}U.layerAdapters={GEOJSON:class extends M{constructor(t,e){super(t,e),this.selected=!1,this._layers=[],this._selectedLayers=[],this._filteredLayers=[],this._openedPopup=[],this.$updateTooltip=f((()=>{this.updateTooltip()}),300),this.$unselect=()=>{this.unselect()}}addLayer(t){return Object.assign(this.options,t),this.paint=t.paint,this.layer=new o([],{...t.nativeOptions,pane:this.pane}),this.selectedPaint=t.selectedPaint,t.paint=this.paint,t.data&&this.addData(t.data),this._addMapListener(),this.layer}beforeRemove(){this._removeMapListener()}select(t){if(t){this._layers.filter(t).forEach((t=>{this._selectLayer(t,"api")}))}else this.selected||(this.selected=!0,this.selectedPaint&&this._setPaintEachLayer(this.selectedPaint))}unselect(t){if(t){this._layers.filter(t).forEach((t=>{this._unSelectLayer(t)}))}else if(this.selected){for(const t of this._openedPopup)this._removePopup(t[0]);this.paint&&this._setPaintEachLayer(this.paint),this._selectedLayers.length=0,this.selected=!1}}getSelected(){return this._selectedLayers.map((t=>({target:this,feature:t.feature,layer:t,...E(t.feature)})))}getFiltered(){return this._filteredLayers}filter(t){this._filterFun=t;const e=this.layer,s=e&&e._map;if(e&&s){e.remove();const i=[];this._layers.forEach((({feature:s,layer:o})=>{if(o){!t||t({target:this,feature:s,layer:o,...E(s)})?(e.addLayer(o),i.push({target:this,feature:s,layer:o,...E(s)})):e.removeLayer(o)}})),this._filteredLayers=i,e.addTo(s)}return this._filteredLayers}cleanFilter(){this.filter()}getLayers(){return this._layers.map((({layer:t,feature:e})=>({feature:e,layer:t,visible:t&&!!t._map,target:this,...E(e)})))}clearLayer(t){this.unselect();const e=this.layer;if(e)if(t)for(let s=this._layers.length;s--;){const i=this._layers[s];if(i){const{feature:o,layer:n}=i;if(o&&n){t(o)&&(e.removeLayer(n),this._layers.splice(s,1))}}}else e.clearLayers(),this._layers=[]}setData(t){this.clearLayer(),this.addData(t)}addData(t){const e=this.options;let s;if(e){if(t){let i;if(e.type)i=e.type;else{const e=function(t){let e;e="FeatureCollection"===t.type?T(t.features.map((t=>t.geometry.type))):"GeometryCollection"===t.type?T(t.geometries.map((t=>t.type))):"Feature"===t.type?t.geometry.type:t.type;return e}(t);i=b[e]}if(this.type&&this.type!==i)return void console.warn("no other data type than layer can be added");this.type=i,(t=function(t,e){if("FeatureCollection"===t.type)t.features=t.features.filter((t=>w(t.geometry.type,e)));else if("Feature"===t.type){if(!w(t.geometry.type,e))return!1}else"GeometryCollection"===t.type&&(t.geometries=t.geometries.filter((t=>w(t.type,e))));return t}(t,i))&&(s=this._getGeoJsonOptions(e,i))}new i(t||void 0,s)}}openPopup(t,e){if(t){this._layers.filter(t).forEach((t=>{this._openPopup(t,e,"api")}))}}closePopup(t){(t?this._openedPopup.filter((e=>t(e[2]))):this._openedPopup).forEach((t=>{this._removePopup(t[0])}))}updateTooltip(t){t?this._updateTooltip(t):this.getLayers().forEach((t=>this._updateTooltip({feature:t.feature,layer:t.layer})))}getExtent(){return this.getBounds()}getBounds(){if(this.layer){return O(this.layer.getBounds())}}setOpacity(t){this.options.opacity=t,this.setPaint(this.paint),this.setSelectedPaint(this.selectedPaint)}setPaint(t){if(t){this.paint=t;for(const e of this._layers)this._setPaint(e,t)}}setSelectedPaint(t){if(t){this.selectedPaint=t;for(const e of this._selectedLayers)this._setPaint(e,t)}}updatePaint(t){this.paint={...this.paint,...t};for(const t of this._layers)this._setPaint(t,this.paint)}updateSelectedPaint(t){this.selectedPaint={...this.selectedPaint,...t};for(const t of this._selectedLayers)this._setPaint(t,this.selectedPaint)}_updateTooltip(t){const{feature:e,layer:s}=t;if(e&&s&&e.properties&&this.options.labelField){s.unbindTooltip();const t=e.properties[this.options.labelField];if(void 0!==t){const e=!this.options.labelOnHover;s.bindTooltip(String(t),{permanent:e,sticky:!1})}}}async _openPopup(t,e={},s,i){var o,n;const{feature:r,layer:a}=t,{minWidth:l,autoPan:p,maxWidth:c,closeButton:h}={minWidth:300,...e},u=null!=h?h:!this.options.selectOnHover;let d;const m=[],y=()=>{d&&this._removePopup(d)},f=e.createPopupContent?await e.createPopupContent({layer:a,feature:r,target:this,type:s,close:y,onClose:t=>{m.push(t)},...E(r)}):e.popupContent;if(f&&a){d=a.bindPopup(f,{minWidth:l,autoPan:p,maxWidth:c,closeButton:u,closeOnClick:!1,autoClose:!1});if(null===(n=null===(o=this.options.popupOptions)||void 0===o?void 0:o.unselectOnClose)||void 0===n||n){const t=a.getPopup();t&&t.once("remove",(()=>{y()}),this)}this._openedPopup.push([d,m,t]),setTimeout((()=>{d.openPopup(i)}),0)}}_removePopup(t){var e,s;if(this.map){t.closePopup().unbindPopup();const i=this._openedPopup.findIndex((e=>e[0]===t));if(-1!==i){const t=null===(s=null===(e=this.options.popupOptions)||void 0===e?void 0:e.unselectOnClose)||void 0===s||s,[,o,n]=this._openedPopup[i];for(const t of o)t(n);o.length=0,t&&this._unSelectLayer(n),this._openedPopup.splice(i,1)}}}_setPaintEachLayer(t){this._layers.forEach((e=>{this._setPaint(e,t)}))}_setPaint(t,e){let s;const{layer:i,feature:o}=t;if(i&&o&&(g(e)?s=e(o):v(e)&&(s=e),s))if("point"===this.type&&"icon"===s.type){const t=i,e=this._createDivIcon(s);t.setIcon(e)}else"setStyle"in i&&i.setStyle(this._preparePaint(s))}_preparePaint(t){if("get-paint"!==t.type){const e=[["color","strokeColor"],["opacity","strokeOpacity"],["stroke","stroke"],["fillColor","fillColor"],["fillOpacity","fillOpacity"],["fill","fill"],["weight","weight"]],s="line"===this.type?[["color","strokeColor"],["opacity","strokeOpacity"],["weight","weight"]]:e,i={};"radius"in t&&"number"==typeof t.radius&&(i.radius=t.radius);for(const[e,o]of s){let s=t[o];_(this.options.opacity)&&-1!==o.toLowerCase().indexOf("opacity")&&(s=Number(s)*this.options.opacity),void 0!==s&&Object.defineProperty(i,e,{enumerable:!0,value:s})}return i}return C}_getGeoJsonOptions(t,e){const s=t.paint;let i={};return"function"==typeof s?"point"===e?i.pointToLayer=(t,e)=>{const i=s(t);return this._createPaintToLayer(i)(t,e)}:i={style:t=>this._preparePaint(t?{...C,...s(t)}:{...C,type:"path"})}:i=this._createPaintOptions(s,e),i.onEachFeature=(t,e)=>{this._onEachFeature(t,e)},i}_onEachFeature(t,e){const s=this.layer;if(s){const i={target:this,feature:t,layer:e,...E(t)};e.options.pane=this.pane,this._layers.push(i);let o=!0;if(this._filterFun&&(o=this._filterFun(i)),o){const{popup:o,popupOptions:n,selectable:r,interactive:a,selectOnHover:l}=this.options;e.options.interactive=!_(a)||a,s.addLayer(e),r&&(l?(e.on("mouseover",(()=>{this._selectLayer(i,"hover")})),e.on("mouseout",(()=>{this._unSelectLayer(i)}))):e.on("click",(t=>this._selectOnLayerClick(t)),this)),this._handleMouseEvents(e),o&&this._openPopup({target:this,layer:e,feature:t,...E(t)},n,"api"),this._updateTooltip({layer:e,feature:t})}}}_handleMouseEvents(t){const e=t=>-1!==this._selectedLayers.indexOf(t),{onClick:s,onLayerClick:i,onMouseOut:o,onMouseOver:n}=this.options,r=s||i;r&&t.on("click",(t=>{r({selected:e(t.target),...this._createMouseEvent(t)})}),this),o&&t.on("mouseout",(t=>{o(this._createMouseEvent(t))}),this),n&&t.on("mouseover",(t=>{n(this._createMouseEvent(t))}),this)}_createMouseEvent(t){return function({layer:t,source:e}){const s=e.target.feature;return{layer:t,feature:s,event:P(e),source:e,...E(s)}}({layer:this,source:t})}_selectOnLayerClick(t){s.stopPropagation(t);const e=t.target,i=e.feature,o={target:this,layer:e,feature:i,...E(i)},n=this._selectedLayers.find((t=>t.layer===e));n?this.options&&this.options.unselectOnSecondClick&&this._unSelectLayer(n):this._selectLayer(o,"click",t.latlng)}_selectLayer(t,e,s){this.map._addUnselectCb((()=>{this._unSelectLayer(t)})),this.options&&!this.options.multiselect&&this._selectedLayers.forEach((t=>this._unSelectLayer(t))),this._selectedLayers.push(t),this.selected=!0;const{selectedPaint:i,popupOnSelect:o,popupOptions:n}=this.options;if(i&&t.layer&&this._setPaint(t,i),o&&this._openPopup(t,n,e,s),this.options.onSelect){const s=t.feature?[t.feature]:[];this.options.onSelect({type:e,layer:this,features:s,...E(s)})}}_unSelectLayer(t){const e=this._selectedLayers.indexOf(t);-1!==e&&(this._selectedLayers.splice(e,1),this.options&&(this.options.paint&&this._setPaint(t,this.options.paint),this.options.popupOnSelect&&t.layer&&this._removePopup(t.layer))),this.selected=this._selectedLayers.length>0}_createDivIcon(t){const{...e}=t;return new n({className:"",...e})}_createPaintToLayer(t){if(t&&t.type)if("icon"===t.type){const e=t.html;if(t.className||e)return(e,s)=>{const i=this._createDivIcon(t);return new r(s,{icon:i})}}else if("pin"===t.type)return(t,e)=>new r(e);return(e,s)=>new a(s,this._preparePaint({...C,...t}))}_createPaintOptions(t,e){const s={},i=t&&this._preparePaint(t)||{};return t&&(s.style=()=>i),"point"===e?s.pointToLayer=this._createPaintToLayer(t):"line"===e&&(i.stroke=!0),s}_addMapListener(){const t=this.map;if(t){const{labelField:e,labelOnHover:s,unselectOnClick:i}=this.options;(null==i||i)&&t.on("click",this.$unselect),e&&!s&&(t.on("zoomend",this.$updateTooltip),t.on("moveend",this.$updateTooltip))}}_removeMapListener(){this.map.off("zoomend",this.$updateTooltip),this.map.off("moveend",this.$updateTooltip),this.map.off("click",this.$unselect)}},IMAGE:class extends M{addLayer(t){const e=t&&t.url;if(e){const s=(t={transparent:!0,...t}).updateWmsParams;if(this.layer=new Z(e,{pane:this.pane,headers:t.headers,setViewDelay:t.setViewDelay,...t,...t.params,...t.nativeOptions}),s){const t=this.layer.updateWmsParams;this.layer.updateWmsParams=function(e){t.call(this,e),this.wmsParams=s(this.wmsParams)}}return this.layer}}},TILE:F,WMS:class extends M{addLayer(t){Object.assign(this.options,t);const{url:e,...s}=t;if(e){const i={pane:this.pane,attribution:s.attribution,minZoom:s.minZoom,maxZoom:s.maxZoom,layers:t.layers,format:t.format,...t.nativeOptions};let o;return o=s.headers?new W(e,{...i,headers:s.headers}):new m.WMS(e,i),o}}},OSM:class extends F{addLayer(t){return super.addLayer({name:"OpenStreetMap",attribution:'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',...t,url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"})}}},U.controlAdapters={ZOOM:e.Zoom,ATTRIBUTION:class extends e.Attribution{constructor(t){super(t);const e=t&&t.customAttribution;if(e){let t=[];Array.isArray(e)?t=e:e&&(t=[e]),t.forEach((t=>this.addAttribution(t)))}}}},U.Map=y;var z=U;export{z as default};
7
+ */class Z extends p{constructor(t,e){super(e),this.defaultWmsParams={service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},this.options={crs:null,uppercase:!1,attribution:"",opacity:1,isBack:!1,minZoom:0,maxZoom:18,pane:"tilePane",headers:null,viewPortBuffer:0,setViewDelay:100},this._url=t;const s={},i={};let o;for(o in e)o in this.options?i[o]=e[o]:s[o]=e[o];c.setOptions(this,i),this.wmsParams=c.extend({},this.defaultWmsParams,s)}setParams(t){c.extend(this.wmsParams,t),this.update()}getAttribution(){return this.options.attribution||""}onAdd(){return this.update(),this}onRemove(t){return this._currentOverlay&&(this._currentOverlay.cancelLoad(),t.removeLayer(this._currentOverlay),delete this._currentOverlay),this._currentUrl&&delete this._currentUrl,this}getEvents(){return{moveend:f(this.update,this.options.setViewDelay)}}update(){if(!this._map)return;this.updateWmsParams();const t=this.getImageUrl();if(this._currentUrl===t)return;this._currentUrl=t;const e=this.options.viewPortBuffer||0,s=this._map.getBounds().pad(e),i=new B(t,s,{opacity:0,pane:this.options.pane,headers:this.options.headers});i.addTo(this._map),this._currentOverlay&&this._currentOverlay.cancelLoad(),i.once("load",(()=>{this._map&&(i._url===this._currentUrl?(this._currentOverlay&&this._map.removeLayer(this._currentOverlay),this._currentOverlay=i,i.setOpacity(void 0!==this.options.opacity?this.options.opacity:1),!0===this.options.isBack&&i.bringToBack(),!1===this.options.isBack&&i.bringToFront(),void 0!==this.options.zIndex&&i.setZIndex(this.options.zIndex)):this._map.removeLayer(i))}),this);const{minZoom:o,maxZoom:n}=this.options;(o&&this._map.getZoom()<o||n&&this._map.getZoom()>n)&&this._map.removeLayer(i)}setOpacity(t){this.options.opacity=t,this._currentOverlay&&this._currentOverlay.setOpacity(t)}bringToBack(){this.options.isBack=!0,this._currentOverlay&&this._currentOverlay.bringToBack()}bringToFront(){this.options.isBack=!1,this._currentOverlay&&this._currentOverlay.bringToFront()}setZIndex(t){this.options.zIndex=t,this._currentOverlay&&this._currentOverlay.setZIndex(t)}updateWmsParams(t){t||(t=this._map);const e=this.options.viewPortBuffer||0,s=t.getBounds().pad(e),i=t.getSize();if(0!==this.options.viewPortBuffer){const t=e+1;i.x=Math.ceil(i.x*t),i.y=Math.ceil(i.y*t)}const o=parseFloat(this.wmsParams.version),n=this.options.crs||t.options.crs,r=o>=1.3?"crs":"srs";if(n){const t=n.project(s.getNorthWest()),e=n.project(s.getSouthEast()),a={width:i.x,height:i.y};a[r]=n.code,a.bbox=(o>=1.3&&n===h.EPSG4326?[e.y,t.x,t.y,e.x]:[t.x,e.y,e.x,t.y]).join(","),c.extend(this.wmsParams,a)}}getImageUrl(){const t=c.getParamString(this.wmsParams,this._url,this.options.uppercase||!1);return this._url+t}}function A(t){return class extends t{constructor(...t){super(...t),this.options.setViewDelay&&(this._update=function(t,e=10){let s;function i(...o){i.clear(),s=setTimeout((()=>{s=null,t.apply(this,o)}),e)}return i.clear=function(){s&&(clearTimeout(s),s=null)},i}(((...t)=>{u.prototype._update.call(this,...t)}),this.options.setViewDelay))}createTile(t,e){const s=this.getTileUrl(t),i=document.createElement("img");return i.abort=S(s,(t=>{i.src=t,e(null,i)}),this.options.headers),(this.options.crossOrigin||""===this.options.crossOrigin)&&(i.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),i.alt="",i.setAttribute("role","presentation"),i}_abortLoading(){const t=this._tiles,e=this._tileZoom;for(const s in t)if(t[s].coords.z!==e){const e=t[s].el;e.onload=c.falseFn,e.onerror=c.falseFn,e.complete||(e.abort&&e.abort(),e.src=c.emptyImageUrl,d.remove(e),delete t[s])}}}}const I=A(class extends m{constructor(t,e){super(t,e),Object.assign(this.options,e)}});class F extends M{addLayer(t){if(this.options=Object.assign(this.options,t),t){const{url:e,...s}=t;if(e){const t={pane:this.pane,attribution:s.attribution,minZoom:s.minZoom,maxZoom:s.maxZoom,...s.nativeOptions};let i;return s.subdomains&&(t.subdomains=s.subdomains),i=s.headers?new I(e,{...t,headers:s.headers,setViewDelay:s.setViewDelay}):new m(e,t),i}}}}const W=A(class extends m.WMS{constructor(t,e){super(t,e)}});function z(t){return[[t[3],t[0]],[t[1],t[2]]]}class U{constructor(){this.options={target:"map"},this.layerAdapters=U.layerAdapters,this.controlAdapters=U.controlAdapters,this.emitter=new t,this._unselectCb=[],this._universalEvents=["move","zoom","moveend","zoomend","zoomstart","movestart"]}create(t){if(this.options={...t},this.options.target){const{zoom:t,center:e,maxZoom:s,minZoom:i,maxBounds:o,mapAdapterOptions:n}=this.options;this.map=new y(this.options.target,{attributionControl:!1,zoomControl:!1,maxBounds:o?z(o):void 0,maxZoom:s,minZoom:i,center:e&&[e[1],e[0]],zoom:t,...n});const r=this.map.createPane("order-0");this.map._addUnselectCb=t=>{this._addUnselectCb(t)},r.style.zIndex=String(0),this.emitter.emit("create",this),this._addMapListeners()}}destroy(){this.map&&this.map.remove()}getContainer(){return this.map&&this.map.getContainer()}getControlContainer(){const t=this.map&&this.map._controlContainer;if(t)return t;throw new Error("Leaflet Map is not initialized yet")}setCursor(t){this.map&&(this.map.getContainer().style.cursor=t)}setView(t,e){const s=this.map;if(s)if(Array.isArray(t)){const s=t,[i,o]=s;this.map&&("number"==typeof e?this.map.setView([o,i],e,{animate:!1}):this.setCenter([i,o]))}else{const{zoom:e,center:i,maxBounds:o,bounds:n,minZoom:r,maxZoom:a}=t;i&&void 0!==e?this.setView(i,e):(void 0!==e&&this.setZoom(e),i&&this.setCenter(i)),n&&this.fitBounds(n),void 0!==o&&s.setMaxBounds(o?z(o):null),void 0!==a&&s.setMaxZoom(a),void 0!==r&&s.setMinZoom(r)}}setCenter(t){const[e,s]=t;this.map&&this.map.panTo([s,e])}getCenter(){const t=this.map;if(t){const e=t.getBounds().getCenter();return[e.lng,e.lat]}}setZoom(t){this.map&&this.map.setZoom(t)}getZoom(){return this.map&&this.map.getZoom()||void 0}getBounds(){if(!this.map)return;const t=this.map.getBounds(),e=t.getSouthWest(),s=t.getNorthEast();return[e.lng,e.lat,s.lng,s.lat]}fitBounds(t,e={}){if(this.map){const{maxZoom:s,offset:i,padding:o}=e,n={};s&&(n.maxZoom=s),o&&(n.padding=[o,o]),i&&(n.padding=i),this.map.fitBounds(z(t),n)}}getLayerAdapter(t){return U.layerAdapters[t]}createControl(t,e){return L(t,e,this)}createButtonControl(t){return function(t,e){const i=document.createElement("a"),o=t.title||"";i.href="#",i.title=o,i.setAttribute("role","button"),i.setAttribute("aria-label",o),s.disableClickPropagation(i),s.on(i,"click",s.stop),t.html instanceof HTMLElement?i.appendChild(t.html):"string"==typeof t.html&&(i.innerHTML=t.html);const n=e=>{e.stopPropagation(),t.onClick()};return L({onAdd:()=>(void 0!==t.onClick&&i.addEventListener("click",n),i),onRemove(){const e=i.parentNode;e&&e.removeChild(i),void 0!==t.onClick&&i.removeEventListener("click",n)}},{bar:!0},e)}(t,this)}addControl(t,e){if(t.options.position=e.replace("-",""),this.map)return this.map.addControl(t),t}removeControl(t){this.map&&this.map.removeControl(t)}removeLayer(t){t&&t.remove&&t.remove()}showLayer(t){this.map&&t.addTo(this.map)}hideLayer(t){t.remove()}setLayerOpacity(t,e){"setOpacity"in t&&t.setOpacity(e)}setLayerOrder(t,e,s){}onMapClick(t){const e=P(t);this.emitter.emit("preclick",e),this.emitter.emit("click",e)}locate(t,e){const s=this.map;if(s&&(s.locate(t),e)){const{locationfound:t,locationerror:i}=e,o=e=>{t({lngLat:[e.latlng.lng,e.latlng.lat]})};void 0!==t&&s.on("locationfound",o,this),i&&s.on("locationerror",i,this);return{stop:()=>{void 0!==t&&s.off("locationfound",o),i&&s.off("locationerror",i)}}}return{stop:()=>{}}}_addUnselectCb(t){for(const t of this._unselectCb)t();this._unselectCb.length=0,this._unselectCb.push(t)}_addMapListeners(){const t=this.map;t&&(t.on("click",(t=>{this.onMapClick(t)})),this._universalEvents.forEach((e=>{t.on(e,(()=>this.emitter.emit(e,this)),t)})))}}U.layerAdapters={GEOJSON:class extends M{constructor(t,e){super(t,e),this.selected=!1,this._layers=[],this._selectedLayers=[],this._filteredLayers=[],this._openedPopup=[],this.$updateTooltip=f((()=>{this.updateTooltip()}),300),this.$unselect=()=>{this.unselect()}}addLayer(t){return Object.assign(this.options,t),this.paint=t.paint,this.layer=new o([],{...t.nativeOptions,pane:this.pane}),this.selectedPaint=t.selectedPaint,t.paint=this.paint,t.data&&this.addData(t.data),this._addMapListener(),this.layer}beforeRemove(){this._removeMapListener()}select(t){if(t){this._layers.filter(t).forEach((t=>{this._selectLayer(t,"api")}))}else this.selected||(this.selected=!0,this.selectedPaint&&this._setPaintEachLayer(this.selectedPaint))}unselect(t){if(t){this._layers.filter(t).forEach((t=>{this._unSelectLayer(t)}))}else if(this.selected){for(const t of this._openedPopup)this._removePopup(t[0]);this.paint&&this._setPaintEachLayer(this.paint),this._selectedLayers.length=0,this.selected=!1}}getSelected(){return this._selectedLayers.map((t=>({target:this,feature:t.feature,layer:t,...E(t.feature)})))}getFiltered(){return this._filteredLayers}filter(t){this._filterFun=t;const e=this.layer,s=e&&e._map;if(e&&s){e.remove();const i=[];this._layers.forEach((({feature:s,layer:o})=>{if(o){!t||t({target:this,feature:s,layer:o,...E(s)})?(e.addLayer(o),i.push({target:this,feature:s,layer:o,...E(s)})):e.removeLayer(o)}})),this._filteredLayers=i,e.addTo(s)}return this._filteredLayers}cleanFilter(){this.filter()}getLayers(){return this._layers.map((({layer:t,feature:e})=>({feature:e,layer:t,visible:t&&!!t._map,target:this,...E(e)})))}clearLayer(t){this.unselect();const e=this.layer;if(e)if(t)for(let s=this._layers.length;s--;){const i=this._layers[s];if(i){const{feature:o,layer:n}=i;if(o&&n){t(o)&&(e.removeLayer(n),this._layers.splice(s,1))}}}else e.clearLayers(),this._layers=[]}setData(t){this.clearLayer(),this.addData(t)}addData(t){const e=this.options;let s;if(e){if(t){let i;if(e.type)i=e.type;else{const e=function(t){let e;e="FeatureCollection"===t.type?T(t.features.map((t=>t.geometry.type))):"GeometryCollection"===t.type?T(t.geometries.map((t=>t.type))):"Feature"===t.type?t.geometry.type:t.type;return e}(t);i=b[e]}if(this.type&&this.type!==i)return void console.warn("no other data type than layer can be added");this.type=i,(t=function(t,e){if("FeatureCollection"===t.type)t.features=t.features.filter((t=>w(t.geometry.type,e)));else if("Feature"===t.type){if(!w(t.geometry.type,e))return!1}else"GeometryCollection"===t.type&&(t.geometries=t.geometries.filter((t=>w(t.type,e))));return t}(t,i))&&(s=this._getGeoJsonOptions(e,i))}new i(t||void 0,s)}}openPopup(t,e){if(t){this._layers.filter(t).forEach((t=>{this._openPopup(t,e,"api")}))}}closePopup(t){(t?this._openedPopup.filter((e=>t(e[2]))):this._openedPopup).forEach((t=>{this._removePopup(t[0])}))}updateTooltip(t){t?this._updateTooltip(t):this.getLayers().forEach((t=>this._updateTooltip({feature:t.feature,layer:t.layer})))}getExtent(){return this.getBounds()}getBounds(){if(this.layer){const t=this.layer.getBounds();if(t.isValid())return O(t)}}setOpacity(t){this.options.opacity=t,this.setPaint(this.paint),this.setSelectedPaint(this.selectedPaint)}setPaint(t){if(t){this.paint=t;for(const e of this._layers)this._setPaint(e,t)}}setSelectedPaint(t){if(t){this.selectedPaint=t;for(const e of this._selectedLayers)this._setPaint(e,t)}}updatePaint(t){this.paint={...this.paint,...t};for(const t of this._layers)this._setPaint(t,this.paint)}updateSelectedPaint(t){this.selectedPaint={...this.selectedPaint,...t};for(const t of this._selectedLayers)this._setPaint(t,this.selectedPaint)}_updateTooltip(t){const{feature:e,layer:s}=t;if(e&&s&&e.properties&&this.options.labelField){s.unbindTooltip();const t=e.properties[this.options.labelField];if(void 0!==t){const e=!this.options.labelOnHover;s.bindTooltip(String(t),{permanent:e,sticky:!1})}}}async _openPopup(t,e={},s,i){var o,n;const{feature:r,layer:a}=t,{minWidth:l,autoPan:p,maxWidth:c,closeButton:h}={minWidth:300,...e},u=null!=h?h:!this.options.selectOnHover;let d;const m=[],y=t=>{m.push(t)},f=()=>{d&&this._removePopup(d)};let g;if(g=e.createPopupContent?await e.createPopupContent({layer:a,feature:r,target:this,type:s,close:f,onClose:y,...E(r)}):e.popupContent,g&&a){const e={minWidth:l,autoPan:p,closeButton:u,closeOnClick:!1,autoClose:!1};_(c)&&(e.maxWidth=c),d=a.bindPopup(g,e);if(null===(n=null===(o=this.options.popupOptions)||void 0===o?void 0:o.unselectOnClose)||void 0===n||n){const t=a.getPopup();t&&t.once("remove",(()=>{f()}),this)}this._openedPopup.push([d,m,t]),d.openPopup(i)}}_removePopup(t){var e,s;if(this.map){t.closePopup().unbindPopup();const i=this._openedPopup.findIndex((e=>e[0]===t));if(-1!==i){const t=null===(s=null===(e=this.options.popupOptions)||void 0===e?void 0:e.unselectOnClose)||void 0===s||s,[,o,n]=this._openedPopup[i];for(const t of o)t(n);o.length=0,t&&this._unSelectLayer(n),this._openedPopup.splice(i,1)}}}_setPaintEachLayer(t){this._layers.forEach((e=>{this._setPaint(e,t)}))}_setPaint(t,e){let s;const{layer:i,feature:o}=t;if(i&&o&&(g(e)?s=e(o):v(e)&&(s=e),s))if("point"===this.type&&"icon"===s.type){const t=i,e=this._createDivIcon(s);t.setIcon(e)}else"setStyle"in i&&i.setStyle(this._preparePaint(s))}_preparePaint(t){if("get-paint"!==t.type){const e=[["color","strokeColor"],["opacity","strokeOpacity"],["stroke","stroke"],["fillColor","fillColor"],["fillOpacity","fillOpacity"],["fill","fill"],["weight","weight"]],s="line"===this.type?[["color","strokeColor"],["opacity","strokeOpacity"],["weight","weight"]]:e,i={};"radius"in t&&"number"==typeof t.radius&&(i.radius=t.radius);for(const[e,o]of s){let s=t[o];_(this.options.opacity)&&-1!==o.toLowerCase().indexOf("opacity")&&(s=Number(s)*this.options.opacity),void 0!==s&&Object.defineProperty(i,e,{enumerable:!0,value:s})}return i}return x}_getGeoJsonOptions(t,e){const s=t.paint;let i={};return"function"==typeof s?"point"===e?i.pointToLayer=(t,e)=>{const i=s(t);return this._createPaintToLayer(i)(t,e)}:i={style:t=>this._preparePaint(t?{...x,...s(t)}:{...x,type:"path"})}:i=this._createPaintOptions(s,e),i.onEachFeature=(t,e)=>{this._onEachFeature(t,e)},i}_onEachFeature(t,e){const s=this.layer;if(s){const i={target:this,feature:t,layer:e,...E(t)};e.options.pane=this.pane,this._layers.push(i);let o=!0;if(this._filterFun&&(o=this._filterFun(i)),o){const{popup:o,popupOptions:n,selectable:r,interactive:a,selectOnHover:l}=this.options;e.options.interactive=!_(a)||a,s.addLayer(e),r&&(l?(e.on("mouseover",(()=>{this._selectLayer(i,"hover")})),e.on("mouseout",(()=>{this._unSelectLayer(i)}))):e.on("click",(t=>this._selectOnLayerClick(t)),this)),this._handleMouseEvents(e),setTimeout((()=>{o&&this._openPopup({target:this,layer:e,feature:t,...E(t)},n,"api"),this._updateTooltip({layer:e,feature:t})}))}}}_handleMouseEvents(t){const e=t=>-1!==this._selectedLayers.indexOf(t),{onClick:s,onLayerClick:i,onMouseOut:o,onMouseOver:n}=this.options,r=s||i;r&&t.on("click",(t=>{r({selected:e(t.target),...this._createMouseEvent(t)})}),this),o&&t.on("mouseout",(t=>{o(this._createMouseEvent(t))}),this),n&&t.on("mouseover",(t=>{n(this._createMouseEvent(t))}),this)}_createMouseEvent(t){return function({layer:t,source:e}){const s=e.target.feature;return{layer:t,feature:s,event:P(e),source:e,...E(s)}}({layer:this,source:t})}_selectOnLayerClick(t){s.stopPropagation(t);const e=t.target,i=e.feature,o={target:this,layer:e,feature:i,...E(i)},n=this._selectedLayers.find((t=>t.layer===e));n?this.options&&this.options.unselectOnSecondClick&&this._unSelectLayer(n):this._selectLayer(o,"click",t.latlng)}_selectLayer(t,e,s){this.map._addUnselectCb((()=>{this._unSelectLayer(t)})),this.options&&!this.options.multiselect&&this._selectedLayers.forEach((t=>this._unSelectLayer(t))),this._selectedLayers.push(t),this.selected=!0;const{selectedPaint:i,popupOnSelect:o,popupOptions:n}=this.options;if(i&&t.layer&&this._setPaint(t,i),o&&this._openPopup(t,n,e,s),this.options.onSelect){const s=t.feature?[t.feature]:[];this.options.onSelect({type:e,layer:this,features:s,...E(s)})}}_unSelectLayer(t){const e=this._selectedLayers.indexOf(t);-1!==e&&(this._selectedLayers.splice(e,1),this.options&&(this.options.paint&&this._setPaint(t,this.options.paint),this.options.popupOnSelect&&t.layer&&this._removePopup(t.layer))),this.selected=this._selectedLayers.length>0}_createDivIcon(t){const{...e}=t;return new n({className:"",...e})}_createPaintToLayer(t){if(t&&t.type)if("icon"===t.type){const e=t.html;if(t.className||e)return(e,s)=>{const i=this._createDivIcon(t);return new r(s,{icon:i})}}else if("pin"===t.type)return(t,e)=>new r(e);return(e,s)=>new a(s,this._preparePaint({...x,...t}))}_createPaintOptions(t,e){const s={},i=t&&this._preparePaint(t)||{};return t&&(s.style=()=>i),"point"===e?s.pointToLayer=this._createPaintToLayer(t):"line"===e&&(i.stroke=!0),s}_addMapListener(){const t=this.map;if(t){const{labelField:e,labelOnHover:s,unselectOnClick:i}=this.options;(null==i||i)&&t.on("click",this.$unselect),e&&!s&&(t.on("zoomend",this.$updateTooltip),t.on("moveend",this.$updateTooltip))}}_removeMapListener(){this.map.off("zoomend",this.$updateTooltip),this.map.off("moveend",this.$updateTooltip),this.map.off("click",this.$unselect)}},IMAGE:class extends M{addLayer(t){const e=t&&t.url;if(e){const s=(t={transparent:!0,...t}).updateWmsParams;if(this.layer=new Z(e,{pane:this.pane,headers:t.headers,setViewDelay:t.setViewDelay,...t,...t.params,...t.nativeOptions}),s){const t=this.layer.updateWmsParams;this.layer.updateWmsParams=function(e){t.call(this,e),this.wmsParams=s(this.wmsParams)}}return this.layer}}},TILE:F,WMS:class extends M{addLayer(t){Object.assign(this.options,t);const{url:e,...s}=t;if(e){const i={pane:this.pane,attribution:s.attribution,minZoom:s.minZoom,maxZoom:s.maxZoom,layers:t.layers,format:t.format,...t.nativeOptions};let o;return o=s.headers?new W(e,{...i,headers:s.headers}):new m.WMS(e,i),o}}},OSM:class extends F{addLayer(t){return super.addLayer({name:"OpenStreetMap",attribution:'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',...t,url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"})}}},U.controlAdapters={ZOOM:e.Zoom,ATTRIBUTION:class extends e.Attribution{constructor(t){super(t);const e=t&&t.customAttribution;if(e){let t=[];Array.isArray(e)?t=e:e&&(t=[e]),t.forEach((t=>this.addAttribution(t)))}}}},U.Map=y;var D=U;export{D as default};
8
8
  //# sourceMappingURL=leaflet-map-adapter.esm-bundler.prod.js.map
@@ -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/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.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 { LayerPosition, 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): LayerPosition {\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 { EventEmitter } from 'events';\nimport { Map, Control, FitBoundsOptions } 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 MapAdapter,\n MapOptions,\n FitOptions,\n MapControl,\n Locate,\n} from '@nextgis/webmap';\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 _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 && [\n [mb[1], mb[0]],\n [mb[3], mb[2]],\n ],\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 }\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 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 }\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(e: 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 // top, left, bottom, right\n this.map.fitBounds(\n [\n [e[3], e[0]],\n [e[1], e[2]],\n ],\n opt,\n );\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 _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 LeafletEvent,\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 CircleMarkerOptions,\n LeafletMouseEvent,\n LatLngExpression,\n GeoJSONOptions,\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 return boundsToArray(bounds);\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 } = { minWidth: 300, ...options };\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 const content = options.createPopupContent\n ? await options.createPopupContent({\n layer,\n feature,\n target: this,\n type,\n close,\n onClose,\n ...createFeaturePositionOptions(feature),\n })\n : options.popupContent;\n if (content && layer) {\n popup = layer.bindPopup(content, {\n minWidth,\n autoPan,\n maxWidth,\n closeButton,\n closeOnClick: false,\n autoClose: false,\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 setTimeout(() => {\n popup.openPopup(latlng);\n }, 0);\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 if (popup) {\n this._openPopup(\n {\n target: this,\n layer,\n feature,\n ...createFeaturePositionOptions(feature),\n },\n popupOptions,\n 'api',\n );\n }\n\n this._updateTooltip({ layer, feature });\n }\n }\n }\n\n private _handleMouseEvents(layer: Layer) {\n const isSelected = (l: LayerDef) => this._selectedLayers.indexOf(l) !== -1;\n\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 onClick_({\n selected: isSelected(e.target),\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 _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._selectedLayers.find((x) => x.layer === 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","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","LeafletMapAdapter","target","layerAdapters","controlAdapters","EventEmitter","create","zoom","center","maxBounds","mb","mapAdapterOptions","Map","attributionControl","zoomControl","defPane","_addUnselectCb","def","emitter","emit","_addMapListeners","destroy","getContainer","getControlContainer","controlContainer","_controlContainer","Error","setCursor","cursor","setView","animate","setCenter","panTo","setZoom","b","fitBounds","e","offset","padding","getLayerAdapter","name","createButtonControl","link","title","href","on","stop","html","HTMLElement","innerHTML","onClick","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","_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","setPaint","setSelectedPaint","l","_setPaint","updatePaint","updateSelectedPaint","properties","labelField","unbindTooltip","message","permanent","labelOnHover","bindTooltip","sticky","minWidth","autoPan","maxWidth","closeButton","closeButton_","selectOnHover","popup","_closeHandlers","close","createPopupContent","onClose","handler","popupContent","bindPopup","closeOnClick","autoClose","popupOptions","unselectOnClose","getPopup","unbindPopup","index","findIndex","closeHandlers","isPaintCallback","isPaint","marker","divIcon","_createDivIcon","setIcon","setStyle","_preparePaint","paintAliases","aliases","readyPaint","radius","to","from","paintProp","defined","toLowerCase","Number","defineProperty","enumerable","lopt","pointToLayer","iconOpt","_createPaintToLayer","_createPaintOptions","onEachFeature","_onEachFeature","ok","selectable","interactive","_selectOnLayerClick","_handleMouseEvents","isSelected","onLayerClick","onMouseOut","onMouseOver","onClick_","_createMouseEvent","event","createMouseEvent","find","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/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.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 { LayerPosition, 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): LayerPosition {\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 { Map, Control, FitBoundsOptions } 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 _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 }\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 map.setMaxBounds(arrayToBoundsExpression(maxBounds));\n } else {\n // @ts-ignore `null` works for unset maxBounds, but not in typing\n map.setMaxBounds(null);\n }\n }\n if (maxZoom !== undefined) {\n map.setMaxZoom(maxZoom);\n }\n if (minZoom !== undefined) {\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 _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 } = { minWidth: 300, ...options };\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 isSelected = (l: LayerDef) => this._selectedLayers.indexOf(l) !== -1;\n\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 onClick_({\n selected: isSelected(e.target),\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 _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._selectedLayers.find((x) => x.layer === 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","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","getContainer","getControlContainer","controlContainer","_controlContainer","Error","setCursor","cursor","setView","lngLatOrOpt","animate","setCenter","setZoom","fitBounds","setMaxBounds","setMaxZoom","setMinZoom","panTo","b","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","_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","isSelected","onLayerClick","onMouseOut","onMouseOver","onClick_","_createMouseEvent","event","createMouseEvent","find","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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"}