@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 9.56 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{createUniqueColors as e}from"../../core/colorUtils.js";import i from"../../core/Error.js";import{fetchMessageBundle as a}from"../../intl/messages.js";import r from"../../renderers/support/AuthoringInfo.js";import n from"../../renderers/support/AuthoringInfoVisualVariable.js";import{round as l}from"../../renderers/support/numberUtils.js";import s from"../../renderers/visualVariables/OpacityVariable.js";import o from"../../renderers/visualVariables/support/OpacityStop.js";import t from"../../renderers/visualVariables/support/VisualVariableLegendOptions.js";import p from"../heuristics/outline.js";import{createVisualVariables as m}from"./size.js";import{createRenderer as d}from"./type.js";import{spliceVisualVariables as u,updateAuthoringInfoVisualVariable as c,processRegenerateParams as y,getRendererToUpdate as f,getStyleType as b,hasOutlineVV as g,hasScaleDependentSizeVV as h,isSizeVV as v,findOutlineVVIndex as w,findSizeVVIndex as z,findOpacityVVIndex as V}from"./support/regenerateUtils.js";import{errorCallback as T,verifyBasicFieldValidity as E,getBasemapInfo as S,createSymbol as O,getSymbolOutlineFromScheme as I,getSummaryStatistics as x}from"./support/utils.js";import j from"../statistics/predominantCategories.js";import{getPredominanceExpressions as M}from"../statistics/support/predominanceUtils.js";import{verifyBinningParams as q}from"../support/binningUtils.js";import{binningCapableLayerTypes as C,featureCapableLayerTypes as B,createLayerAdapter as U,getLayerTypeLabels as P}from"../support/adapters/support/layerUtils.js";import{cloneScheme as A,getSchemes as Q}from"../symbology/predominance.js";async function W(e){if(!(e?.layer&&e.view&&e.fields?.length))throw new i("predominance-renderer:missing-parameters","'layer', 'view' and 'fields' parameters are required");if(e.fields.length<2)throw new i("predominance-renderer:invalid-parameters","Minimum 2 fields are required");if(e.fields.length>10)throw new i("predominance-renderer:invalid-parameters","Maximum 10 fields are supported");e.forBinning&&q(e,"predominance-renderer");const a={...e,layer:e.layer,fields:e.fields};a.symbolType=a.symbolType||"2d",a.defaultSymbolEnabled??=!0,a.includeOpacityVariable=e.includeOpacityVariable||!1,a.includeSizeVariable=e.includeSizeVariable||!1,a.sortBy??="count";const r=e.forBinning?C:B,n=U(a.layer,r,e.forBinning);if(!n)throw new i("predominance-renderer:invalid-parameters","'layer' must be one of these types: "+P(B).join(", "));const l=null!=a.signal?{signal:a.signal}:null;await n.load(l);const s=n.geometryType,o=a.symbolType.includes("3d");if(a.outlineOptimizationEnabled="polygon"===s&&a.outlineOptimizationEnabled,a.includeSizeVariable||(a.sizeOptimizationEnabled=("point"===s||"multipoint"===s||"polyline"===s)&&a.sizeOptimizationEnabled),"mesh"===s)a.symbolType="3d-volumetric",a.colorMixMode=a.colorMixMode||"replace",a.edgesType=a.edgesType||"none",a.sizeOptimizationEnabled=!1;else{if(o&&("polyline"===s||"polygon"===s))throw new i("predominance-renderer:not-supported","3d symbols are not supported for polyline and polygon layers");if(a.symbolType.includes("3d-volumetric")&&(!a.view||"3d"!==a.view.type))throw new i("predominance-renderer:invalid-parameters","'view' parameter should be an instance of SceneView when 'symbolType' parameter is '3d-volumetric' or '3d-volumetric-uniform'")}const t=a.fields.map((e=>e.name)),p=E(n,t,"predominance-renderer:invalid-parameters");if(p)throw p;return{...a,layer:n}}async function k(e){const a="regenerate-predominance-renderer",r=e.includedParts?.includes("size-variable")??!0;await y(e,a);const n=await f(e);if("predominance"!==b(n))throw new i(`${a}:invalid-parameters`,"Renderer is invalid");const{visualVariables:l}=n,{layer:s,forBinning:o,filter:t,view:p,signal:m}=e,d=g(n),u=h(n),c=r&&l?.some(v),w=l?.some((e=>"opacity"===e.type)),z=n.authoringInfo,V=z?.fields?.map((e=>({name:e})));if(!V?.length)throw new i(`${a}:invalid-parameters`,"Fields are required");const T=await W({layer:s,fields:V,outlineOptimizationEnabled:d,sizeOptimizationEnabled:u,includeSizeVariable:c,includeOpacityVariable:w,forBinning:o,filter:t,view:p,signal:m});return{...e,creatorParameters:T,renderer:n}}async function F(e){let i=e.predominanceScheme,a=null,r=null;const n=await S(e.basemap,e.view);if(a=null!=n.basemapId?n.basemapId:null,r=null!=n.basemapTheme?n.basemapTheme:null,i)return{scheme:A(i),basemapId:a,basemapTheme:r};const l=Q({basemapTheme:r,geometryType:e.geometryType,numColors:e.numColors,theme:e.theme,worldScale:e.worldScale,view:e.view});return l&&(i=l.primaryScheme,a=l.basemapId,r=l.basemapTheme),{scheme:i,basemapId:a,basemapTheme:r}}async function R(i,n,l,s){const o=await a("esri/smartMapping/t9n/smartMapping"),t=i.layer,{view:m,filter:u,signal:c}=i,[y,f]=await Promise.all([j({layer:t,fields:s,view:m,filter:u,signal:c}),i.outlineOptimizationEnabled?p({layer:t,view:m,filter:u,signal:c}).catch(T):null]);let b=y;y?.predominantCategoryInfos||(b={predominantCategoryInfos:s.map((e=>({value:e,count:0})))});const g=f?.opacity,h=await d({layer:t,basemap:i.basemap,valueExpression:n.valueExpression,valueExpressionTitle:o.predominantCategory,numTypes:-1,defaultSymbolEnabled:i.defaultSymbolEnabled,sortBy:i.sortBy,typeScheme:l,statistics:{uniqueValueInfos:b.predominantCategoryInfos},legendOptions:i.legendOptions,outlineOptimizationEnabled:!1,sizeOptimizationEnabled:(!i.includeSizeVariable||!i.sizeOptimizationEnabled)&&i.sizeOptimizationEnabled,symbolType:i.symbolType,colorMixMode:i.colorMixMode,edgesType:i.edgesType,filter:i.filter,view:i.view,signal:i.signal}),{renderer:v,basemapId:w,basemapTheme:z,uniqueValueInfos:V,excludedUniqueValueInfos:E}=h,S=v.uniqueValueInfos??[],x={};for(const e of i.fields){const i=t.getField(e.name);x[i.name]=e.label||i&&i.alias||e.name}if(S.forEach(((e,i)=>{const a=x[e.value];e.label=a,V[i].label=a})),i.includeSizeVariable){let a=t.geometryType,r=null;if("polygon"===a){const e=l.sizeScheme,n=e.background;v.backgroundFillSymbol=O(a,{type:i.symbolType,color:n.color,outline:I(n,a,g)}),r=e.marker.size,a="point"}else if("polyline"===a){r=l.width}else{r=l.size}const n=e(l.colors,S.length);S.forEach(((e,s)=>{const o=O(a,{type:i.symbolType,color:n[s],size:r,outline:I(l,a,g),meshInfo:{colorMixMode:i.colorMixMode,edgesType:i.edgesType}});e.symbol=o,V[s].symbol=o.clone()}))}return f?.visualVariables.length&&(v.visualVariables=f.visualVariables.map((e=>e.clone()))),v.authoringInfo=new r({type:"predominance",fields:[...s]}),{renderer:v,predominantCategoryInfos:V,excludedCategoryInfos:E,predominanceScheme:l,basemapId:w,basemapTheme:z}}async function $(e,i,r){const n=await a("esri/smartMapping/t9n/smartMapping");return m({layer:e.layer,basemap:e.basemap,valueExpression:i.valueExpression,sqlExpression:i.statisticsQuery.sqlExpression,sqlWhere:i.statisticsQuery.sqlWhere,sizeScheme:r,sizeOptimizationEnabled:e.sizeOptimizationEnabled,worldScale:!!e.symbolType?.includes("3d-volumetric"),legendOptions:{title:n.sumOfCategories},filter:e.filter,view:e.view,signal:e.signal})}async function L(e,i){const p=await a("esri/smartMapping/t9n/smartMapping"),m=await x({layer:e.layer,valueExpression:i.valueExpression,sqlExpression:i.statisticsQuery.sqlExpression,sqlWhere:i.statisticsQuery.sqlWhere,filter:e.filter,view:e.view,signal:e.signal}),{avg:d,stddev:u}=m,c=null==d||null==u,y=1/e.fields.length*100;let f=c?100:d+1.285*u;f>100&&(f=100);const b=l([y,f],{strictBounds:!0}),g=new s({valueExpression:i.valueExpression,stops:[new o({value:b[0],opacity:.15}),new o({value:b[1],opacity:1})],legendOptions:new t({title:p.strengthOfPredominance})}),h=new n({type:"opacity",minSliderValue:m.min,maxSliderValue:m.max});return{visualVariable:g,statistics:m,defaultValuesUsed:c,authoringInfo:new r({visualVariables:[h]})}}async function D(e){const i=await W(e),a=i.layer,n=(await F({basemap:i.basemap,geometryType:a.geometryType,numColors:i.fields.length,predominanceScheme:i.predominanceScheme,worldScale:!!i.symbolType?.includes("3d-volumetric"),view:i.view})).scheme,l=i.fields.map((e=>e.name)),s=M(a,l),o=R(i,s.predominantCategory,n,l),t=i.includeSizeVariable?$(i,s.size,n.sizeScheme):null,p=i.includeOpacityVariable?L(i,s.opacity):null,[m,d,u]=await Promise.all([o,t,p]),c=[],y=[];if(d&&(Array.prototype.push.apply(c,d.visualVariables.map((e=>e.clone()))),delete d.sizeScheme,m.size=d,Array.prototype.push.apply(y,d.authoringInfo.visualVariables.map((e=>e.clone())))),u&&(c.push(u.visualVariable.clone()),m.opacity=u,Array.prototype.push.apply(y,u.authoringInfo.visualVariables.map((e=>e.clone())))),c.length){const e=m.renderer.visualVariables||[];Array.prototype.push.apply(e,c),m.renderer.visualVariables=e,m.renderer.authoringInfo??=new r,m.renderer.authoringInfo.visualVariables=y}return m}async function G(e){const{creatorParameters:i,view:a,signal:r,filter:n,renderer:l}=await k(e),{layer:s,fields:o,outlineOptimizationEnabled:t,includeSizeVariable:m,includeOpacityVariable:d}=i,y=o.map((e=>e.name)),f=M(s,y),b=(await F({geometryType:s.geometryType,numColors:i.fields.length,view:i.view})).scheme,g=b&&"sizeScheme"in b?b.sizeScheme:null,[h,v,E]=await Promise.all([t?p({layer:s,view:a,signal:r,filter:n}).catch(T):null,m?$(i,f.size,g):null,d?L(i,f.opacity):null]);return u(l,h?.visualVariables,w),u(l,v?.visualVariables,z),u(l,E?.visualVariable,V),c(l,v?.authoringInfo,"size"),c(l,E?.authoringInfo,"opacity"),{renderer:l}}export{D as createRenderer,G as regenerateRenderer};