Google Earth Engine(GEE)计算长时序的月VCI和TCI

本文介绍了如何使用Google Earth Engine (GEE) 计算并可视化武汉市的植被状况指数(VCI)和温度条件指数(TCI),基于MODIS数据集进行大规模干旱和热力条件分析。作者详细展示了从数据预处理到结果展示的全过程,包括代码实现和统计图表的创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天来简单分享在上一篇文章的基础上计算植被状况指数(VCI)和温度条件指数(TCI)

目标:

利用MODIS为数据源,在GEE计算某一地区对月VCI和TCI,并制作统计图

以武汉市为研究区

Kogan等提出的植被状态指数(vegetation condition index,VCI)。与NDVI一样,VCI也可以通过NOAA卫星的AVHRR传感器获取,VCI对干旱敏感可以消除地理位置、生态系统对NDVI的影响,成为了大规模遥感干旱监测的理想数据,它的可靠性得到了大量数据的证明。它是在ndvi的基础上计算得出的。

同样而言,TCI也是在LST的基础上计算得出的,

具体的定义的可以查阅相关的论文

GEE实现代码:

首先确定研究区和使用的数据集

var roi = ee.FeatureCollection("users/lilei655123/WUhan");
Map.centerObject(roi,7)
var styling = {color:"red",fillColor:"00000000"};
Map.addLayer(roi.style(styling),{},"geometry")
//添加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

确定起止时间和月份

var startYear = 2010;
var endYear = 2020;
var startDate = ee.Date.fromYMD(startYear, 1, 1);
var endDate = ee.Date.fromYMD(endYear, 12, 31);

合成NDVI和LST

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
    ));
// MOD12Q1数据的NDVI比例为0.0001 [ 最小值=-2000,最大值=10000]
var Coll_NDVI = Coll_NDVI.map(function(img) {
  return img
    .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
    .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);

合成VCI和TCI

var VCI2 = monthlyNDVI.map(function(image) {
  var img = image.select('NDVI').clip(roi);
  return image.addBands(image.expression(
  "100*(NDVI-min)/(max-min)",{
    "NDVI" : img,
    "max" : ee.Image(MonthlyMAX.filter(ee.Filter.eq('month', image.get('month'))).first()),
    "min" : ee.Image(MonthlyMIN.filter(ee.Filter.eq('month', image.get('month'))).first()),
  })
  .rename('VCI')).copyProperties(img,['system:time_start','system:time_end']);
});


//print(VCI2)
Map.addLayer(VCI2)
Map.centerObject(roi)
var clipped_VCI = VCI2.mean().clip(roi).select('VCI');
var VCI_Vis = {
  min: 0.0,
  max: 100.0,
  palette: [
    'red', 'yellow', 'green'],
};


Map.addLayer(clipped_VCI,  VCI_Vis, 'VCI');
//计算TCI: 温度条件指数(TCI)
// 温度条件指数(TCI)
var TCI2 = monthlyLST.map(function(image) {
  var img = image.select('LST_Day_1km').clip(roi);
  return image.addBands(image.expression(
  "100*(LST_Day_1km-min)/(max-min)",{
    "LST_Day_1km" : img,
    "max" : ee.Image(Monthly_LST_MAX.filter(ee.Filter.eq('month', image.get('month'))).first()),
    "min" : ee.Image(Monthly_LST_MIN.filter(ee.Filter.eq('month', image.get('month'))).first()),
  })
  .rename('TCI')).copyProperties(img,['system:time_start','system:time_end']);
});
//print(TCI2)
//Map.addLayer(TCI2)
var clipped_TCI = TCI2.mean().clip(roi).select('TCI');
var TCI_Vis = {
  min: 0,
  max: 100,
  palette: [
    'green', 'yellow', 'red'],
};
Map.addLayer(clipped_TCI,  TCI_Vis, 'TCI');

创建统计图

var VCITimeSeries = ui.Chart.image.seriesByRegion(
    VCI2, roi, ee.Reducer.mean(), 'VCI', 500, 'system:time_start', 'label')
        .setChartType('ScatterChart')
        .setOptions({trendlines: {0: {color: 'red'}},lineWidth: 1,pointSize: 3,
          title: 'MODIS VCI Time Series',
          vAxis: {title: 'VCI'},
                   series: {
            0: {color: 'red'}, 
           
}});


print(VCITimeSeries);
print(ui.Chart.image.series(VCI2 , roi , ee.Reducer.mean(), 500));


var TCITimeSeries = ui.Chart.image.seriesByRegion(
    TCI2, roi, ee.Reducer.mean(), 'TCI', 500, 'system:time_start', 'label')
        .setChartType('ScatterChart')
        .setOptions({trendlines: {0: {color: 'red'}},lineWidth: 1,pointSize: 3,
          title: 'MODIS TCI Time Series',
          vAxis: {title: 'TCI'},
                   series: {
            0: {color: 'red'}, 
           
}});


print(TCITimeSeries);
print(ui.Chart.image.series(TCI2 , roi , ee.Reducer.mean(), 500));

运行结果如下:

315ea60fa6e4a4b3df0582940cd3dbee.png

VCI

2a6c5062d8d421a307c0d1dfeff9b260.png

TCI

3f71f94f48827044f111715f6428400d.png

73afcce4137ef7623b00f8fde3c4e118.png

完整代码请在公众号后台回复“0804合成月VCI和TCI”

感谢关注,欢迎转发!

声明:仅供学习使用!

希望关注的朋友们转发,如果对你有帮助的话记得给小编点个赞或者在看

## ****更多内容请关注微信公众号“生态遥感监测笔记”**

### 如何在 Google Earth Engine (GEE)计算雷达指数 NDI 雷达指数(NDI, Normalized Difference Index)是一种常见的遥感指标,用于分析不同波段之间的差异。其通用公式如下: \[ NDI = \frac{(B_1 - B_2)}{(B_1 + B_2)} \] 其中 \(B_1\) \(B_2\) 是两个不同的波段。 #### 计算 NDI 的具体实现 在 GEE 中可以通过 `ee.Image.expression` 或直接操作波段来完成 NDI 的计算。以下是基于 Sentinel-1 数据集的一个示例代码片段[^2]: ```javascript // 加载Sentinel-1影像集合 var sentinel1 = ee.ImageCollection('COPERNICUS/S1_GRD') .filterDate('2023-01-01', '2023-12-31') // 过滤日期范围 .filterBounds(geometry); // 定义研究区域边界 // 选择VVVH波段并计算NDI var ndi = sentinel1.map(function(image){ var vv = image.select('VV'); // VV 波段 var vh = image.select('VH'); // VH 波段 // 使用表达式计算NDI var ndiValue = vv.subtract(vh).divide(vv.add(vh)).rename('NDI'); return image.addBands(ndiValue); }); // 可视化结果 Map.addLayer(ndi.first().select('NDI'), {min:-1,max:1}, 'NDI Visualization'); ``` 上述代码展示了如何加载 Sentinel-1 雷达数据,并通过 `.subtract()` `.add()` 方法组合波段值以生成 NDI 图像。最后一步是将新创建的 NDI 值作为额外波段附加到原始图像上。 如果遇到分辨率不匹配的情况,则可以利用 `.reduceResolution()` 来调整重采样方式[^1]。例如,在某些情况下可能需要先降低空间分辨率再执行进一步处理。 #### 注意事项 当尝试应用 `.reduceResolution()` 函数时,请确认输入对象支持该方法。通常它适用于 ImageCollections 转换后的 Images 上面的操作场景下有效。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生态遥感监测笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值