UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) • 8.21 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import e from"../../../Color.js";import a from"../../../Graphic.js";import{neverReached as i}from"../../../core/compilerUtils.js";import n from"../../../core/Logger.js";import{meterIn as t}from"../../support/lengthUtils.js";import{isSizeVariable as r,isValidNumber as s,TransformationType as l,InputValueType as o}from"./sizeVariableUtils.js";const c=()=>n.getLogger("esri.renderers.visualVariables.support.visualVariableUtils"),u=e=>c().warn(`The visualVariable should be an instance of esri.renderers.visualVariables.${e}`),f=()=>c().error("Use of arcade expressions requires an arcade context"),p=new a,d=Math.PI,v=/^\s*(return\s+)?\$view\.scale\s*(;)?\s*$/i;function m(a,i,n){const t="visualVariables"in a&&a.visualVariables?a.visualVariables.find((e=>"color"===e.type)):a;if(!t)return;if("esri.renderers.visualVariables.ColorVariable"!==t.declaredClass)return void u("ColorVariable");const r="number"==typeof i,s=r?null:i,l=s?.attributes;let o=r?i:null;const c=t.field,{ipData:p,hasExpression:d}=t.cache;let v=t.cache.compiledFunc;if(!c&&!d){const e=t.stops;return e&&e[0]&&e[0].color}if("number"!=typeof o)if(d){if(null==n?.arcade)return void f();const e={viewingMode:n.viewingMode,scale:n.scale,spatialReference:n.spatialReference},a=n.arcade.arcadeUtils,i=a.getViewInfo(e),r=a.createExecContext(s,i,n.timeZone);if(!v){const e=a.createSyntaxTree(t.valueExpression);v=a.createFunction(e),t.cache.compiledFunc=v}o=a.executeFunction(v,r)}else l&&(o=l[c]);const m=t.normalizationField,b=null!=l&&null!=m?parseFloat(l[m]):void 0;if(null!=o&&(!m||r||!isNaN(b)&&0!==b)){isNaN(b)||r||(o/=b);const a=U(o,p);if(a){const i=a[0],r=a[1],s=i===r?t.stops[i].color:e.blendColors(t.stops[i].color,t.stops[r].color,a[2],null!=n?n.color:void 0);return new e(s)}}}function b(e,a,i){const n="visualVariables"in e&&e.visualVariables?e.visualVariables.find((e=>"opacity"===e.type)):e;if(!n)return;if("esri.renderers.visualVariables.OpacityVariable"!==n.declaredClass)return void u("OpacityVariable");const t="number"==typeof a,r=t?null:a,s=r?.attributes;let l=t?a:null;const o=n.field,{ipData:c,hasExpression:p}=n.cache;let d=n.cache.compiledFunc;if(!o&&!p){const e=n.stops;return e&&e[0]&&e[0].opacity}if("number"!=typeof l)if(p){if(null==i?.arcade)return void f();const e={viewingMode:i.viewingMode,scale:i.scale,spatialReference:i.spatialReference},a=i.arcade.arcadeUtils,t=a.getViewInfo(e),s=a.createExecContext(r,t,i.timeZone);if(!d){const e=a.createSyntaxTree(n.valueExpression);d=a.createFunction(e),n.cache.compiledFunc=d}l=a.executeFunction(d,s)}else s&&(l=s[o]);const v=n.normalizationField,m=null!=s&&null!=v?parseFloat(s[v]):void 0;if(null!=l&&(!v||t||!isNaN(m)&&0!==m)){isNaN(m)||t||(l/=m);const e=U(l,c);if(e){const a=e[0],i=e[1];if(a===i)return n.stops[a].opacity;{const t=n.stops[a].opacity;return t+(n.stops[i].opacity-t)*e[2]}}}}function h(e,a,i){const n="visualVariables"in e&&e.visualVariables?e.visualVariables.find((e=>"rotation"===e.type)):e;if(!n)return;if("esri.renderers.visualVariables.RotationVariable"!==n.declaredClass)return void u("RotationVariable");const t=n.axis||"heading",r="heading"===t&&"arithmetic"===n.rotationType?90:0,s="heading"===t&&"arithmetic"===n.rotationType?-1:1,l="number"==typeof a?null:a,o=l?.attributes,c=n.field,{hasExpression:p}=n.cache;let d=n.cache.compiledFunc,v=0;if(!c&&!p)return v;if(p){if(null==i?.arcade)return void f();const e={viewingMode:i.viewingMode,scale:i.scale,spatialReference:i.spatialReference},a=i.arcade.arcadeUtils,t=a.getViewInfo(e),r=a.createExecContext(l,t,i.timeZone);if(!d){const e=a.createSyntaxTree(n.valueExpression);d=a.createFunction(e),n.cache.compiledFunc=d}v=a.executeFunction(d,r)}else o&&(v=o[c]||0);return v="number"!=typeof v||isNaN(v)?null:r+s*v,v}function V(e,a,i){const n="number"==typeof a,t=n?null:a,r=t?.attributes;let l=n?a:null;const{isScaleDriven:c}=e.cache;let u=e.cache.compiledFunc;if(c){const a=null!=i?i.scale:void 0,n=null!=i?i.view:void 0;l=null==a||"3d"===n?x(e):a}else if(!n)switch(e.inputValueType){case o.Expression:{if(null==i?.arcade)return void f();const a={viewingMode:i.viewingMode,scale:i.scale,spatialReference:i.spatialReference},n=i.arcade.arcadeUtils,r=n.getViewInfo(a),s=n.createExecContext(t,r,i.timeZone);if(!u){const a=n.createSyntaxTree(e.valueExpression);u=n.createFunction(a),e.cache.compiledFunc=u}l=n.executeFunction(u,s);break}case o.Field:r&&(l=r[e.field]);break;case o.Unknown:l=null}if(!s(l))return null;if(n||!e.normalizationField)return l;const p=r?parseFloat(r[e.normalizationField]):null;return s(p)&&0!==p?l/p:null}function x(e){let a=null,i=null;const n=e.stops;return n?(a=n[0].value,i=n[n.length-1].value):(a=e.minDataValue||0,i=e.maxDataValue||0),(a+i)/2}function y(e,a,i){const n="visualVariables"in e&&e.visualVariables?e.visualVariables.find((e=>"size"===e.type)):e;if(!n)return;if("esri.renderers.visualVariables.SizeVariable"!==n.declaredClass)return void u("SizeVariable");const t=k(V(n,a,i),n,a,i,n.cache.ipData);return null==t||isNaN(t)?0:t}function g(e,a,i){return null==e?null:r(e)?y(e,a,i):s(e)?e:null}function w(e,a,i){return s(i)&&e>i?i:s(a)&&e<a?a:e}function z(e,a,i,n){return e+((g(a.minSize,i,n)||a.minDataValue)??0)}function F(e,a,i){const n=e.stops;let t=n?.length&&n[0].size;return null==t&&(t=e.minSize),g(t,a,i)}function S(e,a,i,n){const t=(e-a.minDataValue)/(a.maxDataValue-a.minDataValue),r=g(a.minSize,i,n),s=g(a.maxSize,i,n),l=null!=n?n.shape:void 0;if(e<=a.minDataValue)return r;if(e>=a.maxDataValue)return s;if(null==r||null==s)return null;if("area"===a.scaleBy&&l){const e="circle"===l,a=e?d*(r/2)**2:r*r,i=a+t*((e?d*(s/2)**2:s*s)-a);return e?2*Math.sqrt(i/d):Math.sqrt(i)}return r+t*(s-r)}function E(e,a,i,n){const t=null!=n?n.shape:void 0,r=e/a.minDataValue,s=g(a.minSize,i,n),l=g(a.maxSize,i,n);let o=null;return o="circle"===t?2*Math.sqrt(r*(s/2)**2):"square"===t||"diamond"===t||"image"===t?Math.sqrt(r*s**2):r*s,w(o,s,l)}function C(e,a,i,n,t){const[r,s,l]=U(e,t);if(r===s)return g(a.stops?.[r].size,i,n);{const e=g(a.stops?.[r].size,i,n);return e+(g(a.stops?.[s].size,i,n)-e)*l}}function D(e,a,i,n){const r=(n?.resolution??1)*t[a.valueUnit],s=g(a.minSize,i,n),l=g(a.maxSize,i,n),{valueRepresentation:o}=a;let c=null;return c="area"===o?2*Math.sqrt(e/d)/r:"radius"===o||"distance"===o?2*e/r:e/r,w(c,s,l)}function M(e){return e}function k(e,a,i,n,t){switch(a.transformationType){case l.Additive:return z(e,a,i,n);case l.Constant:return F(a,i,n);case l.ClampedLinear:return S(e,a,i,n);case l.Proportional:return E(e,a,i,n);case l.Stops:return C(e,a,i,n,t);case l.RealWorldSize:return D(e,a,i,n);case l.Identity:return M(e);case l.Unknown:return null}}function N(e,a,i){const{isScaleDriven:n}=e.cache;if(!(n&&"3d"===i||a))return null;const t={scale:a,view:i};let r=g(e.minSize,p,t),s=g(e.maxSize,p,t);if(null!=r||null!=s){if(r>s){const e=s;s=r,r=e}return{minSize:r,maxSize:s}}}function R(e,a,i){if(!e.visualVariables)return;const n=[],t=[],r=[],s=[],l=[];for(const o of e.visualVariables)switch(o.type){case"color":t.push(o);break;case"opacity":r.push(o);break;case"rotation":l.push(o);break;case"size":s.push(o)}return t.forEach((e=>{const t=m(e,a,i);n.push({variable:e,value:t})})),r.forEach((e=>{const t=b(e,a,i);n.push({variable:e,value:t})})),l.forEach((e=>{const t=h(e,a,i);n.push({variable:e,value:t})})),s.forEach((e=>{const t=y(e,a,i);n.push({variable:e,value:t})})),n.filter((e=>null!=e.value))}function U(e,a){if(!a)return;let i=0,n=a.length-1;return a.some(((a,t)=>e<a?(n=t,!0):(i=t,!1))),[i,n,(e-a[i])/(a[n]-a[i])]}function T(e,a,n){const t=["proportional","proportional","proportional"];for(const r of e){const e=r.useSymbolValue?"symbol-value":y(r,a,n);switch(r.axis){case"width":t[0]=e;break;case"depth":t[1]=e;break;case"height":t[2]=e;break;case"width-and-depth":t[0]=e,t[1]=e;break;case"all":case void 0:case null:t[0]=e,t[1]=e,t[2]=e;break;default:i(r.axis)}}return t}export{T as getAllSizes,m as getColor,b as getOpacity,h as getRotationAngle,y as getSize,k as getSizeForValue,g as getSizeFromNumberOrVariable,N as getSizeRangeAtScale,R as getVisualVariableValues,v as viewScaleRE};