**
Google Earth Engine (GEE):提取ERA5气象数据至点/面要素集,导出为SHP/CSV
**
ERA5气象再分析数据
ERA5 是第五代 ECMWF 全球气候大气再分析。 再分析将模型数据与世界各地的观测结果结合起来,形成全球完整且一致的数据集。
数据范围:全球
数据可用时间:1979/1/1 - 现在
GEE已存储ERA5月值、日值、小时等分辨率数据:
GEE获取ERA5数据
实际使用气象数据时往往只取点/面等感兴趣区的数据,如果去CDS官网下载数据,往往是几十个G,但是只提取一小部分使用,GEE能够提供云端ERA5数据的查询、处理和导出等服务,节约科学研究的数据处理时间。废话不多说,直接上代码(提取142个湖泊中心点要素数据集2005-2022年温度、降水、辐射、气压等日值):
// 数据提取时间范围
var startDate = '2005-01-01';
var endDate = '2023-01-01';
// 矢量数据,每个要素是一个提取单元
var regions = Lake142CenterPoints;
// 确定提取值的统计方式,比如min/max/median....,reduceName也需要修改
var reduce = ee.Reducer.mean();
var reduceName = 'mean';
// ---------------------------------calc daily data----------------------------------
// 按照时间范围筛选数据
var ERA5DailyLatest_filterdate = ERA5DailyLatest.filterDate(startDate, endDate);
var ERA5Daily_filterdate = ERA5Daily.filterDate(startDate, endDate);
print(ERA5DailyLatest_filterdate, ERA5Daily_filterdate);
// 空的结果要素集合
var regions_data_modify = ee.FeatureCollection(ee.List([]));
// 提取ee.ImageCollection("ECMWF/ERA5/DAILY")数据的函数
var getERA5DailyLatest = function(image, regions) {
var varName = image.bandNames().get(0);
// add a column named reduceName
var regions_data = image.reduceRegions(ee.FeatureCollection(regions), reduce);
var date = image.date().format().slice(0,10);
// writes the date in each feature as a new column named date
// get temp with unit oC
if (['mean_2m_air_temperature', 'minimum_2m_air_temperature', 'maximum_2m_air_temperature', 'dewpoint_2m_temperature'].indexOf(varName) !== -1) {
regions_data_modify = regions_data.map(function(feature) {
return feature.set(date, feature.get(reduceName).subtract(ee.Number(273.15)));
});
return regions_data_modify;
}
// get pr with unit mm
else if (['total_precipitation'].indexOf(varName) !== -1) {
regions_data_modify = regions_data.map(function(feature) {
return feature.set(date, feature.get(reduceName).multiply(ee.Number(1000.0)));
});
return regions_data_modify;
}
// get pres with unit hPa
else if (['surface_pressure'].indexOf(varName) !== -1) {
regions_data_modify = regions_data.map(function(feature) {
return feature.set(date, feature.get(reduceName).multiply(ee.Number(0.01)));
});
return regions_data_modify;
}
// get ws with unit m/s, unit did not need change
else {
regions_data_modify = regions_data.map(function(feature) {
return feature.set(date, feature.get(reduceName));
});
return regions_data_modify;
}
};
// 提取ee.ImageCollection("ECMWF/ERA5/DAILY")数据的函数
var getERA5Daily = function(image, regions) {
var varName = image.bandNames().get(0);
// add a column named mean
var regions_data = image.reduceRegions(ee.FeatureCollection(regions), reduce);
var date = image.date().format().slice(0,10);
// get sr with unit MJ/m2
if (['surface_solar_radiation_downwards_sum'].indexOf(varName) !== -1) {
regions_data_modify = regions_data.map(function(feature) {
return feature.set(date, feature.get(reduceName).multiply(ee.Number(1e-6)));
});
return regions_data_modify;
}
// unit did not need change
else {
regions_data_modify = regions_data.map(function(feature) {
return feature.set(date, feature.get(reduceName));
});
return regions_data_modify;
}
};
var ERA5DailyLatest_varNameLs = ['mean_2m_air_temperature', 'minimum_2m_air_temperature', 'maximum_2m_air_temperature', 'dewpoint_2m_temperature',
'total_precipitation', 'surface_pressure', 'u_component_of_wind_10m', 'v_component_of_wind_10m'];
var _ = ERA5DailyLatest_varNameLs.map(function (varName){
var fc_data = ee.FeatureCollection(ERA5DailyLatest_filterdate.select([varName]).iterate(getERA5DailyLatest, regions));
Export.table.toDrive({
collection: fc_data,
description: startDate + '_' + endDate + '_' + varName,
folder: 'GEE',
fileNamePrefix: startDate + '_' + endDate + '_' + varName,
fileFormat: 'CSV',
maxVertices: 1e13,
});
return null;
}, true);
var ERA5Daily_varNameLs = ['surface_solar_radiation_downwards_sum'];
var _ = ERA5Daily_varNameLs.map(function (varName){
var fc_data = ee.FeatureCollection(ERA5Daily_filterdate.select([varName]).iterate(getERA5Daily, regions));
Export.table.toDrive({
collection: fc_data,
description: startDate + '_' + endDate + '_' + varName,
folder: 'GEE',
fileNamePrefix: startDate + '_' + endDate + '_' + varName,
fileFormat: 'CSV',
maxVertices: 1e13,
});
return null;
}, true);
// ---------------------------------calc daily data----------------------------------
核心处理部分
基础代码不懂的自己搜,下面说一下核心的处理部分
1、读取区域矢量数据,使用ee.Image.reduceRegions()将每幅影像的区域至提取处出来,注意,这个函数会在FeatureCollection加一列属性,reduceName需要与这个属性名称一致
2、使用ee.ImageCollection.iterate()迭代写入提取数据,每次迭代一个影像,获取影像时间,然后把FeatureCollection加一列数据,把属性reduceName的临时数据保存到以日期为名的列中,然后再把加了属性的FeatureCollection作为下一个迭代的输入,所以最后导出数据的结果CSV格式为(CSV名字为日期范围+提取要素名称):
Index | 2005-01-01 | 2005-01-02 |
---|---|---|
0 | xxx | xxx |
1 | xxx | xxx |
2 | xxx | xxx |