【GEE】获取区域气象数据

介绍

在本教程中,我们将使用 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 成为地理空间数据分析和可视化的强大工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

维吉斯蔡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值