UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) • 12.7 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import e from"../../Color.js";import{isSome as r}from"../../core/arrayUtils.js";import{createUniqueColors as i}from"../../core/colorUtils.js";import a 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 p from"../../renderers/support/OthersCategory.js";import c from"../../renderers/support/RendererLegendOptions.js";import m from"../heuristics/outline.js";import f from"../heuristics/sizeRange.js";import{createVisualVariables as d}from"./size.js";import{spliceVisualVariables as b,updateAuthoringInfoVisualVariable as h,processRegenerateParams as y,getRendererToUpdate as w,getStyleType as g,hasOutlineVV as v,hasScaleDependentSizeVV as z,isSizeVV as E,findSizeVVIndex as S,findOutlineVVIndex as x,findScaleDependentSizeVVIndex as V}from"./support/regenerateUtils.js";import{errorCallback as j,getSymbolOutlineFromScheme as C,createSymbol 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 B}from"../support/utils.js";import{binningCapableLayerTypes as P,createLayerAdapter as U,getLayerTypeLabels as L,getLayerTypes as R}from"../support/adapters/support/layerUtils.js";import{cloneScheme as F,getSchemes as M}from"../symbology/pieChart.js";import _ from"../../symbols/SimpleLineSymbol.js";import{getCIMSymbolColor as A}from"../../symbols/support/cimSymbolUtils.js";const N=[2,3,4,6,7,8,9,12,15];async function W(e){if(!(e?.layer&&e.view&&e.attributes?.length))throw new a("pie-chart-renderer:missing-parameters","'layer', 'view' and 'attributes' parameters are required");if(e.attributes.length>10)throw new a("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 i=e.forBinning?P:N,t=U(r.layer,i,e.forBinning);if(!t)throw new a("pie-chart-renderer:invalid-parameters","'layer' must be one of these types: "+L(i).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 a("pie-chart-renderer:not-supported","PieChart renderer is only supported for point and polygon layers");const u=[],p=r.attributes;for(const a of p){const e=await B({field:a.field,valueExpression:a.valueExpression});u.push(...e)}const c=$(t,u.filter(Boolean),"pie-chart-renderer:invalid-parameters");if(c)throw c;return{...r,layer:t}}async function Z(e){const r="regenerate-pie-chart-renderer",i=e.includedParts?.includes("size-variable")??!0;await y(e,r);const t=await w(e);if("pie-chart"!==g(t))throw new a(`${r}:invalid-parameters`,"Renderer is invalid");const{visualVariables:n}=t,{layer:s,forBinning:l,filter:o,view:u,signal:p}=e,c=v(t),m=z(t),f=i&&n?.some(E),d=t.attributes.map(e=>({field:e.field,label:e.label,valueExpression:e.valueExpression,valueExpressionTitle:e.valueExpressionTitle})),b=await W({layer:s,attributes:d,outlineOptimizationEnabled:c,sizeOptimizationEnabled:m,includeSizeVariable:f,forBinning:l,filter:o,view:u,signal:p});return{...e,creatorParameters:b,renderer:t}}async function D(e){let r=e.pieChartScheme,i=null,a=null;const t=await I(e.basemap,e.view);if(i=null!=t.basemapId?t.basemapId:null,a=null!=t.basemapTheme?t.basemapTheme:null,r)return{scheme:F(r),basemapId:i,basemapTheme:a};const n=M({numColors:e.attributes.length,geometryType:e.layer.geometryType,basemapTheme:a});return n&&(r=n.primaryScheme,i=n.basemapId,a=n.basemapTheme),{scheme:r,basemapId:i,basemapTheme:a}}async function G(e,r){const{valueExpression:i,sqlExpression:a,sqlWhere:t}=k(e.attributes),s=await n("esri/smartMapping/t9n/smartMapping");return d({layer:e.layer,basemap:e.basemap,valueExpression:i,sqlExpression:a,sqlWhere:t,sizeScheme:r,sizeOptimizationEnabled:e.sizeOptimizationEnabled,legendOptions:{title:s.sumOfCategories},filter:e.filter,view:e.view,signal:e.signal})}async function H(e){const[s,l]=await Promise.all([W(e),n("esri/smartMapping/t9n/smartMapping")]),d=await D(s),b=d?.scheme;if(!b)throw new a("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:E}=s,S=b.sizeScheme,x=s.attributes,V=x.map(e=>e.field).filter(r),[$,I,k,q]=await Promise.all([V.length>1?O({layer:h,fields:V,view:v,signal:z,filter:E}):null,y?G(s,S):null,!y&&w?f({layer:h,view:v,signal:z,filter:E}).catch(j):null,g?m({layer:h,view:v,signal:z,filter:E}).catch(j):null]),B=$?.predominantCategoryInfos?{uniqueValueInfos:$.predominantCategoryInfos}:{uniqueValueInfos:V.map(e=>({value:e,count:0}))},P=i(b.colors,x.length),U=x.map((e,r)=>new u({field:e.field,valueExpression:e.valueExpression,label:e.label,valueExpressionTitle:e.valueExpressionTitle,color:P[r]})),L=h.geometryType,R=null!=S&&"background"in S&&S.background,M=new o({attributes:U,othersCategory:new p({label:l.other,color:s.othersCategoryEnabled?b.colorForOthersCategory:null,threshold:.04}),holePercentage:"donut"===s.shape?.45:0,backgroundFillSymbol:R?T(L,{type:"2d",color:R.color,outline:C(R,L,q?.opacity)}):null,size:t(b.size),outline:new _(C(b,"point",q?.opacity)),legendOptions:c.from(s.legendOptions)});if(I&&(K(I,w,L),M.authoringInfo=I.authoringInfo.clone(),M.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);M.visualVariables?M.visualVariables.push(...e):M.visualVariables=e}return k?.minSize&&(Q(k,L),M.visualVariables?M.visualVariables.push(k.minSize):M.visualVariables=[k.minSize]),{renderer:M,pieChartScheme:F(b),size:I,basemapId:d.basemapId,basemapTheme:d.basemapTheme,statistics:B}}async function J(e){const{creatorParameters:r,view:i,signal:a,filter:t,renderer:n}=await Z(e),{layer:s,outlineOptimizationEnabled:l,includeSizeVariable:o,sizeOptimizationEnabled:u}=r,p=await D(r),c=p?.scheme?.sizeScheme,[d,y,w]=await Promise.all([l?m({layer:s,view:i,signal:a,filter:t}).catch(j):null,o?G(r,c):null,!o&&u?f({layer:s,view:i,signal:a,filter:t}).catch(j):null]),g=s.geometryType;if(y&&(K(y,u,g),b(n,y?.visualVariables,S),h(n,y?.authoringInfo,"size")),d?.visualVariables?.length){const e=d.visualVariables.map(e=>e.clone()).filter(e=>"color"!==e.type&&"rotation"!==e.type);b(n,e,x)}return w?.minSize&&(Q(w,g),b(n,w?.minSize,V)),{renderer:n}}function K(e,r,i){r||e.visualVariables.forEach(e=>{"number"==typeof e.minSize&&"number"==typeof e.maxSize&&(e.minSize*=2.5,e.maxSize*=1.8)}),r&&"point"===i&&e.visualVariables.forEach(e=>{e?.minSize&&"object"==typeof e.minSize&&e.minSize?.stops?.forEach(e=>{e.size*=1.8})})}function Q(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 X=new Set(["unique-value","class-breaks"]),Y=new e("#aaaaaa"),ee=new e("#5c5c5c"),re=[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 a("pie-chart-cluster-renderer:missing-parameters","'layer' parameter is required");const r={...e};r.shape=r.shape||"pie",r.defaultSymbolEnabled??=!0;const i=e.layer;if(!R(N).includes(i.type))throw new a("pie-chart-cluster-renderer:invalid-parameters","'layer' must be one of these types: "+L(N).join(", "));const t=null!=r.signal?{signal:r.signal}:null;await i.load(t);if(!("point"===i.geometryType))throw new a("pie-chart-cluster-renderer:invalid-parameters","Cluster renderers are only supported for point layers");const n="renderer"in i?i.renderer:void 0;if(!n)throw new a("pie-chart-cluster-renderer:invalid-parameters","input layer does not have a renderer.");if(!X.has(n.type))throw new a("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 a("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 a("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 a("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 a("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 a("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 a("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 ae(e){const r=await ie(e),{layer:i,shape:a,defaultSymbolEnabled:t,legendOptions:s}=r,l="renderer"in i?i.renderer:void 0,p=(await n("esri/smartMapping/t9n/smartMapping")).other;let m=[];"unique-value"===l?.type&&(m=te({renderer:l,defaultSymbolEnabled:t,defaultLabelBackup:p})),"class-breaks"===l?.type&&(m=ne({renderer:l,defaultSymbolEnabled:t,defaultLabelBackup:p}));const f=[],d=[];for(const n of m){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:c.from(s),holePercentage:"donut"===a?.45:0,outline:null,size:9,othersCategory:null})}}function te(e){const{renderer:r,defaultSymbolEnabled:a,defaultLabelBackup:t}=e,{field:n,defaultSymbol:o,defaultLabel:u}=r,p=r.uniqueValueInfos??[],c=o&&a,m=c?9:10,f=i(re,m),d=(n?p.slice(0,m).map((e,r)=>{const i=e.label,a=f[r];return{field:new s({name:se(e.value?.toString()),alias:i,onStatisticExpression:new l({title:`Field definition - ${i}`,expression:oe(n,e),returnType:"number"}),statisticType:"sum"}),color:le(e.symbol,a)}}):null)??[];if(c){const e="cluster_default",r=u||t;d.push({field:new s({name:se(e),alias:r,onStatisticExpression:new l({title:`Field definition - ${r}`,expression:ue(n,p),returnType:"number"}),statisticType:"sum"}),color:le(o,ee)})}return d}function ne(e){const{renderer:r,defaultSymbolEnabled:a,defaultLabelBackup:t}=e,{field:n,classBreakInfos:o,defaultSymbol:u,defaultLabel:p}=r,c=u&&a,m=c?9:10,f=i(re,m),d=o.slice(0,m).map((e,r)=>{const i=e.label||`${e.minValue} - ${e.maxValue}`,a=f[r];return{field:new s({name:se(i),alias:i,onStatisticExpression:new l({title:`Field definition - ${i}`,expression:pe(n,e),returnType:"number"}),statisticType:"sum"}),color:le(e.symbol,a)}});if(c){const e="cluster_default",r=p||t;d.push({field:new s({name:se(e),alias:r,onStatisticExpression:new l({title:`Field definition - ${r}`,expression:ce(n,o),returnType:"number"}),statisticType:"sum"}),color:le(u,ee)})}return d}function se(e){return"SUM_"+(e+"").replaceAll(/[^a-zA-Z0-9_]/g,"_")}function le(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():Y.clone()}function oe(e,r){return`Number(Text($feature["${e}"]) == "${r.value+""}")`}function ue(e,r){return`Number(!(${r.map(r=>`(Text($feature["${e}"]) == "${r.value+""}")`).join(" || ")}))`}function pe(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{H as createRenderer,ae as createRendererForClustering,J as regenerateRenderer};