UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) 6.77 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{clone as e}from"../../../../../core/lang.js";import{CircleStyleLayer as t,SymbolStyleLayer as r,LineStyleLayer as a,FillStyleLayer as i,BackgroundStyleLayer as s}from"./StyleLayer.js";class l{constructor(t,r=!0){if(this.backgroundBucketIds=[],this._uidToLayer=new Map,this._layerByName={},this._runningId=0,this._style=r?e(t):t,this._style.layers||(this._style.layers=[]),this.version=parseFloat(this._style.version),this.layers=this._style.layers.map((e,t,r)=>this._create(e,t,r)).filter(e=>!!e),this.layers)for(let e=0;e<this.layers.length;e++){const t=this.layers[e];this._layerByName[t.id]=t,this._uidToLayer.set(t.uid,t),0===t.type&&this.backgroundBucketIds.push(t.id)}this._identifyRefLayers()}getLayerStyleProperties(e,t){const r=this.getStyleLayerByUID(e),a=0!==r?.getLayoutValue("symbol-placement",t);let i=r?.getLayoutValue("icon-rotation-alignment",t);2===i&&(i=a?0:1);let s=r?.getLayoutValue("text-rotation-alignment",t);2===s&&(s=a?0:1);const l=r?.getPaintValue("icon-translate",t),n=r?.getPaintValue("icon-translate-anchor",t),y=r?.getPaintValue("text-translate",t),o=r?.getPaintValue("text-translate-anchor",t);return{geometryType:null,iconAllowOverlap:r?.getLayoutValue("icon-allow-overlap",t),iconIgnorePlacement:r?.getLayoutValue("icon-ignore-placement",t),textAllowOverlap:r?.getLayoutValue("text-allow-overlap",t),textIgnorePlacement:r?.getLayoutValue("text-ignore-placement",t),iconRotationAlignment:i,textRotationAlignment:s,iconTranslateAnchor:n,iconTranslate:l,textTranslateAnchor:o,textTranslate:y}}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 a,i=!0;const s=this._layerByName[e.id];if(s){const n=this.layers.indexOf(s);t||(t=n),t===n?(i=!1,a=l._recreateLayer(e,s),this.layers[t]=a,r.layers[t]=e):(this.layers.splice(n,1),r.layers.splice(n,1),a=this._create(e,t,this.layers),this.layers.splice(t,0,a),r.layers.splice(t,0,e))}else a=this._create(e,t,this.layers),!t||t>=this.layers.length?(this.layers.push(a),r.layers.push(e)):(this.layers.splice(t,0,a),r.layers.splice(t,0,e));this._layerByName[e.id]=a,this._uidToLayer.set(a.uid,a),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 a={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(a,r),s=this.layers.indexOf(r);this.layers[s]=i,this._style.layers[s].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 a={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(a,r),s=this.layers.indexOf(r);this.layers[s]=i,this._style.layers[s].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 a=r.layout||{};a.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:a,paint:r.paint},s=l._recreateLayer(i,r),n=this.layers.indexOf(r);this.layers[n]=s,this._style.layers[n].layout=a,this._layerByName[r.id]=s,this._uidToLayer.set(r.uid,s)}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 e=[],t=[];let r=0;for(const a of this.layers){const i=a.layout;if(1===a.type){const t=a;let s=a.source+"|"+a.sourceLayer;s+="|"+(i?.visibility??""),s+="|"+a.minzoom,s+="|"+a.maxzoom,s+="|"+JSON.stringify(a.filter),(t.hasDataDrivenFill||t.hasDataDrivenOutline)&&(s+="|"+r),e.push({key:s,layer:a})}else if(2===a.type){const e=a,s=a.paint,l=null!=s&&(null!=s["line-pattern"]||null!=s["line-dasharray"]);let n=a.source+"|"+a.sourceLayer;n+="|"+(i?.visibility??""),n+="|"+a.minzoom,n+="|"+a.maxzoom,n+="|"+JSON.stringify(a.filter),n+="|"+(void 0!==i?i["line-cap"]:""),n+="|"+(void 0!==i?i["line-join"]:""),(e.hasDataDrivenLine||l)&&(n+="|"+r),t.push({key:n,layer:a})}++r}this._assignRefLayers(e),this._assignRefLayers(t)}_assignRefLayers(e){let t,r;e.sort((e,t)=>e.key<t.key?-1:e.key>t.key?1:0);const a=e.length;for(let i=0;i<a;i++){const s=e[i];if(s.key===t)s.layer.refLayerId=r;else if(t=s.key,r=s.layer.id,1===s.layer.type){if(!s.layer.getPaintProperty("fill-outline-color"))for(let l=i+1;l<a;l++){const a=e[l];if(a.key!==t)break;if(a.layer.getPaintProperty("fill-outline-color")){e[i]=a,e[l]=s,r=a.layer.id;break}}}else if(2===s.layer.type){let l=s.layer;for(let n=i+1;n<a;n++){const a=e[n];if(a.key!==t)break;const y=a.layer;(l.canUseThinTessellation&&!y.canUseThinTessellation||!l.canUseThinTessellation&&(y.getPaintProperty("line-pattern")||y.getPaintProperty("line-dasharray")))&&(l=y,e[i]=a,e[n]=s,r=a.layer.id)}}}}_create(e,l,n){const y=1-(1+l)*(1/(n.length+1)),o=this._runningId++;switch(e.type){case"background":return new s(0,e,y,o);case"fill":return new i(1,e,y,o);case"line":return new a(2,e,y,o);case"symbol":return new r(3,e,y,o);case"raster":return console.warn(`Unsupported vector tile raster layer ${e.id}`),null;case"circle":return new t(4,e,y,o)}return null}static _recreateLayer(e,l){switch(e.type){case"background":return new s(0,e,l.z,l.uid);case"fill":return new i(1,e,l.z,l.uid);case"line":return new a(2,e,l.z,l.uid);case"symbol":return new r(3,e,l.z,l.uid);case"raster":return console.warn(`Unsupported vector tile raster layer ${e.id}`),null;case"circle":return new t(4,e,l.z,l.uid)}return null}}export{l as default};