保姆级教程:用GEE计算Landsat8/9的NDVI,并一键获取区域平均值(附完整代码)
零基础掌握GEE从Landsat数据到NDVI区域统计的完整实战指南植被指数是环境监测和农业研究中的重要工具而Google Earth EngineGEE平台让这些分析变得前所未有的简单。本文将带你从零开始逐步掌握如何利用GEE处理Landsat8/9卫星数据计算NDVI植被指数并获取特定区域的平均值——即使你从未接触过遥感编程。1. 准备工作GEE平台入门在开始分析前我们需要先熟悉这个强大的云端地理空间分析平台。GEE整合了PB级卫星影像和地理数据集用户无需下载数据即可在线处理。注册GEE账号访问https://earthengine.google.com/使用Google账号登录填写申请表学术用途通常能快速通过审批提示审批过程可能需要1-2个工作日建议提前申请进入GEE代码编辑器后你会看到以下主要界面组件代码编辑器左侧面板用于编写和运行JavaScript代码地图窗口中央区域可视化显示分析结果控制台底部面板输出打印结果和错误信息Assets右侧面板管理上传的自定义数据集// 测试GEE环境是否正常工作 print(Hello, Earth Engine!);2. Landsat数据基础与选择策略Landsat系列卫星提供了连续40多年的地球观测数据。Landsat8和9携带的OLI传感器特别适合植被监测波段波长范围(μm)主要用途B20.45-0.51蓝光水体穿透B30.53-0.59绿光植被反射B40.64-0.67红光叶绿素吸收B50.85-0.88近红外植被反射数据等级选择建议TOA大气层顶反射率快速获取适合初步分析SR地表反射率经过大气校正精度更高// Landsat8 TOA数据示例 var l8_toa ee.ImageCollection(LANDSAT/LC08/C02/T1_TOA); // Landsat9 SR数据示例 var l9_sr ee.ImageCollection(LANDSAT/LC09/C02/T1_SR);3. 完整NDVI计算流程详解NDVI归一化植被指数通过近红外和红光波段的差异来量化植被活力计算公式为NDVI (NIR - Red) / (NIR Red)实战步骤定义研究区域手动绘制使用地图工具栏的几何图形工具坐标输入精确指定边界点// 方法1坐标点定义多边形区域 var roi ee.Geometry.Polygon([ [[116.258, 28.542], [116.258, 28.874], [115.863, 28.874], [115.863, 28.542]] ]); // 方法2加载已有矢量边界 var roi ee.FeatureCollection(users/yourname/your_asset);筛选和加载影像数据按时间、空间和云量过滤var image ee.ImageCollection(LANDSAT/LC08/C02/T1_TOA) .filterBounds(roi) .filterDate(2022-05-01, 2022-05-31) .sort(CLOUD_COVER) .first();NDVI计算与可视化使用GEE内置的normalizedDifference方法var ndvi image.normalizedDifference([B5, B4]).rename(NDVI); // 可视化参数设置 var visParams { min: -0.2, max: 0.8, palette: [blue, white, green] }; Map.centerObject(roi, 9); Map.addLayer(ndvi, visParams, NDVI); Map.addLayer(roi, {color: red}, Study Area);4. 区域统计与结果导出获取区域平均值是许多研究的核心需求GEE的reduceRegion方法能高效完成这一任务var stats ndvi.reduceRegion({ reducer: ee.Reducer.mean(), geometry: roi, scale: 30, // 与Landsat分辨率一致 maxPixels: 1e9 }); print(区域平均NDVI值:, stats.get(NDVI));关键参数解析scale分析使用的空间分辨率单位米maxPixels处理的最大像素数大区域需增加此值注意scale值设置过小会导致计算时间大幅增加一般设置为影像原始分辨率结果导出到Google Drive// 导出NDVI图像 Export.image.toDrive({ image: ndvi, description: NDVI_export, scale: 30, region: roi, fileFormat: GeoTIFF }); // 导出统计结果为CSV Export.table.toDrive({ collection: ee.FeatureCollection([ ee.Feature(null, { mean_NDVI: stats.get(NDVI), area: roi.area() }) ]), description: NDVI_stats, fileFormat: CSV });5. 进阶技巧与常见问题解决云掩膜处理Landsat的QA波段可用于去除云污染区域function maskClouds(image) { var qa image.select(QA_PIXEL); var cloudBit 1 3; var mask qa.bitwiseAnd(cloudBit).eq(0); return image.updateMask(mask); } var cloudFreeImage maskClouds(image);多时相分析计算时间序列NDVI变化var monthlyNDVI ee.ImageCollection(LANDSAT/LC08/C02/T1_TOA) .filterBounds(roi) .filterDate(2020-01-01, 2022-12-31) .map(function(image) { var ndvi image.normalizedDifference([B5, B4]).rename(NDVI); return ndvi.set(date, image.date().format(YYYY-MM-dd)); }); var chart ui.Chart.image.series({ imageCollection: monthlyNDVI, region: roi, reducer: ee.Reducer.mean(), scale: 30 }).setOptions({ title: NDVI时间序列, vAxis: {title: NDVI值}, hAxis: {title: 日期} }); print(chart);常见错误排查几何范围无效确保roi坐标闭合且顺序正确无数据返回检查日期范围和云量过滤条件计算超时适当增大scale值或缩小区域范围波段名称错误不同数据集可能使用不同命名约定6. 完整代码模板与自定义修改以下是一个可直接运行的完整示例包含所有关键步骤// 1. 定义研究区域 var roi ee.Geometry.Polygon([ [[116.258, 28.542], [116.258, 28.874], [115.863, 28.874], [115.863, 28.542]] ]); // 2. 加载并筛选影像 var image ee.ImageCollection(LANDSAT/LC09/C02/T1_TOA) .filterBounds(roi) .filterDate(2022-05-01, 2022-05-31) .sort(CLOUD_COVER) .first(); // 3. 计算NDVI var ndvi image.normalizedDifference([B5, B4]).rename(NDVI); // 4. 可视化 Map.centerObject(roi, 9); Map.addLayer(ndvi, {min: -0.2, max: 0.8, palette: [blue, white, green]}, NDVI); Map.addLayer(roi, {color: red}, Study Area); // 5. 区域统计 var stats ndvi.reduceRegion({ reducer: ee.Reducer.mean(), geometry: roi, scale: 30, maxPixels: 1e9 }); print(区域平均NDVI:, stats.get(NDVI)); // 6. 导出结果 Export.image.toDrive({ image: ndvi, description: NDVI_export, scale: 30, region: roi });自定义修改指南替换roi坐标为你感兴趣的区域调整filterDate参数选择不同时间段的影像修改scale值适应不同精度需求添加更多统计指标如标准差、最大值等