UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) 3.02 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import{isSome as t}from"../../../core/arrayUtils.js";import{getMetersPerUnitForSR as n,getMetersPerVerticalUnitForSR as e,convertUnit as l}from"../../../core/unitUtils.js";import{getConfig as a}from"./constants.js";function i(t,i){const o=t.length;if(0===o)return null;const s=t[0],m=s.sampledZ;let c=m,p=m,h=0,E=0,f=null,g=null,x=null!=m?m:0,_=0,S=0,d=null!=m?1:0,C=0,D=0;const N=n(i),P=e(i),H=a().minSlopeSampleDistance/N,Z=2*H,j=new v,y=new v,M=()=>{G(),j.copy(y),y.reset()},w=(t,n)=>{M(),t>0&&t-j.start<=Z&&(t=j.start+H),y.restart(t,n)},G=()=>{if(j.isHole||y.isHole)return;const t=y.avgElevation-j.avgElevation,n=y.start-j.start,e=t*P,a=n*N,i=l(Math.atan2(e,a),"radians","degrees");i>0?(_+=i,f=u(f,i),C++):i<0&&(S-=i,g=u(g,-i),D++)};null!=s.sampledZ&&w(s.distance,s.sampledZ);for(let n=1;n<o;++n){const e=t[n-1],l=t[n],a=l.sampledZ;if(null==a){y.isHole||M();continue}d++,x+=a,c=r(c,a),p=u(p,a),y.isHole||l.distance-y.start>=H?w(l.distance,a):y.insert(a);const i=e.sampledZ;if(null!=i){const t=a-i;t>0?h+=t:t<0&&(E-=t)}}return M(),0===d?null:{maxDistance:t[o-1].distance,minElevation:c,maxElevation:p,avgElevation:0===d?null:x/d,elevationGain:h,elevationLoss:E,maxPositiveSlope:f,maxNegativeSlope:g,avgPositiveSlope:0===C?null:_/C,avgNegativeSlope:0===D?null:S/D}}function o(n){const e=n.filter(t),l=e.length;if(0===l)return null;const a=e[0];if(1===l)return a;let i=a.maxDistance,o=a.minElevation,s=a.maxElevation,m=a.maxPositiveSlope,v=a.maxNegativeSlope;for(let t=1;t<e.length;++t){const n=e[t];i=u(i,n.maxDistance),o=r(o,n.minElevation),s=u(s,n.maxElevation),m=u(m,n.maxPositiveSlope),v=u(v,n.maxNegativeSlope)}return{maxDistance:i,minElevation:o,maxElevation:s,avgElevation:null,elevationGain:null,elevationLoss:null,maxPositiveSlope:m,maxNegativeSlope:v,avgPositiveSlope:null,avgNegativeSlope:null}}function s(t){let l=null,a=null,i=null;for(const o of t){if(null==o)continue;const{statistics:t,spatialReference:s}=o;if(null==t)continue;const v=n(s);l=u(l,m(t.maxDistance,v));const c=e(s);i=r(i,m(t.minElevation,c)),a=u(a,m(t.maxElevation,c))}return{minDistance:0,maxDistance:l??0,minElevation:i??0,maxElevation:a??0}}function r(t,n){return null==n?t:null!=t?Math.min(t,n):n}function u(t,n){return null==n?t:null!=t?Math.max(t,n):n}function m(t,n){return null!=t&&null!=n?t*n:null}class v{constructor(){this._start=0,this._totalElevation=0,this._sampleCount=0}get avgElevation(){return this._totalElevation/this._sampleCount}get isHole(){return 0===this._sampleCount}get start(){return this._start}copy(t){this._start=t._start,this._sampleCount=t._sampleCount,this._totalElevation=t._totalElevation}reset(){this._start=0,this._sampleCount=0,this._totalElevation=0}restart(t,n){this._start=t,this._sampleCount=1,this._totalElevation=n}insert(t){++this._sampleCount,this._totalElevation+=t}}export{s as getBoundsInMeters,i as getStatistics,o as mergeStatistics};