科研数据下载 | 基于Google Earth Engine 下载 Landsat 8/9 真彩色遥感影像
在遥感数据处理领域,批量获取高质量的卫星影像一直是困扰研究者的基础性难题。传统方式需要逐景手动下载,数据量大时效率极低。Google Earth Engine(以下简称 GEE)作为全球最大的云计算遥感平台,整合了 Landsat、Sentinel等数十种卫星数据集,并提供在线计算与批量导出能力,极大地简化了大规模遥感数据的获取流程。本文以 Landsat 8/9 为例,详细介绍如何借助 GEE 平台按研究区域和时间范围自动筛选、去云处理,并最终导出为可直接使用的真彩色 GeoTIFF 影像。

一、环境配置与 GEE 初始化
在开始之前,需要确保本地 Python 环境已安装 earthengine-api、geemap、geopandas 等必要依赖库。其中 geemap 是一个基于 Leaflet 的交互式地图库,封装了 GEE 的核心操作接口,能够以极少的代码实现矢量绘制、影像筛选、地图可视化和批量下载等功能。
import ee, geemap, osimport geopandas as gpd
GEE 使用前需要完成认证授权。如果当前环境尚未初始化,会自动弹出浏览器进行账号授权流程。首次初始化成功后,后续运行时只需直接调用初始化方法即可。下面的代码实现了先尝试初始化、失败则触发认证的容错逻辑:
try: ee.Initialize(project=' ')except Exception: ee.Authenticate() ee.Initialize(project=' ')
需要特别说明的是,project 参数应替换为个人在 GEE Code Editor 中申请的云项目名称。如果尚未创建项目,可访问 code.earthengine.google.com 在左侧面板中新建。云项目的使用可以更好地管理和追踪计算配额。
二、加载研究区域矢量边界
在实际应用中,影像下载范围通常由研究区的矢量边界决定。GEE 支持直接读取 GeoJSON、Shapefile 等常见矢量格式。这里使用 geopandas 库读取本地 Shpfile 文件,并统一坐标系为 WGS84(EPSG:4326),以确保与 GEE 的坐标系保持一致:
SHP_PATH = r"aearprj.shp"gdf = gpd.read_file(SHP_PATH, encoding='utf-8')gdf = gdf.set_crs(4326) if gdf.crs isNoneelse gdf.to_crs(4326)roi_fc = geemap.geopandas_to_ee(gdf)roi = roi_fc.geometry()
geemap.geopandas_to_ee() 函数将本地的 GeoDataFrame 对象转换为 GEE 的 FeatureCollection 对象,随后通过 .geometry() 提取几何边界,作为后续影像筛选和裁剪的空间范围。读取矢量文件时需要兼顾不同编码环境,代码中用 try-except 自动切换 utf-8 和 gbk 两种常见编码,避免因编码问题导致读取失败。
三、 Landsat 8/9 影像去云与缩放处理
Landsat 系列卫星的 Collection 2 Level-2 数据产品已经过大气校正处理,其地表反射率(Surface Reflectance,SR)以数字编号(DN)形式存储,需要通过官方缩放公式还原为真实的反射率值。缩放公式为:反射率 = DN × 0.0000275 − 0.2。同时,为了剔除影像中的云层和薄云覆盖区域,需要基于 QA 波段(QA_PIXEL)进行位掩膜处理。QA_PIXEL 是一个复合质量波段,每个比特位记录了一种质量标识,包括膨胀云(dilated cloud)、卷云(cirrus)、云(cloud)和云阴影(cloud shadow)等类别。下面的函数实现了去云掩膜与反射率缩放的完整处理流程:
defmask_and_scale(img): qa = img.select('QA_PIXEL') mask = (qa.bitwiseAnd(1 << 1).eq(0) .And(qa.bitwiseAnd(1 << 2).eq(0)) .And(qa.bitwiseAnd(1 << 3).eq(0)) .And(qa.bitwiseAnd(1 << 4).eq(0))) sr = img.select(['SR_B4', 'SR_B3', 'SR_B2']).multiply(0.0000275).add(-0.2)return sr.updateMask(mask).copyProperties(img, ['system:time_start'])
真彩色合成需要调用红、绿、蓝三个波段,对应 Landsat 的 B4(Red)、B3(Green)、B2(Blue)波段。需要注意的是,Collection 2 数据以 SR_B 为前缀命名波段,而非早期 Collection 1 的 B 前缀,引用错误将导致影像输出为空。
四、多时相影像合成与导出参数设置
单一景 Landsat 影像通常难以完全覆盖目标区域且存在云污染,多时相合成是解决这一问题的标准做法。通过设定时间范围和云量阈值,系统会自动筛选出满足条件的所有影像,并以中位数(Median)方式合成一幅代表该时段典型地表特征的影像。中位数合成相比均值合成具有更强的抗云能力,因为云像素的反射率通常偏高,中位数可以有效排除这些离群值的影响:
START_DATE = '2024-05-01'END_DATE = '2025-10-31'CLOUD_PCT = 10SCALE = 30l8 = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")l9 = ee.ImageCollection("LANDSAT/LC09/C02/T1_L2")landsat = (l8.merge(l9) .filterBounds(roi) .filterDate(START_DATE, END_DATE) .filter(ee.Filter.lt('CLOUD_COVER', CLOUD_PCT)) .sort('CLOUD_COVER') .map(mask_and_scale) .median())
上述代码首先合并 Landsat 8 和 Landsat 9 的影像集,然后依次施加空间过滤(仅保留与研究区相交的影像)、时间过滤(指定日期范围内的影像)、云量过滤(影像级云覆盖率低于阈值的影像),并按云量排序优先选取高质量影像,最后通过 .median() 执行中位数合成。经过合成处理后,调用 .clip(roi) 将影像裁剪至研究区边界范围,并通过 .float() 将数据类型转换为浮点型,确保导出时不丢失反射率精度。
五、下载为本地 GeoTIFF 文件
一切处理就绪后,通过 geemap.download_ee_image() 函数即可将处理完成的影像批量下载至本地目录。该函数封装了 GEE 的 Image.getDownloadURL() 接口,支持直接指定输出分辨率、投影坐标系和裁剪范围,省去了手动构造下载参数的繁琐步骤:
OUT_DIR = r".\输出"OUT_NAME = f"TrueColor_{SCALE}m_lanping_L89_{START_DATE}_{END_DATE}.tif"os.makedirs(OUT_DIR, exist_ok=True)out_path = os.path.join(OUT_DIR, OUT_NAME)geemap.download_ee_image(rgb, out_path, region=roi, scale=SCALE, crs='EPSG:4326')print(f"✅ 下载完成: {out_path}")
下载时需注意两个关键参数:scale 指定输出像元大小(Landsat 原生分辨率 30 米),不宜设得过小否则会触发 GEE 的超采样限制;crs 指定输出文件的坐标参考系统,设为 EPSG:4326 可输出经纬度坐标系的 GeoTIFF,便于在 QGIS、ArcGIS 等多数 GIS 软件中直接使用。若省略 crs 参数,则默认使用影像原生坐标系(通常为 UTM),下载速度会更快但需要后续额外做投影转换。
六、交互式地图可视化与质量验证
下载完成后,可以用 geemap 内置的交互式地图快速预览影像质量,验证去云效果和数据完整性。通过波段组合设置(真彩色波段对应 ['SR_B4', 'SR_B3', 'SR_B2'])并调整亮度和对比度参数(min、max、gamma),即可生成色彩自然的遥感影像底图:
rgb_vis = {'bands': ['SR_B4', 'SR_B3', 'SR_B2'], 'min': 0.0, 'max': 0.3, 'gamma': 1.2}Map = geemap.Map(height='700px')Map.centerObject(roi, 8)Map.addLayer(rgb, rgb_vis, f'True Color {START_DATE}~{END_DATE} (Landsat 8/9)')Map.addLayer(roi_fc, {'color': 'red', 'fillColor': '00000000'}, 'ROI')Map
可视化不仅有助于检查最终输出的色彩质量,还能直观判断去云处理是否充分、研究区是否被完整覆盖。建议在正式下载前先使用 geemap.ee_to_gdf() 或 Map 对象进行小范围预览,确认无误后再执行全区域下载,以节省 GEE 计算配额。
七、总结
本文完整演示了从 GEE 初始化、矢量区域加载、影像去云处理、多景合成到批量下载的 Landsat 8/9 真彩色影像获取全流程。该方法具有高度的可复用性——只需将数据源替换为 Sentinel-2(COPERNICUS/S2_SR_HARMONIZED)并将分辨率调整为 10 米,即可获取更高空间精度的真彩色影像;若将波段组合改为近红外、红边等组合,则可进一步拓展为归一化植被指数(NDVI)计算、植被变化监测等应用场景。GEE 的云端计算能力与 geemap 的简洁接口相结合,使大规模遥感数据的获取与处理从过去需要专业服务器的复杂操作,转变为仅需数行代码即可完成的标准化工作流。
后续小编也会更新计算其他哨兵系列的代码。代码小程序免费获取:
夜雨聆风