GEE:指数计算(NDVI、NBR、EVI、NDMI、NDSI、TC、NDFI、EBBI、VCI、BSI、NDBI、GRAY)

2023-10-08 11:50

本文主要是介绍GEE:指数计算(NDVI、NBR、EVI、NDMI、NDSI、TC、NDFI、EBBI、VCI、BSI、NDBI、GRAY),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文记录了,使用 Landsat 光学波段计算指数的方法和代码,包括NDVI、NBR、EVI、NDMI、NDSI、TC变化(绿度、亮度、湿度)、NDFI、EBBI、VCI等指数。


文章目录

      • 一、代码框架
      • 二、指数计算
        • 1.NDVI
        • 2.NBR
        • 3.EVI
        • 4.NDMI
        • 5.NDSI
        • 6.TC-Transform
        • 7.NDFI
        • 8.EBBI
        • 9.VCI
        • 10.BSI
        • 11.NDBI
        • 12.GRAY


一、代码框架

在GEE平台上使用Landsat影像计算指数需要以下几个步骤:

  1. 导入Landsat影像;
  2. 定义指数计算函数;
  3. 计算指数并将其添加到图层中;
  4. 将图层添加到地图中。

下面是一个简单的示例代码,演示如何使用GEE平台计算归一化植被指数(NDVI):

//导入研究区边界
var roi = table
Map.centerObject(roi, 10);
Map.addLayer(roi, {color:"black"}, "roi");// Step 1: 导入Landsat影像
var l8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA').filterDate('2019-01-01', '2019-12-31').filterBounds(roi).map(roiClip);//按研究区边界裁剪
function roiClip(image){return image.clip(roi)
}// Step 2: 定义NDVI计算函数
function addNDVI(image) {var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');return image.addBands(ndvi);
}// Step 3: 计算NDVI并将其添加到图层中
var withNDVI = l8.map(addNDVI);// Step 4: 将图层添加到地图中
// 可视化参数
var viz = {min:-1, max:1, palette:'blue, white, green'};
Map.addLayer(withNDVI.select('NDVI'), viz, 'NDVI');

二、指数计算

以下指数计算中使用到的波段名,基于《GEE:时间序列分析2——将Landsat5、7、8所有影像合成一个影像集合,构建NDVI时间序列》一文中Landsat578波段统一后的名称。

1.NDVI

归一化植被指数

// NDVI
var ndviTransform = function(img){ var ndvi = img.normalizedDifference(['B4', 'B3']) // calculate normalized dif between band 4 and band 3 (B4-B3/B4_B3).multiply(1000) // scale results by 1000.select([0], ['NDVI']) // name the band.set('system:time_start', img.get('system:time_start'));return ndvi;
};
2.NBR
// NBR
var nbrTransform = function(img) {var nbr = img.normalizedDifference(['B4', 'B7']) // calculate normalized difference of B4 and B7. orig was flipped: ['B7', 'B4'].multiply(1000) // scale results by 1000.select([0], ['NBR']) // name the band.set('system:time_start', img.get('system:time_start'));return nbr;
};
3.EVI
// EVI
var eviTransform = function(img) {var evi = img.expression('2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {'NIR': img.select('B4'),'RED': img.select('B3'),'BLUE': img.select('B1')}).multiply(1000) // scale results by 1000.select([0], ['EVI']) // name the band.set('system:time_start', img.get('system:time_start')); return evi;
};
4.NDMI
// NDMI
var ndmiTransform = function(img) {var ndmi = img.normalizedDifference(['B4', 'B5']) // calculate normalized difference of B4 and B7. orig was flipped: ['B7', 'B4'].multiply(1000) // scale results by 1000.select([0], ['NDMI']) // name the band.set('system:time_start', img.get('system:time_start'));return ndmi;
};
5.NDSI
// NDSI
var ndsiTransform = function(img){ var ndsi = img.normalizedDifference(['B2', 'B5']) // calculate normalized dif between band 4 and band 3 (B4-B3/B4_B3).multiply(1000) // scale results by 1000.select([0], ['NDSI']) // name the band.set('system:time_start', img.get('system:time_start'));return ndsi;
};
6.TC-Transform
// TASSELLED CAP
var tcTransform = function(img){ var b = ee.Image(img).select(["B1", "B2", "B3", "B4", "B5", "B7"]); // select the image bandsvar brt_coeffs = ee.Image.constant([0.2043, 0.4158, 0.5524, 0.5741, 0.3124, 0.2303]); // set brt coeffs - make an image object from a list of values - each of list element represents a bandvar grn_coeffs = ee.Image.constant([-0.1603, -0.2819, -0.4934, 0.7940, -0.0002, -0.1446]); // set grn coeffs - make an image object from a list of values - each of list element represents a bandvar wet_coeffs = ee.Image.constant([0.0315, 0.2021, 0.3102, 0.1594, -0.6806, -0.6109]); // set wet coeffs - make an image object from a list of values - each of list element represents a bandvar sum = ee.Reducer.sum(); // create a sum reducer to be applyed in the next steps of summing the TC-coef-weighted bandsvar brightness = b.multiply(brt_coeffs).reduce(sum); // multiply the image bands by the brt coef and then sum the bandsvar greenness = b.multiply(grn_coeffs).reduce(sum); // multiply the image bands by the grn coef and then sum the bandsvar wetness = b.multiply(wet_coeffs).reduce(sum); // multiply the image bands by the wet coef and then sum the bandsvar angle = (greenness.divide(brightness)).atan().multiply(180/Math.PI).multiply(100);var tc = brightness.addBands(greenness).addBands(wetness).addBands(angle).select([0,1,2,3], ['TCB','TCG','TCW','TCA']) //stack TCG and TCW behind TCB with .addBands, use select() to name the bands.set('system:time_start', img.get('system:time_start'));return tc;
};indexImg = tc.select(['TCB']);
indexImg = tc.select(['TCG']);
indexImg = tc.select(['TCW']);
indexImg = tc.select(['TCA']);
7.NDFI
//Ben added
// NDFI - from CODED utility (original: users/bullocke/coded:coded/miscUtilities)
var ndfiTransform = function(img) {// pre-defined endmembersvar params = ee.Dictionary({'cfThreshold': 0.01, // CLOUD THRESHOLD 'soil': [2000, 3000, 3400, 5800, 6000, 5800],'gv': [500, 900, 400, 6100, 3000, 1000],'npv': [1400, 1700, 2200, 3000, 5500, 3000],'shade': [0, 0, 0, 0, 0, 0],'cloud': [9000, 9600, 8000, 7800, 7200, 6500]});/* Utility function for calculating spectral indices */var gv = params.get('gv');var shade = params.get('shade');var npv = params.get('npv');var soil = params.get('soil');var cloud = params.get('cloud');//var cfThreshold = ee.Image.constant(params.get('cfThreshold'))/*  Do spectral unmixing on a single image  */var unmixImage = ee.Image(img).unmix([gv, shade, npv, soil, cloud], true,true).rename(['band_0', 'band_1', 'band_2','band_3','band_4']);var newImage = ee.Image(img).addBands(unmixImage);//var mask = newImage.select('band_4').lt(cfThreshold)var ndfi = unmixImage.expression('((GV / (1 - SHADE)) - (NPV + SOIL)) / ((GV / (1 - SHADE)) + NPV + SOIL)', {'GV': unmixImage.select('band_0'),'SHADE': unmixImage.select('band_1'),'NPV': unmixImage.select('band_2'),'SOIL': unmixImage.select('band_3')}); var ndvi = ee.Image(img).normalizedDifference(['B4','B3']).rename('NDVI')var evi = ee.Image(img).expression('float(2.5*(((B4/10000) - (B3/10000)) / ((B4/10000) + (6 * (B3/10000)) - (7.5 * (B1/10000)) + 1)))',{'B4': ee.Image(img).select(['B4']),'B3': ee.Image(img).select(['B3']),'B1': ee.Image(img).select(['B1'])}).rename('EVI');    var toExp = newImage.addBands([ndfi.rename(['NDFI']), ndvi, evi]).select(['band_0','band_1','band_2','band_3','NDFI','NDVI','EVI','B1','B2','B3','B4','B5']).rename(['GV','Shade','NPV','Soil','NDFI','NDVI','EVI','Blue','Green','Red','NIR','SWIR1']); //.updateMask(mask)toExp = toExp.select(['NDFI']).multiply(1000).set('system:time_start', img.get('system:time_start'));return toExp;};
8.EBBI

在这里插入图片描述

// calculate EBBI
var ebbi = median1.expression('(SWIR - NIR)/ 10 * sqrt(SWIR + TIRS)',
{
'SWIR':median1.select('B5_median'),
'NIR':median1.select('B4_median'),
'TIRS' : median1.select('B6_median')
}).rename('EBBI');
9.VCI

计算多年来的植被状况指数(the vegetation condition index,VCI)
(代码链接)

var getvci = function(image){// ((NDVI-NDVImin)/(NDVImax-MDVImin))*100var vci = image.subtract(minImage).divide(maxImage.subtract(minImage)).rename('VCI')// return image.addBands(vci) // both output togtherreturn vci // only the vci
}
10.BSI
var addBSI = function(image) {var bsi = image.expression('((RED + SWIR) - (NIR + BLUE)) / ((RED + SWIR) + (NIR + BLUE)) ', {'RED': image.select('B4'), 'BLUE': image.select('B2'),'NIR': image.select('B8'),'SWIR': image.select('B11'),}
).rename('BSI').copyProperties(image,['system:time_start']);return image.addBands(bsi);
};
11.NDBI

归一化建筑指数:RNIR、RMIR分别为影像的近红外、中红外波段,OLI数据的5波段、6波段。
在这里插入图片描述

// NDBI
var ndbiTransform = function(img) {var ndbi = img.normalizedDifference(['B5', 'B6']) // calculate normalized difference of B5 and B6. orig was flipped: ['B5', 'B6'].multiply(1000) // scale results by 1000.select([0], ['NDBI']) // name the band.set('system:time_start', img.get('system:time_start'));return ndbi;
};
12.GRAY
var GRAY = imageOriginal.expression('(0.3 * NIR)  + (0.59 * R) + (0.11 * G)', {'NIR': imageOriginal.select('B5'),'R': imageOriginal.select('B4'),'G': imageOriginal.select('B3')}).multiply(1000).rename('GRAY'); 

这篇关于GEE:指数计算(NDVI、NBR、EVI、NDMI、NDSI、TC、NDFI、EBBI、VCI、BSI、NDBI、GRAY)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/165058

相关文章

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

【详细介绍一下GEE】

GEE(Google Earth Engine)是一个强大的云计算平台,它允许用户处理和分析大规模的地球科学数据集,如卫星图像、气候模型输出等。以下是对GEE用法的详细介绍: 一、平台访问与账户设置 访问GEE平台: 用户可以通过访问Google Earth Engine的官方网站来开始使用GEE。 创建账户: 用户需要注册并登录Google账户,然后申请访问GEE平台。申请过程可能需要提

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

Java - BigDecimal 计算分位(百分位)

日常开发中,如果使用数据库来直接查询一组数据的分位数,就比较简单,直接使用对应的函数就可以了,例如:         PERCENT_RANK() OVER(PARTITION BY 分组列名 ORDER BY 目标列名) AS 目标列名_分位数         如果是需要在代码逻辑部分进行分位数的计算,就需要我们自己写一个工具类来支持计算了 import static ja

OpenStack离线Train版安装系列—2计算节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版