使用Google Earth Engine分析风速的代码解析
在本博客中,我们将逐步解析一段使用Google Earth Engine(GEE)进行风速分析的JavaScript代码。该代码主要用于计算特定区域内的风速,并导出结果为CSV文件。
1. 定义感兴趣区域(ROI)
首先,我们定义一个多边形作为我们的感兴趣区域(ROI):
var roi =
/* color: #ffc82d */
/* shown: false */
/* displayProperties: [
{
"type": "rectangle"
}
] */
ee.Geometry.Polygon(
[[[-0.5759926154934103, 51.56908953196694],
[-0.5759926154934103, 51.468253456226385],
[-0.4221840217434103, 51.468253456226385],
[-0.4221840217434103, 51.56908953196694]]], null, false);
2. 加载ERA5气象数据集
接下来,我们加载ERA5气象数据集,选择风速的u和v分量,并过滤时间范围为2010年至2024年:
var era5 = ee.ImageCollection("ECMWF/ERA5/DAILY")
.select('u_.*','v_.*')
.filterDate('2010','2024');
3. 计算风速
我们使用map
函数来计算风速,风速的计算公式为:
[
\text{风速} = \sqrt{(u^2) + (v^2)}
]
以下是计算风速的代码:
var windspeed = era5.map(function(img) {
var eq = img.expression('sqrt((u**2)+(v**2))', {
'u': img.select('u_.*'), 'v': img.select('v_.*')
}).rename('wind_speed');
return eq.copyProperties(img, img.propertyNames());
});
4. 绘制风速时间序列图
我们使用ui.Chart.image.series
函数绘制风速时间序列图,并将其打印出来:
print(ui.Chart.image.series(windspeed, roi, ee.Reducer.mean(), 27000, 'system:time_start'));
5. 加载1980年至2020年的ERA5气象数据集
我们再次加载ERA5气象数据集,但这次的时间范围为1980年至2020年:
var wind40 = ee.ImageCollection("ECMWF/ERA5/DAILY").filterDate('1980','2020');
6. 计算1980年至2020年的风速
与之前相似,我们计算1980年至2020年期间的风速:
var windspeed40 = wind40.map(function(img) {
var eq = img.expression('sqrt((u**2)+(v**2))', {
'u': img.select('u_.*'), 'v': img.select('v_.*')
}).rename('wind_speed');
return eq.copyProperties(img, img.propertyNames());
});
7. 提取风速数据
我们定义一个函数get_value
,用于提取每个影像的日期和风速值:
function get_value(img) {
var date = ee.Date(ee.Image(img).get('system:time_start')).format().slice(0, 10);
var value = ee.Number(ee.Image(img).reduceRegion({
reducer: ee.Reducer.mean(), geometry: roi, scale: 27000
}).values().get(0));
return [date, value];
}
8. 创建风速特征集合
我们将风速数据转化为特征集合,以便于导出:
var size = windspeed40.size();
var windlist = windspeed40.toList(size).map(get_value);
var wind_feature = ee.FeatureCollection(windlist.map(function(el) {
el = ee.List(el);
return ee.Feature(null, {'date': ee.String(el.get(0)), 'windspeed': ee.String(el.get(1))});
}));
9. 导出风速数据
最后,我们将风速特征集合导出为CSV文件:
Export.table.toDrive({
collection: wind_feature,
description: 'windspeed40',
fileFormat: 'CSV'
});
结论
通过以上步骤,我们成功地使用Google Earth Engine计算了特定区域内的风速,并将结果导出为CSV文件。这些分析可以为气象研究和环境监测提供有价值的信息。希望这篇博客能帮助你更好地理解如何使用GEE进行气象数据分析!
全部代码
// 定义感兴趣区域(ROI)
var roi =
/* color: #ffc82d */
/* shown: false */
/* displayProperties: [
{
"type": "rectangle"
}
] */
ee.Geometry.Polygon(
[[[-0.5759926154934103, 51.56908953196694],
[-0.5759926154934103, 51.468253456226385],
[-0.4221840217434103, 51.468253456226385],
[-0.4221840217434103, 51.56908953196694]]], null, false);
// 加载ERA5气象数据集,选择风速的u和v分量
var era5 = ee.ImageCollection("ECMWF/ERA5/DAILY")
.select('u_.*','v_.*')
.filterDate('2010','2024');
// 计算风速
var windspeed = era5.map(function(img) {
var eq = img.expression('sqrt((u**2)+(v**2))', {
'u': img.select('u_.*'), 'v': img.select('v_.*')
}).rename('wind_speed');
return eq.copyProperties(img, img.propertyNames());
});
// 打印风速时间序列图
print(ui.Chart.image.series(windspeed, roi, ee.Reducer.mean(), 27000, 'system:time_start'));
// 加载1980年至2020年的ERA5气象数据集
var wind40 = ee.ImageCollection("ECMWF/ERA5/DAILY").filterDate('1980','2020');
// 计算1980年至2020年的风速
var windspeed40 = wind40.map(function(img) {
var eq = img.expression('sqrt((u**2)+(v**2))', {
'u': img.select('u_.*'), 'v': img.select('v_.*')
}).rename('wind_speed');
return eq.copyProperties(img, img.propertyNames());
});
// 提取风速数据的函数
function get_value(img) {
var date = ee.Date(ee.Image(img).get('system:time_start')).format().slice(0, 10);
var value = ee.Number(ee.Image(img).reduceRegion({
reducer: ee.Reducer.mean(), geometry: roi, scale: 27000
}).values().get(0));
return [date, value];
}
// 创建风速特征集合
var size = windspeed40.size();
var windlist = windspeed40.toList(size).map(get_value);
var wind_feature = ee.FeatureCollection(windlist.map(function(el) {
el = ee.List(el);
return ee.Feature(null, {'date': ee.String(el.get(0)), 'windspeed': ee.String(el.get(1))});
}));
// 导出风速数据为CSV文件
Export.table.toDrive({
collection: wind_feature,
description: 'windspeed40',
fileFormat: 'CSV'
});