@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 5.09 kB
JavaScript
import e from"../../../../core/Error.js";import has from"../../../../core/has.js";import r from"../../../../core/Logger.js";import{isNone as s}from"../../../../core/maybe.js";import{createMD5Hash as i}from"../../../../core/MD5.js";import n from"../../../../layers/support/AggregateField.js";import a from"../../../../layers/support/ExpressionInfo.js";import t from"../../../../renderers/support/AuthoringInfo.js";import l from"../../../../renderers/visualVariables/SizeVariable.js";import o from"../../../../renderers/visualVariables/support/SizeStop.js";import{LevelDependentSizeVariable as u}from"../../engine/LevelDependentSizeVariable.js";const p=r.getLogger("esri.views.2d.layers.support.clusterUtils");has.add("esri-cluster-arcade-enabled",!0);const c=has("esri-cluster-arcade-enabled"),d=(e,r,i,n,a)=>{const l=r.clone();if(!g(l))return l;if(l.authoringInfo||(l.authoringInfo=new t),l.authoringInfo.isAutoGenerated=!0,"visualVariables"in l){const r=(l.visualVariables||[]).filter((e=>"$view.scale"!==e.valueExpression)),t=f(r);r.forEach((r=>{"rotation"===r.type?r.field?r.field=w(e,r.field,"avg_angle","number"):r.valueExpression&&(r.field=E(e,r.valueExpression,"avg_angle","number"),r.valueExpression=null):r.normalizationField?(r.field=w(e,r.field,"avg_norm","number",r.normalizationField),r.normalizationField=null):r.field?r.field=w(e,r.field,"avg","number"):r.valueExpression&&(r.field=E(e,r.valueExpression,"avg","number"),r.valueExpression=null)})),s(t)&&!v(r)&&a&&(r.push(b(i,n)),l.dynamicClusterSize=!0),l.visualVariables=r}switch(l.type){case"simple":break;case"pie-chart":for(const r of l.attributes)r.field?r.field=w(e,r.field,"sum","number"):r.valueExpression&&(r.field=E(e,r.valueExpression,"sum","number"),r.valueExpression=null);break;case"unique-value":l.field?l.field=w(e,l.field,"mode","string"):l.valueExpression&&(l.field=E(e,l.valueExpression,"mode","string"),l.valueExpression=null);break;case"class-breaks":l.normalizationField?(l.field=w(e,l.field,"avg_norm","number",l.normalizationField),l.normalizationField=null):l.field?l.field=w(e,l.field,"avg","number"):l.valueExpression&&(l.field=E(e,l.valueExpression,"avg","number"),l.valueExpression=null)}return l},f=e=>{for(const r of e)if("size"===r.type)return r;return null};function m(e,r,i){const n=e.clone();let a=!1;if("visualVariables"in n){const e=(n.visualVariables||[]).filter((e=>"$view.scale"!==e.valueExpression)),t=f(e);s(t)&&(n.visualVariables||(n.visualVariables=[]),n.visualVariables.push(b(r,i)),n.dynamicClusterSize=!0,a=!0)}return{renderer:n,didInject:a}}const v=e=>{for(const r of e)if("cluster_count"===r.field)return!0;return!1},b=(e,r)=>{const i=[new o({value:0,size:0}),new o({value:1})];if(s(r))return new l({field:"cluster_count",stops:[...i,new o({value:2,size:0})]});const n=Object.keys(r).reduce(((s,n)=>({...s,[n]:[...i,new o({value:Math.max(2,r[n].minValue),size:e.clusterMinSize}),new o({value:Math.max(3,r[n].maxValue),size:e.clusterMaxSize})]})),{});return new u({field:"cluster_count",levels:n})},g=r=>{const s=s=>p.error(new e("Unsupported-renderer",s,{renderer:r}));switch(r.type){case"unique-value":if(r.field2||r.field3)return s("FeatureReductionCluster does not support multi-field UniqueValueRenderers"),!1;break;case"class-breaks":if(r.normalizationField){const e=r.normalizationType;if("field"!==e)return s(`FeatureReductionCluster does not support a normalizationType of ${e}`),!1}break;case"simple":case"pie-chart":break;default:return s(`FeatureReductionCluster does not support renderers of type ${r.type}`),!1}if(!c){if("valueExpression"in r&&r.valueExpression)return s("FeatureReductionCluster does not currently support renderer.valueExpression. Support will be added in a future release"),!1;if(("visualVariables"in r&&r.visualVariables||[]).some((e=>!(!("valueExpression"in e)||!e.valueExpression))))return s("FeatureReductionCluster does not currently support visualVariables with a valueExpression. Support will be added in a future release"),!1}return!0};function x(e,r,s){switch(e){case"sum":return`cluster_sum_${r}`;case"avg":case"avg_angle":return`cluster_avg_${r}`;case"mode":return`cluster_type_${r}`;case"avg_norm":{const e=s,n="field",a=r.toLowerCase()+",norm:"+n+","+e.toLowerCase();return"cluster_avg_"+i(a)}}}function E(e,r,s,t){const l=i(r),o="mode"===s?`cluster_type_${l}`:"sum"===s?`cluster_sum_${l}`:`cluster_avg_${l}`;return e.some((e=>e.name===o))||e.push(new n({name:o,isAutoGenerated:!0,onStatisticExpression:new a({expression:r,returnType:t}),statisticType:s})),o}function w(e,r,s,i,t){if("cluster_count"===r||e.some((e=>e.name===r)))return r;const l=x(s,r,t);return e.some((e=>e.name===l))||("avg_norm"===s?e.push(new n({name:l,isAutoGenerated:!0,onStatisticExpression:new a({expression:`$feature.${r} / $feature.${t}`,returnType:i}),statisticType:"avg"})):e.push(new n({name:l,isAutoGenerated:!0,onStatisticField:r,statisticType:s}))),l}export{b as createClusterCountSizeVariable,d as createClusterRenderer,f as findSizeVV,v as hasClusterCountVV,m as injectDynamicLevelDependentSizeVisualVariable,g as isClusterCompatibleRenderer};