目录

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
本代码基于 Google Earth Engine(GEE)平台,利用 ECMWF/ERA5_LAND/MONTHLY_AGGR 数据集(ERA5-Land 月度聚合数据),计算 1960-2020 年全球范围内的相对湿度(RH)和比湿(q),并按年份生成年度均值影像,最终将各年份的相对湿度和比湿影像导出至 Google Drive。
一、基础参数与数据集初始化
var startYear = 1960, endYear = 2020;
var col = ee.ImageCollection('ECMWF/ERA5_LAND/MONTHLY_AGGR')
.filterDate(startYear + '-01-01', (endYear + 1) + '-01-01')
.select(['temperature_2m', 'dewpoint_temperature_2m', 'surface_pressure']);
- 参数定义:明确数据时间范围为 1960 年至 2020 年,通过
startYear和endYear两个变量固定起止年份,方便后续代码复用和修改。 - 数据集调用:
ee.ImageCollection('ECMWF/ERA5_LAND/MONTHLY_AGGR'):加载 GEE 内置的 ERA5-Land 月度聚合数据集,该数据集包含全球地表及近地面多种气象要素的月度统计数据,精度和完整性较高。filterDate(...):对数据集进行时间筛选。由于 GEE 的filterDate为左闭右开区间(包含起始日期,不包含结束日期),因此结束日期设置为endYear + 1的 1 月 1 日,确保 2020 年 12 月的月度数据被完整包含。select(...):筛选数据集所需的 3 个核心气象变量,避免加载冗余数据,提升计算效率:temperature_2m:2 米高度气温(单位:开尔文 K);dewpoint_temperature_2m:2 米高度露点温度(单位:开尔文 K);surface_pressure:地表气压(单位:帕斯卡 Pa)。
二、湿度参数计算(核心处理步骤)
var withHum = col.map(function(img) {
var T = img.select('temperature_2m').subtract(273.15);
var Td = img.select('dewpoint_temperature_2m').subtract(273.15);
var sp = img.select('surface_pressure');
// 饱和水汽压计算
var es = T.expression('611.2 * exp(17.62 * tc / (243.12 + tc))', {tc: T});
// 实际水汽压计算
var e = Td.expression('611.2 * exp(17.62 * td / (243.12 + td))', {td: Td});
// 相对湿度计算
var rh = e.divide(es).multiply(100).rename('RH');
// 比湿计算
var q = e.multiply(0.622).divide(sp.subtract(e.multiply(0.378))).rename('q');
return img.select(0).addBands([rh, q]);
});
该部分通过map函数遍历数据集中的每一幅月度影像,逐像元计算相对湿度(RH)和比湿(q),是代码的核心逻辑:
- 温度单位转换:原始气温(T)和露点温度(Td)均为开尔文(K),通过
subtract(273.15)转换为摄氏度(℃),符合后续水汽压计算公式的单位要求。 - 水汽压计算:
- 饱和水汽压(es):基于气温(T),采用世界气象组织(WMO)推荐的 Magnus-Tetens 公式计算,表征某一温度下空气所能容纳的最大水汽量。公式中
611.2为 0℃时的饱和水汽压(Pa),17.62和243.12为经验常数。 - 实际水汽压(e):基于露点温度(Td),采用与饱和水汽压相同的公式计算,表征空气实际含有的水汽量(露点温度是空气水汽达到饱和时的温度)。
- 饱和水汽压(es):基于气温(T),采用世界气象组织(WMO)推荐的 Magnus-Tetens 公式计算,表征某一温度下空气所能容纳的最大水汽量。公式中
- 目标湿度参数计算:
- 相对湿度(RH):定义为实际水汽压与同温度下饱和水汽压的比值(百分比形式),反映空气接近饱和的程度。通过
e.divide(es)计算比值,再multiply(100)转换为百分比,最后用rename('RH')为新波段命名。 - 比湿(q):定义为水汽质量与湿空气总质量的比值(单位:kg/kg),是气象和气候研究中常用的湿度指标(不受气压影响)。计算公式中
0.622和0.378为水汽与干空气的分子量相关常数,通过该公式将水汽压和地表气压转换为比湿,命名为q。
- 相对湿度(RH):定义为实际水汽压与同温度下饱和水汽压的比值(百分比形式),反映空气接近饱和的程度。通过
- 影像输出:
return img.select(0).addBands([rh, q])表示保留原始数据集中的第一个波段(此处为 2 米气温),并将计算得到的 RH 和 q 作为新波段添加到影像中,形成包含原始气温和两个湿度参数的新影像集合withHum。
三、年度均值合成
var years = ee.List.sequence(startYear, endYear);
var annual = ee.ImageCollection.fromImages(
years.map(function(y) {
y = ee.Number(y);
var mean = withHum.filter(ee.Filter.calendarRange(y, y, 'year'))
.mean()
.set('year', y)
.set('system:index', y.format('%d'));
return mean;
})
);
- 年份序列生成:
ee.List.sequence(startYear, endYear)生成 1960-2020 年的年份列表(整数序列),作为后续按年份筛选数据的依据。 - 年度均值计算:
- 通过
years.map(...)遍历每一个年份,对withHum影像集合进行按年筛选和均值计算:filter(ee.Filter.calendarRange(y, y, 'year')):筛选出当前年份(y)的所有月度影像;.mean():对该年份的月度影像进行逐像元均值计算,得到年度平均影像(包含气温、RH、q 三个波段的年度均值);.set('year', y)和.set('system:index', y.format('%d')):为生成的年度影像添加属性(year字段记录年份)和索引(以年份作为影像索引),方便后续按年份筛选和导出。
ee.ImageCollection.fromImages(...):将所有年份的年度均值影像整合为新的影像集合annual,该集合包含 61 幅影像(1960-2020 年每年 1 幅)。
- 通过
四、导出范围定义与影像导出
var region = ee.Geometry.Rectangle([-180, -90, 180, 90], null, false);
years.evaluate(function(yearList) {
yearList.forEach(function(y) {
var img = annual.filter(ee.Filter.eq('year', y)).first();
// 相对湿度导出
Export.image.toDrive({
image: img.select('RH'),
description: 'ERA5Land_RH_' + y,
folder: 'ERA5Land_RH',
scale: 11132,
region: region,
maxPixels: 1e13
});
// 比湿导出
Export.image.toDrive({
image: img.select('q'),
description: 'ERA5Land_q_' + y,
folder: 'ERA5Land_q',
scale: 11132,
region: region,
maxPixels: 1e13
});
});
});
- 导出范围定义:
ee.Geometry.Rectangle([-180, -90, 180, 90], null, false)定义导出的空间范围为全球(经度:-180°~180°,纬度:-90°~90°)。其中null表示使用默认投影,false表示不闭合几何图形(矩形本身已闭合,此处不影响结果)。 - 客户端与服务器端数据交互:
years.evaluate(function(yearList) { ... }):GEE 中ee.List是服务器端对象,无法直接在客户端(如浏览器)进行遍历,evaluate方法将服务器端的年份列表years转换为客户端可识别的普通数组yearList,从而实现逐年份循环导出。 - 影像导出配置:对每一年的年度影像,分别筛选出
RH(相对湿度)和q(比湿)波段,通过Export.image.toDrive导出至 Google Drive:image: img.select('RH')/img.select('q'):指定导出的目标波段;description: 'ERA5Land_RH_' + y/'ERA5Land_q_' + y:导出文件的名称(包含数据集名称、参数类型和年份,如ERA5Land_RH_1960),便于区分和管理;folder: 'ERA5Land_RH'/'ERA5Land_q':指定导出文件在 Google Drive 中的存储文件夹(会自动创建该文件夹),将不同参数的文件分类存储;scale: 11132:导出影像的空间分辨率(单位:米),约等于 1°×1°(赤道处 1° 经度约为 111320 米,此处scale=11132对应约 0.1° 分辨率),该分辨率与 ERA5-Land 数据集的原始分辨率匹配;region: region:指定导出的空间范围(全球);maxPixels: 1e13:设置导出影像的最大像元数限制(1×10¹³,远大于全球 0.1° 分辨率影像的像元数,避免因像元数超限导致导出失败)。
五、关键技术要点总结与注意事项
关键技术要点总结:
- GEE 数据处理逻辑:遵循 “服务器端处理为主、客户端交互为辅” 的原则,通过
map、filter等方法实现批量数据处理,利用evaluate实现服务器端与客户端的数据转换。 - 气象参数计算原理:基于经典的 Magnus-Tetens 公式计算水汽压,再通过水汽压、地表气压等基础参数推导相对湿度和比湿,确保计算结果的科学性和准确性。
- 导出优化配置:通过合理设置
scale(分辨率)、maxPixels(最大像元数)、folder(存储文件夹)等参数,保证导出过程的稳定性和结果的可用性。 - 数据完整性保障:时间筛选时采用 “左闭右开” 区间设计,确保包含完整的目标年份数据;导出参数时分类存储、命名规范,便于后续数据管理和分析。
注意事项:
- 该代码运行依赖 Google Earth Engine 账号和稳定的网络环境,且导出大量影像(61 年 ×2 个参数 = 122 幅影像)需要一定的时间(取决于 GEE 服务器负载),需耐心等待导出完成。
- 导出的影像格式默认为 GeoTIFF(GEE 导出的默认 raster 格式),可直接用于 ArcGIS、QGIS 等 GIS 软件的空间分析。
- 若需调整时间范围(如延长至 2023 年)或空间范围(如仅导出某一区域),可修改
startYear、endYear和region的定义,无需改动核心计算逻辑。
六、运行结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
315





