使用 pyart 绘制多雷达拼图

Python

This article was last updated on <span id="expire-date"></span> days ago, the information described in the article may be outdated.

前言

这是一篇关于使用 Pthon 库 Py-ART 读取雷达数据文件、绘制单个雷达图以及多雷达拼图的教程。

这篇文章是我在去年暑假–也就是 2020年8月–做大创项目的时候写的,想着既然要写自己的博客了那就一块搬过来吧,当然原博客的地址还是要加的

由于中间修改过代码,并不确定代码 100% 正确

原地址:Py-ART 简易中文教程

将单个雷达图像绘制在笛卡尔坐标系中

下面是绘制单个雷达拼图的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/python3

import numpy as np
import matplotlib.pyplot as plt
import pyart as pa
from sys import exit

if __name__=='__main__':
radar=pa.io.read_cfradial('one_radar.nc')

#检查扫描方式

if radar.scan_type!='ppi':
exit('Error: 请使用扫描方式为PPI的数据文件')

#将一个或多个雷达画进一个坐标系中,返回一个Grid对象
#第一个参数带入读取的文件或者读取的文件组成的tuple
#grid_shape代表绘制的点的个数,格式为(z,y,x),推荐z轴写为1,因为就此程序来说不写成1也没什么用:)
#grid_limits代表绘制的距离的上下限,单位是米
#注意最大值最小值要对称。至于为什么不从0开始,咱也不清楚
#fields接受要用到的数据在radar对象的fields中对应的键值,以列表形式可带入多个

grid=pa.map.grid_from_radars((radar,),
grid_shape=(1,1001,1001),
grid_limits=((3000,3000),(-275000,275000),(-275000,275000)),
fields=['reflectivity'])

#grid.fields里面的键值与上面fields接受的键值有关
#imshow()函数用来绘制热图,vmin、vmax规定了colormap覆盖的范围
#origin设置原点(0,0)在左上还是左下,按照习惯来说填lower就可以,然而默认是upper......
#colorbar第一个参数是映射颜色的对象,理解成绘制的图像似乎也可以
#cax指示colorbar绘制的位置,参数依次为left,bottom,width,height,小数实际代表百分比
#例如left=0.84指在离画布左边距离总长84%的地方
#spacing的模式控制是否给予色块均匀的空间还是根据之间的距离,
#按照比例变化,然而更改后发现图像似乎没有变化

fig=plt.figure()
ax=fig.add_subplot(111)
myax=ax.imshow(grid.fields['reflectivity']['data'][0],
origin='lower',vmin=0,vmax=50)
cax=fig.add_axes([0.84,0.2,0.03,0.6])
fig.colorbar(myax,cax,spacing='proportional',orientation='vertical')
plt.show()

绘制出的图像如下图所示

绘制单个雷达

多雷达拼图

下面是将三个相近雷达的数据绘制到一张图上的示例,与上面的例子十分类似,不同的地方仅在于第38行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/python3

import netCDF4
import matplotlib.pyplot as plt
import pyart
from sys import exit

name1='CfRadial1.nc'
name2='CfRadial2.nc'
name3='CfRadial3.nc'

#将读取文件的函数包装进一个名称更简单的函数,方便调用

def read(name):
return pyart.io.read_cfradial(name)

if __name__=='__main__':

#读取文件

radar1=read(name1)
radar2=read(name2)
radar3=read(name3)

#检查扫描方式

if radar.scan_type!='ppi':
exit('Error: 请使用扫描方式为PPI的数据文件')

#将一个或多个雷达画进一个坐标系中,返回一个Grid对象
#第一个参数带入读取的文件或者读取的文件组成的tuple
#grid_shape代表绘制的点的个数,格式为(z,y,x),推荐z轴写为1,因为不写成1也没什么用:)
#grid_limits代表绘制的距离的上下限,单位是米
#注意最大值最小值要对称。至于为什么不从0开始,咱也不清楚
#grid_origin是拼图的中心点的坐标,与雷达文件有关
#fields接受要用到的数据在radar对象的fields中对应的键值,以列表形式可带入多个

grid=pyart.map.grid_from_radars((radar1,radar2,radar3),
grid_shape=(1,1001,1001),
grid_limits=((3000,3000),(-300000,300000),(-300000,300000)),
grid_origin=(32.8,119.5),fields=['reflectivity'])

#grid.fields里面的键值与上面fields接受的键值有关
#imshow()函数用来绘制热图,vmin、vmax规定了colormap覆盖的范围
#origin设置原点(0,0)在左上还是左下,按照习惯来说填lower就可以,然而默认是upper......
#colorbar第一个参数是映射颜色的对象,理解成绘制的图像似乎也可以
#cax指示colorbar绘制的位置,参数依次为left,bottom,width,height,小数实际代表百分比
#例如left=0.84指在离画布左边距离总长84%的地方
#spacing的模式控制是否给予色块均匀的空间还是根据之间的距离
#按照比例变化,然而更改后发现图像似乎没有变化

fig=plt.figure()
ax=fig.add_subplot(111)
myax=ax.imshow(grid.fields['reflectivity']['data'][0],origin='lower',
vmin=0,vmax=50)
cax=fig.add_axes([0.84,0.2,0.03,0.6])
fig.colorbar(myax,cax,spacing='uniform',orientation='vertical')
plt.show()

绘制出的图像如下图所示,其中三个空心圆代表雷达基站的位置

三雷达拼图

Author: Syize

Permalink: https://blog.syize.cn/2021/09/10/multiple-radar/

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Syizeのblog

Comments