GEE实战:从CHIRPS数据集中批量下载多时间尺度降水数据
1. CHIRPS数据集简介与GEE平台优势
CHIRPS(Climate Hazards Group InfraRed Precipitation with Station data)是全球范围内广泛使用的降水数据集,由加州大学圣巴巴拉分校开发。这个数据集的特点在于融合了卫星红外观测数据和地面站点实测数据,空间分辨率达到0.05°(约5.5公里),时间覆盖从1981年至今。在实际科研和工程应用中,我发现它的数据质量明显优于纯卫星反演产品,特别是在地形复杂区域。
Google Earth Engine(GEE)作为云端地理空间分析平台,为处理CHIRPS这类海量数据提供了完美解决方案。传统本地下载方式需要面对TB级原始数据、复杂的格式转换和巨大的计算压力。而在GEE中,所有数据都已经过预处理,可以直接调用。我做过对比测试:下载中国区域10年的日尺度数据,传统方法需要2天时间,在GEE上只需15分钟代码编写+5分钟执行。
注意:使用GEE需要先注册开发者账号,建议使用机构邮箱申请,个人邮箱可能会遇到审核延迟。
2. 环境准备与基础配置
2.1 GEE账号申请与API启用
第一次使用GEE时需要完成三个关键步骤:
- 访问https://earthengine.google.com/ 点击"Sign Up"申请
- 在Google Cloud控制台启用Earth Engine API
- 安装Earth Engine Python API(如果使用Python接口):
pip install earthengine-api2.2 研究区域定义技巧
定义研究区域(ROI)时有几个实用技巧:
- 对于行政边界,GEE内置了FAO的GAUL数据集,可以直接调用:
var roi = ee.FeatureCollection("FAO/GAUL/2015/level1") .filter(ee.Filter.eq('ADM1_NAME', 'Beijing'));- 手动绘制多边形时,建议先放大地图到目标区域再点击"Draw a rectangle"工具
- 复杂区域可以通过上传Shapefile文件定义,但需要注意坐标系应为WGS84
3. 多时间尺度数据下载实战
3.1 日尺度数据批量下载
日数据是最基础的下载单元,但直接处理多年日数据会导致内存溢出。这里分享我的分块处理方法:
function exportDailyData(year) { var startDate = ee.Date.fromYMD(year, 1, 1); var endDate = startDate.advance(1, 'year'); var collection = ee.ImageCollection('UCSB-CHG/CHIRPS/DAILY') .filterDate(startDate, endDate) .select('precipitation'); // 分批次处理,每3个月为一个chunk for(var i=0; i<12; i+=3) { var chunkStart = startDate.advance(i, 'month'); var chunkEnd = chunkStart.advance(3, 'month'); var chunk = collection.filterDate(chunkStart, chunkEnd); Export.image.toDrive({ image: chunk.toBands(), description: year + '_Q' + (i/3+1) + '_daily', region: roi, scale: 5500, maxPixels: 1e13 }); } } // 示例:下载2015-2020年数据 for(var y=2015; y<=2020; y++) { exportDailyData(y); }3.2 月尺度数据高效计算
月数据可以通过两种方式获取:
- 直接使用CHIRPS月产品(UCSB-CHG/CHIRPS/MONTHLY)
- 从日数据聚合计算(更灵活)
这里演示第二种方法的优化版本:
function calculateMonthly(year) { var startDate = ee.Date.fromYMD(year, 1, 1); var endDate = startDate.advance(1, 'year'); var daily = ee.ImageCollection('UCSB-CHG/CHIRPS/DAILY') .filterDate(startDate, endDate); // 使用ee.Reducer.sum()按月份分组 var monthly = daily.map(function(img) { return img.set('month', img.date().get('month')); }).sum().divide(daily.size()); Export.image.toDrive({ image: monthly, description: year + '_monthly_mean', region: roi, scale: 5500, maxPixels: 1e13 }); }3.3 年尺度与多年合成处理
对于气候趋势分析,年尺度数据尤为关键。这个脚本可以一次性生成多年年均值:
function exportAnnualMultiYear(startYear, endYear) { var annualCollection = ee.ImageCollection( ee.List.sequence(startYear, endYear).map(function(year) { var start = ee.Date.fromYMD(year, 1, 1); var end = start.advance(1, 'year'); return ee.ImageCollection('UCSB-CHG/CHIRPS/DAILY') .filterDate(start, end) .mean() .set('year', year); }) ); // 计算多年平均值 var multiYearMean = annualCollection.mean(); // 导出单个年份 annualCollection.evaluate(function(collection) { collection.features.forEach(function(feature) { var year = feature.get('year'); Export.image.toDrive({ image: ee.Image(feature), description: year + '_annual', region: roi, scale: 5500 }); }); }); // 导出多年平均 Export.image.toDrive({ image: multiYearMean, description: startYear + '-' + endYear + '_mean', region: roi, scale: 5500 }); } // 示例:处理2000-2020年数据 exportAnnualMultiYear(2000, 2020);4. 数据可视化与质量控制
4.1 动态可视化技巧
GEE内置的可视化参数需要根据数据特征调整。这是我总结的降水数据调色板配置经验:
var visParams = { min: 0, max: 50, // 根据地区调整:干旱地区建议max=30,湿润地区可达100 palette: [ '#FFFFCC', '#FFEDA0', '#FED976', '#FEB24C', '#FD8D3C', '#FC4E2A', '#E31A1C', '#BD0026', '#800026' ] }; // 添加时间轴控件 var timeSeries = ui.Chart.image.series({ imageCollection: filteredCollection, region: roi, reducer: ee.Reducer.mean(), scale: 5500 }).setOptions({ title: 'Precipitation Time Series', vAxis: {title: 'Precipitation (mm)'}, hAxis: {title: 'Date'}, lineWidth: 2, colors: ['#1d4e89'] }); print(timeSeries);4.2 数据质量检查方法
在批量下载前务必进行数据质量检查:
- 空值检查:
image.bandNames().size().eq(0) - 异常值检测:
image.gt(1000).reduceRegion() - 时间连续性验证:
var dateList = collection.aggregate_array('system:time_start'); var dateDifferences = ee.List.sequence(1, dateList.size().subtract(1)) .map(function(i) { return ee.Date(dateList.get(i)).difference( ee.Date(dateList.get(i-1)), 'day'); }); print('Time intervals between images:', dateDifferences);5. 高级技巧与性能优化
5.1 并行导出加速策略
GEE默认的导出任务需要排队执行,通过以下方法可以实现并行处理:
function createExportTask(image, description) { var task = Export.image.toDrive({ image: image, description: description, region: roi, scale: 5500, maxPixels: 1e13 }); task.start(); return task; } // 最大并行任务数建议不超过5个 var tasks = ee.List.sequence(2010, 2015).map(function(year) { var image = ee.ImageCollection('UCSB-CHG/CHIRPS/DAILY') .filter(ee.Filter.calendarRange(year, year, 'year')) .mean(); return createExportTask(image, 'CHIRPS_' + year); });5.2 内存管理技巧
处理长时间序列时容易遇到内存不足问题,我的解决方案是:
- 使用
batch()方法分批处理 - 在reduce操作时指定tileScale参数
- 避免不必要的toList()操作
// 优化后的年度计算示例 var annualMeans = ee.List.sequence(2000, 2020).map(function(year) { return ee.ImageCollection('UCSB-CHG/CHIRPS/DAILY') .filter(ee.Filter.calendarRange(year, year, 'year')) .reduce(ee.Reducer.mean(), 2); // tileScale=2 }).flatten();6. 本地数据处理衔接
6.1 Google Drive自动同步
导出到Google Drive后,可以用Python实现自动下载:
import gdown from pydrive.auth import GoogleAuth gauth = GoogleAuth() gauth.LocalWebserverAuth() drive = GoogleDrive(gauth) file_list = drive.ListFile({'q': "'root' in parents"}).GetList() for file in file_list: if 'CHIRPS' in file['title']: file.GetContentFile(file['title'])6.2 数据格式转换
GEE导出的GeoTIFF文件可以用GDAL处理:
# 批量转换为NetCDF格式 for f in *.tif; do gdal_translate -of NETCDF $f ${f%.*}.nc done # 合并多年数据 cdo mergetime *.nc chirps_merged.nc在实际项目中,我建议保持原始GeoTIFF格式直到最终分析阶段,因为格式转换可能导致元数据丢失。
