1. 为什么需要构建生态气候时序数据集
做生态或气候研究的朋友应该都深有体会,最头疼的就是找数据。以前我们要分析某个区域的植被变化,可能需要从不同平台下载MODIS数据;研究气候因子又得去另一个网站找降水、温度资料。光是数据收集和格式转换就能耗掉大半个月,更别提还要处理缺失值、统一空间分辨率这些琐碎活了。
我在黄土高原做植被恢复研究时就吃过这个亏。当时为了分析2000-2020年的植被响应,前后折腾了三个月才把NDVI、降水和土壤水分数据对齐。直到后来发现Google Earth Engine(GEE)这个神器,才明白原来数据准备可以这么高效——这就是为什么我要分享这套一站式数据集构建方案。
这个教程要构建的时序数据集包含两大核心要素:
- 植被参数:NDVI(归一化植被指数)、EVI(增强型植被指数)、LAI(叶面积指数)
- 气候因子:实际蒸散发、潜在蒸散发、降水量、太阳辐射等12个变量
所有数据都已做好时空对齐,分辨率统一为1km,时间跨度为2000-2025年(可自定义)。你只需要复制代码,替换研究区域,就能直接导出CSV或GeoTIFF格式的分析就绪数据。实测下来,从数据获取到导出全程不超过20分钟,比传统方法快了至少50倍。
2. 准备工作:GEE环境配置
2.1 注册与基础操作
首先确保你有Google账号并已开通GEE权限(申请地址:earthengine.google.com)。登录后你会看到代码编辑器界面,主要功能区域包括:
- 左侧:脚本管理器(Scripts)和资源库(Assets)
- 中部:代码编辑区
- 右侧:交互式地图
- 上方:运行按钮和搜索栏
建议新建一个空白脚本,我通常命名为"Region_Climate_Vegetation_Timeseries"这种一看就懂的名字。所有后续代码都会在这里编写。
2.2 定义研究区域
这里以长江流域为例,你可以替换为自己的研究区。有三种常用方式定义区域边界:
// 方法1:直接绘制多边形 var geometry = ee.Geometry.Polygon([ [110.2, 32.5], [120.8, 32.1], [121.6, 26.3], [109.7, 26.8] ]); // 方法2:上传Shapefile到Assets var geometry = ee.FeatureCollection("users/your_account/your_shapefile"); // 方法3:使用现有数据集边界 var geometry = ee.FeatureCollection("WWF/HydroSHEDS/v1/Basins/hybas_7") .filter(ee.Filter.eq('HYBAS_ID', 7120217340));建议先在地图上预览区域是否准确:
Map.centerObject(geometry, 6); // 6表示缩放级别 Map.addLayer(geometry, {color: 'red'}, 'Study Area');3. MODIS植被数据处理
3.1 NDVI与EVI提取
我们使用MOD13A3数据集(月度1km分辨率),关键点在于:
- 原始值需要乘以0.0001缩放
- 年度均值通过日历年份过滤计算
- 统一重投影避免后续分析错位
var mod13 = ee.ImageCollection("MODIS/061/MOD13A3"); function getAnnualVegetation(year) { var startDate = ee.Date.fromYMD(year, 1, 1); var endDate = startDate.advance(1, 'year'); return mod13 .filterDate(startDate, endDate) .filterBounds(geometry) .select(['NDVI','EVI']) .mean() .multiply(0.0001) .set('year', year) .clip(geometry); } // 生成2000-2025年序列 var years = ee.List.sequence(2000, 2025); var vegCollection = ee.ImageCollection(years.map(getAnnualVegetation));注意事项:
- MOD13A3的NDVI范围是-2000到10000,缩放后为-0.2到1.0
- 云覆盖较多地区建议使用QA波段进行质量控制
3.2 叶面积指数(LAI)处理
使用MOD15A2H数据集(8天500m分辨率),需要特别注意:
- 原始数据需乘以0.1缩放
- 500m分辨率需要重采样到1km
var mod15 = ee.ImageCollection("MODIS/061/MOD15A2H"); function getAnnualLAI(year) { return mod15 .filter(ee.Filter.calendarRange(year, year, 'year')) .select('Lai_500m') .mean() .multiply(0.1) .resample('bilinear') .reproject('EPSG:4326', null, 1000) .set('year', year); } var laiCollection = ee.ImageCollection(years.map(getAnnualLAI));4. TerraClimate气候数据处理
4.1 气候变量分类处理
TerraClimate提供月度4km分辨率数据,变量处理分三种类型:
- 累积量:如降水(pr)、实际蒸散发(aet)
- 平均值:如土壤湿度(soil)、PDSI指数
- 衍生变量:如平均温度(tmean)
var terra = ee.ImageCollection("IDAHO_EPSCOR/TERRACLIMATE"); function getAnnualClimate(year) { var col = terra.filter(ee.Filter.calendarRange(year, year, 'year')); // 累积变量求和 var sumVars = col.select(['aet','pet','pr','srad']).sum() .multiply(ee.Image([0.1, 0.1, 1, 0.1])); // 单位转换 // 平均变量求均值 var meanVars = col.select(['pdsi','soil','vpd','vs']).mean() .multiply(ee.Image([0.01, 0.1, 0.01, 0.01])); // 计算年平均温度 var tmean = col.select(['tmmx','tmmn']) .mean() .multiply(0.1) .reduce(ee.Reducer.mean()) .rename('tmean'); return sumVars .addBands(meanVars) .addBands(tmean) .set('year', year); } var climateCollection = ee.ImageCollection(years.map(getAnnualClimate));4.2 关键气候变量说明
| 变量名 | 全称 | 单位 | 生态意义 |
|---|---|---|---|
| aet | 实际蒸散发 | mm | 植被水分利用 |
| pr | 降水量 | mm | 水分供应 |
| pdsi | 帕默尔干旱指数 | 无 | 干旱程度 |
| vpd | 水汽压差 | kPa | 气孔导度压力 |
5. 数据合成与导出
5.1 多变量时序合成
将所有变量合并为单一ImageCollection,每个影像包含同一年份的植被和气候数据:
function combineVariables(year) { year = ee.Number(year); var veg = vegCollection.filter(ee.Filter.eq('year', year)).first(); var lai = laiCollection.filter(ee.Filter.eq('year', year)).first(); var climate = climateCollection.filter(ee.Filter.eq('year', year)).first(); return ee.Image.cat([ veg.select(['NDVI','EVI']), lai.select(['Lai_500m']), climate ]).set('year', year); } var finalCollection = ee.ImageCollection(years.map(combineVariables));5.2 导出到Google Drive
批量导出各变量多年均值:
function exportData(collection, prefix) { var img = collection.mean(); // 计算多年平均 // 逐个变量导出 var bandNames = img.bandNames().getInfo(); bandNames.forEach(function(name) { Export.image.toDrive({ image: img.select(name), description: prefix + '_' + name, fileNamePrefix: name + '_2000-2025', region: geometry, scale: 1000, crs: 'EPSG:4326', maxPixels: 1e13 }); }); } exportData(finalCollection, 'Yangtze');导出设置建议:
- 大区域导出时设置
maxPixels为1e13避免报错 - 复杂形状区域建议导出为GeoTIFF格式
- 小区域可以直接导出为CSV进行统计分析
6. 实际应用案例
6.1 干旱对植被的影响分析
用这套数据我做过一个有趣的分析:计算PDSI干旱指数与NDVI的相关系数,发现黄土高原草地生态系统对干旱的响应存在1-2个月的滞后效应。关键代码片段:
// 计算逐像元相关系数 var correlation = finalCollection.select(['PDSI','NDVI']) .reduce(ee.Reducer.pearsonsCorrelation()); Map.addLayer(correlation, {min: -1, max: 1}, 'PDSI-NDVI Correlation');6.2 植被生产力趋势检测
使用Mann-Kendall检验分析EVI的长期变化趋势:
var trend = vegCollection.select('EVI') .reduce(ee.Reducer.kendallsCorrelation()) .select('slope'); Map.addLayer(trend, {palette: ['red', 'yellow', 'green']}, 'EVI Trend');这套方法已经帮助我团队完成了3篇SCI论文的数据处理工作。特别是在分析极端气候事件对生态系统的影响时,多变量数据集的价值就凸显出来了——你可以在同一时空框架下分析植被动态与气候因子的耦合关系,而不需要担心数据不一致带来的误差。