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{clone as n}from"../../core/lang.js";import{isSome as a}from"../../core/maybe.js";import{fetchMessageBundle as i}from"../../intl/messages.js";import l from"../../renderers/support/AuthoringInfo.js";import{AuthoringInfoClassBreakInfo as r}from"../../renderers/support/AuthoringInfoClassBreakInfo.js";import{AuthoringInfoFieldInfo as s}from"../../renderers/support/AuthoringInfoFieldInfo.js";import{createRenderer as o}from"./type.js";import{createColors as t,getClassBreaks as d,verifyBasicFieldValidity as m,getBasemapInfo as u}from"./support/utils.js";import{verifyBinningParams as f}from"../support/binningUtils.js";import{binningCapableLayerTypes as p,featureCapableLayerTypes as c,createLayerAdapter as h,getLayerTypeLabels as y}from"../support/adapters/support/layerUtils.js";import{getColors as b,cloneScheme as w,getSchemes as v,flatten2DArray as g}from"../symbology/relationship.js";import{applyColorToSymbol as I}from"../../symbols/support/utils.js";const M=["equal-interval","natural-breaks","quantile"],z=["HH","HL","LH","LL"],F={2:[["HL","HH"],["LL","LH"]],3:[["HL","HM","HH"],["ML","MM","MH"],["LL","LM","LH"]],4:[["HL","HM1","HM2","HH"],["M2L","M2M1","M2M2","M2H"],["M1L","M1M1","M1M2","M1H"],["LL","LM1","LM2","LH"]]},T={2:["L","H"],3:["L","M","H"],4:["L","M1","M2","H"]},V=e=>({minValue:e.minValue,maxValue:e.maxValue});async function H(n){if(!(n&&n.layer&&n.view&&n.field1&&n.field2))throw new e("relationship-renderer:missing-parameters","'layer', 'view', 'field1' and 'field2' parameters are required");n.forBinning&&f(n,"relationship-renderer");const i={...n};if(i.symbolType=i.symbolType||"2d",i.defaultSymbolEnabled=null==i.defaultSymbolEnabled||i.defaultSymbolEnabled,i.classificationMethod=i.classificationMethod||"quantile",i.numClasses=i.numClasses||3,i.focus=i.focus||null,!M.includes(i.classificationMethod))throw new e("relationship-renderer:invalid-parameters",`classification method ${i.classificationMethod} is not supported`);if(i.numClasses<2||i.numClasses>4)throw new e("relationship-renderer:invalid-parameters","'numClasses' must be 2, 3 or 4");if(n.focus&&!z.includes(n.focus))throw new e("relationship-renderer:invalid-parameters","'focus' must be 'HH', 'HL', 'LH', 'LL' or null");const l=n.forBinning?p:c,r=h(i.layer,l,n.forBinning);if(i.layer=r,!r)throw new e("relationship-renderer:invalid-parameters","'layer' must be one of these types: "+y(l).join(", "));const s=a(i.signal)?{signal:i.signal}:null;await r.load(s);const o=r.geometryType,t=i.symbolType.includes("3d");if(i.outlineOptimizationEnabled="polygon"===o&&i.outlineOptimizationEnabled,i.sizeOptimizationEnabled=("point"===o||"multipoint"===o||"polyline"===o)&&i.sizeOptimizationEnabled,"mesh"===o)i.symbolType="3d-volumetric",i.colorMixMode=i.colorMixMode||"replace",i.edgesType=i.edgesType||"none";else{if("3d-volumetric-uniform"===i.symbolType&&"point"!==o)throw new e("relationship-renderer:not-supported","3d-volumetric-uniform symbols are supported for point layers only");if(t&&"polygon"===o)throw new e("relationship-renderer:not-supported","3d symbols are not supported for polygon layers");if(i.symbolType.includes("3d-volumetric")&&(!i.view||"3d"!==i.view.type))throw new e("relationship-renderer:invalid-parameters","'view' parameter should be an instance of SceneView when 'symbolType' parameter is '3d-volumetric' or '3d-volumetric-uniform'")}const{field1:d,field2:u}=i,b=[d.field,u.field];d.normalizationField&&b.push(d.normalizationField),u.normalizationField&&b.push(u.normalizationField);const w=m(r,b,"relationship-renderer:invalid-parameters");if(w)throw w;return i}async function L(n){if(!(n&&n.renderer&&n.numClasses))throw new e("update-relationship-renderer:missing-parameters","'renderer' and 'numClasses' parameters are required");const{field1:a,field2:i,renderer:l,numClasses:r,colors:s}=n,o=r**2;if((a||i)&&!(a&&i&&a.field&&i.field))throw new e("update-relationship-renderer:missing-parameters","'field1' and 'field2' parameters are required");if(a&&!a.classBreakInfos||i&&!i.classBreakInfos)throw new e("update-relationship-renderer:missing-parameters","'field1.classBreakInfos' and 'field2.classBreakInfos' are required");if(!l.authoringInfo)throw new e("update-relationship-renderer:missing-parameters","'renderer.authoringInfo' is required");if(l.uniqueValueInfos.length!==o)throw new e("update-relationship-renderer:invalid-parameters",`Renderer must have ${o} unique value infos to support ${r} classes`);if(s&&s.length!==o)throw new e("update-relationship-renderer:invalid-parameters",`The scheme must have ${o} colors`);return n}async function k(e){let n=e.relationshipScheme,i=null,l=null;const r=await u(e.basemap,e.view);if(i=a(r.basemapId)?r.basemapId:null,l=a(r.basemapTheme)?r.basemapTheme:null,n)return{scheme:w(n),basemapId:i,basemapTheme:l};const s=v({basemap:i,basemapTheme:l,geometryType:e.geometryType,theme:e.theme,worldScale:e.worldScale,view:e.view});return s&&(n=s.primaryScheme,i=s.basemapId,l=s.basemapTheme),{scheme:n,basemapId:i,basemapTheme:l}}function C(e,a){const i=n(F[e]);return g(i,a)}function E(e,n){return C(e,n).map((e=>({value:e,count:0})))}function x(e,n,a,i){const{field:l,normalizationField:r}=e,{field:s,normalizationField:o}=n,t=a.map((e=>[e.minValue,e.maxValue])),d=i.map((e=>[e.minValue,e.maxValue])),m=t.length,u=T[m];return`\n var field1 = $feature['${l}'];\n var field2 = $feature['${s}'];\n var hasNormField1 = ${r?"true":"false"};\n var hasNormField2 = ${o?"true":"false"};\n var normField1 = ${r?`$feature['${r}']`:"null"};\n var normField2 = ${o?`$feature['${o}']`:"null"};\n\n if (\n IsEmpty(field1) ||\n IsEmpty(field2) ||\n (hasNormField1 && (IsEmpty(normField1) || normField1 == 0)) ||\n (hasNormField2 && (IsEmpty(normField2) || normField2 == 0))\n ) {\n return null;\n }\n\n var value1 = IIf(hasNormField1, (field1 / normField1), field1);\n var value2 = IIf(hasNormField2, (field2 / normField2), field2);\n\n var breaks1 = ${JSON.stringify(t)};\n var breaks2 = ${JSON.stringify(d)};\n var classCodes = ${JSON.stringify(u)};\n\n function getClassCode(value, breaks) {\n var code = null;\n\n for (var i in breaks) {\n var info = breaks[i];\n if (value >= info[0] && value <= info[1]) {\n code = classCodes[i];\n break;\n }\n }\n\n return code;\n }\n\n var code1 = getClassCode(value1, breaks1);\n var code2 = getClassCode(value2, breaks2);\n\n var classValue = IIf(IsEmpty(code1) || IsEmpty(code2), null, code1 + code2);\n return classValue;\n `}async function B(n,a,r){const s=await i("esri/smartMapping/t9n/smartMapping"),{basemap:t,classificationMethod:d,field1:m,field2:u,focus:f,numClasses:p,signal:c}=n,h=n.layer,y=a.classBreakInfos,w=r.classBreakInfos;if(p!==y.length||y.length!==w.length)throw new e("relationship-renderer:error","incompatible class breaks");const v=E(p,f),g=x(n.field1,n.field2,y,w),I=(await k({basemap:t,geometryType:h.geometryType,theme:"default",relationshipScheme:n.relationshipScheme,worldScale:n.symbolType.includes("3d-volumetric"),view:n.view})).scheme,M=await o({layer:h,basemap:t,valueExpression:g,valueExpressionTitle:s.relationship.legendTitle,numTypes:-1,sortEnabled:!1,defaultSymbolEnabled:n.defaultSymbolEnabled,typeScheme:{colors:b(I,p,f),...I},statistics:{uniqueValueInfos:v},legendOptions:n.legendOptions,outlineOptimizationEnabled:n.outlineOptimizationEnabled,sizeOptimizationEnabled:n.sizeOptimizationEnabled,symbolType:n.symbolType,colorMixMode:n.colorMixMode,edgesType:n.edgesType,view:n.view,signal:c}),z=M.renderer,F=z.uniqueValueInfos,T=s.relationship;for(const e of F)e.label=T[e.value];const H=new l({type:"relationship",classificationMethod:d,numClasses:p,focus:f,field1:{field:m.field,normalizationField:m.normalizationField,label:m.label,classBreakInfos:y.map(V)},field2:{field:u.field,normalizationField:u.normalizationField,label:u.label,classBreakInfos:w.map(V)}});return z.authoringInfo=H,{renderer:z,classBreaks:{field1:a,field2:r},uniqueValueInfos:M.uniqueValueInfos,relationshipScheme:I,basemapId:M.basemapId,basemapTheme:M.basemapTheme}}function $(e,n,a){const i=C(n,a);e.sort(((e,n)=>{const a=i.indexOf(e.value),l=i.indexOf(n.value);let r=0;return a<l?r=-1:a>l&&(r=1),r}))}function S(e,n){const{authoringInfo:a}=e;a.numClasses=n.numClasses,a.focus=n.focus||null,a.focus||delete a.focus;const{field1:i,field2:l}=n;a.field1=new s({field:i.field,normalizationField:i.normalizationField,label:i.label,classBreakInfos:i.classBreakInfos.map((e=>new r(V(e))))}),a.field2=new s({field:l.field,normalizationField:l.normalizationField,label:l.label,classBreakInfos:l.classBreakInfos.map((e=>new r(V(e))))}),e.authoringInfo=a}async function q(e){const n=await L(e),{field1:a,field2:i,renderer:l,numClasses:r,focus:s,colors:o}=n,d=l.clone();if(d.valueExpression=x(a,i,a.classBreakInfos,i.classBreakInfos),$(d.uniqueValueInfos,r,s),o){const e=t(o,o.length);d.uniqueValueInfos.forEach(((n,a)=>I(n.symbol,e[a])))}return S(d,n),d}async function O(n){const a=await H(n),{layer:i,classificationMethod:l,field1:r,field2:s,numClasses:o,view:t,signal:m}=a,u={layer:i,classificationMethod:l,field:r.field,normalizationField:r.normalizationField,normalizationType:r.normalizationField?"field":null,minValue:r.minValue,maxValue:r.maxValue,analyzeData:!(null!=r.minValue&&null!=r.maxValue),numClasses:o,view:t,signal:m},f={layer:i,classificationMethod:l,field:s.field,normalizationField:s.normalizationField,normalizationType:s.normalizationField?"field":null,minValue:s.minValue,maxValue:s.maxValue,analyzeData:!(null!=s.minValue&&null!=s.maxValue),numClasses:o,view:t,signal:m},[p,c]=await Promise.all([d(u),d(f)]);if(!p||!c)throw new e("relationship-renderer:error","error when calculating class breaks");return B(a,p.result,c.result)}export{O as createRenderer,q as updateRenderer};
|