目录
[1. 筛选单年份数据](#1. 筛选单年份数据)
[2. 降水量单位转换](#2. 降水量单位转换)
[3. 时间聚合(求和 / 求平均)](#3. 时间聚合(求和 / 求平均))
[4. 合并影像与导出](#4. 合并影像与导出)

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
本代码基于 Google Earth Engine(GEE)平台,目标是从 NASA/GDDP-CMIP6 气候数据集(全球降尺度数据产品,包含 CMIP6 模式的气候模拟数据)中,筛选特定模式、情景和年份的气候数据,对不同类型的气候变量执行求和或求平均的时间聚合处理,最终将处理后的单波段数据裁剪到目标区域并导出至 Google Drive。
一、关键变量定义与说明
(一)核心数据相关变量
javascript
var roi = table; // 感兴趣区域(Region of Interest),由外部导入的矢量数据(table)定义,用于后续数据裁剪
var dataset = ee.ImageCollection('NASA/GDDP-CMIP6'); // GEE数据集ID,指向NASA发布的GDDP-CMIP6气候数据集合
roi:必须提前在 GEE 中导入矢量图层(如行政边界、研究区域边界)并命名为table,否则会导致裁剪失败。dataset:包含多个气候模式(model)、不同排放情景(scenario)、长时序的气候数据,变量涵盖降水、温度、辐射等多种气象要素。
(二)波段分类变量
javascript
var sumBands = ['pr', 'rlds', 'rsds']; // 需要进行"时间求和"的波段集合
var meanBands = ['tas', 'tasmin', 'tasmax', 'hurs', 'huss', 'sfcWind']; // 需要进行"时间求平均"的波段集合
var allBands = sumBands.concat(meanBands); // 合并所有波段,用于后续循环导出
各波段含义(GDDP-CMIP6 数据集标准定义):
| 波段名称 | 变量含义 | 单位 | 聚合方式 |
|---|---|---|---|
| pr | 降水量 | kg/m²/s(原始) | 求和 |
| rlds | 向下长波辐射通量 | W/m² | 求和 |
| rsds | 向下短波辐射通量 | W/m² | 求和 |
| tas | 近地面气温(平均) | K | 求平均 |
| tasmin | 近地面最低气温 | K | 求平均 |
| tasmax | 近地面最高气温 | K | 求平均 |
| hurs | 近地面相对湿度 | % | 求平均 |
| huss | 近地面比湿 | kg/kg | 求平均 |
| sfcWind | 近地面风速 | m/s | 求平均 |
(三)筛选条件变量
javascript
var models = ['ACCESS-CM2']; // 要筛选的气候模式名称(CMIP6中的一个全球气候模式)
var scenarios = ['ssp245', 'ssp585']; // 要筛选的排放情景
- 气候模式:
ACCESS-CM2是澳大利亚联邦科学与工业研究组织(CSIRO)开发的 CMIP6 模式,适用于全球气候模拟。 - 排放情景(SSP 情景,共享社会经济路径):
- ssp245:中等排放情景("中间道路" 情景,全球温升控制在 2-3℃);
- ssp585:高排放情景(化石燃料密集型发展,全球温升可能超过 4℃);
- 额外包含
historical(历史情景,通常为 1850-2014 年观测驱动的模拟数据)。
二、核心函数:exportYearlyData
该函数是数据处理与导出的核心,接收 4 个参数(气候模式、情景、年份、数据集合),完成单年份数据的处理与导出。
(一)函数整体逻辑
筛选单年份数据 → 预处理特定波段(降水量单位转换) → 按波段类型聚合(求和 / 求平均) → 合并聚合结果 → 循环导出单波段数据至 Drive。
(二)关键步骤解析
1. 筛选单年份数据
javascript
var yearCol = collection.filter(ee.Filter.calendarRange(year, year, 'year'));
- 使用
ee.Filter.calendarRange筛选输入数据集合(collection)中指定年份(year)的所有影像,得到该年份的时序影像集合(yearCol)。 - 注:GDDP-CMIP6 数据通常为日尺度数据,因此
yearCol包含该年份 365/366 天的日尺度影像。
2. 降水量单位转换
javascript
var processedCol = yearCol.map(function(img) {
var pr = img.select('pr').multiply(86400).rename('pr');
return img.addBands(pr, null, true);
});
- 核心目的:GDDP-CMIP6 中
pr(降水量)的原始单位是kg/m²/s(即 mm/s),乘以 86400(一天的秒数)后,转换为mm/天,符合日常降水量统计习惯。 - 逻辑:遍历年份影像集合中的每幅影像(
img),单独处理pr波段,转换后覆盖原pr波段(addBands的true参数表示替换同名波段)。
3. 时间聚合(求和 / 求平均)
javascript
var sumImg = processedCol.select(sumBands).sum(); // 对sumBands波段集合执行"年度求和"
var meanImg = processedCol.select(meanBands).mean(); // 对meanBands波段集合执行"年度求平均"
- 求和逻辑:适用于通量类、累积类变量(如降水量
pr、辐射通量rlds),得到年度总量(如年降水量、年总辐射量)。 - 求平均逻辑:适用于状态类变量(如气温、湿度、风速),得到年度平均值(如年平均气温、年平均相对湿度)。
4. 合并影像与导出
javascript
var combinedImg = sumImg.addBands(meanImg); // 合并求和、求平均后的所有波段,得到单幅年度综合影像
allBands.forEach(function(band) {
var imageToExport = combinedImg.select(band).clip(roi); // 筛选单个波段,并裁剪到目标区域(roi)
var fileName = model + '_' + scenario + '_' + year + '_' + band; // 定义导出文件名(包含模式、情景、年份、波段信息)
Export.image.toDrive({ // 导出影像至Google Drive
image: imageToExport,
description: fileName, // GEE任务描述
folder: 'NEX_GDDP_CMIP6_oya', // 导出到Drive中的目标文件夹(需提前创建或允许GEE自动创建)
fileNamePrefix: fileName, // 导出文件前缀(与fileName一致,确保文件标识唯一)
region: roi, // 导出区域(与裁剪区域一致)
scale: 27830, // 空间分辨率(单位:米),GDDP-CMIP6数据的标准分辨率(约25km,因投影不同略有差异)
crs: 'EPSG:4326', // 坐标系(WGS84经纬度坐标系)
maxPixels: 1e13 // 最大像素数限制(避免因区域过大导致导出失败,1e13足够覆盖全球尺度)
});
});
- 导出特点:按波段单独导出(而非多波段影像),每个波段对应一个独立的 Drive 文件,文件名包含完整的元数据信息(模式 - 情景 - 年份 - 波段),便于后续数据管理。
- 依赖条件:运行前需确保 GEE 已授权访问 Google Drive,且目标文件夹(
NEX_GDDP_CMIP6_oya)可写入。
三、数据筛选与函数调用逻辑
(一)整体执行流程
遍历指定气候模式(models)→ 分别处理历史情景(historical)和未来情景(scenarios)→ 筛选对应情景的数据集 → 调用exportYearlyData函数导出指定年份数据。
(二)历史情景数据处理
javascript
models.forEach(function(model) {
var historicalCol = dataset.filter(ee.Filter.eq('model', model))
.filter(ee.Filter.eq('scenario', 'historical')); // 筛选历史情景数据集
for (var year = 2010; year <= 2010; year++) {
exportYearlyData(model, 'historical', year, historicalCol); // 导出2010年历史情景数据
}
});
- 筛选逻辑:通过
ee.Filter.eq(等于筛选),从总数据集(dataset)中筛选出指定模式(model)和historical情景的影像集合(historicalCol)。 - 年份限制:仅导出 2010 年数据(循环条件
year=2010至2010),如需导出多个历史年份,可修改循环范围(如2000至2010)。
(三)未来情景数据处理
javascript
scenarios.forEach(function(scenario) {
var futureCol = dataset.filter(ee.Filter.eq('model', model))
.filter(ee.Filter.eq('scenario', scenario)); // 筛选未来情景数据集
for (var year = 2050; year <= 2050; year++) {
exportYearlyData(model, scenario, year, futureCol); // 导出2050年未来情景数据
}
});
- 逻辑与历史情景一致:遍历
ssp245和ssp585两个未来情景,分别筛选数据集后,导出 2050 年数据。 - 扩展说明:如需导出多个未来年份(如 2030、2050、2100),可修改
for循环的年份范围。
四、关键注意事项与约束
-
数据权限与依赖:
- 需在 GEE 中导入矢量数据(
table)作为roi,否则裁剪步骤会报错; - 需确保 Google 账号已授权 GEE 访问 Google Drive,且目标文件夹(
NEX_GDDP_CMIP6_oya)存在或允许创建。
- 需在 GEE 中导入矢量数据(
-
分辨率与数据量:
- 导出分辨率为
27830米(约 25km),若需更高分辨率(如 10km),需修改scale参数,但会增加数据量和导出时间; maxPixels: 1e13是 GEE 允许的最大像素数限制,不可随意减小,否则大面积区域导出会失败。
- 导出分辨率为
-
波段与变量兼容性:
- 若需添加或删除波段,需确保修改
sumBands、meanBands和allBands三个变量,且新增波段在 GDDP-CMIP6 数据集中存在; - 不同气候模式(
models)可能存在波段缺失,更换模式时需确认目标模式支持所有指定波段。
- 若需添加或删除波段,需确保修改
-
年份有效性 :历史情景(
historical)的年份范围通常为 1850-2014(具体取决于模式),未来情景(ssp245/ssp585)通常为 2015-2100,需确保导出年份在对应情景的有效范围内,否则会导出空数据。
五、输出结果说明
- 输出位置:Google Drive 的
NEX_GDDP_CMIP6_oya文件夹; - 输出文件格式:GeoTIFF(GEE 默认影像导出格式,支持大部分 GIS 软件打开);
- 文件命名示例:
ACCESS-CM2_historical_2010_pr.tif(ACCESS-CM2 模式、历史情景、2010 年、降水量波段); - 数据内容:每个文件为单波段、单年份、裁剪后的栅格数据,数值为年度总量(sumBands)或年度平均值(meanBands)。
六、运行结果
点击RUN即可下载数据
下载的数据可视化结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!