news 2026/8/11 22:03:15

GEE实战:构建2000-2025年MODIS与TerraClimate多变量生态气候时序数据集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GEE实战:构建2000-2025年MODIS与TerraClimate多变量生态气候时序数据集

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分辨率数据,变量处理分三种类型:

  1. 累积量:如降水(pr)、实际蒸散发(aet)
  2. 平均值:如土壤湿度(soil)、PDSI指数
  3. 衍生变量:如平均温度(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论文的数据处理工作。特别是在分析极端气候事件对生态系统的影响时,多变量数据集的价值就凸显出来了——你可以在同一时空框架下分析植被动态与气候因子的耦合关系,而不需要担心数据不一致带来的误差。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 22:02:58

【AI】高效交互的艺术:AI提示工程与大模型对话指南

🔥小龙报:个人主页 🎬作者简介:C研发,嵌入式,机器人等方向学习者 ❄️个人专栏:《AI》 ✨ 永远相信美好的事情即将发生 文章目录前言一、ChatatGPT介绍二、什么是提示工程?三、大语言…

作者头像 李华
网站建设 2026/8/11 22:02:14

零成本搭建家庭Linux服务器:樱花frp+SSH避坑指南(含端口冲突解决)

零成本搭建家庭Linux服务器:从设备选型到SSH优化全攻略 家里那台吃灰的旧电脑其实是个宝藏——只要稍加改造,就能变身成为你的专属Linux服务器。不需要昂贵的云服务费用,利用闲置硬件和免费内网穿透工具,我们完全可以打造一个稳定…

作者头像 李华
网站建设 2026/7/14 15:41:14

OV-Card:基于STM32与RC522的UID卡模拟硬件终端

1. 项目概述OV-Card 是一款面向便携式身份凭证管理场景设计的嵌入式硬件终端,其核心功能为非接触式IC卡信息的本地化采集、安全存储与可控复现。该设备并非通用型NFC读写器,而是聚焦于MIFARE Classic 1K类卡片中UID(Unique Identifier&#x…

作者头像 李华
网站建设 2026/7/14 15:41:27

利用CRU TS tmp数据集进行区域年平均气温可视化分析

1. CRU TS tmp数据集简介与下载指南 CRU TS(Climatic Research Unit Timeseries)是全球气候研究领域最权威的公开数据集之一,由英国东英吉利大学气候研究中心开发维护。我最早接触这个数据集是在2015年做华南地区气候变化研究时,当…

作者头像 李华