CA/CB波段多普勒天气雷达解析——python
本文简单介绍基于python的多普勒天气雷达的基数据解析,由于作者也是第一次去解析它,若有错误的地方,希望有大佬来指正,谢谢。
如下是CA/CB雷达基数据格式:
#先导入包
import matplotlib.pyplot as plt
import struct
import os
#定义一下数据类型
dictC2Py = {
'char': ['c', 1, 'string of length 1'],
'signed char': ['b', 1, 'integer'],
'unsigned char': ['B', 1, 'integer'],
'_Bool': ['?', 1, 'bool'],
'short': ['h', 2, 'integer'],
'unsigned short': ['H', 2, 'integer'],
'int': ['i', 4, 'integer'],
'unsigned int': ['I', 4, 'integer or long'],
'long': ['l', 4, 'integer'],
'unsigned long': ['L', 4, 'long'],
'float': ['f', 4, 'float'],
'double': ['d', 8, 'float'],
'char[]': ['s', 1, 'string']
}
filename = r'F:/Desktop/RADA_CHN_DOR_L2_O-Z9095-CA-CAP-20200301092500.bin'
f = open(filename, 'rb')
filesize = os.path.getsize(filename)
print(filesize/4132) # 注:2432为S波段每层仰角的数据大小 4132是CA/CB波段每层仰角的数据大小
reflect = [] # 一层的反射率
Z = [] # 所有层的反射率
for i in range(0, filesize, 4132):
Head = f.read(28)
Radar_data = struct.unpack('I', f.read(4)) # 径向数据收集时间(毫秒)
Julian = struct.unpack('H', f.read(2)) # 儒略日
Unambiguous_distance = struct.unpack('H', f.read(2)) # 不模糊距离(数值/10.=千米)C=100km
azimuth = (struct.unpack('H', f.read(2))[0] / 8) * (180 / 4096) # 方位角(编码方式:[数值/8.]*[180./4096.]=度)起始68
Radial_No = struct.unpack('H', f.read(2)) # 当前仰角内径向数据序号
Radial_data_status = struct.unpack('H', f.read(2))[0] # 径向数据状态,0:该仰角的第一条径向数据;1:该仰角中间的径向数据;2:该仰角的最后一条径向数据;3:体扫开始的第一条径向数据;4:体扫结束的最后一条径向数据。
elevation = (struct.unpack('H', f.read(2))[0] / 8) * (180 / 4096) # 仰角(编码方式:[数值/8.]*[180./4096.]=度)
Elevation_number = struct.unpack('H', f.read(2)) # 体扫内的仰角数
Reflectance_actual_distance = struct.unpack('h', f.read(2)) # 反射率数据的第一个距离库的实际距离(单位:米)
Doppler_actual_range = struct.unpack('h', f.read(2)) # 多普勒速度数据的第一个距离库的实际距离(单位:米)
Reflectivity_distance_length = struct.unpack('H', f.read(2)) # 反射率数据的距离库长(单位:米)500m
Doppler_length = struct.unpack('H', f.read(2)) # 多普勒速度数据的距离库长(单位:米)
Reflectivity_distance_library_number = struct.unpack('H', f.read(2)) # 反射率因子数据的距离库数
Doppler_library_number = struct.unpack('H', f.read(2)) # 多普勒速度数据的距离库数
Sector_code = struct.unpack('H', f.read(2)) # 扇区号
System_correction_constant = struct.unpack('I', f.read(4)) # 系统订正常数
Reflectivity_data_pointer = struct.unpack('H', f.read(2)) # 反射率数据指针(偏离雷达数据头的字节数)表示第一个反射率数据的位置
Speed_data_pointer = struct.unpack('H', f.read(2)) # 多普勒速度数据指针(偏离雷达数据头的字节数)表示第一个多普勒速度数据的位置
Spectrum_width_data_pointer = struct.unpack('H', f.read(2)) # 谱宽数据指针(离雷达数据头的字节数)表示第一个谱宽数据的位置
Doppler_velocity_resolution = struct.unpack('H', f.read(2)) # =2 多普勒速度分辨率 2:表示 0.5 m/s 4:表示 1.0 m/s
VCP_mode = struct.unpack('H', f.read(2))[0] # 体扫(VCP)模式,11:降水模式,16层仰角;21:降水模式,14层仰角;31:晴空模式,8层仰角;32:晴空模式,7层仰角
Reserve_data=f.read(8)
Playback_Reflectivity_data_pointer = struct.unpack('H', f.read(2))
Playback_Speed_data_pointer = struct.unpack('H', f.read(2))
Playback_Spectrum_width_data_pointer = struct.unpack('H', f.read(2))
Nyquist_Speed = struct.unpack('h', f.read(2))[0]/100 # Nyquist 速度(表示:数值/100=m/s)
Reserve_data=f.read(38)
if VCP_mode == 21:
Radial_data = [] #一个径向数据
for i in range(800):
unpack_grib = struct.unpack('B', f.read(1))[0] #一个径向的所有网格数据
actual_ref = (unpack_grib - 2) / 2 - 32 # dBz
Radial_data.append(actual_ref)
reflect.append(Radial_data)
if Radial_data_status == 2 or Radial_data_status == 4: #判断径向数据的状态 ,2代表一层读完,4代表所有层读完
Z.append(reflect)
reflect = []
Doppler_velocity = f.read(1600) #这里可以如上同理解析出多普勒速度和谱宽
Doppler_spectral_width = f.read(1600)
# Reserve_data = f.read(4000)
Reserve_data=f.read(4)
f.close()
最后读出来不同层的dbz数据如下:
做到这种程度应该就可以画图了,希望可以帮助到大家。