UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) 6.09 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import{StyleLayerType as e}from"./StyleDefinition.js";import{CircleStyleLayer as t,SymbolStyleLayer as r,LineStyleLayer as s,FillStyleLayer as i,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)for(let r=0;r<this.layers.length;r++){const 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?.id)return;const r=this._style;null!=t&&t>=this.layers.length&&(t=this.layers.length-1);let s,i=!0;const a=this._layerByName[e.id];if(a){const y=this.layers.indexOf(a);t||(t=y),t===y?(i=!1,s=l._recreateLayer(e,a),this.layers[t]=s,r.layers[t]=e):(this.layers.splice(y,1),r.layers.splice(y,1),s=this._create(e,t,this.layers),this.layers.splice(t,0,s),r.layers.splice(t,0,e))}else s=this._create(e,t,this.layers),!t||t>=this.layers.length?(this.layers.push(s),r.layers.push(e)):(this.layers.splice(t,0,s),r.layers.splice(t,0,e));this._layerByName[e.id]=s,this._uidToLayer.set(s.uid,s),i&&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 s={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},i=l._recreateLayer(s,r),a=this.layers.indexOf(r);this.layers[a]=i,this._style.layers[a].paint=t,this._layerByName[r.id]=i,this._uidToLayer.set(r.uid,i)}setLayoutProperties(e,t){const r=this._layerByName[e];if(!r)return;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:t,paint:r.paint},i=l._recreateLayer(s,r),a=this.layers.indexOf(r);this.layers[a]=i,this._style.layers[a].layout=t,this._layerByName[r.id]=i,this._uidToLayer.set(r.uid,i)}setStyleLayerVisibility(e,t){const r=this._layerByName[e];if(!r)return;const s=r.layout||{};s.visibility=t;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:s,paint:r.paint},a=l._recreateLayer(i,r),y=this.layers.indexOf(r);this.layers[y]=a,this._style.layers[y].layout=s,this._layerByName[r.id]=a,this._uidToLayer.set(r.uid,a)}getStyleLayerVisibility(e){const t=this._layerByName[e];if(!t)return"none";const r=t.layout;return r?.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 s=0;for(const i of this.layers){const a=i.layout;if(i.type===e.FILL){const e=i;let r=i.source+"|"+i.sourceLayer;r+="|"+(a?.visibility??""),r+="|"+i.minzoom,r+="|"+i.maxzoom,r+="|"+JSON.stringify(i.filter),(e.hasDataDrivenFill||e.hasDataDrivenOutline)&&(r+="|"+s),t.push({key:r,layer:i})}else if(i.type===e.LINE){const e=i,t=i.paint,l=null!=t&&(null!=t["line-pattern"]||null!=t["line-dasharray"]);let y=i.source+"|"+i.sourceLayer;y+="|"+(a?.visibility??""),y+="|"+i.minzoom,y+="|"+i.maxzoom,y+="|"+JSON.stringify(i.filter),y+="|"+(void 0!==a?a["line-cap"]:""),y+="|"+(void 0!==a?a["line-join"]:""),(e.hasDataDrivenLine||l)&&(y+="|"+s),r.push({key:y,layer:i})}++s}this._assignRefLayers(t),this._assignRefLayers(r)}_assignRefLayers(t){let r,s;t.sort(((e,t)=>e.key<t.key?-1:e.key>t.key?1:0));const i=t.length;for(let a=0;a<i;a++){const l=t[a];if(l.key===r)l.layer.refLayerId=s;else if(r=l.key,s=l.layer.id,l.layer.type===e.FILL){if(!l.layer.getPaintProperty("fill-outline-color"))for(let e=a+1;e<i;e++){const i=t[e];if(i.key!==r)break;if(i.layer.getPaintProperty("fill-outline-color")){t[a]=i,t[e]=l,s=i.layer.id;break}}}else if(l.layer.type===e.LINE){let e=l.layer;for(let y=a+1;y<i;y++){const i=t[y];if(i.key!==r)break;const n=i.layer;(e.canUseThinTessellation&&!n.canUseThinTessellation||!e.canUseThinTessellation&&(n.getPaintProperty("line-pattern")||n.getPaintProperty("line-dasharray")))&&(e=n,t[a]=i,t[y]=l,s=i.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 i(e.FILL,l,o,u);case"line":return new s(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 i(e.FILL,l,y.z,y.uid);case"line":return new s(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};