UNPKG

@arcgis/core

Version:

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

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