使用 GEE 批量计算 Landsat 遥感指数
本文最后更新于 2026年3月3日 下午
在定量遥感分析中,遥感指数(如 NDVI、EVI、NBR 等)往往是后续建模、变化检测、制图统计的基础。GEE 的优势在于:可以在云端批量处理长时间序列,并将结果按年/按季导出。
本文整理一套“能直接跑起来”的流程:
- 将现成脚本添加到 GEE Code Editor
- 按时间序列批量计算 Landsat 指数(可选均值/中值等统计)
- 一键导出每个时间片的多波段 GeoTIFF
- 扩展:添加自定义指数(以 RVI、DVI 为例)
参考脚本来源与导入方式
bgcasey 在 GEE Code Editor 维护了一套脚本仓库,包含时间序列、指数计算、导出等通用函数:
将脚本仓库添加到你的 GEE Code Editor(Reader 区)的方法:
- 打开链接:https://code.earthengine.google.com/?accept_repo=users/bgcasey/science_centre
- 在左侧 Scripts 面板的 Reader
中会出现
users/bgcasey/science_centre相关脚本
仓库结构大致如下:
functions/:通用函数(导出 ImageCollection、计算指数、预处理等)landsat_time_series.js:Landsat 时间序列主流程sentinel_time_series.js:Sentinel-2 时间序列主流程modis_time_series.js:MODIS 相关主流程
示例:批量计算 Landsat 年度指数并导出
下面的示例脚本演示:以 AOI(阿尔伯塔省)为区域,按年构建时间序列,为每个时间片计算一组指数,并导出为多波段 GeoTIFF(每个时间片导出一个文件)。
1 | |
关键参数怎么改
你只需要改这几处:
- AOI:把示例中的行政区筛选改成你的矢量/几何(
ee.FeatureCollection/ee.Geometry都可以)。 - 时间范围:
utils.createDateList(start, end, step, unit)决定时间片起点列表;ls_fn(dateList, window, unit, ...)决定每个时间片的长度。 - 统计方式:
statistic = 'mean'可换成'median'、'max'等(视脚本实现支持情况)。 - 导出参数:
folder / scale / crs / fileNameFn控制导出位置、分辨率、投影与命名。
建议:AOI 很大、年份很多时,导出任务会非常多。可以按 3–5 年分段跑(示例代码里已经给了分段写法),避免超时或任务队列过长。
扩展:添加自定义遥感指数
如果需要计算脚本未内置的指数,一般做法是:
- 在
landsat_indices_and_masks.js(或该仓库对应的指数工具文件)里新增exports.addXXX方法 - 在时间序列主逻辑中把
'XXX'映射到对应的addXXX方法 - 在主脚本的指数列表里加上
'XXX'
下面以 RVI、DVI 为例。
1 | |
将这些函数添加到相应文件后,需要在
landsat_time_series.js(或它内部调用的 switch/case
逻辑)里为新指数加映射。例如:
1 | |
最后在主脚本的指数列表里添加
'RVI'、'DVI',即可随时间序列一起批量输出。
1 | |
常见注意事项
- 波段命名要对得上:示例里自定义指数用的是
SR_B4/SR_B3(脚本重新统一了波段名称)。如果你的数据源是 Landsat 8/9 Collection 2 L2,红光/近红外通常是SR_B4(Red)和SR_B5(NIR)。请以脚本实际输入影像的 band 名称为准。 - QA 波段处理:示例里通过过滤
QA_PIXEL避免导出该波段;但更关键的是云/阴影掩膜是否已在上游处理(取决于landsat_indices_and_masks的实现)。 - 导出任务数量:每个时间片一个导出任务,年份越多任务越多。建议分段跑,或把 AOI 先做裁剪/缩小用于调试。
- 投影与分辨率:
scale=30对 Landsat 常见;crs可按你的区域/后处理习惯改(例如 UTM)。
到这里,就能比较稳定地用 GEE 批量计算并导出 Landsat 遥感指数时间序列了。Sentinel-2、MODIS 也有类似的脚本结构,可以参考上述方法进行修改和使用。希望对你有所帮助!