目录
1.EVI的算术计算
2.使用表达式计算 EVI
3.使用表达式计算 BAI
1.EVI的算术计算
增强植被指数 (EVI) 旨在最大限度地减少 NDVI 的饱和度和其他问题,在叶绿素含量高的地区(例如雨林),EVI 不会像 NDVI 那样饱和(即达到最大值),从而更容易检查这些地区植被的变化。 计算 EVI 的广义方程为:
其中 G、C1、C2 和 L 是常数。 我们不需要记住这些值,因为它们是由其他研究人员确定的,并且可以在线查找,对于 Sentinel-2,方程为 :
使用基本算术,我们计算并显示 Sentinel-2 图像的 EVI,我们需要提取波段,然后除以 10,000 以考虑数据集中的缩放。
// Import and filter imagery by location and date.
var sfoPoint = ee.Geometry.Point(106.39614 , 29.80574);
var sfoImage = ee.ImageCollection('COPERNICUS/S2')
.filterBounds(sfoPoint)
.filterDate('2020-02-01', '2020-04-01')
.first();
Map.centerObject(sfoImage, 11);
// Calculate EVI using Sentinel 2
// Extract the bands and divide by 10,000 to account for scaling done.
var nirScaled = sfoImage.select('B8').divide(10000);
var redScaled = sfoImage.select('B4').divide(10000);
var blueScaled = sfoImage.select('B2').divide(10000);
// Calculate the numerator, note that order goes from left to right.
var numeratorEVI =(nirScaled.subtract(redScaled)).multiply(2.5);
// Calculate the denominator.
var denomClause1 = redScaled.multiply(6);
var denomClause2 = blueScaled.multiply(7.5);
var denominatorEVI = nirScaled.add(denomClause1).subtract(denomClause2).add(1);
// Calculate EVI and name it.
var EVI =numeratorEVI.divide(denominatorEVI).rename('EVI');
// And now map EVI using our vegetation palette.
var vegPalette = ['red', 'white', 'green'];
var visParams = {min: -1, max: 1, palette: vegPalette};
Map.addLayer(EVI, visParams, 'EVI');
图1 重庆市北碚区使用Sentinel-2计算 的 EVI 显示
2.使用表达式计算 EVI
EVI 代码可以工作(图 1),但创建大量变量并显式调用加法、减法、乘法和除法可能会造成混乱,并可能导致错误。 在这些情况下,您可以创建一个函数以使步骤更加稳健且易于重复。 在下面概述的另一个简单策略中,Earth Engine 有一种方法来定义表达式来实现相同的结果。
// Calculate EVI.
var eviExpression = sfoImage.expression({
expression: '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5* BLUE + 1))',
map: { // Map between variables in the expression and images.
'NIR': sfoImage.select('B8').divide(10000),
'RED': sfoImage.select('B4').divide(10000),
'BLUE': sfoImage.select('B2').divide(10000)
}
});
// And now map EVI using our vegetation palette.
Map.addLayer(eviExpression, visParams, 'EVI Expression');
该表达式首先被定义为使用人类可读名称的字符串, 然后,我们通过选择适当的波段来定义这些名称。
3.使用表达式计算 BAI
现在我们已经了解了表达式的工作原理,让我们使用表达式来计算另一个索引。 Martin(1998)开发了烧伤面积指数(BAI)来帮助描述烧伤痕迹和评估烧伤严重程度,它依靠火留下灰烬和木炭,不会产生灰烬或木炭的火灾以及灰烬和木炭已被冲走或覆盖的旧火将无法很好地检测到。 BAI 计算每个像素到燃烧区域往往相似的光谱参考点的光谱距离, 远离该参考的像素(例如,健康的植被)将具有非常小的值,而接近该参考的像素(例如,火中的木炭)将具有非常大的值。
该方程中有两个常数:ρc r 是红光波段的常数,等于0.1; ρc nir 用于近红外波段,等于 0.06。
要检查燃烧指数,请加载 2021年显示重庆北碚边缘火灾的图像,我们将使用 Landsat 8 来探索这场火灾,在新脚本中输入以下代码。
// Examine the true-color Landsat 8 images for the 2013 RimFire.
var burnImage =ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
.filterBounds(ee.Geometry.Point(106.39614 , 29.80574))
.filterDate('2021-07-15', '2021-09-27')
.sort('CLOUD_COVER')
.first();
Map.centerObject(ee.Geometry.Point(106.39614 , 29.80574), 11);
var rgbParams = {
bands: ['B4', 'B3', 'B2'],
min: 0,
max: 0.3
};
Map.addLayer(burnImage, rgbParams, 'True-Color BurnImage');
图2 真彩色显示
检查该图像的真彩色显示。 你能发现火吗? 如果没有,BAI 可能会有所帮助。与 EVI 一样,使用上面的方程以及您对 Landsat 8 频段的了解,在 Earth Engine 中使用表达式来计算 BAI:
// Calculate BAI.
var bai = burnImage.expression(
'1.0 / ((0.1 - RED)**2 + (0.06 - NIR)**2)', {
'NIR': burnImage.select('B5'),
'RED': burnImage.select('B4'),
});
显示结果:
// Display the BAI image.
var burnPalette = ['green', 'blue', 'yellow', 'red'];
Map.addLayer(bai, {
min: 0,
max: 400,
palette: burnPalette
}, 'BAI');
图3 BAI 边缘火