如何通过Earth Engine Python API将影像集导出为指定维度numpy数组?
Earth Engine影像集转指定维度NumPy数组方案
问题背景
需要下载特定时间范围的Earth Engine影像集,生成维度为(xdim, ydim, 影像数量)的3维numpy.ndarray用于CNN训练。目前可导出单张影像或栅格格式影像集,但单张影像导出的数组第三维为波段数,无法直接得到时间序列维度的数组。
解决方案
核心逻辑
将时间序列的单波段影像集合并为多波段影像(每个波段对应一个时间点的影像),导出后读取为NumPy数组,再调整维度顺序即可得到目标结构。
完整实现代码
import ee import geemap import numpy as np import rasterio # 初始化Earth Engine ee.Initialize() # 配置时间范围与影像集 start_date = ee.Date.fromYMD(2021, 1, 1) end_date = ee.Date.fromYMD(2022, 1, 1) # 关键:用toBands()将时间序列影像转为多波段影像 image_collection = ee.ImageCollection("ECMWF/ERA5_LAND/DAILY_RAW") \ .select('dew_point_temperature_2m') \ .filterDate(start_date, end_date) \ .toBands() # 定义导出区域(替换为你的目标区域Geometry) # 若未提前定义,可使用影像集的边界:target_region = image_collection.geometry() target_region = chora # 假设chora是已定义的ee.Geometry对象 # 导出多波段影像到本地(也可改用ee_export_image_to_drive导出到Drive) geemap.ee_export_image( image_collection, filename='dew_temp_timeseries.tif', region=target_region, scale=500, crs='EPSG:4326' ) # 读取影像并转换维度 with rasterio.open('dew_temp_timeseries.tif') as src: # 读取后初始维度:(波段数, 高度, 宽度) → 对应(影像数量, xdim, ydim) raw_array = src.read() # 转置为目标维度:(高度, 宽度, 波段数) → (xdim, ydim, 影像数量) final_array = np.transpose(raw_array, axes=(1, 2, 0)) print(f"目标数组维度:{final_array.shape}")
关键细节说明
- 影像集转多波段:
toBands()是核心操作,它会把影像集里的每一张单波段影像按时间顺序合并成一个多波段影像,每个波段的名称会自动带上对应影像的时间戳,方便后续验证。 - 维度调整:用
rasterio读取多波段影像后,默认维度是(波段数, 行, 列),通过np.transpose()转置为(行, 列, 波段数),正好对应需求的(xdim, ydim, 影像数量)。 - 批量处理限制:如果影像集包含超过1000张影像,
toBands()会触发Earth Engine的波段数上限限制,此时需要拆分影像集(比如按季度/月份)分别导出,再用np.concatenate()合并数组。
内容的提问来源于stack exchange,提问作者witheringwhispers
相关产品推荐
相关产品推荐

