UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) 6.32 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import{createUniqueColors as e}from"../../core/colorUtils.js";import t from"../../core/Error.js";import{getResolutionForScale as r}from"../../geometry/support/scaleUtils.js";import i from"../../renderers/DotDensityRenderer.js";import a from"../../renderers/support/AuthoringInfo.js";import n from"../heuristics/outline.js";import{roundValue as s}from"./support/dotDensityUtils.js";import{spliceVisualVariables as l,processRegenerateParams as o,getRendererToUpdate as u,getStyleType as d,hasOutlineVV as m,findOutlineVVIndex as p}from"./support/regenerateUtils.js";import{errorCallback as c,getSymbolOutlineFromScheme as f,verifyBasicFieldValidity as y,getBasemapInfo as b}from"./support/utils.js";import g from"../statistics/spatialStatistics.js";import w from"../statistics/summaryStatisticsForAttributes.js";import v from"../statistics/support/attributeDensity.js";import{verifyBinningParams as h}from"../support/binningUtils.js";import{getFieldsList as S}from"../support/utils.js";import{binningCapableLayerTypes as V,createLayerAdapter as E,getLayerTypeLabels as x}from"../support/adapters/support/layerUtils.js";import{cloneScheme as j,getSchemes as T}from"../symbology/dotDensity.js";const D=500;async function I(e){const r=e.view;if(!(e?.layer&&r&&e.attributes?.length))throw new t("dot-density-renderer:missing-parameters","'layer', 'view' and 'attributes' parameters are required");if(e.attributes.length>8)throw new t("dot-density-renderer:invalid-parameters","Dot density renderer does not support more than 8 attributes");e.forBinning&&h(e,"dot-density-renderer");const i={...e,view:r,layer:e.layer,attributes:e.attributes},a=[3,9,6,7,4,15],n=e.forBinning?V:a,s=E(i.layer,n,e.forBinning);if(!s)throw new t("dot-density-renderer:invalid-parameters","'layer' must be one of these types: "+x(n).join(", "));i.dotBlendingEnabled??=!0,i.dotValueOptimizationEnabled??=!0;const l=null!=i.signal?{signal:i.signal}:null;await Promise.all([r.when(),s.load(l)]);if("polygon"!==s.geometryType)throw new t("dot-density-renderer:not-supported","Dot density renderer is supported for polygon layers only");const o=[],u=i.attributes;for(const t of u){const e=await S({field:t.field,valueExpression:t.valueExpression});o.push(...e)}const d=y(s,o.filter(Boolean),"dot-density-renderer:invalid-parameters");if(d)throw d;return{...i,layer:s}}async function z(e){const r="regenerate-dot-density-renderer";await o(e,r);const i=await u(e);if("dot-density"!==d(i))throw new t(`${r}:invalid-parameters`,"Renderer is invalid");const{layer:a,forBinning:n,filter:s,view:l,signal:p}=e,c=m(i),f=i.attributes.map(e=>({field:e.field,valueExpression:e.valueExpression,label:e.label,valueExpressionTitle:e.valueExpressionTitle})),y=await I({layer:a,attributes:f,dotValueOptimizationEnabled:null!=i.referenceScale,outlineOptimizationEnabled:c,forBinning:n,filter:s,view:l,signal:p});return{...e,creatorParameters:y,renderer:i}}async function B(e){let t=e.dotDensityScheme,r=null,i=null;const a=await b(e.basemap,e.view);if(r=null!=a.basemapId?a.basemapId:null,i=null!=a.basemapTheme?a.basemapTheme:null,t)return{scheme:j(t),basemapId:r,basemapTheme:i};const n=T({numColors:e.attributes.length,basemapTheme:i});return n&&(t=n.primaryScheme,r=n.basemapId,i=n.basemapTheme),{scheme:t,basemapId:r,basemapTheme:i}}function O(e){return{dotValue:1,referenceScale:e.scale,minSliderValue:1,maxSliderValue:100}}async function U(e){const{view:t,layer:i,attributes:a,signal:n,filter:l}=e,o=await i.getSampleFeatures({view:t,sampleSize:D,returnGeometry:!0,filter:l,signal:n},"json"),[u,d]=await Promise.all([g({features:o,geometryType:i.geometryType}),w({layer:i,attributes:a,filter:l,includeZeros:!1,includeNegatives:!1,view:t,signal:n})]),m=null!=u&&"avgSize"in u&&u.avgSize,p=d.avg;if(!m||!p)return O(t);const c=r(t.scale,t.spatialReference);return{dotValue:s(p/(m*m/(c*c)*.1))||1,referenceScale:t.scale,minSliderValue:1,maxSliderValue:s(p)}}async function P(e){const{view:t,layer:i,attributes:a,signal:n,filter:l}=e,o=[];for(const r of a){const e=await S({field:r.field,valueExpression:r.valueExpression});o.push(...e)}const u=await i.getSampleFeatures({view:t,sampleSize:D,requiredFields:o,filter:l,returnGeometry:!0,signal:n},"json"),{minDensity:d,maxDensity:m,avgDensity:p}=await v({features:u,attributes:a,includeZeros:!1,includeNegatives:!1,view:t});if(!p||!d||!m)return O(t);const c=r(t.scale,t.spatialReference),f=c*c,y=s(d*f),b=s(m*f);let g=s(p*f*10)||1;return g>b&&(g=b),{dotValue:g,referenceScale:t.scale,minSliderValue:y,maxSliderValue:b}}async function F(r){const s=await I(r),l=s.layer,o=l.geometryType,u=await B(s),d=u?.scheme;if(!d)throw new t("dot-density-renderer:insufficient-info","Unable to find dot-density scheme");const m=s.view,p=s.filter,y={layer:l,view:m,filter:p,attributes:s.attributes,signal:s.signal},b={layer:s.layer,view:m,filter:p,signal:s.signal},[g,w]=await Promise.all([s.trueDensity?P(y):U(y),s.outlineOptimizationEnabled?n(b).catch(c):null]),{dotValue:v,referenceScale:h,minSliderValue:S,maxSliderValue:V}=g,E=e(d.colors,s.attributes.length),x=s.attributes.map((e,t)=>({field:e.field,valueExpression:e.valueExpression,label:e.label,valueExpressionTitle:e.valueExpressionTitle,color:E[t]})),j=new i({attributes:x,dotBlendingEnabled:s.dotBlendingEnabled,outline:w?f(d,o,w.opacity):null,dotValue:v,referenceScale:s.dotValueOptimizationEnabled?h:null,legendOptions:s.legendOptions});return w?.visualVariables.length&&(j.visualVariables=w.visualVariables.map(e=>e.clone())),j.authoringInfo=new a({type:"dot-density",minSliderValue:S,maxSliderValue:V}),{renderer:j,dotDensityScheme:d,basemapId:u.basemapId,basemapTheme:u.basemapTheme}}async function R(e){const{creatorParameters:t,renderer:r}=await z(e),{layer:i,attributes:a,outlineOptimizationEnabled:s,view:o,signal:u,filter:d}=t,m={layer:i,view:o,filter:d,attributes:a,signal:u},[f,y]=await Promise.all([t.trueDensity?P(m):U(m),s?n({layer:i,view:o,signal:u,filter:d}).catch(c):null]),{dotValue:b,referenceScale:g,minSliderValue:w,maxSliderValue:v}=f;return r.dotValue=b,r.referenceScale=t.dotValueOptimizationEnabled?g:null,r.authoringInfo&&(r.authoringInfo.minSliderValue=w,r.authoringInfo.maxSliderValue=v),l(r,y?.visualVariables,p),{renderer:r}}export{F as createRenderer,R as regenerateRenderer};