GEE计算VCI(植被状况指数)及VHI(植被健康指数)

2024-03-16 00:10

本文主要是介绍GEE计算VCI(植被状况指数)及VHI(植被健康指数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于GEE计算VCI(植被状况指数)及VHI(植被健康指数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813721

相关文章

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

【多系统萎缩患者必看】✨维生素补充全攻略,守护你的健康每一天!

亲爱的朋友们,今天我们要聊一个既重要又容易被忽视的话题——‌多系统萎缩患者如何科学补充维生素‌!🌟 在这个快节奏的生活中,健康成为了我们最宝贵的财富,而对于多系统萎缩(MSA)的患者来说,合理的营养补充更是维护身体机能、提升生活质量的关键一步。👇 🌈 为什么多系统萎缩患者需要特别关注维生素? 多系统萎缩是一种罕见且复杂的神经系统疾病,它影响身体的多个系统,包括自主神经、锥体外系、小脑及锥

【详细介绍一下GEE】

GEE(Google Earth Engine)是一个强大的云计算平台,它允许用户处理和分析大规模的地球科学数据集,如卫星图像、气候模型输出等。以下是对GEE用法的详细介绍: 一、平台访问与账户设置 访问GEE平台: 用户可以通过访问Google Earth Engine的官方网站来开始使用GEE。 创建账户: 用户需要注册并登录Google账户,然后申请访问GEE平台。申请过程可能需要提

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

Java - BigDecimal 计算分位(百分位)

日常开发中,如果使用数据库来直接查询一组数据的分位数,就比较简单,直接使用对应的函数就可以了,例如:         PERCENT_RANK() OVER(PARTITION BY 分组列名 ORDER BY 目标列名) AS 目标列名_分位数         如果是需要在代码逻辑部分进行分位数的计算,就需要我们自己写一个工具类来支持计算了 import static ja