GEE | 使用植被健康指数(VHI)进行干旱评估并导出逐年VHI指数影像

文摘   2024-10-17 00:00   天津  

LXX

读完需要

4
分钟

速读仅需 1 分钟

前言:

干旱给农业和经济发展造成巨大损失,人类已经探索了许多抗旱措施来减轻干旱的影响。植被健康指数(VHI)代表实际条件下实际农业干旱严重程度,其干旱频率和受灾地区的差异反映了缓解农业干旱的抗旱措施水平;同时VHI 是综合考虑植被状态和温度状态的遥感植被指数,可以同时反映区域内水分与温度的变化,监测不同时间尺度和地区的干旱变化情况。因此,本文分享使用植被健康指数 (VHI) 评估植被健康状况作为农业干旱的替代指标。


希望各位同学点个关注,点个小赞,这将是更新的动力,不胜感激❥(^_-)

1

   

计算方法

植被健康指数(VHI)是通过分析卫星遥感数据计算得出的一个指标,用于评估植被的健康状况。它结合了植被覆盖度和地表温度等因素,常用于监测农作物的生长情况、预测旱灾、评估草原和森林的生态系统健康等方面。
植被状况指数(VCI)是一种用于评估当前植被健康状况的指数,其基本原理是将当前时段的归一化差异植被指数(NDVI)与历史时段的最小值和最大值进行比较。VCI 通过将 NDVI 值与历史范围进行归一化,从而反映出植被当前的状况相对于历史情况的位置。这有助于区分天气变化对 NDVI 的影响与植被自身生长状态的影响。
植被健康指数(VHI)则是植被状况指数(VCI)与温度状态指数(TCI)的加权平均。温度状态指数(TCI)反映了地表温度对植被生长的影响,结合 VCI,可以更全面地评估植被的健康状况。
植被健康具体计算公式如下:

式中:VCI 为植被状态指数;NDVI 为归一化植被指数;NDVImax 和 NDVImin 分别为研究时期 NDVI 的最大值和最小值;TCI 为温度状态指数;LST 为地表温度;LSTmax和 LSTmin分别为研究时期 LST 的最大值和最小值;α 为 VCI 和 TCI 的加权系数,取 α=0.5


2

   

实现代码

本文将计算研究区域内从2010年-2022年的VHI指数,并进行逐年导出,显示每年VHI指数的平均值。

// 定义感兴趣区var aoi = ee.FeatureCollection("users/geestudy2/yibin");Map.addLayer(aoi)Map.centerObject(aoi, 8)
// 定义分析时间段var startDate = "2010-01-01"; var endDate = "2022-12-31"; var startDate = ee.Date(startDate); var endDate = ee.Date(endDate);
// 获取MODIS影像集合并选择NDVI波段var filteredNDVI = ee.ImageCollection("MODIS/061/MOD13Q1").select('NDVI');
// ---------------- 计算植被状况指数(VCI) ----------------- //
// 定义计算VCI的函数function calcVCI(image) { var min = filteredNDVI.reduce(ee.Reducer.min()); var max = filteredNDVI.reduce(ee.Reducer.max()); var vci = image.subtract(min).divide(max.subtract(min)).multiply(100); return vci.rename('VCI').copyProperties(image, ['system:time_start', 'system:time_end']);}
// 应用函数计算VCIvar VCI = filteredNDVI.filterDate(startDate, endDate).map(calcVCI);
// -------------- 计算温度状况指数(TCI) --------------- //
// 获取MODIS陆地表面温度数据并选择白天温度数据(LST_Day_1km)var LST = ee.ImageCollection("MODIS/061/MOD11A2").select('LST_Day_1km');
// 定义将8天温度数据合并为16天的数据的函数(取平均)function convertLstDatesToModisDates(ndvimg) { var start = ndvimg.get('system:time_start'); var end = ndvimg.get('system:time_end');
var composite = LST.filterDate(start, end).mean(); // 使用均值合并影像
return composite .set('system:time_start', start) .set('date', ee.Date(start).format()) .set('system:time_end', end) .set('empty', composite.bandNames().size().eq(0));}
// 过滤温度数据,匹配NDVI数据的时间段var filteredlst = filteredNDVI.filterDate(startDate, endDate).map(convertLstDatesToModisDates);
// 定义计算TCI的函数function calcTCI(image1) { var min = LST.reduce(ee.Reducer.min()); var max = LST.reduce(ee.Reducer.max()); var tci = max.subtract(image1).divide(max.subtract(min)).multiply(100);
return tci.rename('TCI').copyProperties(image1, ['system:time_start', 'system:time_end']);}
// 应用函数计算TCIvar TCI = filteredlst.filterDate(startDate, endDate).map(calcTCI);
// ------------------- 计算植被健康指数(VHI) ---------------------- //
// 定义过滤条件,将VCI和TCI进行配对var filter = ee.Filter.equals({leftField: 'system:time_start', rightField: 'system:time_start'});var join = ee.Join.saveFirst({matchKey: 'match'});
// 将VCI和TCI集合进行配对合并var both = ee.ImageCollection(join.apply(VCI, TCI, filter)) .map(function(img) { return img.addBands(img.get('match')).set('date', img.date().format('YYYY_MM_dd')); });
// 计算VHI并将其添加为集合中的一个波段var VHI = both.map(function(img) { return img.addBands( img.expression('a1/2 + b1/2', { "a1": img.select('VCI'), "b1": img.select('TCI'), }).rename('VHI') );});
// 创建每年5月对应的VHI影像列表var imageList = VHI.toList(VHI.size());var my_indices = ee.List([9,32,55,78,101,124,147,170,193,216,239,262,285]);
// 使用索引选择影像function getImages(list){ var img = ee.Image(imageList.get(list)); return img;}
// 创建包含所选影像的影像集合var finalCollection = ee.ImageCollection.fromImages(my_indices.map(getImages));
// 将每年的VHI波段提取并裁剪到感兴趣区var VHI_Collection = finalCollection.map(function(image) { return image.select("VHI").clip(aoi);});
// 导出每年VHI的结果到Google Drivefor (var i = 0; i < my_indices.length().getInfo(); i++) { var img = ee.Image(VHI_Collection.toList(VHI_Collection.size()).get(i)); var year = 2010 + i; Export.image.toDrive({ image: img, description: 'VHI_' + year, folder: 'VHI_Export', scale: 500, region: aoi.geometry(), crs: 'EPSG:4326', maxPixels: 1e13 });}
// 可视化VHI的参数var VisParams = { min: 0, max: 100, palette: ['#d73027', '#fdae61', '#ffffbf', '#a6d96a', '#1a9850']};
// 显示2014年的VHI影像var VHI_2020 = VHI_Collection.toList(VHI_Collection.size()).get(10);Map.addLayer(ee.Image(VHI_2020), VisParams, 'VHI 2020');
// ------------------------- 图例 --------------------------//
// 定义图例信息var classInfo = [ {name: '极端干旱', color: '#d73027'}, {name: '严重干旱', color: '#fdae61'}, {name: '中度干旱', color: '#ffffbf'}, {name: '轻度干旱', color: '#a6d96a'}, {name: '无干旱', color: '#1a9850'}];
// 创建图例条目:颜色和标签并排显示function legendEntry(info) { var color = ui.Panel({style: { width: '20px', height: '20px', backgroundColor: info.color, margin: '6px 0px 0px 0px' }}); var label = ui.Label({ value: info.name, }); return ui.Panel({ widgets: [color, label], layout: ui.Panel.Layout.flow('horizontal'), style: { stretch: 'horizontal', margin: '-6px 0px 0px 0px' }});}
// 定义用于保存所有图例条目的面板var legend = ui.Panel({ style: { position: 'top-left', padding: '8px 8px 0px 8px' }});
// 创建图例标题var legendTitle = ui.Label({ value: 'VHI 2020', style: { fontWeight: 'bold', fontSize: '18px', margin: '0 0 4px 0', padding: '0'}});
// 将标题添加到面板legend.add(legendTitle);
// 遍历类信息,将每个条目添加到图例面板for (var i = 0; i < classInfo.length; i++) { legend.add(legendEntry(classInfo[i]));}
// 将图例显示在地图上Map.add(legend);
// ------------------- 绘制每年5月的VHI折线图 ---------------------- //
// 获取每年5月的VHI均值var vhiMeans = finalCollection.map(function(image) { var mean = image.reduceRegion({ reducer: ee.Reducer.mean(), geometry: aoi, scale: 500 }).get('VHI'); return ee.Feature(null, {'VHI': mean});});
// 创建年份列表var years = ee.List.sequence(2010, 2022);
// 将年份和VHI值组合成特征集合var chartData = ee.FeatureCollection(years.zip(vhiMeans.toList(vhiMeans.size())).map(function(val) { val = ee.List(val); return ee.Feature(null, { 'year': val.get(0), 'VHI': ee.Feature(val.get(1)).get('VHI') });}));
// 将特征集合转换为图表var chart = ui.Chart.feature.byFeature(chartData, 'year', ['VHI']) .setOptions({ title: 'VHI 每年5月平均值', hAxis: {title: '年份'}, vAxis: {title: 'VHI 值'}, lineWidth: 2, pointSize: 4, });
// 显示折线图print(chart);

3

   

结果

【参考】

遥感小屋
分享遥感相关文章、代码,大家一起交流,互帮互助
 最新文章