UNPKG

maplibre-gl-indoor

Version:

A MapLibre plugin to visualize multi-level buildings

6 lines (5 loc) 27.6 kB
(function(p,d){typeof exports=="object"&&typeof module<"u"?d(exports):typeof define=="function"&&define.amd?define(["exports"],d):(p=typeof globalThis<"u"?globalThis:p||self,d(p.mapgl_indoor={}))})(this,function(p){"use strict";var pe=Object.defineProperty;var he=(p,d,y)=>d in p?pe(p,d,{enumerable:!0,configurable:!0,writable:!0,value:y}):p[d]=y;var n=(p,d,y)=>he(p,typeof d!="symbol"?d+"":d,y);var d=63710088e-1,y={centimeters:d*100,centimetres:d*100,degrees:360/(2*Math.PI),feet:d*3.28084,inches:d*39.37,kilometers:d/1e3,kilometres:d/1e3,meters:d,metres:d,miles:d/1609.344,millimeters:d*1e3,millimetres:d*1e3,nauticalmiles:d/1852,radians:1,yards:d*1.0936};function q(i,e,t={}){const o={type:"Feature"};return(t.id===0||t.id)&&(o.id=t.id),t.bbox&&(o.bbox=t.bbox),o.properties=e||{},o.geometry=i,o}function Y(i,e,t={}){if(!i)throw new Error("coordinates is required");if(!Array.isArray(i))throw new Error("coordinates must be an Array");if(i.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!k(i[0])||!k(i[1]))throw new Error("coordinates must contain numbers");return q({type:"Point",coordinates:i},e,t)}function Z(i,e="kilometers"){const t=y[e];if(!t)throw new Error(e+" units is invalid");return i*t}function V(i,e="kilometers"){const t=y[e];if(!t)throw new Error(e+" units is invalid");return i/t}function E(i){return i%(2*Math.PI)*180/Math.PI}function g(i){return i%360*Math.PI/180}function k(i){return!isNaN(i)&&i!==null&&!Array.isArray(i)}function z(i){if(!i)throw new Error("coord is required");if(!Array.isArray(i)){if(i.type==="Feature"&&i.geometry!==null&&i.geometry.type==="Point")return[...i.geometry.coordinates];if(i.type==="Point")return[...i.coordinates]}if(Array.isArray(i)&&i.length>=2&&!Array.isArray(i[0])&&!Array.isArray(i[1]))return[...i];throw new Error("coord must be GeoJSON Point or an Array of numbers")}function X(i,e,t={}){var o=z(i),r=z(e),s=g(r[1]-o[1]),a=g(r[0]-o[0]),c=g(o[1]),l=g(r[1]),h=Math.pow(Math.sin(s/2),2)+Math.pow(Math.sin(a/2),2)*Math.cos(c)*Math.cos(l);return Z(2*Math.atan2(Math.sqrt(h),Math.sqrt(1-h)),t.units)}var x=X;function P(i){const[e,t,o,r]=i;return[(e+o)/2,(t+r)/2]}function B(i,e){const[t,o,r,s]=i,[a,c]=e,l=o<=c&&c<=s;let h=t<=a&&a<=r;return t>r&&(h=t>=a&&a>=r),l&&h}function J(i,e){return i[0]>e[2]||e[0]>i[2]?!1:!(i[3]<e[1]||e[3]<i[1])}function K(i,e,t=!1){return t?["all",i,["any",["!",["has","level"]],C(e)]]:["all",i,C(e)]}function C(i){return["all",["<=",["to-number",["slice",["get","level"],0,["index-of","~",["get","level"]]]],i],[">=",["to-number",["slice",["get","level"],["+",["index-of","~",["get","level"]],1]]],i]]}const N="indoor";class A{constructor(e){n(this,"_indoorMaps");n(this,"_level");n(this,"_map");n(this,"_mapLoadedPromise");n(this,"_previousSelectedLevel");n(this,"_previousSelectedMap");n(this,"_savedFilters");n(this,"_selectedMap");n(this,"_updateMapPromise");this._map=e,this._level=null,this._indoorMaps=[],this._savedFilters=[],this._selectedMap=null,this._previousSelectedMap=null,this._previousSelectedLevel=null,this._updateMapPromise=Promise.resolve(),this._map.loaded()?this._mapLoadedPromise=Promise.resolve():this._mapLoadedPromise=new Promise(t=>this._map.on("load",t)),this._map.on("moveend",()=>this._updateSelectedMapIfNeeded())}_addLayerForFiltering(e,t){this._map.addLayer(e,t),this._savedFilters.push({filter:this._map.getFilter(e.id)||["all"],layerId:e.id})}_closestMap(){if(this._map.getZoom()<16.5)return null;const e=this._map.getBounds(),t=[e.getWest(),e.getSouth(),e.getEast(),e.getNorth()],o=this._indoorMaps.filter(a=>J(a.bounds,t));if(o.length===0)return null;if(o.length===1)return o[0];let r=Number.POSITIVE_INFINITY,s=o[0];for(const a of o){const c=x(P(a.bounds),P(t));c<r&&(s=a,r=c)}return s}_removeLayerForFiltering(e){this._savedFilters=this._savedFilters.filter(({layerId:t})=>e!==t),this._map.removeLayer(e)}_updateFiltering(){const e=this._level;let t;if(e!==null){const o=this._selectedMap?this._selectedMap.showFeaturesWithEmptyLevel:!1;t=r=>K(r,e,o)}else t=o=>o;this._savedFilters.forEach(({filter:o,layerId:r})=>{this._map.setFilter(r,t(o))})}_updateSelectedMap(e){const t=this._selectedMap;if(t!==null&&(t.layersToHide.forEach(l=>this._map.setLayoutProperty(l,"visibility","visible")),t.layers.forEach(({id:l})=>this._removeLayerForFiltering(l)),this._map.removeSource(N),e||(this._previousSelectedLevel=this._level,this._previousSelectedMap=t),this.setLevel(null,!1),this._map.fire("indoor.map.unloaded",{indoorMap:t})),this._selectedMap=e,!e)return;const{beforeLayerId:o,geojson:r,layers:s,levelsRange:a}=e;this._map.addSource(N,{data:r,lineMetrics:!0,type:"geojson"}),s.forEach(l=>this._addLayerForFiltering(l,o)),e.layersToHide.forEach(l=>this._map.setLayoutProperty(l,"visibility","none"));const c=this._previousSelectedMap===e?this._previousSelectedLevel:Math.max(Math.min(e.defaultLevel,a.max),a.min);this.setLevel(c,!1),this._map.fire("indoor.map.loaded",{indoorMap:e})}async _updateSelectedMapIfNeeded(){await this._mapLoadedPromise,await this._updateMapPromise,this._updateMapPromise=(async()=>{const e=this._closestMap();e!==this._selectedMap&&this._updateSelectedMap(e)})(),await this._updateMapPromise}addLayerForFiltering(e,t){this._addLayerForFiltering(e,t),this._updateFiltering()}async addMap(e){this._indoorMaps.push(e),await this._updateSelectedMapIfNeeded()}getLevel(){return this._level}getSelectedMap(){return this._selectedMap}removeLayerForFiltering(e){this._removeLayerForFiltering(e),this._updateFiltering()}async removeMap(e){this._indoorMaps=this._indoorMaps.filter(t=>t!==e),await this._updateSelectedMapIfNeeded()}setLevel(e,t=!0){if(this._selectedMap===null)throw new Error("Cannot set level, no map has been selected");this._level=e,this._updateFiltering(),t&&this._map.fire("indoor.level.changed",{level:e})}}function O(i){return Object.defineProperty(i,"indoor",{get:function(){return this._indoor||(this._indoor=new A(this)),this._indoor}}),i}class Q{constructor(){n(this,"_container");n(this,"_indoor");n(this,"_indoorMap");n(this,"_levelsButtons");n(this,"_map");n(this,"_selectedButton");n(this,"_onLevelChanged",({level:e})=>this._setSelected(e));n(this,"_onMapLoaded",({indoorMap:e})=>{this._indoorMap=e,this._updateNavigationBar(),this._setSelected(this._indoor.getLevel())});n(this,"_onMapUnLoaded",()=>{this._indoorMap=null,this._updateNavigationBar()});this._levelsButtons=[],this._selectedButton=null,this._indoorMap=null}_createLevelButton(e,t){const o=document.createElement("button");return o.innerHTML=t.toString(),o.classList.add("maplibregl-ctrl-icon"),e.appendChild(o),o.addEventListener("click",()=>{var r;(r=this._map)==null||r.fire("indoor.control.clicked",{level:t}),this._indoor.getLevel()!==t&&this._indoor.setLevel(t)}),o}_onContextMenu(e){e.preventDefault()}_setSelected(e){this._levelsButtons.length!==0&&(this._selectedButton&&(this._selectedButton.style.fontWeight="normal"),e!==null&&this._levelsButtons[e]&&(this._levelsButtons[e].style.fontWeight="bold",this._selectedButton=this._levelsButtons[e]))}_updateNavigationBar(){if(!this._container)return;if(this._indoorMap===null){this._container.style.display="none";return}for(this._container.style.display="block",this._levelsButtons=[];this._container.firstChild;)this._container.removeChild(this._container.firstChild);const e=this._indoorMap.levelsRange;for(let t=e.max;t>=e.min;t--)this._levelsButtons[t]=this._createLevelButton(this._container,t)}onAdd(e){if(e.indoor===void 0)throw Error("call addIndoorTo(map) before creating the IndoorControl");this._map=e,this._indoor=this._map.indoor;const t=this._container=document.createElement("div");return t.classList.add("maplibregl-ctrl"),t.classList.add("maplibregl-ctrl-group"),t.style.display="none",t.addEventListener("contextmenu",this._onContextMenu),this._indoorMap=this._indoor.getSelectedMap(),this._indoor.getSelectedMap()!==null&&(this._updateNavigationBar(),this._setSelected(this._indoor.getLevel())),this._map.on("indoor.map.loaded",this._onMapLoaded),this._map.on("indoor.map.unloaded",this._onMapUnLoaded),this._map.on("indoor.level.changed",this._onLevelChanged),t}onRemove(){var e,t,o,r,s;(e=this._container)==null||e.removeEventListener("contextmenu",this._onContextMenu),(t=this._container)==null||t.remove(),delete this._container,(o=this._map)==null||o.off("indoor.map.loaded",this._onMapLoaded),(r=this._map)==null||r.off("indoor.map.unloaded",this._onMapUnLoaded),(s=this._map)==null||s.off("indoor.level.changed",this._onLevelChanged),delete this._map}}function D(i,e,t){if(i!==null)for(var o,r,s,a,c,l,h,f=0,m=0,b,U=i.type,$=U==="FeatureCollection",de=U==="Feature",ce=$?i.features.length:1,_=0;_<ce;_++){h=$?i.features[_].geometry:de?i.geometry:i,b=h?h.type==="GeometryCollection":!1,c=b?h.geometries.length:1;for(var S=0;S<c;S++){var u=0,v=0;if(a=b?h.geometries[S]:h,a!==null){l=a.coordinates;var M=a.type;switch(f=0,M){case null:break;case"Point":if(e(l,m,_,u,v)===!1)return!1;m++,u++;break;case"LineString":case"MultiPoint":for(o=0;o<l.length;o++){if(e(l[o],m,_,u,v)===!1)return!1;m++,M==="MultiPoint"&&u++}M==="LineString"&&u++;break;case"Polygon":case"MultiLineString":for(o=0;o<l.length;o++){for(r=0;r<l[o].length-f;r++){if(e(l[o][r],m,_,u,v)===!1)return!1;m++}M==="MultiLineString"&&u++,M==="Polygon"&&v++}M==="Polygon"&&u++;break;case"MultiPolygon":for(o=0;o<l.length;o++){for(v=0,r=0;r<l[o].length;r++){for(s=0;s<l[o][r].length-f;s++){if(e(l[o][r][s],m,_,u,v)===!1)return!1;m++}v++}u++}break;case"GeometryCollection":for(o=0;o<a.geometries.length;o++)if(D(a.geometries[o],e)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function ee(i,e={}){if(i.bbox!=null&&e.recompute!==!0)return i.bbox;const t=[1/0,1/0,-1/0,-1/0];return D(i,o=>{t[0]>o[0]&&(t[0]=o[0]),t[1]>o[1]&&(t[1]=o[1]),t[2]<o[0]&&(t[2]=o[0]),t[3]<o[1]&&(t[3]=o[1])}),t}var te=ee;function oe(i){const e=i.split(";").map(re).filter(t=>t!==null);return e.length?{max:Math.max(...e.map(t=>t.max)),min:Math.min(...e.map(t=>t.min))}:null}function ie(i){if(i.type!=="FeatureCollection")throw new Error(i.type+" is not allowed as a top level collection, please use FeatureCollection instead.");const e=i.features.filter(t=>!!t.properties&&typeof t.properties.level=="string").map(t=>{var o;return oe(((o=t.properties)==null?void 0:o.level)??"")}).filter(t=>t!==null);if(e.length==0)throw console.debug(i),new Error("the FeatureCollection does not contain a single level. Cannot compute the range of levels to display");return{bounds:te(i),levelsRange:{max:Math.max(...e.map(t=>t.max)),min:Math.min(...e.map(t=>t.min))}}}function re(i){const e=i.split("~"),t={max:parseFloat(e[1]),min:parseFloat(e[0])};return isNaN(t.min)||isNaN(t.max)?null:t}const R=[{filter:["any",["has","building"],["has","building:part"]],id:"buildings-background",minzoom:16.5,paint:{"fill-color":"#FFFFFF","fill-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1]},source:"indoor",type:"fill"},{filter:["==",["get","leisure"],"garden"],id:"indoor-gardens",minzoom:16.5,paint:{"fill-color":"#D8E5A4","fill-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1]},source:"indoor",type:"fill"},{filter:["==",["get","amenity"],"parking"],id:"indoor-parkings",minzoom:16.5,paint:{"fill-color":"#fbeada","fill-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1],"fill-outline-color":"#000000"},source:"indoor",type:"fill"},{filter:["==",["get","amenity"],"parking"],id:"indoor-parkings-patterns",minzoom:16.5,paint:{"fill-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,.1],"fill-pattern":"si-main-3","fill-translate-anchor":"viewport"},source:"indoor",type:"fill"},{filter:["any",["==",["get","indoor"],"room"],["==",["get","indoor"],"area"],["==",["get","railway"],"platform"]],id:"indoor-rooms",minzoom:16.5,paint:{"fill-color":"#e0e0e0","fill-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1]},source:"indoor",type:"fill"},{filter:["all",["any",["==",["get","indoor"],"room"],["==",["get","indoor"],"area"],["==",["get","railway"],"platform"]],["==",["get","access"],"no"]],id:"indoor-rooms-no-access",minzoom:16.5,paint:{"fill-color":"#878787","fill-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1]},source:"indoor",type:"fill"},{filter:["any",["==",["get","indoor"],"room"],["==",["get","indoor"],"area"],["==",["get","railway"],"platform"]],id:"indoor-rooms-walls",minzoom:16.5,paint:{"line-color":"#000","line-offset":1,"line-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1]},source:"indoor",type:"line"},{filter:["==",["get","indoor"],"room"],id:"indoor-rooms-borders",minzoom:16.5,paint:{"line-color":"#000","line-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1]},source:"indoor",type:"line"},{filter:["all",["any",["==",["get","indoor"],"door"],["has","door"]],["!",["has","entrance"]],["!=",["get","access"],"no"]],id:"indoor-doors",minzoom:16.5,paint:{"circle-color":"#e0e0e0","circle-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1],"circle-radius":["interpolate",["exponential",2],["zoom"],10,["*",["*",.5,["number",["get","width"],1.6]],["^",2,-6]],24,["*",["*",.5,["number",["get","width"],1.6]],["^",2,8]]]},source:"indoor",type:"circle"},{filter:["==",["get","highway"],"pedestrian"],id:"indoor-highways-area",paint:{"fill-color":["interpolate",["linear"],["zoom"],16,"hsl(230, 16%, 94%)",16.25,"hsl(230, 50%, 98%)"],"fill-opacity":1,"fill-outline-color":"hsl(230, 26%, 88%)"},source:"indoor",type:"fill"},{filter:["==",["get","highway"],"pedestrian"],id:"indoor-highways-area-pattern",minzoom:16.5,paint:{"fill-color":"hsl(0, 0%, 100%)","fill-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1],"fill-outline-color":"hsl(35, 10%, 83%)","fill-pattern":"pedestrian-polygon"},source:"indoor",type:"fill"},{filter:["any",["==",["get","indoor"],"corridor"],["==",["get","room"],"stairs"]],id:"indoor-corridors",minzoom:16.5,paint:{"fill-color":"#b9e1ff","fill-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1]},source:"indoor",type:"fill"},{filter:["==",["get","indoor"],"area"],id:"indoor-area",minzoom:16.5,paint:{"fill-antialias":!0,"fill-color":"#8dd1fc","fill-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1],"fill-outline-color":"#000"},source:"indoor",type:"fill"},{filter:["all",["==",["get","indoor"],"area"],["==",["get","balcony"],"yes"]],id:"indoor-balcony",minzoom:16.5,paint:{"fill-color":"#BDBDBD","fill-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1]},source:"indoor",type:"fill"},{filter:["any",["==",["get","elevator"],"yes"],["==",["get","highway"],"elevator"]],id:"indoor-elevators-below",minzoom:16.5,paint:{"fill-antialias":!0,"fill-color":"#b9e1ff","fill-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1],"fill-outline-color":"#000000"},source:"indoor",type:"fill"},{filter:["all",["==",["get","door"],"sliding"],["==",["get","automatic_door"],"button"],["!=",["get","access"],"no"]],id:"indoor-elevator-doors",metadata:{"maputnik:comment":`Overlaying with the base color makes a ~~door~~ *glory-wall* :scream:`},paint:{"circle-color":"#b9e1ff","circle-radius":["interpolate",["exponential",2],["zoom"],10,["*",["*",.5,["number",["get","width"],1.6]],["^",2,-6]],24,["*",["*",.5,["number",["get","width"],1.6]],["^",2,8]]]},source:"indoor",type:"circle"},{filter:["any",["==",["get","elevator"],"yes"],["==",["get","highway"],"elevator"]],id:"indoor-elevators-logo",layout:{"icon-allow-overlap":!0,"icon-image":"elevator","icon-size":["interpolate",["exponential",1.8],["zoom"],17,["*",2,["^",2,-2]],24,["*",2,["^",2,3]]]},paint:{"icon-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1]},source:"indoor",type:"symbol"},{filter:["==",["get","indoor"],"wall"],id:"indoor-walls",paint:{"line-color":"#000000","line-opacity":["interpolate",["linear"],["zoom"],17,0,18,1],"line-width":2},source:"indoor",type:"line"},{filter:["has","barrier"],id:"indoor-barriers",paint:{"line-color":"#000000","line-opacity":["interpolate",["linear"],["zoom"],17,0,18,1]},source:"indoor",type:"line"},{filter:["==",["get","indoor"],"block"],id:"indoor-blocks",paint:{"fill-color":"#000000","fill-opacity":["interpolate",["linear"],["zoom"],17,0,18,1]},source:"indoor",type:"fill"},{filter:["all",["==",["get","handrail"],"yes"],["!=",["get","highway"],"steps"]],id:"indoor-handrail",paint:{"line-color":"#000000","line-opacity":["interpolate",["linear"],["zoom"],17,0,19,1]},source:"indoor",type:"line"},{filter:["==",["get","railway"],"rail"],id:"indoor-rails",paint:{"line-color":"hsl(230, 10%, 74%)","line-opacity":["interpolate",["linear"],["zoom"],17,0,19,1]},source:"indoor",type:"line"},{filter:["==",["get","railway"],"rail"],id:"indoor-rails-tracks",paint:{"line-color":"hsl(230,10%,74%)","line-dasharray":[.1,15],"line-opacity":["interpolate",["linear"],["zoom"],17,0,19,1],"line-width":["interpolate",["exponential",1.5],["zoom"],14,4,20,8]},source:"indoor",type:"line"},{filter:["any",["in",["get","indoor"],["literal",["table","cupboard","chair","kitchen","sofa","tv","shelf","furniture-item"]]],["==",["get","trashcan"],"yes"],["==",["get","copier"],"yes"],["==",["get","amenity"],"vending_machine"]],id:"indoor-furniture",minzoom:18,paint:{"fill-color":"#000","fill-opacity":["interpolate",["linear"],["zoom"],18,0,19,.2],"fill-outline-color":"#000"},source:"indoor",type:"fill"},{filter:["all",["==",["get","highway"],"steps"],["!",["has","conveying"]]],id:"indoor-steps-white-base",layout:{"line-join":"round"},minzoom:17,paint:{"line-gradient":["interpolate",["linear"],["line-progress"],0,"rgba(255, 252, 252, 0)",1,"rgba(255, 252, 252, 0.8)"],"line-opacity":["interpolate",["linear"],["zoom"],17,0,17.25,1],"line-width":["interpolate",["exponential",2],["zoom"],10,["*",1,["^",2,-6]],24,["*",1,["^",2,8]]]},source:"indoor",type:"line"},{filter:["all",["==",["get","highway"],"steps"],["!",["has","conveying"]]],id:"indoor-steps-base",layout:{"line-join":"round"},minzoom:17,paint:{"line-gap-width":["interpolate",["exponential",2],["zoom"],10,["*",1,["^",2,-6]],24,["*",1,["^",2,8]]],"line-gradient":["interpolate",["linear"],["line-progress"],0,"rgba(0,0,0,0)",1,"rgba(0,0,0,1)"],"line-opacity":["interpolate",["linear"],["zoom"],17,0,17.25,1],"line-width":["interpolate",["exponential",2],["zoom"],10,["*",.1,["^",2,-6]],24,["*",.1,["^",2,8]]]},source:"indoor",type:"line"},{filter:["all",["all",["==",["get","highway"],"steps"],["!",["has","conveying"]]]],id:"indoor-steps-middle",layout:{"line-cap":"round","line-join":"round"},minzoom:17,paint:{"line-gradient":["interpolate",["linear"],["line-progress"],0,"rgba(0,0,0,0)",1,"rgba(22, 93, 177, 0.4)"],"line-opacity":["interpolate",["linear"],["zoom"],17,0,17.25,1],"line-width":["interpolate",["exponential",1.8],["zoom"],17,["*",1,["^",2,-2]],24,["*",1,["^",2,6]]]},source:"indoor",type:"line"},{filter:["==",["get","highway"],"steps"],id:"indoor-steps-arrow",layout:{"icon-allow-overlap":!0,"icon-ignore-placement":!1,"icon-image":"triangle","icon-keep-upright":!1,"icon-rotate":90,"icon-size":["interpolate",["exponential",1.8],["zoom"],17,["*",1,["^",2,-2]],24,["*",1,["^",2,3]]],"symbol-avoid-edges":!0,"symbol-placement":"line"},minzoom:18,paint:{"icon-color":"rgba(22, 93, 177, 0.4)","icon-opacity":["interpolate",["linear"],["zoom"],17,0,17.5,.5,19,1]},source:"indoor",type:"symbol"},{filter:["all",["==",["get","highway"],"steps"],["has","conveying"]],id:"indoor-conveying",layout:{"line-join":"round"},paint:{"line-color":"#FF0000","line-dasharray":["step",["zoom"],["literal",[1,0]],17.5,["literal",[1.75,1]],18,["literal",[1,.75]],19,["literal",[.3,.3]]],"line-opacity":["interpolate",["linear"],["zoom"],17,0,17.25,1],"line-width":["interpolate",["exponential",1.5],["zoom"],17,1,18,1.6,19,6]},source:"indoor",type:"line"},{filter:["all",["!",["in",["get","amenity"],["literal",["toilet","toilets","shower","showers"]]]],["==",["get","indoor"],"room"]],id:"poi-indoor-text-ref",layout:{"text-allow-overlap":!1,"text-anchor":"center","text-field":["case",["all",["has","name"],["has","name"]],["format",["get","name"],{},` `,{},["get","ref"],{"font-scale":.8}],["has","name"],["get","name"],["get","ref"]],"text-font":["Roboto Regular"],"text-ignore-placement":!1,"text-justify":"auto","text-padding":5,"text-rotation-alignment":"auto","text-size":["interpolate",["exponential",1.5],["zoom"],16.5,12,24,18]},minzoom:16.5,paint:{"text-color":"#072140","text-opacity":["interpolate",["linear"],["zoom"],17.5,0,18,.5,19,1]},source:"indoor",type:"symbol"},{filter:["all",["any",["==",["get","entrance"],"exit"],["==",["get","entrance"],"emergency"]]],id:"poi-exterior-exit-bg",minzoom:18,paint:{"circle-color":"rgba(255, 255, 255, 1)","circle-opacity":["interpolate",["linear"],["zoom"],18,0,18.5,.8],"circle-radius":10},source:"indoor",type:"circle"},{filter:["all",["any",["==",["get","entrance"],"exit"],["==",["get","entrance"],"emergency"]]],id:"poi-exterior-exit",layout:{"icon-image":"exit-alt1"},minzoom:18,paint:{"icon-opacity":["interpolate",["linear"],["zoom"],18,0,18.5,1]},source:"indoor",type:"symbol"},{filter:["all",["has","entrance"],["!=",["get","entrance"],"exit"],["!=",["get","entrance"],"emergency"]],id:"poi-exterior-entrance-bg",minzoom:16,paint:{"circle-color":"rgba(255, 255, 255, 1)","circle-opacity":["interpolate",["linear"],["zoom"],16,0,16.5,1],"circle-radius":10},source:"indoor",type:"circle"},{filter:["has","building"],id:"buildings-walls",minzoom:16.5,paint:{"line-color":"#FFFFFF","line-opacity":["interpolate",["linear"],["zoom"],16.5,0,18,1],"line-width":2},source:"indoor",type:"line"},{filter:["all",["has","entrance"],["!=",["get","entrance"],"exit"],["!=",["get","entrance"],"emergency"]],id:"poi-exterior-entrance",layout:{"icon-allow-overlap":!0,"icon-ignore-placement":!0,"icon-image":"entrance-alt1","icon-optional":!1,"text-font":[]},minzoom:16,paint:{"icon-opacity":["interpolate",["linear"],["zoom"],16,0,16.5,1]},source:"indoor",type:"symbol"},{filter:["in",["get","amenity"],["literal",["toilets","shower","showers"]]],id:"poi-indoor-bathrooms",layout:{"icon-allow-overlap":!0,"icon-anchor":"center","icon-image":["case",["in",["get","amenity"],["literal",["shower","showers"]]],["literal","noun-shower-51"],["==",["get","wheelchair"],"yes"],["literal","wheelchair"],["all",["==",["get","female"],"yes"],["!=",["get","male"],"yes"]],["literal","toilet_female"],["all",["!=",["get","female"],"yes"],["==",["get","male"],"yes"]],["literal","toilet_male"],["literal","toilet"]],"icon-size":["interpolate",["linear"],["zoom"],17,.5,20,1]},minzoom:18,paint:{"icon-opacity":["interpolate",["linear"],["zoom"],18,0,18.5,.5,19,1]},source:"indoor",type:"symbol"},{filter:["boolean",!1],id:"poi-indoor",layout:{"icon-allow-overlap":!0,"icon-anchor":"center","icon-image":["get","maki"],"icon-optional":!1,"icon-size":["interpolate",["linear"],["zoom"],17,.5,20,1],"symbol-placement":"point","symbol-spacing":250,"text-allow-overlap":!1,"text-anchor":"top","text-field":["case",["all",["has","name"],["has","name"]],["format",["get","name"],{},` `,{},["get","ref"],{"font-scale":.8}],["has","name"],["get","name"],["get","ref"]],"text-font":["Roboto Regular"],"text-ignore-placement":!1,"text-line-height":1.2,"text-max-angle":38,"text-max-width":8,"text-offset":[0,1],"text-padding":2,"text-rotation-alignment":"viewport","text-size":["interpolate",["linear"],["zoom"],17,11,20,13]},minzoom:17,paint:{"icon-opacity":["interpolate",["linear"],["zoom"],18,0,18.5,.5,19,1],"text-color":"#072140","text-halo-color":"rgb(194, 215, 239, 0.3)","text-halo-width":1,"text-opacity":["interpolate",["linear"],["zoom"],17,0,17.5,.5,19,1]},source:"indoor",type:"symbol"}];let w=R;const I="poi-indoor",T=[{maki:"suitcase",shop:"travel_agency"},{maki:"grocery",shop:"convenience"},{maki:"bakery",shop:"bakery"},{maki:"pharmacy",shop:"chemist"},{maki:"clothing-store",shop:"clothes"}],W=[{filter:["==",["get","amenity"],"fast_food"],maki:"fast-food"},{filter:["==",["get","amenity"],"restaurant"],maki:"restaurant"},{filter:["==",["get","amenity"],"cafe"],maki:"cafe"},{filter:["in",["get","amenity"],["literal",["bank","vending_machine"]]],maki:"bank"},{filter:["==",["get","natural"],"tree"],maki:"park"},...T.map(({maki:i,shop:e})=>({filter:["==",["get","shop"],e],maki:i}))];function ae(i){const e=T.map(t=>t.shop);return W.push({filter:["in",["get","shop"],["literal",e]],maki:"shop"}),W.map(t=>{const o=Object.assign({},i);return o.id+=`-${t.maki}`,o.filter=t.filter,o.layout=Object.assign({},i.layout),o.layout["icon-image"]=t.maki,o})}const H=w.find(i=>i.id===I);H&&(ae(H).forEach(i=>w.push(i)),w=w.filter(i=>i.id!==I));const j={DefaultLayers:w,defaultLayers:R};class L{constructor(e,t,o,r,s,a,c,l){n(this,"beforeLayerId");n(this,"bounds");n(this,"defaultLevel");n(this,"geojson");n(this,"layers");n(this,"layersToHide");n(this,"levelsRange");n(this,"showFeaturesWithEmptyLevel");this.bounds=e,this.geojson=t,this.layers=o,this.levelsRange=r,this.layersToHide=s,this.defaultLevel=a,this.showFeaturesWithEmptyLevel=c,this.beforeLayerId=l}static fromGeojson(e,t={}){const{bounds:o,levelsRange:r}=ie(e);return new L(o,e,t.layers?t.layers:j.DefaultLayers,r,t.layersToHide?t.layersToHide:[],t.defaultLevel?t.defaultLevel:0,t.showFeaturesWithEmptyLevel?t.showFeaturesWithEmptyLevel:!1,t.beforeLayerId)}}function ne(i,e,t,o={}){const r=z(i),s=g(r[0]),a=g(r[1]),c=g(t),l=V(e,o.units),h=Math.asin(Math.sin(a)*Math.cos(l)+Math.cos(a)*Math.sin(l)*Math.cos(c)),f=s+Math.atan2(Math.sin(c)*Math.sin(l)*Math.cos(a),Math.cos(l)-Math.sin(a)*Math.sin(h)),m=E(f),b=E(h);return Y([m,b],o.properties)}var G=ne;const le=16.25,se=200;class F{constructor(e,t,o){n(this,"downloadedBounds");n(this,"indoorMapOptions");n(this,"loadMapsPromise",Promise.resolve());n(this,"map");n(this,"remoteMapsDownloaded");n(this,"serverUrl");this.serverUrl=e,this.map=t,this.indoorMapOptions=o,this.remoteMapsDownloaded=[],this.downloadedBounds=null,t.loaded()?this.loadMapsIfNecessary():t.on("load",()=>this.loadMapsIfNecessary()),t.on("move",()=>this.loadMapsIfNecessary())}static manage(e,t,o){return new F(e,O(t),o)}async addCustomMap(e){const t=await(await fetch(e.url)).json();e.indoorMap=L.fromGeojson(t,this.indoorMapOptions),await this.map.indoor.addMap(e.indoorMap),this.remoteMapsDownloaded.push(e)}async loadMapsIfNecessary(){if(this.map.getZoom()<le)return;const e=this.map.getBounds();if(this.downloadedBounds!==null&&B(this.downloadedBounds,e.getNorthEast().toArray())&&B(this.downloadedBounds,e.getSouthWest().toArray()))return;const t=x(e.getNorthEast().toArray(),e.getNorthWest().toArray(),{units:"meters"}),o=x(e.getNorthEast().toArray(),e.getSouthEast().toArray(),{units:"meters"}),r=Math.max(t,o)/2,s=Math.max(se,r*2),a=this.map.getCenter().toArray();console.debug(`requested indoor maps for a bbox ${s}m vertically/horizontally around ${a}`);const c=s*Math.sqrt(2),l=G(a,c,50,{units:"meters"}),f=[...G(a,c,-130,{units:"meters"}).geometry.coordinates.reverse(),...l.geometry.coordinates.reverse()];this.downloadedBounds=f,await this.loadMapsPromise,this.loadMapsPromise=this.loadMapsInBounds(f)}async loadMapsInBounds(e){const t=`${this.serverUrl}?bbox=${e[0]},${e[1]},${e[2]},${e[3]}`,o=await(await fetch(t)).json(),r=[],s=[];for(const a of o)o.find(c=>c.url===a.url)?this.remoteMapsDownloaded.find(c=>c.url===a.url)||s.push(a):r.push(a);s.forEach(this.addCustomMap.bind(this)),r.forEach(this.removeCustomMap.bind(this))}async removeCustomMap(e){await this.map.indoor.removeMap(e.indoorMap),this.remoteMapsDownloaded.splice(this.remoteMapsDownloaded.indexOf(e),1)}}p.DefaultStyle=j,p.IndoorControl=Q,p.IndoorLayer=A,p.IndoorMap=L,p.MapServerHandler=F,p.addIndoorTo=O,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})}); //# sourceMappingURL=maplibre-gl-indoor.umd.js.map