UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) 4.48 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import"../../../core/has.js";import{JSONMap as t}from"../../../core/jsonMap.js";import e from"../PixelBlock.js";import{mirror as o}from"./mirror.js";const n=new t({1:"min",2:"max",3:"mean",4:"stddev",5:"median",6:"majority",7:"minority"},{useNumericKeys:!0});function s(t,e){const{fillNoDataOnly:o}=e,{band:n,width:s,height:r,mask:i,outBand:l}=t;if(o&&!i)return void l.set(n);const{statisticsType:a,kernelRows:c,kernelCols:f}=e,h="stddev"===a,m=s*r,u=new Float64Array(m),d=new Float64Array(m),y=new Uint32Array(m);for(let A=0;A<r;A++){const t=A*s;let e=0,o=0,r=0;for(let s=0;s<f;s++)i&&!i[t+s]||(e+=n[t+s],h&&(o+=n[t+s]**2),r++);u[t]=e,d[t]=o,y[t]=r;for(let l=1;l<=s-f;l++){const s=t+l-1,a=s+f;i?(i[s]&&(r--,e-=n[s],h&&(o-=n[s]**2)),i[a]&&(r++,e+=n[a],h&&(o+=n[a]**2))):(e-=n[s],e+=n[a],h&&(o-=n[s]**2,o+=n[a]**2)),u[t+l]=e,y[t+l]=r,h&&(d[t+l]=o)}}const k=new Float64Array(m),w=new Float64Array(m),p=new Uint32Array(m),M=c*s;for(let A=0;A<=s-f;A++){let t=0,e=0,o=0;for(let n=0;n<c;n++){const r=n*s+A;t+=u[r],o+=y[r],h&&(e+=d[r])}k[A]=t,w[A]=e,p[A]=o;for(let n=1;n<=r-c;n++){const r=(n-1)*s+A,i=r+M;t-=u[r],t+=u[i],o-=y[r],o+=y[i],h&&(e-=d[r],e+=d[i]),k[n*s+A]=t,w[n*s+A]=e,p[n*s+A]=o}}const g=Math.floor(c/2),b=Math.floor(f/2);for(let A=g;A<r-g;A++){const t=A*s;for(let e=b;e<s-b;e++){const n=(A-g)*s+e-b,r=p[n];if(0===r||o&&(!i||i[t+e]))continue;const a=k[n]/r,c=h?Math.sqrt((w[n]-k[n]*a)/r):a;l[t+e]=c,i&&(i[t+e]=255)}}}function r(t,e){const{fillNoDataOnly:o}=e,{band:n,width:s,height:r,mask:i,outBand:l}=t;if(o&&!i)return void l.set(n);const{kernelRows:a,kernelCols:c,statisticsType:f}=e,h=Math.floor(a/2),m=Math.floor(c/2),u="min"===f,d=l.slice(),y=new Uint32Array(s*r);for(let k=h;k<r-h;k++){const t=k*s;for(let e=m;e<s-m;e++){let o=u?Number.MAX_VALUE:-Number.MAX_VALUE,r=0;for(let l=0;l<a;l++)for(let a=0;a<c;a++){const c=t+e+(l-h)*s+a-m;i&&!i[c]||(o=u?Math.min(o,n[c]):Math.max(o,n[c]),r++)}i?(d[t+e]=0===r?0:o,y[t+e]=r):l[t+e]=0===r?0:o}}if(i)for(let k=h;k<r-h;k++){const t=k*s;for(let e=m;e<s-m;e++)if(y[t+e]){if(o&&i[t+e])continue;l[t+e]=d[t+e],i[t+e]=255}}}function i(t,e){const{fillNoDataOnly:o}=e,{band:n,width:s,height:r,mask:i,outBand:l}=t;if(o&&!i)return void l.set(n);const{kernelRows:a,kernelCols:c}=e,f=Math.floor(a/2),h=Math.floor(c/2),m=l.slice(),u=new Uint32Array(s*r);for(let d=f;d<r-f;d++){const t=d*s;for(let e=h;e<s-h;e++){if(o&&i?.[t+e])continue;const r=[];for(let o=0;o<a;o++)for(let l=0;l<c;l++){const a=t+e+(o-f)*s+l-h;i&&!i[a]||r.push(n[a])}r.length&&(r.sort(((t,e)=>t-e)),i?(m[t+e]=r[Math.floor((r.length-1)/2)],u[t+e]=r.length):l[t+e]=r[Math.floor((r.length-1)/2)])}}if(i)for(let d=f;d<r-f;d++){const t=d*s;for(let e=h;e<s-h;e++)if(u[t+e]){if(o&&i[t+e])continue;l[t+e]=m[t+e],i[t+e]=255}}}function l(t,e){const{fillNoDataOnly:o}=e,{band:n,width:s,height:r,mask:i,outBand:l}=t;if(o&&!i)return void l.set(n);const{kernelRows:a,kernelCols:c}=e,f=Math.floor(a/2),h=Math.floor(c/2),m="majority"===e.statisticsType,u=a*c,d=l.slice(),y=new Uint32Array(s*r);for(let k=f;k<r-f;k++){const t=k*s;for(let e=h;e<s-h;e++){if(o&&i?.[t+e])continue;const r=new Map;for(let o=0;o<a;o++)for(let l=0;l<c;l++){const a=t+e+(o-f)*s+l-h;if(i&&!i[a])continue;const c=n[a];r.set(c,r.has(c)?r.get(c)+1:1)}if(0===r.size)continue;let k=0,w=0,p=m?0:u+1;for(const t of r.keys())w=r.get(t),m===w>p&&(p=w,k=t);i?(d[t+e]=k,y[t+e]=r.size):l[t+e]=k}}if(i)for(let k=f;k<r-f;k++){const t=k*s;for(let e=h;e<s-h;e++)if(y[t+e]){if(o&&i[t+e])continue;l[t+e]=d[t+e],i[t+e]=255}}}function a(t,n){const{mask:a}=t,{fillNoDataOnly:c}=n;if(c&&!a)return t;const{pixels:f,width:h,height:m,bandMasks:u,pixelType:d}=t,y=f.length,k=h*m,w=[],{kernelRows:p,kernelCols:M,statisticsType:g,mirrorEdges:b}=n;if(c&&!a)return t;const A=n.outputPixelType??d,x=[];for(let N=0;N<y;N++){const t=f[N],d=e.createEmptyBand(A,k);c&&d.set(t);const y=u?.[N]??a,j=y?.slice()??null,B={band:t,width:h,height:m,mask:j,outBand:d};switch(g){case"min":case"max":r(B,n);break;case"mean":case"stddev":s(B,n);break;case"median":i(B,n);break;case"majority":case"minority":l(B,n)}b&&!c&&o(d,h,m,p,M),w.push(d),j&&x.push(j)}let j=x[0]??a;x.length!==y&&(x.length=0),y>1&&u?.length&&(j=e.combineBandMasks(u));const B=new e({pixelType:A,width:h,height:m,pixels:w,bandMasks:u&&x.length?x:null,mask:j});return B.updateStatistics(),B}export{a as computeFocalStatistics,n as statisticsTypeMap};