目录

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
本代码基于 Google Earth Engine(GEE)平台,利用 MODIS 卫星的 NDVI(归一化植被指数)和 LST(地表温度)数据,计算植被状态指数(VCI)、温度状态指数(TCI)及综合干旱指数(VHI),并通过时序图表可视化结果,核心用于区域长期干旱监测与植被健康评估。
一、前言
干旱是全球范围内最为频繁和破坏性最大的自然灾害之一。它不仅会影响农作物产量,还会对生态环境和社会经济造成深远影响。随着卫星遥感技术的发展,利用长时间序列的遥感数据监测干旱,已经成为科研和农业管理中的重要手段。
本文介绍经典方法,即基于 MODIS 数据,利用植被状况指数(VCI)、温度状况指数(TCI)和植被健康指数(VHI)来开展干旱监测,并展示具体的研究流程。
传统的干旱监测往往依赖气象站点降水和温度数据,但这些点位稀疏,难以反映大范围内的干旱状况。而遥感方法能够 从空间上大范围、连续、动态地监测干旱,具有不可替代的优势。
本文通过构建 VCI、TCI 和 VHI,旨在定量反映植被在不同时间尺度下的健康状态,综合 NDVI 和地表温度信息,提升干旱监测的准确性。
二、指数计算方法
(一)植被状况指数(VCI)

反映当前植被指数(NDVI)相对历史极值的水平。VCI 越低,植被长势越差,可能受到干旱胁迫。
(二)温度状况指数(TCI)

反映地表温度对植被的胁迫情况。干旱时 LST 升高,TCI 值降低。
(三)植被健康指数(VHI)

其中 𝛼=0.5,表示两者权重相同。综合植被生长和温度胁迫信息,更全面地评价植被的健康状态与干旱程度。
三、基础环境与数据初始化
(一)空间范围定义
var geometry = table;
- 功能:确定分析的空间边界,table为预先导入 GEE 的矢量数据(如行政区、研究区边界等),后续所有数据处理与分析均限定在该范围内。
- 关键说明:需提前在 GEE 资产中上传矢量文件(如 Shapefile 转换的 FeatureCollection),并确保变量名与table一致,否则会导致空间范围失效。
(二)MODIS 数据集加载
var imageCollection = ee.ImageCollection("MODIS/061/MOD13A2"),
    imageCollection2 = ee.ImageCollection("MODIS/061/MOD11A2");
- 数据集 1(MOD13A2): 
  - 产品类型:MODIS 植被指数产品,空间分辨率 1km,时间分辨率 16 天 / 幅。
- 核心用途:提取NDVI波段,反映植被生长状况(NDVI 值越高,植被覆盖度越高、生长越旺盛)。
- 版本说明:061为第 6.1 版,是当前 GEE 中该产品的最新稳定版本,数据质量和精度较旧版本有提升。
 
- 数据集 2(MOD11A2): 
  - 产品类型:MODIS 地表温度产品,空间分辨率 1km,时间分辨率 8 天 / 幅。
- 核心用途:提取LST_Day_1km波段(白天地表温度),用于分析温度对植被的胁迫作用。
 
(三)地图中心与时间范围设置
Map.centerObject(geometry, 8);
var time_start = '2001', 
    time_end = '2024';
- 地图定位:Map.centerObject(geometry, 8)将地图视图自动定位到geometry研究区,8为缩放级别(1-24,数值越大视图越精细),方便可视化查看研究区范围。
- 时间范围:设定分析周期为 2001-2024 年,覆盖 MODIS 数据从早期到近期的完整时间序列,可根据研究需求调整(如缩短为特定年份:'2010'至'2020')。
四、原始数据预处理
(一)NDVI 数据筛选与转换
var ndvi = imageCollection
    .select('NDVI')
    .filterDate(time_start, time_end);
// 时序上逐像元的最小值与最大值
var ndvi_min = ndvi.min().multiply(0.0001);
var ndvi_max = ndvi.max().multiply(0.0001);
- 数据筛选: 
  - select('NDVI'):从 MOD13A2 集合中仅保留- NDVI波段,剔除其他无关波段(如 EVI、QA 等),减少数据量。
- filterDate(time_start, time_end):按设定时间范围筛选影像,仅保留 2001-2024 年的 NDVI 数据。
 
- 极值计算与单位转换: 
  - ndvi.min()/- ndvi.max():计算整个时间序列内逐像元的 NDVI 最小值和最大值(反映该像元植被生长的历史波动范围)。
- multiply(0.0001):MODIS NDVI 数据以整数形式存储,缩放系数为 0.0001(如原始值 10000 对应实际 NDVI 值 1.0),此步骤将数据转换为实际物理意义的 NDVI 值(范围 - 1~1)。
 
(二)LST 数据筛选与转换
var temp = imageCollection2
    .select('LST_Day_1km')
    .filterDate(time_start, time_end);
var temp_min = temp.min().multiply(0.02);
var temp_max = temp.max().multiply(0.02);
- 数据筛选: 
  - select('LST_Day_1km'):从 MOD11A2 集合中保留白天地表温度波段,聚焦白天温度对植被的影响(白天是植被光合作用和水分消耗的主要时段)。
- filterDate(...):同样按 2001-2024 年时间范围筛选,确保 LST 与 NDVI 数据时间匹配。
 
- 极值计算与单位转换: 
  - temp.min()/- temp.max():计算逐像元在时间序列内的最低和最高白天地表温度。
- multiply(0.02):MODIS LST 原始数据为整数,缩放系数 0.02,且单位为开尔文(K),转换后需根据需求可进一步减去 273.15 转为摄氏度(代码中未体现,需额外添加步骤)。
 
五、核心函数:时序数据月尺度聚合
function temporal_collection(collection, start, count, interval, unit) {
    var seq = ee.List.sequence(0, ee.Number(count).subtract(1));
    var origin_date = ee.Date(start);
    
    return ee.ImageCollection(seq.map(function(i) {
        var start_date = origin_date.advance(ee.Number(interval).multiply(i), unit);
        var end_date = origin_date.advance(ee.Number(interval).multiply(ee.Number(i).add(1)), unit);
        
        return collection
            .filterDate(start_date, end_date)
            .mean()
            .set('system:time_start', start_date.millis())
            .set('system:time_end', end_date.millis());
    }));
}
该函数是实现 “高频数据转月尺度” 的核心,将原始 16 天(NDVI)/8 天(LST)的影像聚合为月度均值影像,便于长期时序趋势分析(避免高频数据冗余,突出月度变化规律)。
(一)函数参数说明
| 参数名 | 含义 | 示例(NDVI 聚合) | 
|---|---|---|
| collection | 输入的影像集合(如 NDVI 或 LST 集合) | ndvi(2001-2024 年 NDVI 集合) | 
| start | 时间序列起始日期 | time_start(即 '2001') | 
| count | 聚合后的总期数 | 276(2001-2024 年共 24 年 ×12 月 = 288 个月,此处为示例值) | 
| interval | 每次聚合的时间间隔 | 1(表示 “1 个单位时间”) | 
| unit | 时间单位 | 'month'(表示 “月”,可选 'year'/'day' 等) | 
(二)函数内部逻辑
- 生成序列列表:ee.List.sequence(0, count-1)生成从 0 到count-1的整数列表(如 count=276 时,列表为 [0,1,...,275]),每个整数对应 1 个月度时段的索引。
- 定义起始日期:ee.Date(start)将输入的起始年份(如 '2001')转换为 GEE 可识别的日期对象(默认从该年 1 月 1 日开始)。
- 循环生成月度影像: 
  - start_date/- end_date:对每个索引- i,计算该月度的起始和结束日期(如 i=0 时,start_date=2001-01-01,end_date=2001-02-01;i=1 时,start_date=2001-02-01,end_date=2001-03-01,以此类推)。
- filterDate(start_date, end_date):筛选该月度内的所有原始影像(如 2001 年 1 月内的 2 幅 NDVI 影像,因 NDVI 为 16 天分辨率)。
- mean():计算该月度内所有影像的逐像元均值,得到月度合成影像(平滑高频数据的波动,反映月度平均状态)。
- set(...):为月度影像添加时间属性(- system:time_start/- system:time_end),确保后续时序分析能识别影像的时间顺序。
 
(三)月尺度数据生成
// 月度NDVI影像集合
var ndvi_monthly = temporal_collection(ndvi, time_start, 276, 1, 'month');
// 月度LST影像集合
var temp_monthly = temporal_collection(temp, time_start, 276, 1, 'month');
调用temporal_collection函数,分别将 NDVI 和 LST 的原始时间序列转换为 2001-2024 年的月度均值集合(ndvi_monthly和temp_monthly),两者均包含 276 幅月度影像,时间维度完全对齐。
六、干旱指数计算
(一)植被状态指数(VCI)计算
VCI 通过 NDVI 的实际值与历史极值的比值,反映当前植被生长状况相对于历史同期的偏离程度,VCI 值越低,植被受胁迫(如干旱)越严重。
var vci = ndvi_monthly.map(function(img) {
    var index = img.expression('(ndvi - min)/(max - min)', {
        'ndvi': img.select('NDVI').multiply(0.0001),
        'min': ndvi_min,
        'max': ndvi_max
    });
    
    return index.rename('VCI').copyProperties(img, img.propertyNames());
});
- 逐影像计算:ndvi_monthly.map(...)对每幅月度 NDVI 影像执行相同计算逻辑。
- 指数公式解析: 
  - 分子(ndvi - min):当前月度 NDVI 值与该像元历史最小值的差值(反映当前值高于历史最低的程度)。
- 分母(max - min):该像元 NDVI 的历史极差(反映历史波动范围)。
- 结果范围:VCI 理论范围为 0~1,0 表示植被生长最差(接近历史最低),1 表示生长最好(接近历史最高)。
 
- 分子
- 单位转换与属性复制: 
  - img.select('NDVI').multiply(0.0001):再次执行 NDVI 单位转换(因- ndvi_monthly是原始 NDVI 的均值,未提前转换单位)。
- rename('VCI'):将计算结果波段命名为- VCI,便于后续识别。
- copyProperties(...):将原始月度 NDVI 影像的时间属性(如- system:time_start)复制到 VCI 影像,确保时间信息不丢失。
 
(二)温度状态指数(TCI)计算
TCI 通过地表温度的历史极值比,反映当前温度对植被的胁迫程度,TCI 值越低,温度胁迫越严重(如高温干旱)。
var tci = temp_monthly.map(function(img) {
    var index = img.expression('(max - lst)/(max - min)', {
        'lst': img.select('LST_Day_1km').multiply(0.02),
        'min': temp_min,
        'max': temp_max
    });
    
    return index.rename('TCI').copyProperties(img, img.propertyNames());
});
- 核心差异:与 VCI 公式相反,TCI 以(max - lst)为分子 —— 因高温对植被不利,当前温度(lst)越低,分子越大,TCI 值越高,代表温度胁迫越轻。
- 单位转换:multiply(0.02)将月度 LST 原始值转换为实际开尔文温度。
- 结果范围:同 VCI,TCI 范围 0~1,0 表示温度胁迫最强(当前温度接近历史最高),1 表示胁迫最弱(当前温度接近历史最低)。
(三)植被健康指数(VHI)计算
VHI 是 VCI 和 TCI 的加权求和,综合植被生长状况与温度胁迫,VHI 值越低,干旱程度越严重,是国际通用的干旱监测指数。
var modis_indices = vci.combine(tci);
var drought = modis_indices.map(function(img) {
    var vhi = img.expression('0.5 * vci + (1 - 0.5) * tci', {
        'vci': img.select('VCI'),
        'tci': img.select('TCI')
    }).rename('VHI');
    
    return img.addBands(vhi).copyProperties(img, img.propertyNames());
});
- 指数合并:vci.combine(tci)将 VCI 和 TCI 两个影像集合合并为一个集合(modis_indices),每幅影像包含VCI和TCI两个波段,便于同时调用。
- 加权公式解析: 
  - 权重设置:代码中 VCI 和 TCI 的权重均为 0.5(0.5 * vci + 0.5 * tci),表示同等重视植被状态和温度胁迫。
- 权重调整:可根据研究区特点修改(如干旱区更关注温度,可设 TCI 权重 0.6,VCI 权重 0.4)。
 
- 权重设置:代码中 VCI 和 TCI 的权重均为 0.5(
- 结果处理: 
  - addBands(vhi):将计算的 VHI 波段添加到原始影像中,最终- drought集合的每幅影像包含- VCI、- TCI、- VHI三个波段。
- copyProperties(...):保留时间属性,确保后续时序图表的时间轴正确。
 
七、结果可视化:时序图表输出
代码通过ui.Chart.image.series生成两个时序图表,直观展示研究区 VCI、TCI、VHI 的长期变化趋势。
(一)VCI 与 TCI 时序图
print(
    ui.Chart.image.series(
        drought.select('TCI', 'VCI'), 
        geometry, 
        ee.Reducer.mean(), 
        1000, 
        'system:time_start'
    )
);
- drought.select('TCI', 'VCI'):指定图表的数据源为- drought集合中的- TCI和- VCI波段。
- geometry:指定统计范围为研究区- geometry,计算该区域内的平均值。
- ee.Reducer.mean():统计方法为 “均值 reducer”,即对- geometry范围内的所有像元计算平均值(反映研究区整体的 VCI/TCI 水平)。
- 1000:空间分辨率(单位:米),与 MODIS 原始数据分辨率一致,避免重采样导致的误差。
- system:time_start:时间轴的依据,使用影像的- system:time_start属性(即月度起始时间)。
- 图表意义:输出 2001-2024 年每月的 VCI 和 TCI 均值曲线,可观察两者的变化趋势是否一致(如干旱年份通常 VCI 下降、TCI 下降)。
(二)VHI 时序图
print(
    ui.Chart.image.series(
        drought.select('VHI'), 
        geometry, 
        ee.Reducer.mean(), 
        1000, 
        'system:time_start'
    )
);
- 核心功能:单独输出 VHI 的月度均值时序图,是干旱监测的核心结果 —— 曲线下降的时段对应干旱发生期,下降幅度越大,干旱越严重;曲线平稳或上升则表示植被健康状况良好。
- 应用场景:可结合历史气象数据(如降雨量)验证 VHI 的准确性,或用于识别研究区的干旱发生规律(如季节性干旱、多年尺度干旱)。
八、代码核心逻辑总结与注意事项
核心逻辑链:原始数据(NDVI/LST)→ 时间 / 波段筛选 → 历史极值计算(min/max)→ 月尺度聚合(temporal_collection 函数)→ 指数计算(VCI→TCI→VHI)→ 时序可视化(图表输出)
关键注意事项:
- 单位转换不可遗漏:MODIS 数据的 NDVI(缩放系数 0.0001)和 LST(0.02)均需转换,否则数值无物理意义(如原始 NDVI 值 10000 未转换会显示为 10000,远超实际范围 - 1~1)。
- 时间范围与期数匹配:temporal_collection函数的count参数需与时间范围对应(如 2001-2024 年共 288 个月,count应设为 288,代码中 276 为示例值,需根据实际时间范围调整),否则会导致时间序列不完整。
- 空间范围有效性:geometry需为 GEE 中已导入的矢量数据,若未导入或变量名错误,会导致后续分析无空间约束(计算全球范围数据,耗时且无意义)。
- 权重合理性:VHI 的 VCI/TCI 权重需根据研究区调整(如湿润区植被受温度影响小,可提高 VCI 权重;干旱区温度影响大,提高 TCI 权重),默认 0.5 仅为通用设置。
九、运行结果
 
 
   
 
   
 
  若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
 
                   
                   
                   
                   
                             
                     
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
                     
              
             
                  
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
					 
					 
					


 
            