@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 5.93 kB
JavaScript
import{StyleLayerType as e}from"./StyleDefinition.js";import{CircleStyleLayer as t,SymbolStyleLayer as r,LineStyleLayer as i,FillStyleLayer as s,BackgroundStyleLayer as a}from"./StyleLayer.js";class l{constructor(t){if(this._style=t,this.backgroundBucketIds=[],this._uidToLayer=new Map,this._layerByName={},this._runningId=0,t.layers||(t.layers=[]),this.version=parseFloat(t.version),this.layers=t.layers.map(((e,t,r)=>this._create(e,t,r))).filter((e=>!!e)),this.layers){let t;for(let r=0;r<this.layers.length;r++)t=this.layers[r],this._layerByName[t.id]=t,this._uidToLayer.set(t.uid,t),t.type===e.BACKGROUND&&this.backgroundBucketIds.push(t.id)}this._identifyRefLayers()}isPainterDataDriven(e){const t=this._layerByName[e];return!!t&&t.isPainterDataDriven()}getStyleLayerId(e){return e>=this.layers.length?null:this.layers[e].id}getStyleLayerByUID(e){return this._uidToLayer.get(e)??null}getStyleLayerIndex(e){const t=this._layerByName[e];return t?this.layers.indexOf(t):-1}setStyleLayer(e,t){if(!e||!e.id)return;const r=this._style;null!=t&&t>=this.layers.length&&(t=this.layers.length-1);let i,s=!0;const a=this._layerByName[e.id];if(a){const y=this.layers.indexOf(a);t||(t=y),t===y?(s=!1,i=l._recreateLayer(e,a),this.layers[t]=i,r.layers[t]=e):(this.layers.splice(y,1),r.layers.splice(y,1),i=this._create(e,t,this.layers),this.layers.splice(t,0,i),r.layers.splice(t,0,e))}else i=this._create(e,t,this.layers),!t||t>=this.layers.length?(this.layers.push(i),r.layers.push(e)):(this.layers.splice(t,0,i),r.layers.splice(t,0,e));this._layerByName[e.id]=i,this._uidToLayer.set(i.uid,i),s&&this._recomputeZValues(),this._identifyRefLayers()}getStyleLayer(e){const t=this._layerByName[e];return t?{type:t.typeName,id:t.id,source:t.source,"source-layer":t.sourceLayer,minzoom:t.minzoom,maxzoom:t.maxzoom,filter:t.filter,layout:t.layout,paint:t.paint}:null}deleteStyleLayer(e){const t=this._layerByName[e];if(t){delete this._layerByName[e],this._uidToLayer.delete(t.uid);const r=this.layers.indexOf(t);this.layers.splice(r,1),this._style.layers.splice(r,1),this._recomputeZValues(),this._identifyRefLayers()}}getLayerById(e){return this._layerByName[e]}getLayoutProperties(e){const t=this._layerByName[e];return t?t.layout:null}getPaintProperties(e){const t=this._layerByName[e];return t?t.paint:null}setPaintProperties(e,t){const r=this._layerByName[e];if(!r)return;const i={type:r.typeName,id:r.id,source:r.source,"source-layer":r.sourceLayer,minzoom:r.minzoom,maxzoom:r.maxzoom,filter:r.filter,layout:r.layout,paint:t},s=l._recreateLayer(i,r),a=this.layers.indexOf(r);this.layers[a]=s,this._style.layers[a].paint=t,this._layerByName[r.id]=s,this._uidToLayer.set(r.uid,s)}setLayoutProperties(e,t){const r=this._layerByName[e];if(!r)return;const i={type:r.typeName,id:r.id,source:r.source,"source-layer":r.sourceLayer,minzoom:r.minzoom,maxzoom:r.maxzoom,filter:r.filter,layout:t,paint:r.paint},s=l._recreateLayer(i,r),a=this.layers.indexOf(r);this.layers[a]=s,this._style.layers[a].layout=t,this._layerByName[r.id]=s,this._uidToLayer.set(r.uid,s)}setStyleLayerVisibility(e,t){const r=this._layerByName[e];if(!r)return;const i=r.layout||{};i.visibility=t;const s={type:r.typeName,id:r.id,source:r.source,"source-layer":r.sourceLayer,minzoom:r.minzoom,maxzoom:r.maxzoom,filter:r.filter,layout:i,paint:r.paint},a=l._recreateLayer(s,r),y=this.layers.indexOf(r);this.layers[y]=a,this._style.layers[y].layout=i,this._layerByName[r.id]=a,this._uidToLayer.set(r.uid,a)}getStyleLayerVisibility(e){const t=this._layerByName[e];if(!t)return"none";return t.layout?.visibility??"visible"}_recomputeZValues(){const e=this.layers,t=1/(e.length+1);for(let r=0;r<e.length;r++)e[r].z=1-(1+r)*t}_identifyRefLayers(){const t=[],r=[];let i=0;for(const s of this.layers){const a=s.layout;if(s.type===e.FILL){const e=s;let r=s.source+"|"+s.sourceLayer;r+="|"+(a?.visibility??""),r+="|"+s.minzoom,r+="|"+s.maxzoom,r+="|"+JSON.stringify(s.filter),(e.hasDataDrivenFill||e.hasDataDrivenOutline)&&(r+="|"+i),t.push({key:r,layer:s})}else if(s.type===e.LINE){const e=s,t=s.paint,l=null!=t&&(null!=t["line-pattern"]||null!=t["line-dasharray"]);let y=s.source+"|"+s.sourceLayer;y+="|"+(a?.visibility??""),y+="|"+s.minzoom,y+="|"+s.maxzoom,y+="|"+JSON.stringify(s.filter),y+="|"+(void 0!==a?a["line-cap"]:""),y+="|"+(void 0!==a?a["line-join"]:""),(e.hasDataDrivenLine||l)&&(y+="|"+i),r.push({key:y,layer:s})}++i}this._assignRefLayers(t),this._assignRefLayers(r)}_assignRefLayers(t){let r,i;t.sort(((e,t)=>e.key<t.key?-1:e.key>t.key?1:0));const s=t.length;for(let a=0;a<s;a++){const l=t[a];if(l.key===r)l.layer.refLayerId=i;else if(r=l.key,i=l.layer.id,l.layer.type===e.FILL){if(!l.layer.getPaintProperty("fill-outline-color"))for(let e=a+1;e<s;e++){const s=t[e];if(s.key!==r)break;if(s.layer.getPaintProperty("fill-outline-color")){t[a]=s,t[e]=l,i=s.layer.id;break}}}else if(l.layer.type===e.LINE){let e=l.layer;for(let y=a+1;y<s;y++){const s=t[y];if(s.key!==r)break;const n=s.layer;(e.canUseThinTessellation&&!n.canUseThinTessellation||!e.canUseThinTessellation&&(n.getPaintProperty("line-pattern")||n.getPaintProperty("line-dasharray")))&&(e=n,t[a]=s,t[y]=l,i=s.layer.id)}}}}_create(l,y,n){const o=1-(1+y)*(1/(n.length+1)),u=this._runningId++;switch(l.type){case"background":return new a(e.BACKGROUND,l,o,u);case"fill":return new s(e.FILL,l,o,u);case"line":return new i(e.LINE,l,o,u);case"symbol":return new r(e.SYMBOL,l,o,u);case"raster":return console.warn(`Unsupported vector tile raster layer ${l.id}`),null;case"circle":return new t(e.CIRCLE,l,o,u)}return null}static _recreateLayer(l,y){switch(l.type){case"background":return new a(e.BACKGROUND,l,y.z,y.uid);case"fill":return new s(e.FILL,l,y.z,y.uid);case"line":return new i(e.LINE,l,y.z,y.uid);case"symbol":return new r(e.SYMBOL,l,y.z,y.uid);case"raster":return console.warn(`Unsupported vector tile raster layer ${l.id}`),null;case"circle":return new t(e.CIRCLE,l,y.z,y.uid)}return null}}export{l as default};