目录

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
一、前言
本代码基于 Google Earth Engine(GEE)平台,实现了对特定研究区域(ROI)2020 年 Landsat 8 卫星影像的归一化植被指数(NDVI)计算、统计分析(最大值、最小值、平均值)、可视化展示及结果导出功能,可用于植被生长状况、覆盖度等生态环境相关研究。
归一化植被指数(Normalized Difference Vegetation Index, NDVI)是一种广泛应用于遥感和地理信息系统的植被监测工具,因其敏感性和有效性而受到科研和管理人员的广泛认可。NDVI 的计算基于如下公式:

其中,NIR 代表近红外波段的反射率,RED 代表红光波段的反射率。这一公式利用植被在不同波段的反射特性,尤其是正常生长植被在近红外波段的较高反射率和红光波段的较低反射率,能够有效计算出植被的健康状况和生长水平。通常情况下,NDVI 值的范围为 -1 到 +1,其中负值通常表示水体,值为零表示无植被,值在 0.2 到 0.5 之间表示稀疏植被,而值在 0.6 至 0.9 之间则代表密集植被。因此,NDVI 成为植被覆盖度和生物量评估的重要指标。
NDVI 的应用领域涵盖农业、生态学、气候变化、城市规划等多个方面。在农业领域,NDVI 可用于监测农作物的生长情况、评估健康水平以及预测作物产量,帮助农民作出更加科学的管理决策。在生态学研究中,NDVI 数据能够反映植被覆盖变化,并有助于分析植被对环境变化的响应,评估生物多样性以及生态系统的整体健康。在气候变化研究中,NDVI 可用于监测森林砍伐和土地利用变化,以评估人类活动对生态环境的影响。此外,在城市规划中,利用 NDVI 可以评估城市绿地分布,从而帮助改善城市生态。
尽管 NDVI 的计算简单、易于获取和解释,被广泛应用于各类研究,但仍需注意其局限性。首先,NDVI 对非植被区域的识别能力较弱,例如土壤、石材或水体可能会与植被重叠,从而造成解读上的偏差。其次,大气条件(如雾、烟等)会影响遥感数据的质量,进而影响 NDVI 的准确性。此外,NDVI 值在不同季节和植物生长阶段可能有所不同,这需要研究者在解读 NDVI 数据时考虑季节性变化的影响。
未来的研究方向可能集中在改进数据获取和处理技术方面,结合深度学习、机器学习等先进方法,提高 NDVI 的准确性和可靠性。同时,将 NDVI 与其他生态指标(如土壤湿度、气候数据)结合,有助于更全面地评估生态系统的健康状况和生物多样性。综合运用多种技术和数据源,将为生态保护、农业管理、城市可持续发展提供更加科学和有效的决策支持。NDVI 的未来应用潜力广阔,值得深入探索。
二、核心代码模块解析
(一)初始环境配置
var table = roi;
// 将地图视图中心定位到数据表格的范围,并设置缩放级别为8
Map.centerObject(table, 8);
- 变量定义:
var table = roi中,roi是预先定义好的研究区域矢量数据(如 shp 文件导入后的变量名),此处将其赋值给table变量,方便后续调用。 - 地图定位:
Map.centerObject(table, 8)是 GEE 的地图控制函数,作用是将地图视图的中心点调整到table(即研究区域)的几何中心位置,第二个参数 “8” 代表地图缩放级别(缩放级别范围通常为 1-24,数值越大视图越精细,8 级适合查看区域级范围)。
(二)辅助函数定义
1. 影像数据类型转换函数
// 将图像数据转换为浮点型
function returnFloat(img) {
return img.float();
}
- 函数功能:定义
returnFloat函数,接收一个影像参数img,通过img.float()方法将输入影像的数据类型转换为浮点型。 - 作用意义:Landsat 影像原始数据可能为整型,转换为浮点型可减少后续 NDVI 计算过程中的数据精度损失,确保指数计算结果更准确。
2. NDVI 计算函数
// 定义一个函数来计算 NDVI
function calculateNDVI(image) {
return image.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI');
}
- NDVI 原理:归一化植被指数(NDVI)是通过近红外波段(NIR)与红光波段(Red)的反射率计算得出,公式为
NDVI=(NIR-Red)/(NIR+Red),取值范围为 [-1,1],数值越大代表植被覆盖度越高、生长状况越好。 - 函数解析:
image.normalizedDifference(['SR_B5', 'SR_B4']):normalizedDifference是 GEE 影像的内置方法,接收一个包含两个波段名称的数组,此处SR_B5是 Landsat 8 的近红外波段,SR_B4是红光波段,该方法会自动按照 NDVI 公式计算指数。.rename('NDVI'):将计算得到的指数波段命名为 “NDVI”,便于后续识别和调用。
(三)Landsat 8 影像集合处理
// 导入 Landsat 8 影像集合(Collection 2)
var landsatCollection = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
// 筛选出特定年份的影像,这里以 2020 年为例
.filterDate('2020-01-01', '2020-12-31')
// 选择需要的波段
.select('SR_B4', 'SR_B5')
// 应用 NDVI 计算函数
.map(calculateNDVI);
- 影像集合导入:
ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')用于调用 GEE 平台上的 Landsat 8 Collection 2 Tier 1 Level 2 影像集合,该版本影像经过辐射定标、大气校正等预处理,数据质量更高,可直接用于定量分析。 - 时间筛选:
.filterDate('2020-01-01', '2020-12-31')筛选出 2020 年 1 月 1 日至 2020 年 12 月 31 日期间获取的影像,仅保留研究时段内的数据,减少无关计算量。 - 波段选择:
.select('SR_B4', 'SR_B5')从影像集合中提取红光波段(SR_B4)和近红外波段(SR_B5),这两个波段是计算 NDVI 的必需波段,筛选后可降低数据处理负荷。 - 批量计算 NDVI:
.map(calculateNDVI)对筛选后的每一幅影像应用calculateNDVI函数,实现 NDVI 的批量计算,最终landsatCollection变为仅包含 “NDVI” 波段的影像集合。
(四)NDVI 统计指标计算
1. 年度最大 NDVI 计算
// 计算年度最大 NDVI 值
var maxNDVI = landsatCollection.qualityMosaic('NDVI');
- 函数选择:
qualityMosaic('NDVI')是 GEE 中用于生成 “质量镶嵌图” 的方法,当以 “NDVI” 为质量指标时,该方法会在研究区域的每个像元位置,选择所有影像中 NDVI 值最大的像元,组成一幅新的影像。 - 结果意义:年度最大 NDVI 可反映研究区域内植被生长最旺盛时期的覆盖状况,常用于识别植被生长的最佳状态。
2. 年度最小与平均 NDVI 计算
// 计算年度最小 NDVI 值
var minNDVI = landsatCollection.reduce(ee.Reducer.min());
// 计算年度均值 NDVI 值
var meanNDVI = landsatCollection.mean();
- 最小 NDVI 计算:
landsatCollection.reduce(ee.Reducer.min())中,reduce方法用于对影像集合进行聚合运算,ee.Reducer.min()是最小值聚合器,会对每个像元在 2020 年所有影像中的 NDVI 值取最小值,生成年度最小 NDVI 影像。- 意义:最小 NDVI 可反映植被生长最稀疏或非生长季的植被覆盖状况,也可用于识别水体、裸地等非植被区域(NDVI 值通常接近 - 1 或 0)。
- 平均 NDVI 计算:
landsatCollection.mean()是 GEE 的简化聚合方法,直接对影像集合中每个像元的 NDVI 值计算算术平均值,得到年度平均 NDVI 影像。- 意义:平均 NDVI 可整体反映研究区域 2020 年植被的平均覆盖水平和生长状况,是衡量区域植被状况的常用指标。
(五)研究区域裁剪
// 将结果裁剪到研究区域
var maxNDVIClipped = maxNDVI.clip(roi);
var minNDVIClipped = minNDVI.clip(roi);
var meanNDVIClipped = meanNDVI.clip(roi);
- 裁剪函数:
clip(roi)是 GEE 影像的裁剪方法,接收一个矢量区域(此处为roi研究区域),将影像中超出该区域的部分去除,仅保留研究区域内的影像数据。 - 作用:避免无关区域数据干扰,使后续可视化和导出结果仅聚焦于研究范围,同时减少数据存储体积。
(六)结果可视化展示
// 显示结果
Map.centerObject(roi, 8);
Map.addLayer(
maxNDVIClipped,
{min: -1, max: 1, palette: ['0000ff', '00ff00', 'ffff00', 'ff0000']},
'Max NDVI'
);
// 最小、平均NDVI显示代码类似,此处省略
- 重复定位:
Map.centerObject(roi, 8)再次确认地图中心和缩放级别,确保可视化结果以研究区域为中心展示。 - 图层添加:
Map.addLayer()是 GEE 的地图图层添加方法,第一个参数为待显示的影像(如maxNDVIClipped);- 第二个参数是显示参数配置:
min: -1, max: 1设定 NDVI 值的显示范围(与 NDVI 理论取值范围一致),palette定义颜色映射方案,此处 “0000ff”(蓝色)代表低 NDVI 值(如水体、裸地),“00ff00”(绿色)代表中等 NDVI 值(植被),“ffff00”(黄色)、“ff0000”(红色)代表较高 NDVI 值(茂密植被); - 第三个参数是图层名称(如 “Max NDVI”),用于在地图图层控制栏中识别不同图层。
(七)结果导出到 Google Drive
// 导出最大 NDVI 裁剪结果
Export.image.toDrive({
image: maxNDVIClipped,
description: 'MaxNDVI_2020',
scale: 30,
region: roi,
fileFormat: 'GeoTIFF'
});
// 最小、平均NDVI导出代码类似,此处省略
导出函数:Export.image.toDrive() 是 GEE 用于将影像导出到用户 Google Drive 的方法,通过对象参数配置导出信息:
image:指定待导出的影像(如maxNDVIClipped);description:导出文件的名称(如 “MaxNDVI_2020”),便于在 Drive 中识别;scale:导出影像的空间分辨率,单位为米,此处 “30” 对应 Landsat 8 的原始空间分辨率(30 米),确保导出数据精度与原始影像一致;region:导出的地理范围,此处为roi研究区域,避免导出无关区域;fileFormat:导出文件格式,“GeoTIFF” 是遥感数据常用的无损压缩格式,支持地理坐标信息,可在 ArcGIS、QGIS 等 GIS 软件中进一步处理。
三、代码关键注意事项
- 数据依赖:代码运行需确保
roi研究区域矢量数据已提前导入 GEE 平台,且命名与代码中一致,否则会出现 “变量未定义” 错误。 - 影像可用性:Landsat 8 影像受云层、天气等影响,部分时段可能无有效影像,若 2020 年研究区域无足够影像,可能导致统计结果偏差,建议通过
.filter(ee.Filter.lt('CLOUD_COVER', 20))等代码增加云量筛选(如保留云量低于 20% 的影像)。 - 导出配置:导出时需确保 Google Drive 有足够存储空间(单幅 30 米分辨率、区域面积 100km² 的 GeoTIFF 文件约几十 MB),且导出任务需在 GEE “Tasks” 面板手动运行,等待任务完成后才能在 Drive 中获取文件。
- 波段一致性:代码中使用的
SR_B4(红光)、SR_B5(近红外)是 Landsat 8 的波段编号,若更换为 Landsat 7、Landsat 9 等其他卫星,需对应修改波段名称(如 Landsat 7 的红光波段为SR_B3,近红外波段为SR_B4),否则无法正确计算 NDVI。
四、运行结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
816

被折叠的 条评论
为什么被折叠?



