dotDensity.js 5.3 KB

12345
  1. /*
  2. All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. See https://js.arcgis.com/4.24/esri/copyright.txt for details.
  4. */
  5. import"../../renderers/ClassBreaksRenderer.js";import"../../renderers/DictionaryRenderer.js";import e from"../../renderers/DotDensityRenderer.js";import"../../renderers/HeatmapRenderer.js";import"../../renderers/PieChartRenderer.js";import"../../renderers/Renderer.js";import"../../renderers/SimpleRenderer.js";import"../../renderers/UniqueValueRenderer.js";import"../../renderers/support/jsonUtils.js";import t from"../../core/Error.js";import{isSome as r}from"../../core/maybe.js";import{getResolutionForScale as i}from"../../geometry/support/scaleUtils.js";import a from"../../renderers/support/AuthoringInfo.js";import s from"../heuristics/outline.js";import{roundValue as n}from"./support/dotDensityUtils.js";import{createColors as o,getSymbolOutlineFromScheme as l,verifyBasicFieldValidity as d,getBasemapInfo as m}from"./support/utils.js";import u from"../statistics/spatialStatistics.js";import p from"../statistics/summaryStatisticsForAttributes.js";import y from"../statistics/support/attributeDensity.js";import{getFieldsList as c}from"../support/utils.js";import{LayerType as f,createLayerAdapter as b,getLayerTypeLabels as g}from"../support/adapters/support/layerUtils.js";import{cloneScheme as w,getSchemes as v}from"../symbology/dotDensity.js";const h=500;async function S(e){if(!(e&&e.layer&&e.view&&e.attributes&&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");const i={...e},a=[f.FeatureLayer,f.OGCFeatureLayer,f.GeoJSONLayer,f.WFSLayer],s=b(i.layer,a);if(i.layer=s,i.dotBlendingEnabled=null==i.dotBlendingEnabled||i.dotBlendingEnabled,i.dotValueOptimizationEnabled=null==i.dotValueOptimizationEnabled||i.dotValueOptimizationEnabled,!s)throw new t("dot-density-renderer:invalid-parameters","'layer' must be one of these types: "+g(a).join(", "));const n=r(i.signal)?{signal:i.signal}:null;await Promise.all([i.view.when(),s.load(n)]);if("polygon"!==s.geometryType)throw new t("dot-density-renderer:not-supported","Dot density renderer is supported for polygon layers only");const o=[],l=i.attributes;for(const t of l){const e=await c({field:t.field,valueExpression:t.valueExpression});o.push(...e)}const m=d(s,o.filter(Boolean),"dot-density-renderer:invalid-parameters");if(m)throw m;return i}async function j(e){let t=e.dotDensityScheme,i=null,a=null;const s=await m(e.basemap,e.view);if(i=r(s.basemapId)?s.basemapId:null,a=r(s.basemapTheme)?s.basemapTheme:null,t)return{scheme:w(t),basemapId:i,basemapTheme:a};const n=v({basemap:i,numColors:e.attributes.length,basemapTheme:a});return n&&(t=n.primaryScheme,i=n.basemapId,a=n.basemapTheme),{scheme:t,basemapId:i,basemapTheme:a}}async function V(e){const{view:r,layer:a,attributes:s,signal:o}=e,l=await a.getSampleFeatures({view:r,sampleSize:h,returnGeometry:!0,signal:o}),[d,m]=await Promise.all([u({features:l,geometryType:a.geometryType}),p({layer:a,attributes:s,includeZeros:!1,includeNegatives:!1,view:r,signal:o})]),y="avgSize"in d&&d.avgSize,c=m.avg;if(!y)throw new t("dot-density-renderer:insufficient-info","Average polygon size is invalid");if(!c)throw new t("dot-density-renderer:insufficient-info","Average attribute value is invalid");const f=i(r.scale,r.spatialReference);return{dotValue:n(c/(y*y/(f*f)*.1))||1,referenceScale:r.scale,minSliderValue:1,maxSliderValue:n(c)}}async function E(e){const{view:r,layer:a,attributes:s,signal:o}=e,l=[];for(const t of s){const e=await c({field:t.field,valueExpression:t.valueExpression});l.push(...e)}const d=await a.getSampleFeatures({view:r,sampleSize:h,requiredFields:l,returnGeometry:!0,signal:o}),m=await y({features:d,attributes:s,includeZeros:!1,includeNegatives:!1,view:r});if(!m.avgDensity||!m.minDensity||!m.maxDensity)throw new t("dot-density-renderer:insufficient-info","Invalid density values");const u=i(r.scale,r.spatialReference),p=u*u,f=n(m.minDensity*p),b=n(m.maxDensity*p),g=10;let w=n(m.avgDensity*p*g)||1;return w>b&&(w=b),{dotValue:w,referenceScale:r.scale,minSliderValue:f,maxSliderValue:b}}async function D(r){const i=await S(r),n=i.layer,d=n.geometryType,m=await j(i),u=m&&m.scheme;if(!u)throw new t("dot-density-renderer:insufficient-info","Unable to find dot-density scheme");const p={layer:n,view:i.view,attributes:i.attributes,signal:i.signal},y={layer:i.layer,view:i.view,signal:i.signal},[c,f]=await Promise.all([i.trueDensity?E(p):V(p),i.outlineOptimizationEnabled?s(y):null]),{dotValue:b,referenceScale:g,minSliderValue:w,maxSliderValue:v}=c,h=o(u.colors,i.attributes.length),D=i.attributes.map(((e,t)=>({field:e.field,valueExpression:e.valueExpression,label:e.label,valueExpressionTitle:e.valueExpressionTitle,color:h[t]}))),x=new e({attributes:D,dotBlendingEnabled:i.dotBlendingEnabled,outline:f?l(u,d,f.opacity):null,dotValue:b,referenceScale:i.dotValueOptimizationEnabled?g:null,legendOptions:i.legendOptions});return f&&f.visualVariables&&f.visualVariables.length&&(x.visualVariables=f.visualVariables.map((e=>e.clone()))),x.authoringInfo=new a({type:"dot-density",minSliderValue:w,maxSliderValue:v}),{renderer:x,dotDensityScheme:u,basemapId:m.basemapId,basemapTheme:m.basemapTheme}}export{D as createRenderer};