UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.86 kB
import{isSome as t,isNone as e,unwrapOr as n}from"../../../core/maybe.js";import{getMetersPerUnitForSR as a,getMetersPerVerticalUnitForSR as i,convertUnit as l}from"../../../core/unitUtils.js";import{getConfig as o}from"./constants.js";function s(n,s){const r=n.length;if(0===r)return null;const m=n[0],c=m.sampledZ;let h=c,E=c,f=0,g=0,x=null,_=null,S=t(c)?c:0,d=0,C=0,D=t(c)?1:0,N=0,P=0;const H=a(s),Z=i(s),j=o().minSlopeSampleDistance/H,y=2*j,M=new p,w=new p,G=()=>{b(),M.copy(w),w.reset()},L=(t,e)=>{G(),t>0&&t-M.start<=y&&(t=M.start+j),w.restart(t,e)},b=()=>{if(M.isHole||w.isHole)return;const t=w.avgElevation-M.avgElevation,e=w.start-M.start,n=t*Z,a=e*H,i=l(Math.atan2(n,a),"radians","degrees");i>0?(d+=i,x=v(x,i),N++):i<0&&(C-=i,_=v(_,-i),P++)};t(m.sampledZ)&&L(m.distance,m.sampledZ);for(let a=1;a<r;++a){const i=n[a-1],l=n[a],o=l.sampledZ;if(e(o)){w.isHole||G();continue}D++,S+=o,h=u(h,o),E=v(E,o),w.isHole||l.distance-w.start>=j?L(l.distance,o):w.insert(o);const s=i.sampledZ;if(t(s)){const t=o-s;t>0?f+=t:t<0&&(g-=t)}}return G(),0===D?null:{maxDistance:n[r-1].distance,minElevation:h,maxElevation:E,avgElevation:0===D?null:S/D,elevationGain:f,elevationLoss:g,maxPositiveSlope:x,maxNegativeSlope:_,avgPositiveSlope:0===N?null:d/N,avgNegativeSlope:0===P?null:C/P}}function r(e){const n=e.filter(t),a=n.length;if(0===a)return null;const i=n[0];if(1===a)return i;let l=i.maxDistance,o=i.minElevation,s=i.maxElevation,r=i.maxPositiveSlope,m=i.maxNegativeSlope;for(let t=1;t<n.length;++t){const e=n[t];l=v(l,e.maxDistance),o=u(o,e.minElevation),s=v(s,e.maxElevation),r=v(r,e.maxPositiveSlope),m=v(m,e.maxNegativeSlope)}return{maxDistance:l,minElevation:o,maxElevation:s,avgElevation:null,elevationGain:null,elevationLoss:null,maxPositiveSlope:r,maxNegativeSlope:m,avgPositiveSlope:null,avgNegativeSlope:null}}function m(t){let l=null,o=null,s=null;for(const n of t){if(e(n))continue;const{statistics:t,spatialReference:r}=n;if(e(t))continue;const m=a(r);l=v(l,c(t.maxDistance,m));const p=i(r);s=u(s,c(t.minElevation,p)),o=v(o,c(t.maxElevation,p))}return{minDistance:0,maxDistance:n(l,0),minElevation:n(s,0),maxElevation:n(o,0)}}function u(n,a){return e(a)?n:t(n)?Math.min(n,a):a}function v(n,a){return e(a)?n:t(n)?Math.max(n,a):a}function c(e,n){return t(e)&&t(n)?e*n:null}class p{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,e){this._start=t,this._sampleCount=1,this._totalElevation=e}insert(t){++this._sampleCount,this._totalElevation+=t}}export{m as getBoundsInMeters,s as getStatistics,r as mergeStatistics};