@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 5.64 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import e from"../../../core/Error.js";import{pt2px as t}from"../../../core/screenUtils.js";import{millisecondsPerTimeUnit as n}from"../../../core/timeUtils.js";import o from"../../../geometry/Point.js";import r from"../../../geometry/SpatialReference.js";import{quantizePoint as i}from"../../../geometry/support/quantizationUtils.js";import{isWrappable as s,getInfo as l}from"../../../geometry/support/spatialReferenceUtils.js";import a from"../../../layers/support/FieldsIndex.js";import{isTimeOnlyField as u,isNumericField as f,numericTypes as c}from"../../../layers/support/fieldUtils.js";import{createValueFunction as m,evaluateDensityKernel as p}from"../../../renderers/support/heatmapUtils.js";import{isAnyDateField as d,getWhereClause as h}from"../../support/utils.js";import{processNullValue as y,getNormalizedValue as $}from"../../../statistics/utils.js";import{loadArcade as g}from"../../../support/loadArcade.js";let j=null;const w=/^(?<hh>([01][0-9])|(2[0-3])):(?<mm>[0-5][0-9])(:(?<ss>[0-5][0-9]))?(\.(?<ms>\d+))?$/;function x(e,t,n){return e.x<0?e.x+=t:e.x>n&&(e.x-=t),e}function b(e,t,n,r){const a=s(n)?l(n):null,u=a?Math.round((a.valid[1]-a.valid[0])/t.scale[0]):null;return e.map(e=>{const n=new o(e.geometry);return i(t,n,n),e.geometry=a?x(n,u??0,r[0]):n,e})}function I(e,n=18,o,r,i){const s=new Float64Array(r*i);n=Math.round(t(n));let l=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;const u=m(o);for(const{geometry:t,attributes:f}of e){const{x:e,y:o}=t,c=Math.max(0,e-n),m=Math.max(0,o-n),d=Math.min(i,o+n),h=Math.min(r,e+n),y=+u(f);for(let t=m;t<d;t++)for(let i=c;i<h;i++){const u=t*r+i,f=p(i-e,t-o,n)*y,c=s[u]+=f;l=Math.min(l,c),a=Math.max(a,c)}}return{min:l,max:a}}function F(e){const t=w.exec(e);if(!t)return null;const{hh:o,mm:r,ss:i,ms:s}=t.groups;return Number(o)*n.hours+Number(r)*n.minutes+Number(i)*n.seconds+Number(s||0)}async function N(e,t,n=!0){if(!t)return[];const{field:o,field2:i,field3:s,fieldDelimiter:l,sqlExpression:f,fieldInfos:c,timeZone:m}=e,p=o&&c?.find(e=>e.name.toLowerCase()===o.toLowerCase()),w=!!p&&u(p),x=!!p&&d(p),b=e.valueExpression,I=e.normalizationType,N=e.normalizationField,E=e.normalizationTotal,v=[],U=e.viewInfoParams;let M=null,T=null;if(b){if(!j){const{arcadeUtils:e}=await g();j=e}j.hasGeometryOperations(b)&&await j.enableGeometryOperations(),M=j.createFunction(b),T=U?j.getViewInfo({viewingMode:U.viewingMode,scale:U.scale,spatialReference:new r(U.spatialReference)}):null}const z=e.fieldInfos,O=!(t[0]&&"declaredClass"in t[0]&&"esri.Graphic"===t[0].declaredClass)&&z?{fields:z}:null;for await(const r of t){const e=r.attributes;let t;if(f){const e=await h(f,new a(z));e&&(t=e.calculateValue(r.attributes))}else if(b){const e=O?Object.assign({},r,{layer:O}):r,n=j.createExecContext(e,T,m);t=j.executeFunction(M,n)}else e&&(t=e[o],i?(t=`${y(t)}${l}${y(e[i])}`,s&&(t=`${t}${l}${y(e[s])}`)):"string"==typeof t&&n&&(x?t=t?new Date(t).getTime():null:w&&(t=t?F(t):null)));if(I&&"number"==typeof t&&isFinite(t)){const n=e&&parseFloat(e[N]);t=$(t,I,n,E)}v.push(t)}return v}function E(e){const t=e.field,n=e.normalizationType,o=e.normalizationField;let r;return"field"===n?r="(NOT "+o+" = 0)":"log"!==n&&"natural-log"!==n&&"square-root"!==n||(r=`(${t} > 0)`),r}function v(e,t,n){const o=null!=t?e+" >= "+t:"",r=null!=n?e+" <= "+n:"";let i="";return i=o&&r?T(o,r):o||r,i?"("+i+")":""}function U(t,n,o,r){let i;return n?n.name!==t.objectIdField&&r.includes(n.type)||(i=new e(o,"'field' should be one of these types: "+r.join(","))):i=new e(o,"'field' is not defined in the layer schema"),i}function M(t,n,o){let r;return n?n.name!==t.objectIdField&&f(n)||(r=new e(o,"'field' should be one of these numeric types: "+c.join(","))):r=new e(o,"'field' is not defined in the layer schema"),r}function T(e,t){let n=null!=e?e:"";return null!=t&&t&&(n=n?"("+n+") AND ("+t+")":t),n}function z(t,n){if(t&&"intersects"!==t.spatialRelationship)return new e(n,"Only 'intersects' spatialRelationship is supported for featureFilter")}function O(t,n,o){const r=R({layer:t,fields:n});if(r.length)return new e(o,"Unknown fields: "+r.join(", ")+". You can only use fields defined in the layer schema");const i=V({layer:t,fields:n});return i.length?new e(o,"Unsupported fields: "+i.join(", ")+". You can only use fields that can be fetched i.e. AdapterFieldUsageInfo.supportsStatistics must be true"):void 0}function R(e){const t=e.layer;return e.fields.filter(e=>!t.getField(e))}function V(e){const t=e.layer;return e.fields.filter(e=>{const n=t.getFieldUsageInfo(e);return!n||!n.supportsStatistics})}function q(e,t,n){const o=[],r=[],i=[],s=[],l=[];e.forEach((e,t)=>{const a=e.field?"field":"expression",u=e.field||e.valueExpression;e.field?(l.push(u),r.push(`var ${a}${t} = Number($feature["${u}"]);`)):(o.push(`function getValueForExpr${t}() {\n ${u} \n}`),r.push(`var ${a}${t} = Number(getValueForExpr${t}());`)),n||i.push(`${a}${t} = IIf(${a}${t} < 0, 0, ${a}${t});`),s.push(`${a}${t}`)});const a=o.length?null:l.reduce((e,t)=>`${e} + ${t}`);let u=null;t||n?t?n||a&&(u=`(( ${a} ) >= 0)`):a&&(u=`(( ${a} ) <> 0)`):a&&(u=`(( ${a} ) > 0)`);return{valueExpression:[o.length?o.join("\n"):"",r.join("\n"),i.join("\n"),`var total = ${s.join(" + ")};`,"return total;"].filter(Boolean).join("\n\n"),sqlExpression:a,sqlWhere:u}}export{I as calculateHeatmapStats,N as getDataValues,v as getRangeExpr,E as getSQLFilterForNormalization,q as getSumOfAttributesExpr,T as mergeWhereClauses,b as quantizeFeatures,F as timeOnlyToMilliseconds,O as verifyBasicFieldValidity,U as verifyFieldType,z as verifyFilterValidity,M as verifyNumericField};