雷达组网拼图3.0数据掌握和python解析处理

废话不多说,先展示雷达图

反射率为例:
在这里插入图片描述

核对数据格式

Z_RADA_C_BABJ_20240705043615_P_DOR_ACHN_CREF_20240705_043000.bin

数据分析认识

1. 组网产品分类:组网产品包括组网混合扫描反射率(HSR),组网组合反射率(CR)、组网最大反射率高度(CRH)、组网回波顶高产品(ET)、组网垂直累积液态水含量(VIL)、组网一小时降水(OHP)、组网等高面反射率(CAP)。数据频次为10分钟2. 文件名结构:Z_RADA_C_BABJ_{YYYYMMDDhhmmss}_P_DOR_{AREACODE}_{DTYPE}_{YYYYMMDD_hhmmss}.bin{}内表示为命名规则中的变量,定义依次如下:YYYYMMDDhhmmss:产品生成时间,年月日时分秒AREACODE:区域号,如全国区域:ACHNDTYPE:雷达产品类型简写,如QREFYYYYMMDD_hhmmss:资料观测时间,年月日_时分秒3. 文件格式:组网拼图产品文件格式定义为:文件头 + 数据块。文件头中定义了文件卷标(文件固定标识、文件格式版本代码、文件字节数)、产品描述(拼图产品编号、坐标类型、产品代码、产品描述、产品数据起始位置、产品数据字节数)、数据时间(数据时钟、观测时间年、月、日等)、数据区信息(数据区的南、西、北、东边界等),具体定义如下表所示。文件头共占用256字节,实际定义变量占176字节,后面的80字节为预留空间。数据块为nX*nY(文件头中定义变量)个short类型数组,根据文件头中的Compress标志位判断是否压缩

总体数据包括文件头和数据块,数据为bin格式二进制,根据文件格式将二进制转化为实际的数据类型,其余不过多分析,到这里,我们基本了解了组网产品的基本情况,接下来我们直接读取和出雷达图。

#  雷达拼图3.0数据绘制雷达图*************# 设置日志
logger = logging.getLogger('RADA_L3_MST_CREF_QC')
logging.basicConfig(level=logging.INFO)# 假设雷达颜色映射表 radarColoMap 已定义,并且是Python列表格式def group(array, sub_group_length):for i in range(0, len(array), sub_group_length):yield array[i:i + sub_group_length]def read_string(buffer, length, encoding='gb2312'):return buffer[:length].decode(encoding).replace('\x00', '').replace(' ', '')def unbzip2_decompress(data):try:return bz2.decompress(data)except Exception as e:logger.error(f"Error decompressing bz2 data: {e}")return Nonedef get_path(path, path1):# 找到path1在path中的结束位置end_index = path.find(path1) + len(path1)# 截取从path1之后的部分sub_path = path[end_index:]return sub_pathclass BinaryReader:def __init__(self, buffer, is_little_endian=True):self.buffer = bufferself.index = 0self.is_little_endian = is_little_endiandef seek(self, offset, origin=0):if origin == 0:  # Set absolute positionself.index = offsetelif origin == 1:  # Set relative to current positionself.index += offsetelif origin == 2:  # Set relative to end of fileself.index = len(self.buffer) + offsetdef read_bytes(self, length):data = self.buffer[self.index:self.index + length]self.index += lengthreturn datadef read_string(self, length):return read_string(self.read_bytes(length), length)def read_int(self):fmt = '<i' if self.is_little_endian else '>i'value, = struct.unpack_from(fmt, self.buffer, self.index)self.index += struct.calcsize(fmt)return valuedef read_int16(self):fmt = '<h' if self.is_little_endian else '>h'value, = struct.unpack_from(fmt, self.buffer, self.index)self.index += struct.calcsize(fmt)return valuedef readHeader(br):# 读取文件头信息label = br.read_string(4)  # 文件固定标识version = br.read_string(4)  # 文件格式版本代码file_bytes = br.read_int()  # 文件字节数mosaic_id = br.read_int16()  # 拼图产品编号coordinate = br.read_int16()varname = br.read_string(8)description = br.read_string(64)BlockPos = br.read_int()BlockLen = br.read_int()TimeZone = br.read_int()yr = br.read_int16()mon = br.read_int16()day = br.read_int16()hr = br.read_int16()min = br.read_int16()sec = br.read_int16()ObsSeconds = br.read_int()ObsDates = br.read_int16()GenDates = br.read_int16()GenSeconds = br.read_int()latMin = br.read_int() / 1000lonMin = br.read_int() / 1000latMax = br.read_int() / 1000lonMax = br.read_int() / 1000cx = br.read_int() / 1000cy = br.read_int() / 1000# 读取数据区前的信息nX = br.read_int()  # 列数nY = br.read_int()  # 行数dx = br.read_int() / 10000dy = br.read_int() / 10000height = br.read_int16()compress = br.read_int16()num_of_radars = br.read_int()UnZipBytes = br.read_int()scale = br.read_int16()unUsed = br.read_int16()RgnID = br.read_string(8)units = br.read_string(8)reserved = br.read_string(8)return yr, mon, day, nX, nY, latMin, latMax, lonMin, lonMax, scale# 读取数据字节def readData(buffer):# 读取数据区# br.seek(256)  # 跳过未压缩的256字节头部compressed_data = unbzip2_decompress(buffer[256:])return compressed_data# 解压bz2数据def unbzip2_decompress(data):try:return bz2.decompress(data)except Exception as e:logger.error(f"Error decompressing bz2 data: {e}")return Noneclass RadarWarnRequest(BaseModel):filePath: AnyradarValue: AnylonMin: AnylonMax: AnylatMin: AnylatMax: AnyprovinceId: Anyclass RADA_L3_MST_CREF_QC:@staticmethoddef parse(file_path, radarValue, lonMin, lonMax, latMin, latMax, provinceId):with open(file_path, 'rb') as f:buffer = f.read()br = BinaryReader(buffer, is_little_endian=True)yr, mon, day, nX, nY, lat_Min, lat_Max, lon_Min, lon_Max, scale = readHeader(br)compressed_data = readData(buffer)if compressed_data:data = np.frombuffer(compressed_data, dtype=np.int16)array_2d = data.reshape((nY, nX))array_2d = array_2d / scale  # 数据放大倍数array_2d = np.where((array_2d >= 0) & (array_2d <= 75), array_2d, np.nan)# array_2d = ma.masked_where((array_2d > 75) | (array_2d < -5), array_2d)  # 筛除无效值# array_2d = ma.filled(array_2d)# array_2d = np.round(array_2d, decimals=0)  # 保留两位# 使用flipud函数进行翻转array_2d = np.flipud(array_2d)lon = np.linspace(lon_Min, lon_Max, nX)lat = np.linspace(lat_Min, lat_Max, nY)# # 裁切完的数据cropped_array_2d, cropped_lon, cropped_lat = crop_masked_array_by_bounds(array_2d, lon, lat, lonMin, lonMax,latMin, latMax)# 绘制河南的proj = ccrs.PlateCarree()  # 创建投影,选择cartopy的platecarree投影fig = plt.figure(figsize=(10, 8))  # 创建页面,可以自己选择大小# ax = fig.subplots(subplot_kw={'projection': proj})  #子图ax = fig.add_subplot(1, 1, 1, projection=proj)levs = [0, 5.0, 10.0, 15.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0, 55.0, 60.0, 65.0, 70.0]cols = [(0, 0, 239 / 255), (65 / 255, 157 / 255, 241 / 255), (100 / 255, 231 / 255, 235 / 255),(109 / 255, 250 / 255, 61 / 255), (0, 216 / 255, 0),(1 / 255, 144 / 255, 0), (255 / 255, 255 / 255, 0), (231 / 255, 192 / 255, 0),(255 / 255, 144 / 255, 0), (255 / 255, 0, 0), (214 / 255, 0, 0), (192 / 255, 0, 0),(255 / 255, 0, 240 / 255),(150 / 255, 0, 180 / 255), (173 / 255, 144 / 255, 240 / 255)]# 创建自定义颜色映射custom_cmap = ListedColormap(cols)norm = BoundaryNorm(levs, custom_cmap.N, clip=False)# 绘制等高线填充图plt.contourf(lon, lat, array_2d, cmap=custom_cmap, norm=norm, levels=levs)# 设置透明背景并保存图片plt.savefig('../v3/china.png', transparent=True, bbox_inches='tight',pad_inches=0)else:logger.error("Failed to decompress data")return

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Qt-事件与信号

事件和信号的区别在于&#xff0c;事件通常是由窗口系统或应用程序产生的&#xff0c;信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装&#xff0c;如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…

Android Studio - adb.exe已停止运作的解决方案

adb.exe 是Android Debug Bridge 的缩写&#xff0c;它是Android SDK 中的一个调试工具&#xff0c;允许开发者通过命令行界面与设备进行交互&#xff0c;执行各种操作&#xff0c;如运行设备的shell、管理模拟器或设备的端口映射、在计算机和设备之间上传/下载文件、将本地APK…

鸿蒙语言基础类库:【@system.mediaquery (媒体查询)】

媒体查询 说明&#xff1a; 从API Version 7 开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.mediaquery]。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import mediaquery from sy…

PySide在Qt Designer中使用QTableView 显示表格数据

在 PySide6 中&#xff0c;可以使用 Qt Model View 架构中的 QTableView 部件来显示和编辑表格数据。 1、创建ui文件 在Qt Designer中新建QMainWindow&#xff0c;命名为csvShow.ui。QMainWindow上有两个部件&#xff1a;tableview和btn_exit。 2、使用pyuic工具将ui文件转换为…

使用IDEA编写lua脚本并运行

下载lua https://github.com/rjpcomputing/luaforwindows/releases 是否创建桌面快捷方式&#xff1a;我们的目标是使用IDEA编写lua脚本&#xff0c;所以不需要勾选。后面需要的话&#xff0c;可以到安装目录下手动创建快捷方式 环境变量自动配置 安装后会自动配置好环境变量…

从零开始读RocketMq源码(五)Consumer消费Message流程解析

目录 前言 准备 拉取服务和重平衡服务启动 初识PullRequest 重平衡服务 对重平衡资源进行排序 MessageQueue消息队列集合来源 Consumer消费者集合数据来源 确实分配资源策略 执行分配策略 初始化ProcessQueue 初始化PullRequest 内存队列填充PullRequest 消息拉取…

TikTok用户必看:代理IP的优缺点深度剖析

在咱们这庞大的网络世界里&#xff0c;TikTok就像是夜空中最亮的星星&#xff0c;吸引着全世界的人们。它不仅仅是个让大家开心的地方&#xff0c;更是个能让不同地方的人互相了解、分享生活的神奇平台。但你有没有想过&#xff0c;要是能让这个连接更顺畅&#xff0c;让TikTok…

h5点击电话号跳转手机拨号

需要使用到h5的 <a>标签 我们首先在<head>标签中添加代码 <meta name"format-detection" content"telephoneyes"/>然后再想要的位置添加代码 <a href"tel:10086"> 点击拨打&#xff1a;10086 </a> 这样功能就实现…

【CSS in Depth 2 精译_019】3.2 CSS 的盒模型

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

LLaMA 数据集

LLaMA的训练数据集来源多样&#xff0c;涵盖了多个不同的数据集和预处理步骤。以下是详细的描述&#xff1a; 公开数据来源和预处理 CommonCrawl [67%]&#xff1a; 使用CCNet管道&#xff08;Wenzek等人&#xff0c;2020年&#xff09;对2017年至2020年间的五个CommonCrawl转…

Vue3 + uni-app 微信小程序:仿知乎日报详情页设计及实现

引言 在移动互联网时代&#xff0c;信息的获取变得越来越便捷&#xff0c;而知乎日报作为一款高质量内容聚合平台&#xff0c;深受广大用户喜爱。本文将详细介绍如何利用Vue 3框架结合微信小程序的特性&#xff0c;设计并实现一个功能完备、界面美观的知乎日报详情页。我们将从…

生成式AI的未来:对话的艺术与代理的实践

生成式 AI 的发展方向&#xff0c;是 Chat 还是 Agent&#xff1f; 随着生成式AI技术的不断进步&#xff0c;关于其未来发展方向的讨论也愈发激烈。究竟生成式AI的未来是在对话系统&#xff08;Chat&#xff09;中展现智慧&#xff0c;还是在自主代理&#xff08;Agent&#x…

《驾驭AI浪潮:伦理挑战与应对策略》

AI发展下的伦理挑战&#xff0c;应当如何应对&#xff1f; 人工智能飞速发展的同时&#xff0c;也逐渐暴露出侵犯数据隐私、制造“信息茧房”等种种伦理风险。随着AI技术在社会各个领域的广泛应用&#xff0c;关于AI伦理和隐私保护问题日趋凸显。尽管国外已出台系列法规来规范…

npm安装依赖包报错,npm ERR! code ENOTFOUND

一、报错现象&#xff1a; npm WARN registry Unexpected warning for https://registry.npmjs.org/: Miscellaneous Warning ETIMEDOUT: request to https://registry.npmjs.org/vue failed, reason: connect ETIMEDOUT 104.16.23.35:443 npm WARN registry Using stale data…

【扁平化多级双向链表】python刷题记录

进入链表的遍历模块了 好复杂的题目描述。。。 DFS深度遍历扁平拼接 """ # Definition for a Node. class Node:def __init__(self, val, prev, next, child):self.val valself.prev prevself.next nextself.child child """class Soluti…

Windows双网卡上网原理以及配置方法

目录 1. 背景 2. IP路由原理 3. windows双网卡上网解决方案 3.1. 基础配置解决方案 3.2. 高阶配置解决方案 1. 背景 在windwos上使用多网卡在工作和生活中是一个常见的操作&#xff0c;比如为了获取内部消息将有线连接到内部局域网中&#xff0c;为而了访问外网又将电脑的…

申请https证书的具体流程

申请HTTPS证书的具体流程通常涉及以下步骤&#xff0c;不过请注意&#xff0c;具体细节可能因不同的证书颁发机构&#xff08;CA&#xff09;而有所差异&#xff1a; 1、确定证书类型&#xff1a; 证书类型&#xff1a;根据需求选择合适的SSL证书类型。常见的有DV&#xff08;…

Windows下使用Cygwin创建rsync服务端

1 下载Cygwin 访问官网Cygwin&#xff0c;点击setup-X86_64.exe即可开始下载 2 安装 前面全部默认。路径可以自己选择&#xff0c;站点选阿里云的&#xff0c;等待安装即可 3 配置 使用打开Cygwin安装后创建的快捷方式窗口&#xff0c;输入下面的指令将windows用户导入到cyg…

如何将几百兆的包优化到几十兆----记一次vue项目的打包优化过程

打包优化 现象 前段时间开发的时候遇到客户反馈的一个问题 界面无法打开&#xff0c;显示白屏&#xff0c;控制台无报错 经过我们在开发环境&#xff0c;测试环境反复测试都没复现出客户的问题&#xff0c;然后我们又不停的在生产环境上找问题&#xff0c;也没复现出来 最…

正点原子imx6uSD卡复制files文件到u盘rootfs的root内失败

进入rootfs的home目录 再进入root&#xff0c;一般是要输入密码的&#xff0c;更改权限&#xff0c;设置全部可以读写&#xff0c;删除原有的文件。再把files文件夹复制过来就行 后面找不带分区&#xff0c;哎。相当于内存卡就是启动u盘&#xff0c;进入了linux系统&#xff0c…