CA/CB波段多普勒天气雷达解析——python

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)  #  注:2432S波段每层仰角的数据大小  4132CA/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数据如下:
在这里插入图片描述
做到这种程度应该就可以画图了,希望可以帮助到大家。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值