12345 |
- /*
- All material copyright ESRI, All Rights Reserved, unless otherwise specified.
- See https://js.arcgis.com/4.24/esri/copyright.txt for details.
- */
- import e from"../../core/Error.js";import{isSome as a}from"../../core/maybe.js";import{fetchMessageBundle as i}from"../../intl/messages.js";import s from"../../renderers/support/AuthoringInfo.js";import r from"../../renderers/support/AuthoringInfoVisualVariable.js";import{round as n}from"../../renderers/support/numberUtils.js";import l from"../../renderers/visualVariables/OpacityVariable.js";import o from"../heuristics/outline.js";import{createVisualVariables as t}from"./size.js";import{createRenderer as p}from"./type.js";import{verifyBasicFieldValidity as m,getBasemapInfo as d,createSymbol as u,getSymbolOutlineFromScheme as c,createColors as y}from"./support/utils.js";import b from"../statistics/predominantCategories.js";import f from"../statistics/summaryStatistics.js";import{getPredominanceExpressions as g}from"../statistics/support/predominanceUtils.js";import{createLayerAdapter as h,featureCapableLayerTypes as v,getLayerTypeLabels as w}from"../support/adapters/support/layerUtils.js";import{cloneScheme as z,getSchemes as T}from"../symbology/predominance.js";async function V(i){if(!(i&&i.layer&&i.view&&i.fields&&i.fields.length))throw new e("predominance-renderer:missing-parameters","'layer', 'view' and 'fields' parameters are required");if(i.fields.length<2)throw new e("predominance-renderer:invalid-parameters","Minimum 2 fields are required");if(i.fields.length>10)throw new e("predominance-renderer:invalid-parameters","Maximum 10 fields are supported");const s={...i};s.symbolType=s.symbolType||"2d",s.defaultSymbolEnabled=null==s.defaultSymbolEnabled||s.defaultSymbolEnabled,s.includeOpacityVariable=i.includeOpacityVariable||!1,s.includeSizeVariable=i.includeSizeVariable||!1,s.sortBy=null==s.sortBy?"count":s.sortBy;const r=h(s.layer,v);if(s.layer=r,!r)throw new e("predominance-renderer:invalid-parameters","'layer' must be one of these types: "+w(v).join(", "));const n=a(s.signal)?{signal:s.signal}:null;await r.load(n);const l=r.geometryType,o=s.symbolType.includes("3d");if(s.outlineOptimizationEnabled="polygon"===l&&s.outlineOptimizationEnabled,s.includeSizeVariable||(s.sizeOptimizationEnabled=("point"===l||"multipoint"===l||"polyline"===l)&&s.sizeOptimizationEnabled),"mesh"===l)s.symbolType="3d-volumetric",s.colorMixMode=s.colorMixMode||"replace",s.edgesType=s.edgesType||"none",s.sizeOptimizationEnabled=!1;else{if(o&&("polyline"===l||"polygon"===l))throw new e("predominance-renderer:not-supported","3d symbols are not supported for polyline and polygon layers");if(s.symbolType.includes("3d-volumetric")&&(!s.view||"3d"!==s.view.type))throw new e("predominance-renderer:invalid-parameters","'view' parameter should be an instance of SceneView when 'symbolType' parameter is '3d-volumetric' or '3d-volumetric-uniform'")}const t=s.fields.map((e=>e.name)),p=m(r,t,"predominance-renderer:invalid-parameters");if(p)throw p;return s}async function E(e){let i=e.predominanceScheme,s=null,r=null;const n=await d(e.basemap,e.view);if(s=a(n.basemapId)?n.basemapId:null,r=a(n.basemapTheme)?n.basemapTheme:null,i)return{scheme:z(i),basemapId:s,basemapTheme:r};const l=T({basemap:s,basemapTheme:r,geometryType:e.geometryType,numColors:e.numColors,theme:e.theme,worldScale:e.worldScale,view:e.view});return l&&(i=l.primaryScheme,s=l.basemapId,r=l.basemapTheme),{scheme:i,basemapId:s,basemapTheme:r}}async function S(e,a,r,n){const l=await i("esri/smartMapping/t9n/smartMapping"),t=e.layer,m={layer:e.layer,view:e.view,signal:e.signal},[d,f]=await Promise.all([b({layer:t,fields:n,view:e.view,signal:e.signal}),e.outlineOptimizationEnabled?o(m):null]);let g=d;d&&d.predominantCategoryInfos||(g={predominantCategoryInfos:n.map((e=>({value:e,count:0})))});const h=f&&f.opacity,v=await p({layer:t,basemap:e.basemap,valueExpression:a.valueExpression,valueExpressionTitle:l.predominantCategory,numTypes:-1,defaultSymbolEnabled:e.defaultSymbolEnabled,sortBy:e.sortBy,typeScheme:r,statistics:{uniqueValueInfos:g.predominantCategoryInfos},legendOptions:e.legendOptions,outlineOptimizationEnabled:!1,sizeOptimizationEnabled:(!e.includeSizeVariable||!e.sizeOptimizationEnabled)&&e.sizeOptimizationEnabled,symbolType:e.symbolType,colorMixMode:e.colorMixMode,edgesType:e.edgesType,view:e.view,signal:e.signal}),{renderer:w,basemapId:z,basemapTheme:T,uniqueValueInfos:V,excludedUniqueValueInfos:E}=v,S=w.uniqueValueInfos,x={};for(const i of e.fields){const e=t.getField(i.name);x[e.name]=i.label||e&&e.alias||i.name}if(S.forEach(((e,a)=>{const i=x[e.value];e.label=i,V[a].label=i})),e.includeSizeVariable){let a=t.geometryType,i=null;if("polygon"===a){const s=r.sizeScheme,n=s.background;w.backgroundFillSymbol=u(a,{type:e.symbolType,color:n.color,outline:c(n,a,h)}),i=s.marker.size,a="point"}else if("polyline"===a){i=r.width}else{i=r.size}const s=y(r.colors,S.length);S.forEach(((n,l)=>{const o=u(a,{type:e.symbolType,color:s[l],size:i,outline:c(r,a,h),meshInfo:{colorMixMode:e.colorMixMode,edgesType:e.edgesType}});n.symbol=o,V[l].symbol=o.clone()}))}return f&&f.visualVariables&&f.visualVariables.length&&(w.visualVariables=f.visualVariables.map((e=>e.clone()))),w.authoringInfo=new s({type:"predominance",fields:[...n]}),{renderer:w,predominantCategoryInfos:V,excludedCategoryInfos:E,predominanceScheme:r,basemapId:z,basemapTheme:T}}async function x(e,a,s){const r=await i("esri/smartMapping/t9n/smartMapping");return t({layer:e.layer,basemap:e.basemap,valueExpression:a.valueExpression,sqlExpression:a.statisticsQuery.sqlExpression,sqlWhere:a.statisticsQuery.sqlWhere,sizeScheme:s,sizeOptimizationEnabled:e.sizeOptimizationEnabled,worldScale:e.symbolType.includes("3d-volumetric"),legendOptions:{title:r.sumOfCategories},view:e.view,signal:e.signal})}async function I(e,a){const o=await i("esri/smartMapping/t9n/smartMapping"),t=await f({layer:e.layer,valueExpression:a.valueExpression,sqlExpression:a.statisticsQuery.sqlExpression,sqlWhere:a.statisticsQuery.sqlWhere,view:e.view,signal:e.signal}),p=null==t.avg||null==t.stddev,m=1/e.fields.length*100;let d=p?100:t.avg+1.285*t.stddev;d>100&&(d=100);const u=n([m,d],{strictBounds:!0}),c=new l({valueExpression:a.valueExpression,stops:[{value:u[0],opacity:.15},{value:u[1],opacity:1}],legendOptions:{title:o.strengthOfPredominance}}),y=new r({type:"opacity",minSliderValue:t.min,maxSliderValue:t.max});return{visualVariable:c,statistics:t,defaultValuesUsed:p,authoringInfo:new s({visualVariables:[y]})}}async function O(e){const a=await V(e),i=a.layer,s=(await E({basemap:a.basemap,geometryType:i.geometryType,numColors:a.fields.length,predominanceScheme:a.predominanceScheme,worldScale:a.symbolType.includes("3d-volumetric"),view:a.view})).scheme,r=a.fields.map((e=>e.name)),n=g(i,r),l=S(a,n.predominantCategory,s,r),o=a.includeSizeVariable?x(a,n.size,s.sizeScheme):null,t=a.includeOpacityVariable?I(a,n.opacity):null,[p,m,d]=await Promise.all([l,o,t]),u=[],c=[];if(m&&(Array.prototype.push.apply(u,m.visualVariables.map((e=>e.clone()))),delete m.sizeScheme,p.size=m,Array.prototype.push.apply(c,m.authoringInfo.visualVariables.map((e=>e.clone())))),d&&(u.push(d.visualVariable.clone()),p.opacity=d,Array.prototype.push.apply(c,d.authoringInfo.visualVariables.map((e=>e.clone())))),u.length){const e=p.renderer.visualVariables||[];Array.prototype.push.apply(e,u),p.renderer.visualVariables=e,p.renderer.authoringInfo.visualVariables=c}return p}export{O as createRenderer};
|