GEE:指数计算(基于 Landsat 光学波段)

您所在的位置:网站首页 归一化植被指数 GEE:指数计算(基于 Landsat 光学波段)

GEE:指数计算(基于 Landsat 光学波段)

2023-04-10 13:29| 来源: 网络整理| 查看: 265

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

一、代码框架

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

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

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

1//导入研究区边界 2var roi = table 3Map.centerObject(roi, 10); 4Map.addLayer(roi, {color:"black"}, "roi"); 5 6// Step 1: 导入Landsat影像 7var l8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA') 8 .filterDate('2019-01-01', '2019-12-31') 9 .filterBounds(roi) 10 .map(roiClip); 11 12//按研究区边界裁剪 13function roiClip(image){ 14 return image.clip(roi) 15} 16 17// Step 2: 定义NDVI计算函数 18function addNDVI(image) { 19 var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI'); 20 return image.addBands(ndvi); 21} 22 23// Step 3: 计算NDVI并将其添加到图层中 24var withNDVI = l8.map(addNDVI); 25 26// Step 4: 将图层添加到地图中 27// 可视化参数 28var viz = {min:-1, max:1, palette:'blue, white, green'}; 29Map.addLayer(withNDVI.select('NDVI'), viz, 'NDVI'); 二、指数计算

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

1.NDVI

归一化植被指数

1// NDVI 2var ndviTransform = function(img){ 3 var ndvi = img.normalizedDifference(['B4', 'B3']) // calculate normalized dif between band 4 and band 3 (B4-B3/B4_B3) 4 .multiply(1000) // scale results by 1000 5 .select([0], ['NDVI']) // name the band 6 .set('system:time_start', img.get('system:time_start')); 7 return ndvi; 8}; 2.NBR1// NBR 2var nbrTransform = function(img) { 3 var nbr = img.normalizedDifference(['B4', 'B7']) // calculate normalized difference of B4 and B7. orig was flipped: ['B7', 'B4'] 4 .multiply(1000) // scale results by 1000 5 .select([0], ['NBR']) // name the band 6 .set('system:time_start', img.get('system:time_start')); 7 return nbr; 8}; 3.EVI 1// EVI 2var eviTransform = function(img) { 3 var evi = img.expression( 4 '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', { 5 'NIR': img.select('B4'), 6 'RED': img.select('B3'), 7 'BLUE': img.select('B1') 8 }) 9 .multiply(1000) // scale results by 1000 10 .select([0], ['EVI']) // name the band 11 .set('system:time_start', img.get('system:time_start')); 12 return evi; 13}; 4.NDMI1// NDMI 2var ndmiTransform = function(img) { 3 var ndmi = img.normalizedDifference(['B4', 'B5']) // calculate normalized difference of B4 and B7. orig was flipped: ['B7', 'B4'] 4 .multiply(1000) // scale results by 1000 5 .select([0], ['NDMI']) // name the band 6 .set('system:time_start', img.get('system:time_start')); 7 return ndmi; 8}; 5.NDSI1// NDSI 2var ndsiTransform = function(img){ 3 var ndsi = img.normalizedDifference(['B2', 'B5']) // calculate normalized dif between band 4 and band 3 (B4-B3/B4_B3) 4 .multiply(1000) // scale results by 1000 5 .select([0], ['NDSI']) // name the band 6 .set('system:time_start', img.get('system:time_start')); 7 return ndsi; 8}; 6.TC-Transform 1// TASSELLED CAP 2var tcTransform = function(img){ 3 var b = ee.Image(img).select(["B1", "B2", "B3", "B4", "B5", "B7"]); // select the image bands 4 var 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 band 5 var 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 band 6 var 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 band 7 8 var sum = ee.Reducer.sum(); // create a sum reducer to be applyed in the next steps of summing the TC-coef-weighted bands 9 var brightness = b.multiply(brt_coeffs).reduce(sum); // multiply the image bands by the brt coef and then sum the bands 10 var greenness = b.multiply(grn_coeffs).reduce(sum); // multiply the image bands by the grn coef and then sum the bands 11 var wetness = b.multiply(wet_coeffs).reduce(sum); // multiply the image bands by the wet coef and then sum the bands 12 var angle = (greenness.divide(brightness)).atan().multiply(180/Math.PI).multiply(100); 13 var tc = brightness.addBands(greenness) 14 .addBands(wetness) 15 .addBands(angle) 16 .select([0,1,2,3], ['TCB','TCG','TCW','TCA']) //stack TCG and TCW behind TCB with .addBands, use select() to name the bands 17 .set('system:time_start', img.get('system:time_start')); 18 return tc; 19}; 20 21indexImg = tc.select(['TCB']); 22indexImg = tc.select(['TCG']); 23indexImg = tc.select(['TCW']); 24indexImg = tc.select(['TCA']); 7.NDFI 1//Ben added 2// NDFI - from CODED utility (original: users/bullocke/coded:coded/miscUtilities) 3var ndfiTransform = function(img) { 4 5 // pre-defined endmembers 6 var params = ee.Dictionary({ 7 'cfThreshold': 0.01, // CLOUD THRESHOLD 8 'soil': [2000, 3000, 3400, 5800, 6000, 5800], 9 'gv': [500, 900, 400, 6100, 3000, 1000], 10 'npv': [1400, 1700, 2200, 3000, 5500, 3000], 11 'shade': [0, 0, 0, 0, 0, 0], 12 'cloud': [9000, 9600, 8000, 7800, 7200, 6500] 13 }); 14 15 /* Utility function for calculating spectral indices */ 16 var gv = params.get('gv'); 17 var shade = params.get('shade'); 18 var npv = params.get('npv'); 19 var soil = params.get('soil'); 20 var cloud = params.get('cloud'); 21 //var cfThreshold = ee.Image.constant(params.get('cfThreshold')) 22 /* Do spectral unmixing on a single image */ 23 var unmixImage = ee.Image(img).unmix([gv, shade, npv, soil, cloud], true,true) 24 .rename(['band_0', 'band_1', 'band_2','band_3','band_4']); 25 var newImage = ee.Image(img).addBands(unmixImage); 26 //var mask = newImage.select('band_4').lt(cfThreshold) 27 28 var ndfi = unmixImage.expression( 29 '((GV / (1 - SHADE)) - (NPV + SOIL)) / ((GV / (1 - SHADE)) + NPV + SOIL)', { 30 'GV': unmixImage.select('band_0'), 31 'SHADE': unmixImage.select('band_1'), 32 'NPV': unmixImage.select('band_2'), 33 'SOIL': unmixImage.select('band_3') 34 }); 35 var ndvi = ee.Image(img).normalizedDifference(['B4','B3']).rename('NDVI') 36 var evi = ee.Image(img).expression( 37 'float(2.5*(((B4/10000) - (B3/10000)) / ((B4/10000) + (6 * (B3/10000)) - (7.5 * (B1/10000)) + 1)))', 38 { 39 'B4': ee.Image(img).select(['B4']), 40 'B3': ee.Image(img).select(['B3']), 41 'B1': ee.Image(img).select(['B1']) 42 }).rename('EVI'); 43 44 var toExp = newImage 45 .addBands([ndfi.rename(['NDFI']), ndvi, evi]) 46 .select(['band_0','band_1','band_2','band_3','NDFI','NDVI','EVI','B1','B2','B3','B4','B5']) 47 .rename(['GV','Shade','NPV','Soil','NDFI','NDVI','EVI','Blue','Green','Red','NIR','SWIR1']); 48 //.updateMask(mask) 49 50 toExp = toExp.select(['NDFI']) 51 .multiply(1000) 52 .set('system:time_start', img.get('system:time_start')); 53 return toExp; 54 55}; 8.EBBI在这里插入图片描述1// calculate EBBI 2var ebbi = median1.expression('(SWIR - NIR)/ 10 * sqrt(SWIR + TIRS)', 3{ 4'SWIR':median1.select('B5_median'), 5'NIR':median1.select('B4_median'), 6'TIRS' : median1.select('B6_median') 7}).rename('EBBI'); 9.VCI

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

1var getvci = function(image){ 2 // ((NDVI-NDVImin)/(NDVImax-MDVImin))*100 3 var vci = image.subtract(minImage).divide(maxImage.subtract(minImage)).rename('VCI') 4 5 // return image.addBands(vci) // both output togther 6 return vci // only the vci 7}



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3