使用ERA5数据绘制风向玫瑰图的简易流程

使用ERA5数据绘制风向玫瑰图的简易流程

今天需要做一个2017年-2023年的平均风向的统计,做一个风向玫瑰图,想到的还是高分辨率的ERA5land的数据(0.1°分辨率,逐小时分辨率,1950年至今)。

风向,我分为了16个(0-360°,北方向为0),统计该时间段内的16个风向频率。

下载

使用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 numpy as np
import matplotlib.pyplot as plt

def plot_wind_rose(data, title='Wind Rose'):
    """
    绘制风向玫瑰图
    data: 包含16个方向频率的数组
    """
    # 创建图形
    fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={'projection': 'polar'})
    
    # 设置方向角度(16个方向,每个22.5度)
    angles = np.arange(0, 360, 22.5) * np.pi/180
    
    # 确保数据是闭合的(首尾相连)
    frequencies = np.append(data, data[0])
    angles = np.append(angles, angles[0])
    
    # 绘制极坐标图
    ax.plot(angles, frequencies, 'o-', linewidth=2, color='purple')
    ax.fill(angles, frequencies, alpha=0.25, color='purple')
    
    # 设置方向标签
    ax.set_xticks(angles[:-1])
    direction_labels = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE',
                       'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW']
    ax.set_xticklabels(direction_labels)
    
    # 设置网格和刻度
    ax.grid(True)
    
    # 设置频率刻度范围
    max_freq = np.max(frequencies)
    ax.set_ylim(0, max_freq * 1.1)
    
    # 设置标题
    ax.set_title(title)
    
    return fig

def read_wind_data(tiff_path, x, y):
    """
    读取特定位置的风向数据
    """
    with rasterio.open(tiff_path) as src:
        # 将经纬度转换为像素坐标
        row, col = src.index(x, y)
        
        # 读取所有波段在该位置的值
        data = []
        for i in range(1, src.count + 1):
            value = src.read(i)[row, col]
            data.append(float(value))
    
    return np.array(data)

# 使用示例
import rasterio
#输入tif路径
tiff_path = r'\风向数据\Wind_Direction_Frequency_16dirs.tif'
#输入经纬度
x, y = 99, 25.312

# 读取数据
wind_data = read_wind_data(tiff_path, x, y)

# 打印数据检查
print("Wind direction frequencies:")
for i, freq in enumerate(wind_data):
    print(f"Direction {i*22.5:>6.1f}°: {freq:>6.3f}")

# 绘制风向玫瑰图
fig = plot_wind_rose(wind_data, f'Wind Rose at ({x}, {y})')

# 保存图片
plt.savefig('wind_rose.png', dpi=300, bbox_inches='tight')
plt.show()

在代码中填入需要生成的风玫瑰图的经纬度,即可获得2017-2023年的该地区风向情况。

参考

Claude sonnet 3.5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/936084.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

hbuilder 安卓app手机调试中基座如何设置

app端使用基座 手机在线预览功能 1.点击运行 2.点击运行到手机或者模拟器 3.制作自定义调试基座 4.先生成证书【可以看我上一篇文档写的有】,点击打包 5.打包出android自定义调试基座【android_debug.apk】,【就跟app打包一样需要等个几分钟】 6.点击运行到手…

Qt编写RK3588视频播放器/支持RKMPP硬解/支持各种视音频文件和视频流/海康大华视频监控

一、前言 用ffmpeg做硬解码开发,参考自带的示例hw_decode.c即可,里面提供了通用的dxva2/d3d11va/vaapi这种系统层面封装的硬解码,也就是无需区分用的何种显卡,操作系统自动调度,基本上满足了各种场景的需要&#xff0…

Photoshop提示错误弹窗dll缺失是什么原因?要怎么解决?

Photoshop提示错误弹窗“DLL缺失”:原因分析与解决方案 在创意设计与图像处理领域,Photoshop无疑是众多专业人士和爱好者的首选工具。然而,在使用Photoshop的过程中,有时会遇到一些令人头疼的问题,比如突然弹出的错误…

EXCEL 数据透视表基础操作

目录 1 选择数据,插入数据透视表 2 选择数据透视表生成位置 3 出现了数据透视表的面板 4 数据透视表的基本结构认识 4.1 交叉表/列联表 4.2 row, column, cell 一个新增的筛选器,就这么简单 4.3 可以只添加 rowcell/值 ,也可以colu…

AI生成图表化:深入探索Mermaid

引言 在使用生成式AI时,只要你提出让AI帮你生成mermaid图,AI的生成就会出现丰富的图形! 在现代文档编写中,图表的使用不仅能增强文档的可读性,还能更直观地表达复杂的概念和流程。Mermaid 作为一款开源的图表绘制工具…

iOS runtime总结数据结构,消息传递、转发和应用场景

runtime篇 首先看一下runtiem底层的数据结构 首先从objc_class这么一个结构体(数据结构)开始,objc_class继承于objc_object。 objc_object当中有一个成员变量叫isa_t,那么这个isa_t指针就指向一个objc_class类型的类对象&#xff…

前端编辑器JSON HTML等,vue2-ace-editor,vue3-ace-editor

与框架无关 vue2-ace-editor有问题&#xff0c;ace拿不到&#xff08;brace&#xff09; 一些组件都是基于ace-builds或者brace包装的 不如直接用下面的&#xff0c;不如直接使用下面的 <template><div ref"editor" class"json-editor"><…

QT:在线安装与离线安装

QT 学习系列 QT&#xff1a;在线安装与离线安装 QT 学习系列一、安装&#xff08;一&#xff09;离线安装windows系统Linux 系统Mac 系统 &#xff08;二&#xff09;在线安装 二、 环境变量配置三、验证总结 一、安装 &#xff08;一&#xff09;离线安装 windows系统 获取…

国产固态继电器的演变:可靠的电源解决方案

家用国产固态继电器(SSR)已成为各行各业的基石&#xff0c;性能可靠、设计紧凑、效率高。这些先进的开关设备取代了传统的机电继电器&#xff0c;具有静音运行、使用寿命更长、可靠性更高等诸多优点。家用SSR专为从工业自动化到家用电器等各种应用而设计&#xff0c;展示了本地…

Java-DataX 插件机制示例

示例代码 DataXPluginExample: DataX 项目的plugin 机制学习https://gitee.com/wendgit/data-xplugin-example/ 摘要 DataXPluginExample 是一个我编写的专门解读DataX插件机制的示例项目&#xff0c;旨在深入解析和掌握DataX的插件机制。本示例通过简洁明了的实现方式&#…

Ubuntu boot-repair安装过程

本教程只是在UBuntu系统无法引导才使用的方法&#xff0c;有可能需要提前使用U盘刻录UBuntu镜像去引导。 假如winUBuntu双系统&#xff0c;找不到紫色的UBuntu界面了&#xff0c;请参考&#xff1a;windows10ubuntu双系统开机引导界面不见的解决办法_双系统不出现引导界面-CSD…

苹果公司即将为iPhone和智能家居改用自主研发的蓝牙和Wi-Fi芯片

美股快讯&#xff1a;苹果公司即将为iPhone和智能家居改用自主研发的蓝牙和Wi-Fi芯片 苹果公司计划从明年开始在其设备上改用国产芯片进行蓝牙和Wi-Fi连接&#xff0c;此举将逐步淘汰目前由博通提供的部分部件。这种代号为Proxima的芯片已经开发了数年&#xff0c;现在计划用于…

汽车车牌识别数据集,支持YOLO,COCO,VOC格式的标注,8493张图片,可识别多种环境下的车牌

汽车车牌识别数据集&#xff0c;支持YOLO&#xff0c;COCO&#xff0c;VOC格式的标注&#xff0c;8493张图片&#xff0c;可识别多种环境下的车牌 数据集分割 训练组82&#xff05; 6994图片 有效集12&#xff05; 999图片 测试集6% 500图片 预处理 自动…

Towards Frame Rate Agnostic Multi-object Tracking—迈向帧率无关的多目标跟踪

Towards Frame Rate Agnostic Multi-object Tracking—迈向帧率无关的多目标跟踪 发表在IJCV 2023年 作者&#xff1a;Weitao Feng, Lei Bai, Yongqiang Yao, Fengwei Yu & Wanli Ouyang 研究目标&#xff1a;多目标跟踪的帧率无关性研究 IJCV 在计算机视觉领域的影响力非常…

day11 性能测试(3)——Jmeter 断言+关联

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、复习 2、查看结果树 多个http请求原因分析 3、作业 4、Jmeter断言 4.1 响应断言 4.1.1 案例 4.1.2 小结 4.2 json断言 4.2.1 案例 4.2.2 小结 4.3 断言持续时间 4.3.1 案例 4.3.2 小结 4.…

高项 - 信息化发展

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 博文更新参考时间点&#xff1a;2024-11-09 高项 - 章节与知识点汇总&#xff1a;点击跳转 文章目录 高项 - 信息化发展信息与信息化信息信息系统信息化 现代化基础设施新型基础设施建设工业互联网车联网 现代化创…

PostgreSQL中事件触发器Event Trigger

在PostgreSQL中&#xff0c;事件触发器&#xff08;Event Trigger&#xff09;是一种特殊的触发器类型&#xff0c;它允许你在特定的数据库系统事件发生时执行特定的操作。与普通的触发器不同&#xff0c;事件触发器并不与特定的表或视图相关联&#xff0c;而是与数据库级别的全…

移远EC200A-CN的OPENCPU使用GO开发嵌入式程序TBOX

演示地址&#xff1a; http://134.175.123.194:8811 admin admin 演示视频&#xff1a; https://www.bilibili.com/video/BV196q2YQEDP 主要功能 WatchDog 1. 守护进程 2. OTA远程升级 TBOX 1. 数据采集、数据可视化、数据上报&#xff08;内置Modbus TCP/RTU/ASCII,GPS协…

深度学习中的多通道卷积与偏置过程详解

目录 ​编辑 多通道卷积的深入理解 &#x1f50d; 卷积核的多维特性 &#x1f30c; 卷积操作的细节 &#x1f527; 多通道卷积的优势 &#x1f31f; 偏置过程的深入理解 &#x1f3af; 偏置的两种实现方式 &#x1f6e0;️ 偏置的作用与重要性 &#x1f308; 多通道卷…

在服务器自主选择GPU使用

比如说&#xff0c;程序使用第 2 张显卡&#xff08;从 0 开始计数&#xff09;。它的作用是告诉系统和深度学习框架&#xff08;如 PyTorch 或 TensorFlow&#xff09;只可见某些 GPU。 export CUDA_VISIBLE_DEVICES1 然后再查看当前使用的显卡&#xff1a; echo $CUDA_VIS…