@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 1.62 kB
JavaScript
import{clamp as t}from"../../../core/mathUtils.js";import{isNone as a}from"../../../core/maybe.js";import{ElevationSamplerData as o}from"../../../layers/support/ElevationSamplerData.js";import{bilerp as r}from"../support/mathUtils.js";import{ELEVATION_NODATA_VALUE as s}from"./TerrainConst.js";class i{constructor(t,a,r){this.type="elevation",this.level=t[0],this.i=t[1],this.j=t[2],this.extent=a,this.samplerData=new o(r,a)}computeMinMaxValue(t,a,o,i){i.min=1/0,i.max=-1/0,i.hasNoDataValues=!1;const e=t-this.level;if(e<=0)return i;const l=2**e;if(!(Math.floor(a/l)===this.i&&Math.floor(o/l)===this.j))return i;let n=1/0,h=-1/0;const m=this.samplerData.data.width,f=this.samplerData.data.values,c=.5*s;let u=(m-1)/l,p=(o-this.j*l)*u,M=(a-this.i*l)*u;if(u<1){const t=Math.floor(p),a=Math.floor(M),o=t+a*m,s=f[o],e=f[o+1],l=f[o+m],n=f[o+m+1];if(s+e+l+n<c){const o=p-t,h=M-a,m=r(s,e,l,n,o,h),f=r(s,e,l,n,o+u,h),c=r(s,e,l,n,o,h+u),x=r(s,e,l,n,o+u,h+u);return i.min=Math.min(m,f,c,x),i.max=Math.max(m,f,c,x),i}p=t,M=a,u=1}else p=Math.floor(p),M=Math.floor(M),u=Math.ceil(u);for(let r=p;r<=p+u;r++)for(let t=M;t<=M+u;t++){const a=f[r+t*m];a<c?(n=Math.min(n,a),h=Math.max(h,a)):i.hasNoDataValues=!0}return i.min=n,i.max=h,i}}const e=.5*s;function l(o,r,s){if(a(s))return null;for(const a of s){if(!a)continue;const s=a.safeWidth;let i=t(a.dy*(a.y1-r),0,s),l=t(a.dx*(o-a.x0),0,s);const n=Math.floor(i),h=Math.floor(l),m=a.data.width,f=n*m+h,c=a.data.values,u=c[f],p=c[f+1],M=f+m,x=c[M],d=c[M+1];if(u+x+p+d<e){i-=n,l-=h;const t=u+(p-u)*l;return t+(x+(d-x)*l-t)*i}}return null}export{i as ElevationData,l as sampleElevation};