使用 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 处理气候数据,为研究气候变化提供了强有力的工具。希望这个教程对你有所帮助!