@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.47 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{PipelineCommand as t}from"../PipelineCommand.js";import{readObjectIds as e}from"../featureData/processingUtils.js";import{createDefaultIconSymbolLayer as n,createDefaultObjectSymbolLayer as a}from"./factoryUtils.js";import{IconSymbolLayerRenderer as o}from"./IconSymbolLayerRenderer.js";import{ObjectSymbolLayerRenderer as i}from"./ObjectSymbolLayerRenderer.js";class s{constructor(t,e){this._symbols=new Array,this._featureDataPartitioning=new Map,this._loaded=!1,this._loadingPromise=null,this._renderer=null,this._context=e,this._renderer=t}async load(){return null==this._loadingPromise&&(this._loadingPromise=this._load()),this._loadingPromise}async _load(){this._symbols[0]=new o(n(),this._context),this._symbols[1]=new i(a(),this._context),this._loaded=!0}get loaded(){return this._loaded}async createAddCommand(t){const e=this._context,n=this._partition(t),a=await Promise.all(n.map((async({index:t,features:e})=>{const n=await this._provisionSymbol(t);return await(n?.createAddCommand(e))}))),o=e.joinPipelineCommands(a);return o.appendPipelineStateCommand((()=>this._featureDataPartitioning.set(t.id,n))),o}async createRemoveCommand(e){const{_featureDataPartitioning:n,_context:a}=this,o=a.renderCommandContext,i=n.get(e);if(null==i)return new t(o,o.createRenderCommandBuffer(),[]);const s=await Promise.all(i.map((async({index:t,features:e})=>{const n=this._getLoadedSymbol(t);return await(n?.createRemoveCommand(e.id))}))),r=a.joinPipelineCommands(s);return r.appendPipelineStateCommand((()=>n.delete(e))),r}async createUpdateVisibilityCommand(e){const{_featureDataPartitioning:n,_context:a}=this,o=a.renderCommandContext,i=n.get(e.id);if(null==i)return new t(o,o.createRenderCommandBuffer(),[]);const s=await Promise.all(i.map((async({index:t,features:e})=>{const n=this._getLoadedSymbol(t);return await(n?.createUpdateVisibilityCommand(e))})));return a.joinPipelineCommands(s)}async createUpdateLayerViewOpacityCommand(t){const e=this._context,n=[];for(let o=0;o<this._symbols.length;++o){const e=this._symbols[o];null!=e&&e.loaded&&n.push(e.createUpdateLayerViewOpacityCommand(t))}const a=await Promise.all(n);return e.joinPipelineCommands(a)}async createUpdateElevationCommand(){const{_featureDataPartitioning:t,_context:e}=this,n=[];for(const o of t.values()){const t=o.map((async({index:t,features:e})=>{const n=this._getLoadedSymbol(t);return await(n?.createUpdateElevationCommand(e))}));n.push(...t)}const a=await Promise.all(n);return e.joinPipelineCommands(a)}async createDestroyCommand(){const{_featureDataPartitioning:t,_context:e}=this,n=[];for(const o of t.keys())n.push(this.createRemoveCommand(o));for(const o of this._symbols)n.push(o.createDestroyCommand());const a=await Promise.all(n);return e.joinPipelineCommands(a)}async _provisionSymbol(t){if(null==t)return null;const e=this._symbols[t];return e?(e.loaded||await e.load(),e):null}_getLoadedSymbol(t){if(null==t)return null;const e=this._symbols[t];return null!=e&&e.loaded?e:null}_partition(t){const n=e(t);if(null==n)throw new Error("unable to fetch objectIds");const{featureCount:a}=t,o=[[],[]];for(let e=0;e<a;++e){o[n[e]%2].push(e)}return o.map(((e,n)=>new r(n,t.subset(new Uint32Array(e))))).filter((t=>t.features.featureCount>0))}}class r{constructor(t,e){this.index=t,this.features=e}}export{s as UniqueValueFeatureRenderer};