Google Earth Engine(GEE)提供了强大的工具和功能,使得对遥感数据进行高效处理和分析成为可能。其中,计算植被状况指数(VCI)和植被健康指数(VHI)是遥感领域中的重要应用之一。本文将介绍如何使用GEE计算VCI和VHI,并解释这些指数在遥感分析中的重要性。

植被状况指数(VCI)和植被健康指数(VHI)简介

植被状况指数(VCI)是一种用于评估当前植被健康状况的指数,其基本原理是将当前时段的归一化差异植被指数(NDVI)与历史时段的最小值和最大值进行比较。VCI通过将NDVI值与历史范围进行归一化,从而反映出植被当前的状况相对于历史情况的位置。这有助于区分天气变化对NDVI的影响与植被自身生长状态的影响。

植被健康指数(VHI)则是植被状况指数(VCI)与温度状态指数(TCI)的加权平均。温度状态指数(TCI)反映了地表温度对植被生长的影响,结合VCI,可以更全面地评估植被的健康状况。

在接下来的部分,我们将介绍如何使用GEE计算VCI和VHI,并展示这些指数在遥感数据分析中的应用。

代码实现

加载数据部分代码引用生态遥感监测笔记

Google Earth Engine(GEE)计算长时序的月VCI和TCI_计算植被状况指数与温度状况指数-CSDN博客

设置研究区

首先,使用ee.FeatureCollection()获取研究区范围

接着,调用Map.centerObject()函数,将地图的视角移动到感兴趣区域,设置缩放级别

然后,设置图层上显示的研究区包络线,,边界线的颜色为红色("FF0000"),填充颜色为红色的透明度为0.5的色值("FF000088"),线宽为1.5像素。

最后,将研究区包络线添加到地图上

var roi = ee.FeatureCollection("projects/ee-dxtgchrvhffge47576/assets/henanArea");
Map.centerObject(roi, 7);
var styling = {color: "FF0000", fillColor: "FF000088", width: 1.5}; 
Map.addLayer(roi.style(styling), {}, "geometry");

加载数据

  1. 首先,定义了起始年份(startYear)和结束年份(endYear),并将它们转换为ee.Date类型的对象。

  2. 然后,通过ee.ImageCollection()函数加载了MODIS数据集中的NDVI(MOD13Q1)和LST(MOD11A2)图像集合。

  3. 使用filterDate()方法将NDVI和LST图像集合中的图像筛选出指定时间范围内的图像。

  4. 使用select()方法选择NDVI和LST图像集合中的相应波段("NDVI"和"LST_Day_1km")。

  5. 使用ee.Algorithms.If()方法检查NDVI和LST图像集合是否为空。如果为空,则创建一个包含全零值的图像集合;如果不为空,则保持原始图像集合不变。

  6. 最后,将处理后的NDVI和LST图像集合分别赋值给Coll_NDVI和Coll_LST变量。

var startYear = 2012;
var endYear = 2022;
var startDate = ee.Date.fromYMD(startYear, 1, 1);
var endDate = ee.Date.fromYMD(endYear, 12, 31);
//添加MODIS植被指数16天全球250米 
var Coll_NDVI = ee.ImageCollection("MODIS/006/MOD13Q1")
//MODIS/006/MOD13A1
var Coll_LST = ee.ImageCollection("MODIS/006/MOD11A2")
//MODIS/006/MOD11A1
Coll_NDVI = Coll_NDVI.filterDate(startDate, endDate).select("NDVI");
Coll_NDVI = ee.ImageCollection(ee.Algorithms.If(Coll_NDVI.size().eq(0),
      ee.ImageCollection(ee.Image(0).selfMask().rename('NDVI')),
      Coll_NDVI
    ));
Coll_LST = Coll_LST.filterDate(startDate, endDate).select("LST_Day_1km");
Coll_LST = ee.ImageCollection(ee.Algorithms.If(Coll_LST.size().eq(0),
      ee.ImageCollection(ee.Image(0).selfMask().rename('LST_Day_1km')),
      Coll_LST
    ));

数据预处理

  • 对NDVI图像集合进行了比例缩放
  • 对LST图像集合进行了单位转换,将其从原始单位(0.02)转换为摄氏度(℃)。
  • 使用print()函数将处理后的NDVI和LST图像集合打印输出到控制台,以便查看处理结果。
var Coll_NDVI = Coll_NDVI.map(function(img) {
  return img
    .clip(roi).divide(10000).float().set("system:time_start", img.get("system:time_start")); // keep time info
    });
 
 
var Coll_LST = Coll_LST.map(function(img) {
  return img
    .clip(roi).multiply(0.02).subtract(273.15).float().set("system:time_start", img.get("system:time_start")); // keep time info
});
 
 
print(Coll_NDVI);
print(Coll_LST);

计算最大最小值与显示

// 获取Coll_NDVI和Coll_LST集合的第一个影像
var first_NDVI = Coll_NDVI.first();
var first_LST = Coll_LST.first();

// 在地图上显示第一个NDVI影像
Map.addLayer(first_NDVI, {min: -0.2, max: 1, palette: ['blue', 'white', 'green']}, 'First NDVI');

// 在地图上显示第一个LST影像
Map.addLayer(first_LST, {min:-10, max:20 ,palette: ['blue', 'green', 'red']}, 'First LST');
// 计算十年间每个像素点的NDVI最大值和最小值
var ndviMinMax = Coll_NDVI.reduce(ee.Reducer.minMax());
var lstMinMax = Coll_LST.reduce(ee.Reducer.minMax());
// 裁剪NDVI最大值和最小值图层
var clippedNDVIMin = ndviMinMax.select('NDVI_min');
var clippedNDVIMax = ndviMinMax.select('NDVI_max');
var clippedLSTMin = lstMinMax.select('LST_Day_1km_min');
var clippedLSTMax = lstMinMax.select('LST_Day_1km_max');
// 可视化裁剪后的NDVI最大值和最小值
Map.addLayer(clippedNDVIMin, {min:-0.2, max: 0.5 ,palette: ['blue', 'white', 'green']}, 'Clipped NDVI_min');
Map.addLayer(clippedNDVIMax, {min: -0.2, max:1, palette: ['blue', 'white', 'green']}, 'Clipped NDVI_max');
Map.addLayer(clippedLSTMin, {min:-10, max: 20 ,palette: ['blue', 'white', 'red']}, 'Clipped lst_min');
Map.addLayer(clippedLSTMax, {min: 30, max:50, palette: ['blue', 'white', 'red']}, 'Clipped lst_max');

 

NDVI_max

NDVI_min
LST_max
LST_min

计算VCI&TCI

var newStartDate = ee.Date.fromYMD(2022, 1, 1);
var newEndDate = ee.Date.fromYMD(2022, 12, 31);
var newNDVI = Coll_NDVI.filterDate(newStartDate, newEndDate);
var newLST = Coll_LST.filterDate(newStartDate, newEndDate);
var clippedNDVI = newNDVI.mean();
var clippedLST = newLST.mean();


// 计算VCI
var vci = newNDVI.map(function(image) {
  return image.subtract(ndviMinMax.select('NDVI_min'))
              .divide(ndviMinMax.select('NDVI_max').subtract(ndviMinMax.select('NDVI_min')))
              .rename('VCI')
              .copyProperties(image, ['system:time_start']);
});
// 计算TCI
var tci = newLST.map(function(image) {
  return image.subtract(lstMinMax.select('LST_Day_1km_min'))
              .divide(lstMinMax.select('LST_Day_1km_max').subtract(lstMinMax.select('LST_Day_1km_min')))
              .rename('TCI')
              .copyProperties(image, ['system:time_start']);
});

计算VHI 

// 将具有相同时间戳的VCI和TCI影像合并到一个集合中
var vci_tci_merged = ee.Join.inner().apply({
  primary: vci,
  secondary: tci,
  condition: ee.Filter.equals({
    leftField: 'system:time_start',
    rightField: 'system:time_start'
  })
});

// 将结果转换为 ImageCollection
var vci_tci_merged_collection = ee.ImageCollection(vci_tci_merged.map(function(feature) {
  var vci_image = ee.Image(feature.get('primary'));
  var tci_image = ee.Image(feature.get('secondary'));
  return vci_image.addBands(tci_image);
}));

// 计算 VHI
var vhi_collection = vci_tci_merged_collection.map(function(image) {
  var vci_image = image.select('VCI');
  var tci_image = image.select('TCI');
  var vhi_image = tci_image.multiply(0.5).add(vci_image.multiply(0.5)).rename('VHI');
  return vhi_image.set('system:time_start', image.get('system:time_start'));
});

显示VCI、VHI、TCI

// 查看VCI、TCI、VHI第一个layer
var vci_first = vci.reduce(ee.Reducer.first());
var tci_first = tci.reduce(ee.Reducer.first());
var vhi_first = vhi_collection.reduce(ee.Reducer.first());
Map.addLayer(vci_first, {min:0, max:1 ,palette: ['blue', 'white', 'green']}, 'VCI');
Map.addLayer(tci_first, {min:0, max:0.5 ,palette: ['green', 'white', 'red']}, 'TCI');
Map.addLayer(vhi_first, {min:0, max:0.5 ,palette: ['blue', 'white', 'green']}, 'VHI');
VCI
TCI
VHI

导出数据

均值数据导出

Export.image.toDrive({
  image: clippedVCI.toFloat(),
  description: 'VCI',
  folder: 'GEE_exports',
  fileNamePrefix: 'VCI',
  region: roi,
  scale: 250,
  fileFormat: 'GeoTIFF',
  formatOptions: {
    cloudOptimized: true
  }
});
Export.image.toDrive({
  image: clippedVHI.toFloat(),
  description: 'VHI',
  folder: 'GEE_exports',
  fileNamePrefix: 'VHI',
  region: roi,
  scale: 250,
  fileFormat: 'GeoTIFF',
  formatOptions: {
    cloudOptimized: true
  }
});

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐