@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 13 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import e from"../../Color.js";import{isSome as r}from"../../core/arrayUtils.js";import{createUniqueColors as a}from"../../core/colorUtils.js";import i from"../../core/Error.js";import{toPt as t}from"../../core/screenUtils.js";import{fetchMessageBundle as n}from"../../intl/messages.js";import s from"../../layers/support/AggregateField.js";import l from"../../layers/support/ExpressionInfo.js";import o from"../../renderers/PieChartRenderer.js";import u from"../../renderers/support/AttributeColorInfo.js";import{OthersCategory as p}from"../../renderers/support/OthersCategory.js";import m from"../../renderers/support/RendererLegendOptions.js";import c from"../heuristics/outline.js";import f from"../heuristics/sizeRange.js";import{createVisualVariables as d}from"./size.js";import{spliceVisualVariables as b,findSizeVVIndex as h,updateAuthoringInfoVisualVariable as y,findOutlineVVIndex as w,findScaleDependentSizeVVIndex as g,processRegenerateParams as v,getRendererToUpdate as z,getStyleType as S,hasOutlineVV as E,hasScaleDependentSizeVV as V,isSizeVV as x}from"./support/regenerateUtils.js";import{errorCallback as C,createSymbol as j,getSymbolOutlineFromScheme as T,verifyBasicFieldValidity as $,getBasemapInfo as I}from"./support/utils.js";import O from"../statistics/predominantCategories.js";import{getSumOfAttributesExpr as k}from"../statistics/support/utils.js";import{verifyBinningParams as q}from"../support/binningUtils.js";import{getFieldsList as L}from"../support/utils.js";import{LayerType as B,binningCapableLayerTypes as P,createLayerAdapter as U,getLayerTypeLabels as F,getLayerTypes as R}from"../support/adapters/support/layerUtils.js";import{cloneScheme as M,getSchemes as N}from"../symbology/pieChart.js";import _ from"../../symbols/SimpleLineSymbol.js";import{getCIMSymbolColor as A}from"../../symbols/support/cimSymbolUtils.js";const G=[B.CSVLayer,B.FeatureLayer,B.GeoJSONLayer,B.KnowledgeGraphSublayer,B.OGCFeatureLayer,B.OrientedImageryLayer,B.ParquetLayer,B.StreamLayer,B.WFSLayer];async function W(e){if(!(e?.layer&&e.view&&e.attributes?.length))throw new i("pie-chart-renderer:missing-parameters","'layer', 'view' and 'attributes' parameters are required");if(e.attributes.length>10)throw new i("pie-chart-renderer:invalid-parameters","PieChart renderer does not support more than 10 attributes");e.forBinning&&q(e,"pie-chart-renderer");const r={...e,layer:e.layer,view:e.view,attributes:e.attributes};r.shape=r.shape||"pie",r.othersCategoryEnabled??=!0,r.includeSizeVariable=e.includeSizeVariable||!1;const a=e.forBinning?P:G,t=U(r.layer,a,e.forBinning);if(!t)throw new i("pie-chart-renderer:invalid-parameters","'layer' must be one of these types: "+F(a).join(", "));const n=null!=r.signal?{signal:r.signal}:null;await Promise.all([e.view.when(),t.load(n)]);const s=t.geometryType,l="polygon"===s,o="point"===s||"multipoint"===s||l;if(r.outlineOptimizationEnabled=!!l&&r.outlineOptimizationEnabled,r.sizeOptimizationEnabled=!!o&&r.sizeOptimizationEnabled,!o)throw new i("pie-chart-renderer:not-supported","PieChart renderer is only supported for point and polygon layers");const u=[],p=r.attributes;for(const i of p){const e=await L({field:i.field,valueExpression:i.valueExpression});u.push(...e)}const m=$(t,u.filter(Boolean),"pie-chart-renderer:invalid-parameters");if(m)throw m;return{...r,layer:t}}async function J(e){const r="regenerate-pie-chart-renderer";await v(e,r);const a=await z(e);if("pie-chart"!==S(a))throw new i(`${r}:invalid-parameters`,"Renderer is invalid");const{visualVariables:t}=a,{layer:n,forBinning:s,filter:l,view:o,signal:u}=e,p=E(a),m=V(a),c=t?.some(x),f=a.attributes.map((e=>({field:e.field,label:e.label,valueExpression:e.valueExpression,valueExpressionTitle:e.valueExpressionTitle}))),d=await W({layer:n,attributes:f,outlineOptimizationEnabled:p,sizeOptimizationEnabled:m,includeSizeVariable:c,forBinning:s,filter:l,view:o,signal:u});return{...e,creatorParameters:d,renderer:a}}async function K(e){let r=e.pieChartScheme,a=null,i=null;const t=await I(e.basemap,e.view);if(a=null!=t.basemapId?t.basemapId:null,i=null!=t.basemapTheme?t.basemapTheme:null,r)return{scheme:M(r),basemapId:a,basemapTheme:i};const n=N({numColors:e.attributes.length,geometryType:e.layer.geometryType,basemapTheme:i});return n&&(r=n.primaryScheme,a=n.basemapId,i=n.basemapTheme),{scheme:r,basemapId:a,basemapTheme:i}}async function Z(e,r){const{valueExpression:a,sqlExpression:i,sqlWhere:t}=k(e.attributes),s=await n("esri/smartMapping/t9n/smartMapping");return d({layer:e.layer,basemap:e.basemap,valueExpression:a,sqlExpression:i,sqlWhere:t,sizeScheme:r,sizeOptimizationEnabled:e.sizeOptimizationEnabled,legendOptions:{title:s.sumOfCategories},view:e.view,signal:e.signal})}async function D(e){const[s,l]=await Promise.all([W(e),n("esri/smartMapping/t9n/smartMapping")]),d=await K(s),b=d?.scheme;if(!b)throw new i("pie-chart-renderer:insufficient-info","Unable to find pie-chart scheme");const{layer:h,includeSizeVariable:y,sizeOptimizationEnabled:w,outlineOptimizationEnabled:g,view:v,signal:z,filter:S}=s,E=b.sizeScheme,V=s.attributes,x=V.map((e=>e.field)).filter(r),[$,I,k,q]=await Promise.all([x.length>1?O({layer:h,fields:x,view:v,signal:z,filter:S}):null,y?Z(s,E):null,!y&&w?f({layer:h,view:v,signal:z,filter:S}).catch(C):null,g?c({layer:h,view:v,signal:z,filter:S}).catch(C):null]),L=$?.predominantCategoryInfos?{uniqueValueInfos:$.predominantCategoryInfos}:{uniqueValueInfos:x.map((e=>({value:e,count:0})))},B=a(b.colors,V.length),P=V.map(((e,r)=>new u({field:e.field,valueExpression:e.valueExpression,label:e.label,valueExpressionTitle:e.valueExpressionTitle,color:B[r]}))),U=h.geometryType,F=null!=E&&"background"in E&&E.background,R=new o({attributes:P,othersCategory:new p({label:l.other,color:s.othersCategoryEnabled?b.colorForOthersCategory:null,threshold:.04}),holePercentage:"donut"===s.shape?.45:0,backgroundFillSymbol:F?j(U,{type:"2d",color:F.color,outline:T(F,U,q?.opacity)}):null,size:t(b.size),outline:new _(T(b,"point",q?.opacity)),legendOptions:m.from(s.legendOptions)});if(I&&(Q(I,w,U),R.authoringInfo=I.authoringInfo.clone(),R.visualVariables=I.visualVariables?.map((e=>e.clone()))),q?.visualVariables?.length){const e=q.visualVariables.map((e=>e.clone())).filter((e=>"color"!==e.type&&"rotation"!==e.type));R.visualVariables?R.visualVariables.push(...e):R.visualVariables=e}return k?.minSize&&(X(k,U),R.visualVariables?R.visualVariables.push(k.minSize):R.visualVariables=[k.minSize]),{renderer:R,pieChartScheme:M(b),size:I,basemapId:d.basemapId,basemapTheme:d.basemapTheme,statistics:L}}async function H(e){const{creatorParameters:r,view:a,signal:i,filter:t,renderer:n}=await J(e),{layer:s,outlineOptimizationEnabled:l,includeSizeVariable:o,sizeOptimizationEnabled:u}=r,p=await K(r),m=p?.scheme?.sizeScheme,[d,v,z]=await Promise.all([l?c({layer:s,view:a,signal:i,filter:t}).catch(C):null,o?Z(r,m):null,!o&&u?f({layer:s,view:a,signal:i,filter:t}).catch(C):null]),S=s.geometryType;if(v&&(Q(v,u,S),b(n,v?.visualVariables,h),y(n,v?.authoringInfo,"size")),d?.visualVariables?.length){const e=d.visualVariables.map((e=>e.clone())).filter((e=>"color"!==e.type&&"rotation"!==e.type));b(n,e,w)}return z?.minSize&&(X(z,S),b(n,z?.minSize,g)),{renderer:n}}function Q(e,r,a){r||e.visualVariables.forEach((e=>{"number"==typeof e.minSize&&"number"==typeof e.maxSize&&(e.minSize*=2.5,e.maxSize*=1.8)})),r&&"point"===a&&e.visualVariables.forEach((e=>{e?.minSize&&"object"==typeof e.minSize&&e.minSize?.stops?.forEach((e=>{e.size*=1.8}))}))}function X(e,r){"point"===r&&e.minSize.stops?.forEach((e=>{e.size*=2.5})),"polygon"===r&&e.minSize.stops?.forEach((e=>{e.size*=1.8}))}const Y=new Set(["unique-value","class-breaks"]),ee=new e("#aaaaaa"),re=new e("#5c5c5c"),ae=[new e("#e60049"),new e("#0bb4ff"),new e("#50e991"),new e("#e6d800"),new e("#9b19f5"),new e("#ffa300"),new e("#dc0ab4"),new e("#b3d4ff"),new e("#00bfa0"),new e("#f0cccc")];async function ie(e){if(!e||!e.layer)throw new i("pie-chart-cluster-renderer:missing-parameters","'layer' parameter is required");const r={...e};r.shape=r.shape||"pie",r.defaultSymbolEnabled??=!0;const a=e.layer;if(!R(G).includes(a.type))throw new i("pie-chart-cluster-renderer:invalid-parameters","'layer' must be one of these types: "+F(G).join(", "));const t=null!=r.signal?{signal:r.signal}:null;await a.load(t);if(!("point"===a.geometryType))throw new i("pie-chart-cluster-renderer:invalid-parameters","Cluster renderers are only supported for point layers");const n="renderer"in a?a.renderer:void 0;if(!n)throw new i("pie-chart-cluster-renderer:invalid-parameters","input layer does not have a renderer.");if(!Y.has(n.type))throw new i("pie-chart-cluster-renderer:invalid-parameters",`Cannot create a pie chart renderer for clusters based on a ${n.type} renderer.`);if("valueExpression"in n&&n.valueExpression)throw new i("pie-chart-cluster-renderer:invalid-parameters","Cannot create a pie chart renderer for clusters from a layer whose renderer contains a valueExpression.");if("unique-value"===n.type){if(n.field2)throw new i("pie-chart-cluster-renderer:invalid-parameters","Cannot create a pie chart renderer for clusters from a UniqueValueRenderer using more than one field.");if(null!=n.uniqueValueInfos&&n.uniqueValueInfos.length>10)throw new i("pie-chart-cluster-renderer:invalid-parameters","PieChart cluster renderer cannot be created from a UniqueValueRenderer with more than 10 unique value infos.")}if("class-breaks"===n.type){if(n.classBreakInfos.length<2)throw new i("pie-chart-cluster-renderer:invalid-parameters","Cannot create a pie chart renderer for clusters from a layer renderer with a continuous color or size gradient.");if(n.classBreakInfos.length>10)throw new i("pie-chart-cluster-renderer:invalid-parameters","PieChart cluster renderer can not be created from a ClassBreaksRenderer with more than 10 class break infos.");if("class-breaks-size"===n?.authoringInfo?.type)throw new i("pie-chart-cluster-renderer:invalid-parameters","PieChart cluster renderer can not be created from a ClassBreaksRenderer with breaks varied by size instead of color.")}return r}async function te(e){const r=await ie(e),{layer:a,shape:i,defaultSymbolEnabled:t,legendOptions:s}=r,l="renderer"in a?a.renderer:void 0,p=(await n("esri/smartMapping/t9n/smartMapping")).other;let c=[];"unique-value"===l?.type&&(c=ne({renderer:l,defaultSymbolEnabled:t,defaultLabelBackup:p})),"class-breaks"===l?.type&&(c=se({renderer:l,defaultSymbolEnabled:t,defaultLabelBackup:p}));const f=[],d=[];for(const n of c){const{field:e,color:r}=n;f.push(e),d.push(new u({color:r,field:e.name,label:e.alias}))}return{fields:f,renderer:new o({attributes:d,legendOptions:m.from(s),holePercentage:"donut"===i?.45:0,outline:null,size:9,othersCategory:null})}}function ne(e){const{renderer:r,defaultSymbolEnabled:i,defaultLabelBackup:t}=e,{field:n,defaultSymbol:o,defaultLabel:u}=r,p=r.uniqueValueInfos??[],m=o&&i,c=m?9:10,f=a(ae,c),d=(n?p.slice(0,c).map(((e,r)=>{const a=e.label,i=f[r];return{field:new s({name:le(e.value?.toString()),alias:a,onStatisticExpression:new l({title:`Field definition - ${a}`,expression:ue(n,e),returnType:"number"}),statisticType:"sum"}),color:oe(e.symbol,i)}})):null)??[];if(m){const e="cluster_default",r=u||t;d.push({field:new s({name:le(e),alias:r,onStatisticExpression:new l({title:`Field definition - ${r}`,expression:pe(n,p),returnType:"number"}),statisticType:"sum"}),color:oe(o,re)})}return d}function se(e){const{renderer:r,defaultSymbolEnabled:i,defaultLabelBackup:t}=e,{field:n,classBreakInfos:o,defaultSymbol:u,defaultLabel:p}=r,m=u&&i,c=m?9:10,f=a(ae,c),d=o.slice(0,c).map(((e,r)=>{const a=e.label||`${e.minValue} - ${e.maxValue}`,i=f[r];return{field:new s({name:le(a),alias:a,onStatisticExpression:new l({title:`Field definition - ${a}`,expression:me(n,e),returnType:"number"}),statisticType:"sum"}),color:oe(e.symbol,i)}}));if(m){const e="cluster_default",r=p||t;d.push({field:new s({name:le(e),alias:r,onStatisticExpression:new l({title:`Field definition - ${r}`,expression:ce(n,o),returnType:"number"}),statisticType:"sum"}),color:oe(u,re)})}return d}function le(e){return"SUM_"+(e+"").replaceAll(/[^a-zA-Z0-9_]/g,"_")}function oe(e,r){if("simple-marker"===e?.type&&e.color)return e.color.clone();if("cim"===e?.type){const r=A(e);if(r)return r.clone()}return r?r.clone():ee.clone()}function ue(e,r){return`Number(Text($feature["${e}"]) == "${r.value+""}")`}function pe(e,r){return`Number(!(${r.map((r=>`(Text($feature["${e}"]) == "${r.value+""}")`)).join(" || ")}))`}function me(e,r){return`Number($feature["${e}"] >= ${r.minValue} && $feature["${e}"] < ${r.maxValue})`}function ce(e,r){return`Number(!(${r.map((r=>`($feature["${e}"] >= ${r.minValue} && $feature["${e}"] < ${r.maxValue})`)).join(" || ")}))`}export{D as createRenderer,te as createRendererForClustering,H as regenerateRenderer};