GEE必须会教程—归一化植被指数(NDVI)的地物差异对比

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);

本期分享到这里就结束了,如果对你有帮助,不要忘记了给小编点赞哦!

更多内容,欢迎关注小编的公众号“梧桐凉月”,咱们下期再会!

  • 36
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值