@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 5.83 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import{JSONMap as t}from"../../../core/jsonMap.js";import n from"../PixelBlock.js";import{isIntegerPixelType as e,clipBandToPixelTypeRange as r}from"../rasterFormats/pixelRangeUtils.js";import{calculateCustomBandIndex as a}from"./customBandIndexUtils.js";import{isValidPixelBlock as o}from"./pixelUtils.js";const i=new t({0:"custom",1:"ndvi",2:"savi",3:"tsavi",4:"msavi",5:"gemi",6:"pvi",7:"gvitm",8:"sultan",9:"vari",10:"gndvi",11:"sr",12:"ndvi-re",13:"sr-re",14:"mtvi2",15:"rtvi-core",16:"ci-re",17:"ci-g",18:"ndwi",19:"evi",20:"iron-oxide",21:"ferrous-minerals",22:"clay-minerals",23:"wndwi",24:"bai",25:"nbr",26:"ndbi",27:"ndmi",28:"ndsi",29:"mndwi"},{useNumericKeys:!0});function s(t,i){if(!o(t))return t;const{equation:s,method:l}=i,c=i.bandIndexes.map((t=>t-1)),{pixels:U,mask:q}=t;let M;switch(l){case"gndvi":case"nbr":case"ndbi":case"ndvi":case"ndvi-re":case"ndsi":case"ndmi":case"mndwi":M=u(q,U[c[0]],U[c[1]]);break;case"ndwi":M=u(q,U[c[1]],U[c[0]]);break;case"sr":case"sr-re":case"iron-oxide":case"ferrous-minerals":case"clay-minerals":M=f(q,U[c[0]],U[c[1]]);break;case"ci-g":case"ci-re":M=h(q,U[c[0]],U[c[1]]);break;case"savi":M=w(q,U[c[0]],U[c[1]],c[2]+1);break;case"tsavi":M=m(q,U[c[0]],U[c[1]],c[2]+1,c[3]+1,c[4]+1);break;case"msavi":M=d(q,U[c[0]],U[c[1]]);break;case"gemi":M=g(q,U[c[0]],U[c[1]]);break;case"pvi":M=y(q,U[c[0]],U[c[1]],c[2]+1,c[3]+1);break;case"gvitm":M=p(q,[U[c[0]],U[c[1]],U[c[2]],U[c[3]],U[c[4]],U[c[5]]]);break;case"sultan":M=b(q,[U[c[0]],U[c[1]],U[c[2]],U[c[3]],U[c[4]]]);break;case"vari":M=v(q,[U[c[0]],U[c[1]],U[c[2]]]);break;case"mtvi2":M=k(q,[U[c[0]],U[c[1]],U[c[2]]]);break;case"rtvi-core":M=A(q,[U[c[0]],U[c[1]],U[c[2]]]);break;case"evi":M=F(q,[U[c[0]],U[c[1]],U[c[2]]]);break;case"wndwi":M=x(q,[U[c[0]],U[c[1]],U[c[2]]],c[3]?c[3]+1:.5);break;case"bai":M=j(q,U[c[0]],U[c[1]]);break;case"custom":M=a(q,U,s);break;default:return t}const{outputPixelType:B="f32"}=i,T=null!=B&&e(B);let I;q?(I=new Uint8Array(t.width*t.height),I.set(q)):T&&(I=new Uint8Array(t.width*t.height).fill(255)),T&&(M=M.map((t=>{const e=n.createEmptyBand(B,t.length);return r(t,I,B,e),e})));const P=new n({width:t.width,height:t.height,pixelType:B,pixels:M,mask:I});return P.updateStatistics(),P}function l(t,e,r,a){const{mask:o,pixels:i,width:s,height:l}=t,c=i[r],u=i[e],f=u.length,h=a?new Uint8Array(f):new Float32Array(f),w=a?100:1,m=a?100.5:0;for(let n=0;n<f;n++)if(null==o||o[n]){const t=c[n],e=u[n],r=t+e;r&&(h[n]=(t-e)/r*w+m)}const d=new n({width:s,height:l,mask:o,pixelType:a?"u8":"f32",pixels:[h]});return d.updateStatistics(),d}function c(t){const n=new Float32Array(9);return n[3*t[0]]=1,n[3*t[1]+1]=1,n[3*t[2]+2]=1,n}function u(t,n,e){const r=e.length,a=new Float32Array(r);for(let o=0;o<r;o++)if(null==t||t[o]){const t=n[o],r=e[o],i=t+r;i&&(a[o]=(t-r)/i)}return[a]}function f(t,n,e){const r=e.length,a=new Float32Array(r);for(let o=0;o<r;o++)if(null==t||t[o]){const t=n[o],r=e[o];r&&(a[o]=t/r)}return[a]}function h(t,n,e){const r=n.length,a=new Float32Array(r);for(let o=0;o<r;o++)if(null==t||t[o]){const t=n[o],r=e[o];r&&(a[o]=t/r-1)}return[a]}function w(t,n,e,r){const a=e.length,o=new Float32Array(a);for(let i=0;i<a;i++)if(null==t||t[i]){const t=e[i],a=n[i],s=a+t+r;s&&(o[i]=(a-t)/s*(1+r))}return[o]}function m(t,n,e,r,a,o){const i=e.length,s=new Float32Array(i),l=-a*r+o*(1+r*r);for(let c=0;c<i;c++)if(null==t||t[c]){const t=e[c],o=n[c],i=a*o+t+l;i&&(s[c]=r*(o-r*t-a)/i)}return[s]}function d(t,n,e){const r=e.length,a=new Float32Array(r);for(let o=0;o<r;o++)if(null==t||t[o]){const t=e[o],r=n[o],i=2*r+1;a[o]=.5*(i-Math.sqrt(i*i-8*(r-t)))}return[a]}function g(t,n,e){const r=e.length,a=new Float32Array(r);for(let o=0;o<r;o++)if(null==t||t[o]){const t=e[o],r=n[o];if(1!==t&&r+t+.5!==0){const n=(2*(r*r-t*t)+1.5*r+.5*t)/(r+t+.5);a[o]=n*(1-.25*n)-(t-.125)/(1-t)}}return[a]}function y(t,n,e,r,a){const o=e.length,i=new Float32Array(o),s=1/Math.sqrt(1+r*r);for(let l=0;l<o;l++)if(null==t||t[l]){const t=e[l],o=n[l];i[l]=(o-r*t-a)*s}return[i]}function p(t,n){const[e,r,a,o,i,s]=n,l=e.length,c=new Float32Array(l);for(let u=0;u<l;u++)(null==t||t[u])&&(c[u]=-.2848*e[u]-.2435*r[u]-.5436*a[u]+.7243*o[u]+.084*i[u]-.18*s[u]);return[c]}function b(t,n){const[e,r,a,o,i]=n,s=e.length,l=new Float32Array(s),c=new Float32Array(s),u=new Float32Array(s);for(let f=0;f<s;f++)(null==t||t[f])&&(l[f]=i[f]?o[f]/i[f]*100:0,c[f]=e[f]?o[f]/e[f]*100:0,u[f]=a[f]?r[f]/a[f]*(o[f]/a[f])*100:0);return[l,c,u]}function v(t,n){const[e,r,a]=n,o=e.length,i=new Float32Array(o);for(let s=0;s<o;s++)if(null==t||t[s])for(s=0;s<o;s++){const t=e[s],n=r[s],o=n+t-a[s];o&&(i[s]=(n-t)/o)}return[i]}function k(t,n){const[e,r,a]=n,o=e.length,i=new Float32Array(o);for(let s=0;s<o;s++)if(null==t||t[s])for(s=0;s<o;s++){const t=e[s],n=r[s],o=a[s],l=Math.sqrt((2*t+1)**2-(6*t-5*Math.sqrt(n))-.5);if(l){const e=1.5*(1.2*(t-o)-2.5*(n-o));i[s]=e/l}}return[i]}function A(t,n){const[e,r,a]=n,o=e.length,i=new Float32Array(o);for(let s=0;s<o;s++)if(null==t||t[s])for(s=0;s<o;s++){const t=e[s],n=r[s],o=a[s];i[s]=100*(t-n)-10*(t-o)}return[i]}function F(t,n){const[e,r,a]=n,o=e.length,i=new Float32Array(o);for(let s=0;s<o;s++)if(null==t||t[s])for(s=0;s<o;s++){const t=e[s],n=r[s],o=t+6*n-7.5*a[s]+1;o&&(i[s]=2.5*(t-n)/o)}return[i]}function x(t,n,e=.5){const[r,a,o]=n,i=a.length,s=new Float32Array(i);for(let l=0;l<i;l++)if(null==t||t[l])for(l=0;l<i;l++){const t=r[l],n=a[l],i=o[l],c=t+e*n+(1-e)*i;c&&(s[l]=(t-e*n-(1-e)*i)/c)}return[s]}function j(t,n,e){const r=e.length,a=new Float32Array(r);for(let o=0;o<r;o++)if(null==t||t[o])for(o=0;o<r;o++){const t=(.1-n[o])**2+(.06-e[o])**2;t&&(a[o]=1/t)}return[a]}export{i as bandIndexMethodMap,s as calculateBandIndex,l as calculateNDVI,c as getBandMatrix3};