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