ClassBreaksRenderer.js 8.6 KB

12345
  1. /*
  2. All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. See https://js.arcgis.com/4.25/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 i from"../core/Logger.js";import{isNone as r,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 k from"./Renderer.js";import{VisualVariablesMixin as x}from"./mixins/VisualVariablesMixin.js";import I from"./support/ClassBreakInfo.js";import{rendererBackgroundFillSymbolProperty as v,rendererSymbolProperty as B}from"./support/commonProperties.js";import{LegendOptions as S}from"./support/LegendOptions.js";import{loadArcade as F}from"../support/arcadeOnDemand.js";var V;const E="log",j="percent-of-total",z="field",w=new t({esriNormalizeByLog:E,esriNormalizeByPercentOfTotal:j,esriNormalizeByField:z}),T=h(I);let C=V=class extends(x(k)){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 I;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 i=e.map((e=>e.write({},o)));this._areClassBreaksConsecutive()&&i.forEach((e=>delete e.classMinValue)),s[t]=i}castField(e){return null==e?e:"function"==typeof e?(i.getLogger(this.declaredClass).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&&j||null,s&&t&&i.getLogger(this.declaredClass).warn("warning: both normalizationField and normalizationTotal are set!")):e!==z&&e!==j||(e=null),e}set normalizationType(e){this._set("normalizationType",e)}addClassBreakInfo(e,t,i){let r=null;r="number"==typeof e?new I({minValue:e,maxValue:t,symbol:s(i)}):T(o(e)),this.classBreakInfos.push(r),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&&(r(s)||r(s.arcade))&&i.getLogger(this.declaredClass).warn(""),this.valueExpression?this._getBreakIndexForExpression(e,s):this._getBreakIndexForField(e)}async getClassBreakInfo(e,s){let t=s;this.valueExpression&&(r(s)||r(s.arcade))&&(t={...t,arcade:await F()});const o=this.getBreakIndex(e,t);return-1!==o?this.classBreakInfos[o]:null}getSymbol(e,s){if(this.valueExpression&&(r(s)||r(s.arcade)))return void i.getLogger(this.declaredClass).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&&(r(s)||r(s.arcade))){const e=await F(),{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 V({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:i,arcade:r}=a(s,{}),{valueExpression:n}=this;let u=this._compiledValueExpression.valueExpression===n?this._compiledValueExpression.compiledFunction:null;const c=l(r).arcadeUtils;if(!u){const e=c.createSyntaxTree(n);u=c.createFunction(e),this._compiledValueExpression.compiledFunction=u}this._compiledValueExpression.valueExpression=n;const p=c.executeFunction(u,c.createExecContext(e,c.getViewInfo({viewingMode:t,scale:o,spatialReference:i})));return this._getBreakIndexfromInfos(p)}_getBreakIndexForField(e){const s=this.field,t=e.attributes,o=this.normalizationType;let i=parseFloat(t[s]);if(o){const e=this.normalizationTotal,s=parseFloat(this.normalizationField?t[this.normalizationField]:void 0);if(o===E)i=Math.log(i)*Math.LOG10E;else if(o!==j||null==e||isNaN(e)){if(o===z&&!isNaN(s)){if(isNaN(i)||isNaN(s))return-1;i/=s}}else i=i/e*100}return this._getBreakIndexfromInfos(i)}_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(v)],C.prototype,"backgroundFillSymbol",void 0),e([n({type:[I]})],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:w.apiValues,value:null,json:{type:w.jsonValues,read:w.read,write:w.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=V=e([m("esri.renderers.ClassBreaksRenderer")],C);const _=C;export{_ as default};