基于 GEE 的 ERA5-Land 数据集获取全球 0.1° 空间分辨率的相对湿度与比湿数据

目录

一、基础参数与数据集初始化

二、湿度参数计算(核心处理步骤)

三、年度均值合成

四、导出范围定义与影像导出

五、关键技术要点总结与注意事项

六、运行结果


若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!

本代码基于 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 年,通过startYearendYear两个变量固定起止年份,方便后续代码复用和修改。
  • 数据集调用
    • 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.62243.12为经验常数。
    • 实际水汽压(e):基于露点温度(Td),采用与饱和水汽压相同的公式计算,表征空气实际含有的水汽量(露点温度是空气水汽达到饱和时的温度)。
  • 目标湿度参数计算
    • 相对湿度(RH):定义为实际水汽压与同温度下饱和水汽压的比值(百分比形式),反映空气接近饱和的程度。通过e.divide(es)计算比值,再multiply(100)转换为百分比,最后用rename('RH')为新波段命名。
    • 比湿(q):定义为水汽质量与湿空气总质量的比值(单位:kg/kg),是气象和气候研究中常用的湿度指标(不受气压影响)。计算公式中0.6220.378为水汽与干空气的分子量相关常数,通过该公式将水汽压和地表气压转换为比湿,命名为q
  • 影像输出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 数据处理逻辑:遵循 “服务器端处理为主、客户端交互为辅” 的原则,通过mapfilter等方法实现批量数据处理,利用evaluate实现服务器端与客户端的数据转换。
  • 气象参数计算原理:基于经典的 Magnus-Tetens 公式计算水汽压,再通过水汽压、地表气压等基础参数推导相对湿度和比湿,确保计算结果的科学性和准确性。
  • 导出优化配置:通过合理设置scale(分辨率)、maxPixels(最大像元数)、folder(存储文件夹)等参数,保证导出过程的稳定性和结果的可用性。
  • 数据完整性保障:时间筛选时采用 “左闭右开” 区间设计,确保包含完整的目标年份数据;导出参数时分类存储、命名规范,便于后续数据管理和分析。

注意事项:

  • 该代码运行依赖 Google Earth Engine 账号和稳定的网络环境,且导出大量影像(61 年 ×2 个参数 = 122 幅影像)需要一定的时间(取决于 GEE 服务器负载),需耐心等待导出完成。
  • 导出的影像格式默认为 GeoTIFF(GEE 导出的默认 raster 格式),可直接用于 ArcGIS、QGIS 等 GIS 软件的空间分析。
  • 若需调整时间范围(如延长至 2023 年)或空间范围(如仅导出某一区域),可修改startYearendYearregion的定义,无需改动核心计算逻辑。

六、运行结果

点击RUN即可下载数据
部分相对湿度(Relative Humidity,RH)数据制图结果
部分比湿(Specific Humidity,q)数据制图结果

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@HNUSTer_CUMTBer

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值