用PyQt 5 开发的雷达基数据可视化软件

解决方案

软件布局

软件界面垂直布局遵循普通软件布局习惯,依次为标题栏、菜单栏、工具栏、功能界面、状态栏。主功能界面布局原则遵循简洁优雅充分考虑软件功能和用户操作习惯,最左边是数据选择界面,下置开始处理按钮、三维绘制按钮和显示数据处理进度的进度条;中间大部分空间维图像显示区域,尽量缩小边框,扩展展示区域,为用户带来较好的视觉体验;图片显示区域设有下拉选项卡用于显示控制;界面右侧是数据信息和操作事件记录,一方面方便开发者调试软件,另一方面随时记录用户的历史操作和显示相关的数据动态信息,这样可以弥补数据参数栏只能静态显示的弊端。

连续显示界面在布局上根据功能有别于单个数据显示界面,在数据选择区的下拉选项卡有所不同,图像控制区的滑块变为按钮,方便用户进行连续观察。而右侧的数据参数和时间记录功能区布局相同。

核心功能

单击菜单栏中的文件菜单可以选择打开特定雷达基数据文件,或者直接单击工具栏的打开文件会弹出数据选择窗口,可在系统磁盘目录中选择.bin格式数据。

在数据选择区依次打开下拉菜单选择站点、日期、时间。需要注意的是,下拉菜单中包含的站点、日期、时间信息是软件预设目录(可在配置文件中更改)里的基数据信息,因此不用担心选择到不存在的基数据文件。选定数据后单击开始处理按钮,程序开始处理选择的基数据文件,包括抽取反射率因子、速度、谱宽数值,进行坐标转换,绘制平面位置显示和距离高度显示图像,进度条开始跳动,待所有计算完成后,第一幅雷达回波图像会出现在图像显示区域,接下来拖动功能区的滑块可以设定仰角和方位角,这样就能看到一个体扫数据中的所有仰角、所有方位角的反射率因子平面位置显示图像和距离高度显示图像,右上角的数据参数则显示了选定数据的站号、日期、时间、体扫模式、库数、库长、速度分辨率等信息。右下角的事件记录区域可以显示当前图像的序号和已处理得到的所有图像序号。

通过拖动滑块可以实现单个体扫数据不同仰角的数据展示,滑块可以通过鼠标或键盘左右移动,更方便用户切换图像。同时右下角的事件记录区域则显示了该处理结果中共生成了多少张平面位置显示图像以及当前显示的图像为第几张。

距离高度显示的回波图像也可以通过拖动滑块来切换,默认设定单个体扫数据共生成36张距离高度显示图像,角度分辨率为10°,能够满足观测的基本需求,若需要更高分辨率的距离高度显示图像,也可以通过修改相关参数实现,当拖动方位角滑块时,时间记录区域显示了基数据处理完成后生成的距离高度显示图像数量(36)以及当前显示的图像为第几张。

通过点击工具栏按钮可以实现放大、缩小、复位、转移视角、保存图片、更改背景、更改透明度等操作,也可通过鼠标点击和鼠标滚轮滑动快捷实现。以上三张图片即为三位交互可视化的示例,可以看出不同方向、不同距离的相机位置能够给用户带来更加丰富的视觉体验,实际应应中能够辅助观测员迅速找到强回波中心,估计雷达回波的覆盖范围。

连续显示选项卡有别于单个数据选项卡,它在设定数据是并非选择单个数据文件,而是选定了站点和想要连续查看的时间区间(起始日期、时间和终止日期、时间),相同的是,在下拉选项卡中依次选择站点、日期和时间时不用担心会选中一个空区间或者不对应的站点与时间,因为下拉菜单是根据用户的每一步选择依次刷新的,这得益于Qt先进的信号/槽机制。首要选择的站点是在软件启动时初始化在预设工作目录里遍历所有文件夹得到的站点列表,只要下拉菜单中出现的站点选项都是存在的,都能够在硬盘里找到对应的目录和.bin基数据文件。

设定完成后单击设定完成按钮程序即在后台开始快速绘制所选站点时间区间内的所有平面位置显示图像(后会进行分辨率变更以便在界面中显示),这个绘制过程单独封装,不与前面的单个数据处理程序共用类,因此处理速度较快,能够有效减少用户等待时间,待进度条充满到100%后,处理完成。即可开始点击操作区按钮进行切换操作。右侧的数据参数会根据当前显示的图像相应刷新变更,时间记录区域会打印出操作项目、选定站点时间区间内的所有图像数量和当前展示的图片编号。

软件配置方法

运行环境

得益于Python灵活的语法结构和跨平台特性以及功能丰富的扩展库,这款用PyQt开发的小软件能够跨操作系统在任何配置了Python环境的操作系统中运行,而且磁盘占用量极小。由于Python是高级的解释型、动态的、面向对象的脚本语言,在运行python程序之前省去了复杂的编译过程,也不用考虑平台不兼容特性,只要将程序的源代码文件和配置文件复制到相应的计算机即可立即运

行。

configure目录存放了软件启动初始化时的配置文件;data目录存放了.bin基数据,按站点号分文件夹保存;source目录存放了软件运行相关的媒体文件(如图标、字体、提示音等);temp目录是缓存目录,当处理数据或者绘制图像时,处理结果和绘制结果会存在此目录,用户可直接查看或手动删除,缓存文件不会无限大而浪费磁盘空间,每一次处理都会清楚上一次数据处理残留的图像或数据文件;configure文件是配置信息,格式为json文件;PyRadar是封装成的计算性的专门处理雷达基数据的库,格式为文本文件,源代码;ui文件是图形用户界面和软件底层逻辑信号/槽等框架性功能的源代码文件。

configure配置信息详情:

python 复制代码
{
"installation_path":"c:/data/gui/",
"data_path":"c:/data/gui/data/",
"cache_path":"c:/data/gui/temp/",
"animation_path":"c:/data/gui/temp/animation/",
"ppi_ref_path":"c:/data/gui/temp/ppi_ref/",
"rhi_ref_path":"c:/data/gui/temp/rhi_ref/"
}

以上为文件内容,文件本身保存为json格式,也是文本文件,它记录了软件启动必须的初始化信息,安装路径、基数据存放路径、缓存路径、动画保存路径、平面位置显示图像保存路径、距离高度显示图像保存路径等。用户可以根据自己需要或喜好更改。

在计算机上先配置好Python环境,安装PyQt 5 、Numpy、 Scipy、 Matplotlib、 Mayavi等库之后用Python运行ui.py文件即可进入软件。对于需要自定义配置的地方,比如改变图像分辨率、设定配色卡(color map)、设定坐标轴、设定图片标题、设定三位交互可视化背景颜色等都可以通过更改源代码相关内容可轻易实现,这也是动态解释型语言的优势。若要更改运行计算机或复制程序到其他平台,直接复制以上目录和文件到该计算机后配置完python环境即可运行。

软件的编程原理

PyQt的核心机制是信号/槽,只要理解了其中主要的信号/槽机制,就能够理解软件的运行机理,并根据需要自定义修改。

附录源代码是软件运行过程中用到的核心信号/槽,它们是整个软件的基础架构,支撑着整个软件的功能实现。如上文所说,信号和槽可以多对多连接,这从一定程度上提高了运行效率并减少了开发人员开发周期,是代码更加简洁清晰,也便于其他使用者的修改。

上述核心信号/槽主要有:

  • 打开文件按钮-点击-弹出文件选择对话框;
  • 打开目录按钮-点击-弹出目录设定对话框;
  • 站点选项卡-文本改变-刷新日期选择选项卡;
  • 日期选项卡-文本改变-刷新时间选项卡;
  • 设定完成按钮-点击-更新播放列表,更新显示区间,更新状态栏,调用数据处理函数,开始计数,刷新进度条;
  • 播放控制按钮-点击-调用图像刷新函数,刷新显示区域,设定显示序号;
  • 三位绘制按钮-点击-调用三位交互可视化函数,刷新进度条;
  • 滑块控件-值改变-刷新显示图像。

信号和槽函数可自定义,以实现复杂功能封装。

核心代码

self.actionOpen_folder.triggered.connect(self.set_path)
self.station_set.currentIndexChanged.connect(self.refresh_date_begin)
self.station_set_2.currentIndexChanged.connect(self.refresh_date_begin)
self.date_begin_set.currentIndexChanged.connect(self.refresh_time_begin)
self.time_begin_set.currentIndexChanged.connect(self.refresh_date_end)
self.date_set.currentIndexChanged.connect(self.refresh_time_begin)
self.time_set.currentIndexChanged.connect(self.set_file)
self.date_end_set.currentIndexChanged.connect(self.refresh_time_end)
self.actionopen.triggered.connect(lambda: self.display_1(0))
self.actionopen.triggered.connect(self.open_file)
self.set_done.clicked.connect(lambda: self.counter_zero)
self.set_done.clicked.connect(self.play_list_reset)
self.set_done.clicked.connect(self.generate_animation)
self.first_img.clicked.connect(self.counter_zero)
self.first_img.clicked.connect(lambda: self.show_radarimage1(self.counter))
self.last_img.clicked.connect(self.counter_end)
self.last_img.clicked.connect(lambda: self.show_radarimage1(-1))
self.before_slide.clicked.connect(self.counter_reduce)
self.before_slide.clicked.connect(lambda: self.show_radarimage1(self.counter))
self.after_slide.clicked.connect(self.counter_add)
self.after_slide.clicked.connect(lambda: self.show_radarimage1(self.counter))
self.auto_play.clicked.connect(self.play_all)
self.start_process.clicked.connect(self.ppi_play_list_reset)
self.start_process.clicked.connect(self.rhi_play_list_reset)
self.start_process.clicked.connect(self.process_data)
self.points.clicked.connect(self.plot_points)
self.ele_set.valueChanged.connect(lambda: self.show_ppi_img(int(len(self.ppi_play_list) * self.ele_set.value()/100)))
self.azi_set.valueChanged.connect(lambda: self.show_rhi_img(int(len(self.rhi_play_list) * self.azi_set.value()/100)))
相关推荐
编程修仙1 分钟前
Collections工具类
linux·windows·python
芝麻团坚果17 分钟前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
EterNity_TiMe_26 分钟前
【论文复现】神经网络的公式推导与代码实现
人工智能·python·深度学习·神经网络·数据分析·特征分析
Stara051134 分钟前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
hence..1 小时前
Vscode写markdown快速插入python代码
ide·vscode·python
DanielYQ2 小时前
LCR 001 两数相除
开发语言·python·算法
vener_2 小时前
LuckySheet协同编辑后端示例(Django+Channel,Websocket通信)
javascript·后端·python·websocket·django·luckysheet
封步宇AIGC3 小时前
量化交易系统开发-实时行情自动化交易-4.2.3.指数移动平均线实现
人工智能·python·机器学习·数据挖掘
互联网杂货铺3 小时前
自动化测试基础知识总结
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
小汤猿人类3 小时前
SpringTask
开发语言·python