使用ERA5数据绘制风向玫瑰图的简易流程
今天我需要做一个2017年-2023年的
平均风向的统计
,生成一个风向玫瑰图。
还是一如既往地选择ERA5land的数据(0.1°分辨率,逐小时分辨率,1950年至今),当然你也可以用ERA5数据,我只是觉得分辨率比较低就没用。
做的时候,我把风向分为了16个(0-360°,北方向为0),即统计该时间段内的16个风向频率,然后生成tif,基于tif统计数据获取指定区域的任意风向玫瑰图。
下载
使用Google earth engine快速统计风向频率:
var ROI = 你的区域;
var startDate = '2023-1-01';
var endDate = '2023-01-30';
var dataset = ee.ImageCollection('ECMWF/ERA5_LAND/HOURLY')
.select(['u_component_of_wind_10m', 'v_component_of_wind_10m'])
.filterDate(startDate, endDate)
.filter(ee.Filter.calendarRange(11, 4, 'month'));
var calculateWindDirection = function(image) {
var direction = image.select('u_component_of_wind_10m', 'v_component_of_wind_10m')
.expression(
'atan2(v, u) * 180 / PI + 180',
{
'u': image.select('u_component_of_wind_10m'),
'v': image.select('v_component_of_wind_10m'),
'PI': Math.PI
}
);
return direction.rename('wind_direction');
};
// 计算16个方向的频率
var directions = ee.List.sequence(0, 15);
var binSize = 360/16;
var directionalFrequency = directions.map(function(dir) {
var start = ee.Number(dir).multiply(binSize);
var end = start.add(binSize);
var directionMask = dataset.map(calculateWindDirection)
.map(function(img) {
return img.gte(start).and(img.lt(end));
});
return directionMask.mean()
.rename(ee.String('dir_').cat(ee.Number(dir).format('%02d')));
});
// 将List转换为Image Collection,然后合并为一个多波段图像
var allDirections = ee.ImageCollection.fromImages(directionalFrequency)
.toBands();
// 修改波段名称
var newBandNames = directions.map(function(dir) {
return ee.String('dir_').cat(ee.Number(dir).format('%02d'));
}).getInfo();
// 重命名波段
allDirections = allDirections.rename(newBandNames);
// 导出数据
Export.image.toDrive({
image: allDirections,
description: 'Wind_Direction_Frequency_16dirs',
scale: 10000,
region: ROI,
fileFormat: 'GeoTIFF',
maxPixels: 1e9
});
下载下来后,放到qgis里面看看,一共16个波段,每个波段都代表着一个方向上的频率,16个波段加起来是1:
制图
使用python3实现:
import