UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) 8.87 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import e from"../../../Color.js";import n from"../../../Graphic.js";import t from"../../../core/Logger.js";import{meterIn as i}from"../../support/lengthUtils.js";import{isValidNumber as r,isSizeVariable as a}from"./sizeVariableUtils.js";const s=()=>t.getLogger("esri.renderers.visualVariables.support.visualVariableUtils"),o=e=>s().warn(`The visualVariable should be an instance of esri.renderers.visualVariables.${e}`),l=()=>s().error("Use of arcade expressions requires an arcade context"),c=new n,u=Math.PI,f=/^\s*(return\s+)?\$view\.scale\s*(;)?\s*$/i;function p(e,n,t){return d(e,n,t)?.output}function d(n,t,i){const a="visualVariables"in n?n.visualVariables?.find(e=>"color"===e.type):n;if(!a)return;if("esri.renderers.visualVariables.ColorVariable"!==a.declaredClass)return void o("ColorVariable");const s="number"==typeof t,l=s?null:t,c=l?.attributes,u=a.field,{ipData:f,hasExpression:p}=a.cache;if(!u&&!p){const e=a.stops;return new I(a,e&&e[0]?e[0].color:void 0,void 0)}const d=h(a,t,i),v=a.normalizationField,m=null!=c&&null!=v?parseFloat(c[v]):void 0;let b=d;if(null!=b&&(!v||s||!isNaN(m)&&0!==m)){r(m)&&!s&&(b/=m);const n=Z(b,f);if(n){const t=n[0],r=n[1],s=t===r?a.stops[t].color:e.blendColors(a.stops[t].color,a.stops[r].color,n[2],null!=i?i.color:void 0);return new I(a,s,d)}}return new I(a,void 0,d)}function h(e,n,t){const i="number"==typeof n,r=i?null:n,a=r?.attributes;if(i)return n;const s=e.field,{hasExpression:o}=e.cache;if(!o)return a?.[s];if(null==t?.arcade)return void l();const c={viewingMode:t.viewingMode,scale:t.scale,spatialReference:t.spatialReference},u=t.arcade.arcadeUtils,f=u.getViewInfo(c),p=u.createExecContext(r,f,t.timeZone);if(!e.cache.compiledFunc){const n=u.createSyntaxTree(e.valueExpression);e.cache.compiledFunc=u.createFunction(n)}return u.executeFunction(e.cache.compiledFunc,p)}function v(e,n,t){return m(e,n,t)?.output}function m(e,n,t){const i="visualVariables"in e?e.visualVariables?.find(e=>"opacity"===e.type):e;if(!i)return;if("esri.renderers.visualVariables.OpacityVariable"!==i.declaredClass)return void o("OpacityVariable");const a="number"==typeof n,s=a?null:n,l=s?.attributes,c=i.field,{ipData:u,hasExpression:f}=i.cache;if(!c&&!f){const e=i.stops;return new I(i,e&&e[0]?e[0].opacity:void 0,void 0)}const p=b(i,n,t),d=i.normalizationField,h=null!=l&&null!=d?parseFloat(l[d]):void 0;let v=p;if(null!=v&&(!d||a||!isNaN(h)&&0!==h)){r(h)&&!a&&(v/=h);const e=Z(v,u);if(e){const n=e[0],t=e[1];if(n===t)return new I(i,i.stops[n].opacity,p);const r=i.stops[n].opacity,a=i.stops[t].opacity;return new I(i,r+(a-r)*e[2],p)}}return new I(i,void 0,p)}function b(e,n,t){const i="number"==typeof n;if(i)return n;const r=i?null:n,a=r?.attributes,s=e.field,{hasExpression:o}=e.cache;if(!o)return a?.[s];if(null==t?.arcade)return void l();const c={viewingMode:t.viewingMode,scale:t.scale,spatialReference:t.spatialReference},u=t.arcade.arcadeUtils,f=u.getViewInfo(c),p=u.createExecContext(r,f,t.timeZone);if(!e.cache.compiledFunc){const n=u.createSyntaxTree(e.valueExpression);e.cache.compiledFunc=u.createFunction(n)}return u.executeFunction(e.cache.compiledFunc,p)}function x(e,n,t){return V(e,n,t)?.output}function V(e,n,t){const i="visualVariables"in e?e.visualVariables?.find(e=>"rotation"===e.type):e;if(!i)return;if("esri.renderers.visualVariables.RotationVariable"!==i.declaredClass)return void o("RotationVariable");const r=i.axis||"heading",a="heading"===r&&"arithmetic"===i.rotationType?90:0,s="heading"===r&&"arithmetic"===i.rotationType?-1:1,l=i.field,{hasExpression:c}=i.cache;if(!l&&!c)return;const u=w(i,n,t);let f=u;return f="number"!=typeof f||isNaN(f)?null:a+s*f,new I(i,f,u)}function w(e,n,t){const{hasExpression:i}=e.cache;if("number"==typeof n)return n;const r=n?.attributes,a=e.field;if(!i)return r?.[a];if(null==t?.arcade)return void l();const s={viewingMode:t.viewingMode,scale:t.scale,spatialReference:t.spatialReference},o=t.arcade.arcadeUtils,c=o.getViewInfo(s),u=o.createExecContext(n,c,t.timeZone);if(!e.cache.compiledFunc){const n=o.createSyntaxTree(e.valueExpression);e.cache.compiledFunc=o.createFunction(n)}return o.executeFunction(e.cache.compiledFunc,u)}function y(e,n,t){const i="number"==typeof n,a=i?null:n,s=a?.attributes;let o=i?n:null;const{isScaleDriven:c}=e.cache;let u=e.cache.compiledFunc;if(c){const n=null!=t?t.scale:void 0,i=null!=t?t.view:void 0;o=null==n||"3d"===i?g(e):n}else if(!i)switch(e.inputValueType){case"expression":{if(null==t?.arcade)return void l();const n={viewingMode:t.viewingMode,scale:t.scale,spatialReference:t.spatialReference},i=t.arcade.arcadeUtils,r=i.getViewInfo(n),s=i.createExecContext(a,r,t.timeZone);if(!u){const n=i.createSyntaxTree(e.valueExpression);u=i.createFunction(n),e.cache.compiledFunc=u}o=i.executeFunction(u,s);break}case"field":s&&(o=s[e.field]);break;case"unknown":o=null}return r(o)?o:null}function g(e){let n=null,t=null;const i=e.stops;return i?(n=i[0].value,t=i[i.length-1].value):(n=e.minDataValue||0,t=e.maxDataValue||0),(n+t)/2}function z(e,n,t){return F(e,n,t)?.output}function F(e,n,t){const i="visualVariables"in e?e.visualVariables?.find(e=>"size"===e.type):e;if(!i)return;if("esri.renderers.visualVariables.SizeVariable"!==i.declaredClass)return void o("SizeVariable");const a=y(i,n,t);let s=a;if(null!=s&&"number"!=typeof n&&n&&i.normalizationField){const e=n.attributes,t=parseFloat(e?.[i.normalizationField]);if(!r(t)||0===t)return;s/=t}const l=N(s,i,n,t,i.cache.ipData);return new I(i,null==l||isNaN(l)?void 0:l,a)}function S(e,n,t){return null==e?null:a(e)?z(e,n,t):r(e)?e:null}function E(e,n,t){return r(t)&&e>t?t:r(n)&&e<n?n:e}function M(e,n,t,i){const r=S(n.minSize,t,i)||n.minDataValue;return null==e&&null==r?null:(e??0)+(r??0)}function k(e,n,t){const i=e.stops;let r=i?.length&&i[0].size;return null==r&&(r=e.minSize),S(r,n,t)}function C(e,n,t,i){const r=S(n.minSize,t,i);if(null==e)return r;const{minDataValue:a,maxDataValue:s}=n;if(null==a||null==s)return null;const o=(e-a)/(s-a),l=S(n.maxSize,t,i),c=null!=i?i.shape:void 0;if(e<=a)return r;if(e>=s)return l;if(null==r||null==l)return null;if("area"===n.scaleBy&&c){const e="circle"===c,n=e?u*(r/2)**2:r*r,t=n+o*((e?u*(l/2)**2:l*l)-n);return e?2*Math.sqrt(t/u):Math.sqrt(t)}return r+o*(l-r)}function D(e,n,t,i){const r=S(n.minSize,t,i);if(null==e||null==r)return r;const a=null!=i?i.shape:void 0,{minDataValue:s}=n;if(null==s)return null;const o=e/s,l=S(n.maxSize,t,i);let c=null;return c="circle"===a?2*Math.sqrt(o*(r/2)**2):"square"===a||"diamond"===a||"image"===a?Math.sqrt(o*r**2):o*r,E(c,r,l)}function R(e,n,t,i,r){if(null==e)return null;const[a,s,o]=Z(e,r);if(a===s)return S(n.stops?.[a].size,t,i);{const e=S(n.stops?.[a].size,t,i),r=S(n.stops?.[s].size,t,i);return null==e||null==r?null:e+(r-e)*o}}function T(e,n,t,r){const a=(r?.resolution??1)*i[n.valueUnit],s=S(n.minSize,t,r),o=S(n.maxSize,t,r),{valueRepresentation:l}=n;if(null==e)return s;let c=null;return c="area"===l?2*Math.sqrt(e/u)/a:"radius"===l||"distance"===l?2*e/a:e/a,E(c,s,o)}function U(e){return e}function N(e,n,t,i,r){switch(n.transformationType){case"additive":return M(e,n,t,i);case"constant":return k(n,t,i);case"clamped-linear":return C(e,n,t,i);case"proportional":return D(e,n,t,i);case"stops":return R(e,n,t,i,r);case"real-world-size":return T(e,n,t,i);case"identity":return U(e);case"unknown":return null}}function q(e,n,t){const{isScaleDriven:i}=e.cache;if(!(i&&"3d"===t||n))return null;const r={scale:n,view:t};let a=S(e.minSize,c,r),s=S(e.maxSize,c,r);if(null!=a||null!=s){if(a>s){const e=s;s=a,a=e}return{minSize:a,maxSize:s}}}function j(e,n,t){if(!e.visualVariables)return;const i=[],r=[],a=[],s=[],o=[];for(const l of e.visualVariables)switch(l.type){case"color":r.push(l);break;case"opacity":a.push(l);break;case"rotation":o.push(l);break;case"size":s.push(l)}return r.forEach(e=>{const r=d(e,n,t);r&&i.push(r)}),a.forEach(e=>{const r=m(e,n,t);r&&i.push(r)}),o.forEach(e=>{const r=V(e,n,t);r&&i.push(r)}),s.forEach(e=>{const r=F(e,n,t);r&&i.push(r)}),i}class I{get type(){return this.variable.type}constructor(e,n,t){this.variable=e,this.output=n,this.input=t}}function Z(e,n){if(!n)return;let t=0,i=n.length-1;return n.some((n,r)=>e<n?(i=r,!0):(t=r,!1)),[t,i,(e-n[t])/(n[i]-n[t])]}function $(e,n,t){const i=["proportional","proportional","proportional"];for(const r of e){const e=r.useSymbolValue?"symbol-value":z(r,n,t)??"proportional";switch(r.axis){case"width":i[0]=e;break;case"depth":i[1]=e;break;case"height":i[2]=e;break;case"width-and-depth":i[0]=e,i[1]=e;break;case"all":case void 0:case null:i[0]=e,i[1]=e,i[2]=e;break;default:r.axis}}return i}export{I as VisualVariableValueResult,$ as getAllSizes,p as getColor,v as getOpacity,x as getRotationAngle,z as getSize,N as getSizeForValue,S as getSizeFromNumberOrVariable,q as getSizeRangeAtScale,j as getVisualVariableValues,f as viewScaleRE};