GEE图表:基于ERA5 气候数据来计算特定区域内的温度变化和时序图表

使用 Google Earth Engine 计算和可视化温度变化

在本博客中,我们将介绍如何使用 Google Earth Engine (GEE) 来计算特定区域内的温度变化。我们将从定义研究区域开始,然后加载 ERA5 气候数据,最后计算并可视化温度的百分比变化。

1. 定义研究区域 (ROI)

首先,我们需要定义一个研究区域。我们使用一个多边形来表示该区域。

var geometry2 = 
    ee.FeatureCollection(
        [ee.Feature(
            ee.Geometry.Polygon(
                [[[-39.66417379156609, -7.39304923738461],
                  [-39.66417379156609, -7.511516344061788],
                  [-39.51860494390984, -7.511516344061788],
                  [-39.51860494390984, -7.39304923738461]]], null, false),
            {
              "system:index": "0"
            })]);

var roi = geometry2;
Map.centerObject(roi, 8);

2. 设置时间范围

接下来,我们定义要分析的时间范围,从 2000 年 1 月 1 日到 2023 年 12 月 31 日。

var time_start = '2000-01-01';
var time_end = '2023-12-31';

3. 加载气候数据

我们将加载 ERA5 的气候数据集,以获取 2 米高度的温度数据。

var era5 = ee.ImageCollection("ECMWF/ERA5_LAND/MONTHLY_AGGR")
  .select('temperature_2m')
  .filterDate(time_start, time_end);

4. 创建时间序列集合的函数

我们定义一个函数来创建基于月份的时间序列集合。该函数将返回指定时间范围内的平均温度图像。

function temporal_collection(collection, start, count, interval, unit) {
  var seq = ee.List.sequence(0, ee.Number(count).subtract(1));
  var origin_date = ee.Date(start);
  return ee.ImageCollection(seq.map(function(i) {
    var start_date = origin_date.advance(ee.Number(interval).multiply(i), unit);
    var end_date = start_date.advance(1, unit);  // 向前推进 1 个月
    return collection.filterDate(start_date, end_date).mean()
      .set('system:time_start', start_date.millis())
      .set('system:time_end', end_date.millis());
  }));
}

计算月份总数

接下来,我们计算从 2000 年到 2023 年的总月份数,并生成每个月的平均温度图像集合。

var totalMonths = ee.Date(time_end).difference(ee.Date(time_start), 'month').round();
var monthly = temporal_collection(era5, time_start, totalMonths, 1, 'month')
  .map(function(img) {
    return img.subtract(273.15)  // 从开尔文转换为摄氏度
      .copyProperties(img, img.propertyNames());
  });

5. 可视化温度变化

我们使用图表来显示该区域内每个月的平均温度变化。

print(ui.Chart.image.series(monthly, roi, ee.Reducer.mean(), 10000, 'system:time_start'));

6. 计算温度百分比变化

我们将计算每个月温度的百分比变化,并生成新的图像集合。

var temp_mean = monthly.mean(); // 整个期间的月平均温度

var change = monthly.map(function(img) {
  var eq = img.expression('((temp - mean) / mean) * 100', {
    'temp': img, 'mean': temp_mean
  }).rename('temp_change');
  return eq.copyProperties(img, img.propertyNames());
});

7. 可视化温度变化的百分比

最后,我们使用图表展示温度变化的百分比。

print(ui.Chart.image.series(change, roi, ee.Reducer.mean(), 10000, 'system:time_start')
  .setChartType('ColumnChart'));

全部代码

// 定义研究区域 (ROI)
var geometry2 = 
    ee.FeatureCollection(
        [ee.Feature(
            ee.Geometry.Polygon(
                [[[-39.66417379156609, -7.39304923738461],
                  [-39.66417379156609, -7.511516344061788],
                  [-39.51860494390984, -7.511516344061788],
                  [-39.51860494390984, -7.39304923738461]]], null, false),
            {
              "system:index": "0"
            })]);

var roi = geometry2;
Map.centerObject(roi, 8);

// 设置时间范围
var time_start = '2000-01-01';
var time_end = '2023-12-31';

// 加载气候数据
var era5 = ee.ImageCollection("ECMWF/ERA5_LAND/MONTHLY_AGGR")
  .select('temperature_2m')
  .filterDate(time_start, time_end);

// 创建时间序列集合的函数
function temporal_collection(collection, start, count, interval, unit) {
  var seq = ee.List.sequence(0, ee.Number(count).subtract(1));
  var origin_date = ee.Date(start);
  return ee.ImageCollection(seq.map(function(i) {
    var start_date = origin_date.advance(ee.Number(interval).multiply(i), unit);
    var end_date = start_date.advance(1, unit);  // 向前推进 1 个月
    return collection.filterDate(start_date, end_date).mean()
      .set('system:time_start', start_date.millis())
      .set('system:time_end', end_date.millis());
  }));
}

// 计算月份总数
var totalMonths = ee.Date(time_end).difference(ee.Date(time_start), 'month').round();
var monthly = temporal_collection(era5, time_start, totalMonths, 1, 'month')
  .map(function(img) {
    return img.subtract(273.15)  // 从开尔文转换为摄氏度
      .copyProperties(img, img.propertyNames());
  });

// 可视化温度变化
print(ui.Chart.image.series(monthly, roi, ee.Reducer.mean(), 10000, 'system:time_start'));

// 计算温度百分比变化
var temp_mean = monthly.mean(); // 整个期间的月平均温度

var change = monthly.map(function(img) {
  var eq = img.expression('((temp - mean) / mean) * 100', {
    'temp': img, 'mean': temp_mean
  }).rename('temp_change');
  return eq.copyProperties(img, img.propertyNames());
});

// 可视化温度变化的百分比
print(ui.Chart.image.series(change, roi, ee.Reducer.mean(), 10000, 'system:time_start')
  .setChartType('ColumnChart'));

可视化结果

时序图表可视化

结论

通过以上步骤,我们成功地提取了特定区域内的温度数据,计算了温度的百分比变化,并可视化了这些变化。这一过程展示了如何利用 Google Earth Engine 处理气候数据,为研究气候变化提供了强有力的工具。希望这个教程对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

此星光明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值