NDVI是归一化植被指数的缩写,该指数常常用于植被覆盖程度的监测,不同的地物类型,其NDVI具有较为明显的差异,在GEE上如果要实现不同地物类型的NDVI统计与对比,应该如何做呢?今天这期,跟着小编的视角一起来看看吧。
一、代码步骤
1.选定地物类型与研究区域。由于是要做不同地物的NDVI对比,我们需选择地物本身存在差异的状况进行对比。此处我们选择的是山地森林、城市和沙漠,森林为典型的植被覆盖区,NDVI值一般较高,城市中由于绿化等因素影响,NDVI值介于中间,沙漠植被覆盖率较低,沙土对近红外波段和红光波段反射的差异较小,NDVI值最小。为了方便显示效果,我们需要选择一个区域,该区域既包含森林,也同样存在沙漠,亦存在城市。
这里用到GEE的绘图工具、定义矢量函数。
2.数据源选择与数据预处理。GEE上具有较多的数据产品可以提供已经计算好的NDVI产品,也可以直接利用影像数据进行计算。为了提高影像的分辨率,我们选择Landsat8影像,进行NDVI均值计算。
这里用到影像集合的访问、去云方法、裁剪与过滤等方法。
3.计算NDVI值。计算NDVI需要用到NIR和RED波段,进行归一化操作,在GEE上可以采用表达式expression进行计算,也可以直接采用函数即nomarlizedDifference进行运算。
这里用到计算归一化植被指数的方法。
4.绘制NDVI差异化对比图表。这里需要将计算结果以图表的形式展示出来,我们需要接触在GEE上图表设置和打印的过程。
这里我们接触一个新的方法:ui.Chart.image.seriesByRegion,该方法用于从图像集合生成图表。 提取并绘制集合中每个图像的每个区域中指定波段的值。 通常是时间序列。这里的X轴为时间序列的时间,纵坐标为时间序列的时间值。
看看其主要的参数:
5.打印结果。最后就是华丽的欣赏结果了。
二、研究区域选择
小编选择的研究区域主要位于我国的甘肃省境内,该境内处于我国的交错带分布区,各类地物均有分布,是进行实验的好地方,小编在Google地图上寻找合适的地点绘制矩形方框,设置好案例样本,将坐标点导入GEE中。
三、数据源说明
该数据源为USGS提供的Landsat8数据,小编采用2020年的数据,筛选近红外波段和红光波段,实现NDVI的计算
四、代码实现过程
1.选择地物类型
var city = ee.Feature(ee.Geometry.Rectangle(102.18, 38.49, 102.18, 38.52),{label: 'City'});
var forest = ee.Feature(ee.Geometry.Rectangle(101.26, 38.42, 101.28,38.44), {label: 'Forest'});
var desert = ee.Feature(ee.Geometry.Rectangle(101.62, 38.79,101.66,38.81),{label: 'Desert'});
// 为它们设置不同的颜色
var COLOR = {
CITY: 'ff0000',
DESERT: '0000ff',
FOREST: '00ff00'
};
Map.centerObject(city,6);
Map.addLayer(city,{"color":"FF0000"},"CITY");
Map.addLayer(desert,{"color":"0000FF"},"DESERT");
Map.addLayer(forest,{"color":"00FF00"},"FOREST");
var sampleRegions = new ee.FeatureCollection([city, forest, desert]);
此处分别定义三个矩形变量city、forest、desert,存储相应的坐标,并加上标签表示选择的森林、城市以及沙漠覆盖区域,而后,我们需要对不同的地物设置不同的颜色以作区分,区分好后加载地物覆盖的边框,并将三个区域联合起来形成一个新的矢量数据集,方便后续分析。
2.影像调用与预处理
//影像访问和调用
var dataset = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterDate('2020-01-01', '2020-12-31');
//还原缩放
function applyScaleFactors(image) {
var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
return image.addBands(opticalBands, null, true)
.addBands(thermalBands, null, true);
}
var collection = dataset.map(applyScaleFactors);
function maskL8sr(image){
var cloudMask = (1<<3);
var cloudshadowMask = (1<<4);
var QA = image.select("QA_PIXEL");
var mask = QA.bitwiseAnd(cloudMask).eq(0).and(QA.bitwiseAnd(cloudshadowMask).eq(0));
return image.updateMask(mask);
}
var col = collection.map(maskL8sr)
.filterDate('2020-01-01','2020-12-31')
.filterBounds(sampleRegions)
此处调用Landsat8影像,根据官方文档还原缩放后得到正常影像,再进行去云和过滤处理,得到2020年一年的研究区域的影像集合。
3.计算NDVI
// 计算NDVI,这种方法是function
var getNDVI = function(image){
var NDVI = image.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI')
return image.addBands(NDVI)
};
var col = collection.map(maskL8sr)
.filterDate('2020-01-01','2020-12-31')
.filterBounds(sampleRegions)
.map(getNDVI)
.select(['NDVI'])
选择“SR_B5”和“SR_B4”波段计算NDVI,创建仅包含NDVI波段的数据集合。
4.图表绘制
// 绘制时间序列
var tempTimeSeries = ui.Chart.image.seriesByRegion({
imageCollection: col,
regions: westernRegions,
reducer: ee.Reducer.mean(),
band: 'NDVI',
scale: 30,
xProperty: 'system:time_start',
seriesProperty: 'label'
});
tempTimeSeries.setChartType('LineChart');
tempTimeSeries.setOptions({
title: 'NDVI over time in regions of the American West',
vAxis: {
title: 'NDVI'
},
lineWidth: 1,
pointSize: 4,
series: {
0: {color: COLOR.CITY},
1: {color: COLOR.FOREST},
2: {color: COLOR.DESERT}
}
});
print(tempTimeSeries);
根据seriesByRegion的参数设置要求,设置好相关参数,选择图表类型为线性图表,对标题和坐标轴标签、以及图例等进行设置,得到最终图表,打印输出。
5.结果展示
结果体现了森林、城市与沙漠的NDVI结果对比差异,三者在不同的季节体现出不同的特征。
6.完整的代码
var city = ee.Feature(ee.Geometry.Rectangle(102.18, 38.49, 102.18, 38.52),{label: 'City'});
var forest = ee.Feature(ee.Geometry.Rectangle(101.26, 38.42, 101.28,38.44), {label: 'Forest'});
var desert = ee.Feature(ee.Geometry.Rectangle(101.62, 38.79,101.66,38.81),{label: 'Desert'});
// 为它们设置不同的颜色
var COLOR = {
CITY: 'ff0000',
DESERT: '0000ff',
FOREST: '00ff00'
};
Map.centerObject(city,6);
Map.addLayer(city,{"color":"FF0000"},"CITY");
Map.addLayer(desert,{"color":"0000FF"},"DESERT");
Map.addLayer(forest,{"color":"00FF00"},"FOREST");
var sampleRegions = new ee.FeatureCollection([city, forest, desert]);
// 去云函数
function maskL8sr(image){
var cloudMask = (1<<3);
var cloudshadowMask = (1<<4);
var QA = image.select("QA_PIXEL");
var mask = QA.bitwiseAnd(cloudMask).eq(0).and(QA.bitwiseAnd(cloudshadowMask).eq(0));
return image.updateMask(mask);
}
// 计算NDVI,这种方法是function
var getNDVI = function(image){
var NDVI = image.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI')
return image.addBands(NDVI)
};
//影像访问和调用
var dataset = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterDate('2020-01-01', '2020-12-31');
//还原缩放
function applyScaleFactors(image) {
var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
return image.addBands(opticalBands, null, true)
.addBands(thermalBands, null, true);
}
var collection = dataset.map(applyScaleFactors);
var col = collection.map(maskL8sr)
.filterDate('2020-01-01','2020-12-31')
.filterBounds(sampleRegions)
.map(getNDVI)
.select(['NDVI'])
// 绘制时间序列
var tempTimeSeries = ui.Chart.image.seriesByRegion({
imageCollection: col,
regions: westernRegions,
reducer: ee.Reducer.mean(),
band: 'NDVI',
scale: 30,
xProperty: 'system:time_start',
seriesProperty: 'label'
});
tempTimeSeries.setChartType('LineChart');
tempTimeSeries.setOptions({
title: 'NDVI over time in regions of the American West',
vAxis: {
title: 'NDVI'
},
lineWidth: 1,
pointSize: 4,
series: {
0: {color: COLOR.CITY},
1: {color: COLOR.FOREST},
2: {color: COLOR.DESERT}
}
});
print(tempTimeSeries);
本期分享到这里就结束了,如果对你有帮助,不要忘记了给小编点赞哦!
更多内容,欢迎关注小编的公众号“梧桐凉月”,咱们下期再会!