1. 初识geemap:遥感影像导出的瑞士军刀
第一次接触geemap这个工具时,我正在处理一个农业遥感监测项目。当时需要从Google Earth Engine下载近十年的Landsat影像数据,手动操作GEE的Python API让我抓狂——直到发现了geemap这个神器。简单来说,geemap是基于Earth Engine Python API和ipyleaflet构建的交互式地图工具,特别适合需要频繁处理遥感影像的朋友们。
你可能不知道,传统方式导出GEE影像需要写十几行代码处理权限申请、任务提交和结果检查,而用geemap只需要一行ee_export_image()。这就像从手动挡汽车换成了自动驾驶——我实测导出同一区域NDVI数据,传统方法耗时半小时,geemap五分钟搞定,还自动处理了坐标系转换和文件命名。
安装过程简单到令人发指:
pip install geemap然后三行代码启动交互地图:
import geemap Map = geemap.Map() Map新手常犯的错是忘记初始化Earth Engine,记得先运行ee.Initialize()。有次我熬夜调试两小时才发现问题在这,现在想起来还觉得膝盖中箭。
2. 单幅影像导出的三种姿势
2.1 本地TIF文件:科研狗的刚需
上周帮学弟处理毕业论文数据时,需要导出鄱阳湖区域的Sentinel-2影像。用ee_export_image函数时,这几个参数必须门清:
scale:分辨率(米),30米是Landsat经典配置region:导出范围,建议先用绘图工具在地图上框选file_per_band:是否分波段存储
实战代码长这样:
image = ee.Image('COPERNICUS/S2_SR/20210101T030541_20210101T031853_T50RMU') roi = Map.draw_last_feature.geometry() # 地图上画个多边形 geemap.ee_export_image( image.clip(roi), filename='./data/sentinel2.tif', scale=20, file_per_band=False )踩过的坑:当导出超大区域时,GEE会报错"Array length exceeds maximum"。我的解决方案是分块导出——把研究区分成4个象限分别处理,最后用GDAL合并。
2.2 分波段导出:深度学习必备
做土地分类时,需要单独处理每个波段。设置file_per_band=True后,会生成B1.tif、B2.tif等系列文件。有个冷知识:geemap会自动保留波段原名,比手动重命名省心多了。
2.3 直传Google Drive:团队协作利器
项目组需要共享数据时,云端存储比本地文件方便得多。ee_export_image_to_drive的folder参数支持子目录,实测发现:
- 免费账号每天有导出配额限制
- 网盘文件会有几分钟延迟
description会成为文件名前缀
geemap.ee_export_image_to_drive( image, description='sentinel2_2021', folder='team_project', scale=10, region=roi )3. 影像集合的批量处理魔法
3.1 本地批量下载:时间序列分析
处理2000-2020年的MODIS数据时,ee_export_image_collection拯救了我。关键步骤:
- 用
filterDate限定时间范围 - 用
filterBounds限定空间范围 - 检查
aggregate_array返回的影像数量
collection = ee.ImageCollection('MODIS/006/MOD13A1') \ .filterDate('2010-01-01', '2020-12-31') \ .filterBounds(roi) print(collection.size().getInfo()) # 先确认数据量 geemap.ee_export_image_collection(collection, out_dir='./modis_ndvi/')注意:导出大量影像时会占用C盘临时空间,我吃过亏——建议修改tempfile.tempdir到大容量分区。
3.2 云端批量导出:自动化流水线
当数据量超过100景时,推荐用ee_export_image_collection_to_drive。有个隐藏技巧:添加prefix参数能让文件名更规范:
geemap.ee_export_image_collection_to_drive( collection, folder='modis_export', prefix='ndvi_', scale=500 )4. 直读Numpy数组:AI模型的捷径
去年做农作物识别时,需要把影像直接喂给PyTorch模型。ee_to_numpy函数直接把GEE影像转为ndarray,省去了文件IO的麻烦。
典型工作流:
img = ee.Image('LANDSAT/LC08/C01/T1_SR/LC08_038029_20180810') aoi = ee.Geometry.Rectangle([-110.8, 44.6, -110.6, 44.7]) array = geemap.ee_to_numpy(img, region=aoi) # 数据标准化 array = (array - array.min()) / (array.max() - array.min())遇到过的问题:大区域导出会内存溢出。后来发现设置default_value参数可以处理缺失值:
array = geemap.ee_to_numpy( img, region=aoi, default_value=0 )5. 性能优化实战心得
5.1 分辨率与效率的平衡
导出全球夜间灯光数据时发现:
- 1000米分辨率:30秒完成
- 500米分辨率:3分钟
- 100米分辨率:任务超时
经验公式:预估数据量 = (区域面积/scale²) × 波段数 × 4字节
5.2 并行任务技巧
GEE限制同时运行的任务数,但可以通过:
- 分区域导出
- 分时间段处理
- 使用
geemap.ee_export_image_batch
tasks = [ {'image': image1, 'filename': 'part1.tif'}, {'image': image2, 'filename': 'part2.tif'} ] geemap.ee_export_image_batch(tasks)6. 坐标系问题的终极解决方案
遇到过WGS84和UTM的混乱?geemap默认用影像原始CRS,但可以通过crs参数强制指定:
geemap.ee_export_image( image, filename='output.tif', crs='EPSG:32650' # UTM 50N )有次项目验收前发现坐标系错误,幸亏geemap的get_projection()函数能快速检查:
print(geemap.get_projection(image))7. 异常处理手册
这些错误你可能也会遇到:
EEException: Image.clip:检查geometry是否有效TypeError: expected string or bytes-like object:确认filename是字符串路径EEException: Too many pixels:增大scale值或缩小区域
我的调试锦囊:
- 先用
sample_region测试小区域 - 打印
image.bandNames()确认波段 - 检查
roi.area()是否过大