介绍
在本教程中,我们将使用 Google Earth Engine (GEE) ,获取特定区域(通过经纬度定义的矩形区域)内的降水量(或温度)数据,并将这些数据导出为 CSV 格式。我们将探索如何进行数据筛选、计算月度降水量、应用色带(color ramp)以及导出处理后的数据。
准备工作
首先,你需要在 Google Earth Engine 上创建一个账户并访问代码编辑器。确保你有足够的权限来访问 ERA5 数据集以及可以进行数据导出。
代码解析
1. 定义区域
我们使用 ee.Geometry.Rectangle 定义了一个矩形区域,作为分析区域。这里的经纬度坐标选择了一个大的矩形区域,但你可以根据自己的需求进行调整。
var lake = ee.Geometry.Rectangle({coords: [[70.5, 4], [137, 56]], geodesic:false});
2. 定义变量和时间范围
我们选择了 ERA5 数据集中的 temperature_2m 变量进行分析,表示 2 米高度的温度数据,而不是降水量数据。在实际应用中,你可以根据需要切换到降水量相关的变量(例如 total_precipitation_sum)。
var value = 'temperature_2m'; // 温度变量
var StartYear = 2020; // 起始年份
var EndYear = 2023; // 结束年份
3. 过滤并获取数据
通过 ee.ImageCollection 对 ERA5 数据集进行时间范围的筛选,我们选择了 2023 年 12 月的数据,并将数据裁剪。
var image = ee.ImageCollection('ECMWF/ERA5_LAND/MONTHLY_AGGR')
.filterDate('2023-12-01', '2023-12-30') // 根据时间范围过滤数据
.select(value) // 选择温度数据
.first() // 选择时间段内的第一个图像
.clip(lake); // 裁剪到湖泊区域
4. 色带定义
我们为温度数据创建了一个色带(color ramp),从蓝色(低温)到红色(高温)。通过这种方式,可以在地图上清晰地看到不同区域的温度变化。
var precipVis = {
min: 250, // 最小值
max: 300, // 最大值
palette: ['blue', 'green', 'yellow', 'red'] // 定义一个简单的色带
};
5. 绘制地图和设置视图
在地图上添加了定义好的图像层,并设置了地图的视图中心为湖泊区域。缩放级别设置为 3,以便在地图上看到更大范围的数据。
Map.addLayer(image, precipVis, 'Precipitation');
Map.centerObject(lake, 3); // 将地图视图设置为湖泊区域,并设置缩放级别
6. 遍历年份和月份,获取每月数据
通过循环,我们遍历了从 2020 到 2023 年的所有月份,并逐月获取温度数据。在每次循环中,我们使用 reduceRegion 计算了每个月的区域平均温度,并将其添加到数据列表中。
for (var j = StartYear; j <= EndYear; j++) {
for (var i = 1; i <= 12; i++) {
var date = i.toString();
var timeStart = j + "-" + i + '-01'; // 当前月的开始时间
var k = i + 1; // 下一个月
var timeEnd = j + "-" + k + '-01'; // 下一个月的开始时间
if (k == 13) {
timeEnd = (j + 1) + '-01-01'; // 如果是12月,结束日期为下一年1月
}
var era5_monthly = ee.ImageCollection('ECMWF/ERA5_LAND/MONTHLY_AGGR')
.filterDate(timeStart, timeEnd)
.select(value); // 选择温度数据
var mean_precip = era5_monthly.mean().clip(lake); // 计算平均值并裁剪
var monthly_precip = mean_precip.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: lake,
crs: 'EPSG:4326',
scale: 11132,
}).get(value); // 获取月度平均温度
data_list.push([timeStart, monthly_precip]); // 将数据添加到列表中
}
}
7. 转换数据为 FeatureCollection
我们将所有的月度数据转换为 FeatureCollection,这是 Google Earth Engine 中一种常用的数据结构,便于进一步分析和导出。
var data_list = ee.List(data_list);
var features = data_list.map(function(pair) {
pair = ee.List(pair);
var date = pair.get(0);
var precip = pair.get(1);
var feature = ee.Feature(null, {
'date': date,
value: precip
});
return feature;
});
var data_fc = ee.FeatureCollection(features);
8. 导出数据到 Google Drive
最后,我们使用 Export.table.toDrive 将计算得到的 FeatureCollection 导出为 CSV 格式,便于离线分析和共享。
Export.table.toDrive({
collection: data_fc,
description: 'ERA5' + "_" + value + "_" + StartYear + "_" + EndYear,
folder: 'ERA5' + "_" + value,
fileFormat: 'CSV'
});
9. 结果查看
你可以在 GEE 控制台查看输出的 FeatureCollection,并检查每个月的降水量或温度数据。通过 Google Drive 导出的文件可以直接打开,并对数据进行进一步分析。
10. 完整代码
// 定义区域,使用经纬度坐标构建一个矩形区域
var lake = ee.Geometry.Rectangle({coords: [[70.5, 4], [137, 56]], geodesic:false});
// 创建一个空数组,用于存储每月降水数据
var data_list = [];
// 设置降水变量以及时间范围
var value = 'temperature_2m'; // 降水总和变量
var StartYear = 2020; // 起始年份
var EndYear = 2023; // 结束年份
var image = ee.ImageCollection('ECMWF/ERA5_LAND/MONTHLY_AGGR')
.filterDate('2023-12-01', '2023-12-30') // 根据时间范围过滤数据
.select(value)
.first()
.clip(lake);
// 创建色带(color ramp),从蓝色(低值)到红色(高值)
var precipVis = {
min: 250, // 最小值(即最少的降水量)
max: 300, // 最大值(即最多的降水量)
palette: ['blue', 'green', 'yellow', 'red'] // 定义一个简单的色带
};
// 在地图上添加湖泊区域,方便可视化
Map.addLayer(image, precipVis, 'Precipitation');
// 将地图视图中心设置为区域,并指定缩放级别
Map.centerObject(lake, 3); // 第一个参数是目标地理对象(湖泊),第二个参数是缩放级别(10)
// 遍历年份和月份,收集每个月的降水数据
for (var j = StartYear; j <= EndYear; j++) {
for (var i = 1; i <= 12; i++) {
// 格式化月份为两位数
var date = i.toString();
// 设置每个月的起始和结束时间
var timeStart = j + "-" + i + '-01'; // 当前月的开始时间
var k = i + 1; // 下一个月
var timeEnd = j + "-" + k + '-01'; // 下一个月的开始时间
// 如果下个月是12月,则下一年的1月1日作为结束日期
if (k == 13) {
timeEnd = (j + 1) + '-01-01';
}
// 从ERA5数据集获取当前月的降水数据
var era5_monthly = ee.ImageCollection('ECMWF/ERA5_LAND/MONTHLY_AGGR')
.filterDate(timeStart, timeEnd) // 根据时间范围过滤数据
.select(value); // 选择降水数据
// 计算当前月的平均降水量,并裁剪到湖泊区域
var mean_precip = era5_monthly.mean().clip(lake);
// 对裁剪后的降水数据计算区域的平均值
var monthly_precip = mean_precip.reduceRegion({
reducer: ee.Reducer.mean(), // 使用均值计算
geometry: lake, // 降水计算区域为湖泊
crs: 'EPSG:4326', // 设置坐标参考系统
scale: 11132, // 设置分析尺度(以米为单位)
}).get(value); // 获取当前月的降水值
// 将当前月份和降水值添加到数据列表中
data_list.push([timeStart, monthly_precip]);
}
}
// 将数据列表转换为 Earth Engine List 对象
var data_list = ee.List(data_list);
// 将数据列表映射为Feature集合,每个Feature代表一条降水数据记录
var features = data_list.map(function(pair) {
pair = ee.List(pair); // 每个数据对(时间,降水量)转换为 List 类型
var date = pair.get(0); // 获取时间(每个月的起始时间)
var precip = pair.get(1); // 获取降水量
var feature = ee.Feature(null, {
'date': date, // 设置 Feature 的时间属性
value: precip // 设置 Feature 的降水量属性
});
return feature; // 返回 Feature
});
// 将所有 Features 转换为 FeatureCollection
var data_fc = ee.FeatureCollection(features);
// 打印出 FeatureCollection(可以在控制台查看数据)
print(data_fc);
// 导出结果到 Google Drive
Export.table.toDrive({
collection: data_fc, // 导出的 FeatureCollection 数据
description: 'ERA5' + "_" + value + "_" + StartYear + "_" + EndYear, // 导出文件描述
folder: 'ERA5' + "_" + value, // 导出文件的文件夹名称
fileFormat: 'CSV' // 设置导出格式为 CSV
});
总结
本教程展示了如何利用 Google Earth Engine (GEE) 获取和处理 ERA5 数据集中的温度数据,并对特定湖泊区域进行分析。我们通过编写脚本,定义了感兴趣的区域,筛选了所需时间段的数据,并应用了色带将数据可视化。最后,我们将结果导出为 CSV 文件,方便进行进一步分析。
通过类似的方法,你可以扩展到其他气象变量(如降水量、风速等)和不同区域的数据处理。这使得 GEE 成为地理空间数据分析和可视化的强大工具。
3万+

被折叠的 条评论
为什么被折叠?



