ClassBreaksRenderer.js 8.5 KB

12345
  1. /*
  2. All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. See https://js.arcgis.com/4.24/esri/copyright.txt for details.
  4. */
  5. import{_ as e}from"../chunks/tslib.es6.js";import{ensureType as s}from"../symbols.js";import{JSONMap as t}from"../core/jsonMap.js";import{clone as o}from"../core/lang.js";import r from"../core/Logger.js";import{isNone as i,unwrapOr as a,unwrap as l}from"../core/maybe.js";import{property as n}from"../core/accessorSupport/decorators/property.js";import{cast as u}from"../core/accessorSupport/decorators/cast.js";import{enumeration as c}from"../core/accessorSupport/decorators/enumeration.js";import{reader as p}from"../core/accessorSupport/decorators/reader.js";import{subclass as m}from"../core/accessorSupport/decorators/subclass.js";import{writer as d}from"../core/accessorSupport/decorators/writer.js";import{ensureType as h,ensureString as f,ensureNumber as y}from"../core/accessorSupport/ensureType.js";import{collectArcadeFieldNames as g,collectField as b}from"../layers/support/fieldUtils.js";import x from"./Renderer.js";import{VisualVariablesMixin as k}from"./mixins/VisualVariablesMixin.js";import v from"./support/ClassBreakInfo.js";import{rendererBackgroundFillSymbolProperty as I,rendererSymbolProperty as B}from"./support/commonProperties.js";import{LegendOptions as S}from"./support/LegendOptions.js";import{loadArcade as V}from"../support/arcadeOnDemand.js";var F;const E=r.getLogger("esri.renderers.ClassBreaksRenderer"),j="log",w="percent-of-total",z="field",T=new t({esriNormalizeByLog:j,esriNormalizeByPercentOfTotal:w,esriNormalizeByField:z}),_=h(v);let C=F=class extends(k(x)){constructor(e){super(e),this._compiledValueExpression={valueExpression:null,compiledFunction:null},this.backgroundFillSymbol=null,this.classBreakInfos=null,this.defaultLabel=null,this.defaultSymbol=null,this.field=null,this.isMaxInclusive=!0,this.legendOptions=null,this.normalizationField=null,this.normalizationTotal=null,this.type="class-breaks",this.valueExpression=null,this.valueExpressionTitle=null,this._set("classBreakInfos",[])}readClassBreakInfos(e,s,t){if(!Array.isArray(e))return;let o=s.minValue;return e.map((e=>{const s=new v;return s.read(e,t),null==s.minValue&&(s.minValue=o),null==s.maxValue&&(s.maxValue=s.minValue),o=s.maxValue,s}))}writeClassBreakInfos(e,s,t,o){const r=e.map((e=>e.write({},o)));this._areClassBreaksConsecutive()&&r.forEach((e=>delete e.classMinValue)),s[t]=r}castField(e){return null==e?e:"function"==typeof e?(E.error(".field: field must be a string value"),null):f(e)}get minValue(){return this.classBreakInfos&&this.classBreakInfos[0]&&this.classBreakInfos[0].minValue||0}get normalizationType(){let e=this._get("normalizationType");const s=!!this.normalizationField,t=null!=this.normalizationTotal;return s||t?(e=s&&z||t&&w||null,s&&t&&E.warn("warning: both normalizationField and normalizationTotal are set!")):e!==z&&e!==w||(e=null),e}set normalizationType(e){this._set("normalizationType",e)}addClassBreakInfo(e,t,r){let i=null;i="number"==typeof e?new v({minValue:e,maxValue:t,symbol:s(r)}):_(o(e)),this.classBreakInfos.push(i),1===this.classBreakInfos.length&&this.notifyChange("minValue")}removeClassBreakInfo(e,s){const t=this.classBreakInfos.length;for(let o=0;o<t;o++){const t=[this.classBreakInfos[o].minValue,this.classBreakInfos[o].maxValue];if(t[0]===e&&t[1]===s){this.classBreakInfos.splice(o,1);break}}}getBreakIndex(e,s){return this.valueExpression&&(i(s)||i(s.arcade))&&E.warn(""),this.valueExpression?this._getBreakIndexForExpression(e,s):this._getBreakIndexForField(e)}async getClassBreakInfo(e,s){let t=s;this.valueExpression&&(i(s)||i(s.arcade))&&(t={...t,arcade:await V()});const o=this.getBreakIndex(e,t);return-1!==o?this.classBreakInfos[o]:null}getSymbol(e,s){if(this.valueExpression&&(i(s)||i(s.arcade)))return void E.error("#getSymbol()","Please use getSymbolAsync if valueExpression is used");const t=this.getBreakIndex(e,s);return t>-1?this.classBreakInfos[t].symbol:this.defaultSymbol}async getSymbolAsync(e,s){let t=s;if(this.valueExpression&&(i(s)||i(s.arcade))){const e=await V(),{arcadeUtils:s}=e;s.hasGeometryOperations(this.valueExpression)&&await s.enableGeometryOperations(),t={...t,arcade:e}}const o=this.getBreakIndex(e,t);return o>-1?this.classBreakInfos[o].symbol:this.defaultSymbol}getSymbols(){const e=[];return this.classBreakInfos.forEach((s=>{s.symbol&&e.push(s.symbol)})),this.defaultSymbol&&e.push(this.defaultSymbol),e}getAttributeHash(){return this.visualVariables&&this.visualVariables.reduce(((e,s)=>e+s.getAttributeHash()),"")}getMeshHash(){const e=JSON.stringify(this.backgroundFillSymbol),s=JSON.stringify(this.defaultSymbol),t=`${this.normalizationField}.${this.normalizationType}.${this.normalizationTotal}`;return`${e}.${s}.${this.classBreakInfos.reduce(((e,s)=>e+s.getMeshHash()),"")}.${t}.${this.field}.${this.valueExpression}`}get arcadeRequired(){return this.arcadeRequiredForVisualVariables||!!this.valueExpression}clone(){return new F({field:this.field,backgroundFillSymbol:this.backgroundFillSymbol&&this.backgroundFillSymbol.clone(),defaultLabel:this.defaultLabel,defaultSymbol:this.defaultSymbol&&this.defaultSymbol.clone(),valueExpression:this.valueExpression,valueExpressionTitle:this.valueExpressionTitle,classBreakInfos:o(this.classBreakInfos),isMaxInclusive:this.isMaxInclusive,normalizationField:this.normalizationField,normalizationTotal:this.normalizationTotal,normalizationType:this.normalizationType,visualVariables:o(this.visualVariables),legendOptions:o(this.legendOptions),authoringInfo:this.authoringInfo&&this.authoringInfo.clone()})}async collectRequiredFields(e,s){const t=[this.collectVVRequiredFields(e,s),this.collectSymbolFields(e,s)];await Promise.all(t)}async collectSymbolFields(e,s){const t=[...this.getSymbols().map((t=>t.collectRequiredFields(e,s))),g(e,s,this.valueExpression)];b(e,s,this.field),b(e,s,this.normalizationField),await Promise.all(t)}_getBreakIndexForExpression(e,s){const{viewingMode:t,scale:o,spatialReference:r,arcade:i}=a(s,{});let n=this._compiledValueExpression.valueExpression===this.valueExpression?this._compiledValueExpression.compiledFunction:null;const u=l(i).arcadeUtils;if(!n){const e=u.createSyntaxTree(this.valueExpression);n=u.createFunction(e),this._compiledValueExpression.compiledFunction=n}this._compiledValueExpression.valueExpression=this.valueExpression;const c=u.executeFunction(n,u.createExecContext(e,u.getViewInfo({viewingMode:t,scale:o,spatialReference:r})));return this._getBreakIndexfromInfos(c)}_getBreakIndexForField(e){const s=this.field,t=e.attributes,o=this.normalizationType;let r=parseFloat(t[s]);if(o){const e=this.normalizationTotal,s=parseFloat(t[this.normalizationField]);if(o===j)r=Math.log(r)*Math.LOG10E;else if(o!==w||isNaN(e)){if(o===z&&!isNaN(s)){if(isNaN(r)||isNaN(s))return-1;r/=s}}else r=r/e*100}return this._getBreakIndexfromInfos(r)}_getBreakIndexfromInfos(e){const s=this.isMaxInclusive;if(null!=e&&"number"==typeof e&&!isNaN(e))for(let t=0;t<this.classBreakInfos.length;t++){const o=[this.classBreakInfos[t].minValue,this.classBreakInfos[t].maxValue];if(o[0]<=e&&(s?e<=o[1]:e<o[1]))return t}return-1}_areClassBreaksConsecutive(){const e=this.classBreakInfos,s=e.length;for(let t=1;t<s;t++)if(e[t-1].maxValue!==e[t].minValue)return!1;return!0}};e([n(I)],C.prototype,"backgroundFillSymbol",void 0),e([n({type:[v]})],C.prototype,"classBreakInfos",void 0),e([p("classBreakInfos")],C.prototype,"readClassBreakInfos",null),e([d("classBreakInfos")],C.prototype,"writeClassBreakInfos",null),e([n({type:String,json:{write:!0}})],C.prototype,"defaultLabel",void 0),e([n(B)],C.prototype,"defaultSymbol",void 0),e([n({type:String,json:{write:!0}})],C.prototype,"field",void 0),e([u("field")],C.prototype,"castField",null),e([n({type:Boolean})],C.prototype,"isMaxInclusive",void 0),e([n({type:S,json:{write:!0}})],C.prototype,"legendOptions",void 0),e([n({type:Number,readOnly:!0,value:null,json:{read:!1,write:{overridePolicy(){return 0!==this.classBreakInfos.length&&this._areClassBreaksConsecutive()?{enabled:!0}:{enabled:!1}}}}})],C.prototype,"minValue",null),e([n({type:String,json:{write:!0}})],C.prototype,"normalizationField",void 0),e([n({type:Number,cast:e=>y(e),json:{write:!0}})],C.prototype,"normalizationTotal",void 0),e([n({type:T.apiValues,value:null,json:{type:T.jsonValues,read:T.read,write:T.write}})],C.prototype,"normalizationType",null),e([c({classBreaks:"class-breaks"})],C.prototype,"type",void 0),e([n({type:String,json:{write:!0}})],C.prototype,"valueExpression",void 0),e([n({type:String,json:{write:!0}})],C.prototype,"valueExpressionTitle",void 0),C=F=e([m("esri.renderers.ClassBreaksRenderer")],C);const N=C;export{N as default};