使用Python绘制雷达基数据反射率因子图教程
本教程详细讲解如何使用Python读取天气雷达基数据并绘制标准反射率因子(PPI)图,涵盖极坐标解算、库依赖配置、cinrad与Py-ART核心代码实现、色标映射及投影对齐。
在气象探测与强对流天气监测中,雷达基数据反射率因子(Reflectivity Factor,单位为 dBZ)是评估降水强度、冰雹以及云团发展阶段最核心的物理量。由于天气雷达在扫描时采用天线旋转俯仰的球极坐标系记录回波,原始基数据通常是未经投影的二进制阵列。本文将带领大家梳理从解析原始雷达基数据到完成极坐标转换、色阶映射并绘制标准平面位置显示器(PPI)反射率因子图的完整 Python 实现路径。
一、雷达基数据与反射率因子的物理及数据结构
在实际编写绘图代码前,必须明确雷达基数据的组织逻辑。气象多普勒雷达(如我国主流的 CINRAD 系列或美国的 WSR-88D/NEXRAD)以体积扫描(Volume Scan, VCP)模式工作。雷达天线在特定仰角下进行 360 度圆周旋转,沿不同方位角向外发射微波脉冲并接收云滴、雨滴或冰相粒子的散射回波。
基数据(Base Data)记录的是未经二次网格插值的原生测量值,主要包含反射率因子(Reflectivity, 简写为 REF 或 Z)、径向速度(Velocity, V)和谱宽(Spectrum Width, SW)。其中反射率因子常用对数单位分贝(dBZ)表征:
dBZ = 10 \times \log_{10}(Z),数值通常分布在 -10 至 70 dBZ 之间。低值(10~20 dBZ)多对应弱降水、层云或毛毛雨;35~45 dBZ 提示中到大雨;超过 50 dBZ 通常意味着强对流对流单体,并可能伴有冰雹或短时强降水。
由上图可知,在原生基数据文件中,一个仰角扫描(Sweep)在内存中表现为一个二维数组:行数等于径向方位角数量(通常为 360 或 720 根),列数对应沿射线方向向外的距离库数量(Gate,例如 1000 个库,每个库长 250 米)。因此,绘制反射率因子图的本质,就是将这个极坐标网格(方位角 $\phi$、距离 $r$)映射为平面笛卡尔坐标或地图地理坐标(经纬度),并将库中的 dBZ 数值映射到标准气象色阶表。
二、Python 环境依赖准备与总体操作流程
在 Python 生态中,处理天气雷达基数据有两条主流成熟方案:
- cinrad 库:专为中国新一代天气雷达(CINRAD SA/SB/CB/CC/CD 等标准基数据格式)定制,内置解析器、投影解算和标准 CMA 反射率配色,开箱即用。
- Py-ART 库(ARM Radar Toolkit):美国能源部大气辐射测量项目维护的通用雷达库,支持 NEXRAD、CFRadial、SIGMET 等多种国际格式,具备强大的网格化与极坐标切片绘图能力。
推荐在配置好 Conda 或虚拟环境后安装基础科学计算与绘图包:
# 基础科学计算与地图投影底图库
pip install numpy matplotlib cartopy
# 方案一:针对中国天气雷达 CINRAD 数据的专用库
pip install cinrad
# 方案二:国际通用雷达处理库 Py-ART (建议通过 conda-forge 解决依赖)
conda install -c conda-forge arm_pyart
三、基于 cinrad 快速绘制标准反射率 PPI 图
对于国内雷达站点获取的单站基数据(例如文件名形如 Z_RADR_I_Z9571_20230623080000_O_DOR_SA_CAP.bin),cinrad 库提供了最高效的直读和绘图接口。其底层自动完成了二进制解码和仰角分层。
1. 完整快速绘图示例
import cinrad
from cinrad.io import read_auto
from cinrad.visualize import PPI
# 1. 自动识别并载入基数据文件
file_path = "Z_RADR_I_Z9571_20230623080000_O_DOR_SA_CAP.bin"
radar_file = read_auto(file_path)
# 2. 提取指定扫描层与物理量
# 参数0代表第1个仰角(通常为最低仰角 0.5 度)
# 230 代表探测半径截断为 230 km,'REF' 指定提取反射率因子
data_tilt = radar_file.get_data(tilt=0, drange=230, dtype='REF')
# 3. 初始化 PPI 绘图对象
# dpi 设置输出分辨率,setup_kwargs 传递绘图细节
fig = PPI(data_tilt, dpi=300)
# 4. 执行绘图并输出图片
fig.plot()
fig.save("cinrad_reflectivity_ppi.png")
print("反射率因子图已成功导出至 cinrad_reflectivity_ppi.png")
2. 关键代码解析
read_auto(file_path):内置了对我国主流雷达型号(SA, SB, CB, CC, CD, SC 等)的签名检测,会自动解出站号、雷达经纬度、天线高度以及每个扫描体包含的仰角列表。get_data(tilt=0, drange=230, dtype='REF'):tilt=0代表选取最底层的扫描仰角。对天气雷达而言,0.5° 仰角最贴近近地面,是识别强降水最关键的层位。dtype='REF'确保只提取反射率因子数据,忽略径向速度或谱宽。PPI(data_tilt):cinrad.visualize.PPI会自动绑定中国气象局(CMA)标准的 15 级雷达回波色阶表,并在画布上绘制 50km、100km、150km、200km 的等距离环。
四、基于 Py-ART 与 Cartopy 的底层精细化定制绘制
当需要对接科研通用格式(NetCDF/CFRadial)、叠加自定义 GIS 矢量边界(Shapefile),或者自主控制 Matplotlib 轴对象时,推荐使用 Py-ART 配合 Cartopy。这种方式能让你完全掌控图形的投影方式与地理图层。
1. 完整定制代码示例
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import pyart
# 1. 读取雷达基数据
# Py-ART 支持自动读取 NEXRAD Level 2 或 CFRadial 文件
radar = pyart.io.read("KTLX20130520_200843_V06")
# 2. 创建基于地图投影的显示控制器
display = pyart.graph.RadarMapDisplay(radar)
# 3. 设置绘图投影与画布
# 采用雷达站为中心的等距圆柱投影或朗伯投影
projection = ccrs.PlateCarree()
fig = plt.figure(figsize=(10, 8), dpi=300)
ax = fig.add_subplot(1, 1, 1, projection=projection)
# 4. 绘制第 0 个仰角(0.5度)的反射率因子
# 'reflectivity' 为标准反射率字段名称
display.plot_ppi_map(
field='reflectivity',
sweep=0,
vmin=-10.0,
vmax=70.0,
cmap='pyart_NWSRef', # 使用标准气象反射率色标
colorbar_label='Reflectivity (dBZ)',
title='Radar Reflectivity PPI (0.5° Elevation)',
projection=projection,
ax=ax,
min_lon=-98.0, max_lon=-96.5,
min_lat=34.5, max_lat=36.0
)
# 5. 叠加雷达测距环(50km, 100km, 150km)与地理特征
display.plot_range_rings([50, 100, 150], ax=ax, col='gray', ls='--', lw=0.8)
display.plot_line_geo([-98.0, -96.5], [35.0, 35.0], ax=ax, color='blue') # 自定义参考线
# 6. 保存高质量图片
plt.savefig("pyart_custom_reflectivity.png", bbox_inches='tight')
plt.close()
print("Py-ART 反射率因子图已绘制完毕并保存。")
plot_ppi_map 时,若未安装 cartopy 或地图背景数据下载受阻,可降级使用 pyart.graph.RadarDisplay 与常规直角坐标(X/Y 相对公里数),语法为 display.plot_ppi('reflectivity', sweep=0),适合内网或纯物理回波分析场景。
五、关键技术细节与常见问题排查
在实际批量绘制或工程部署雷达图时,常会遇到一些典型问题,例如非气象回波干扰、地理投影偏差或数据缺失。下表总结了常见问题与对应的修复措施:
| 异常现象 | 根本原因 | 处理建议与代码方案 |
|---|---|---|
| 雷达中心周围出现大量杂乱强回波 | 近地地物、建筑物或山体对电磁波产生强遮挡散射(地物杂波) | 结合双偏振参量(如相关系数 CC < 0.8)进行非气象回波掩膜,或在仰角低于 0.5° 时剔除近距离 10km 范围内的强回波。 |
| 绘图出现空白,或回波被全部裁切 | 反射率因子字段存在大量 -999.0 填充值或无效值 | 使用 np.ma.masked_invalid() 或 np.ma.masked_less(data, -5) 屏蔽无回波晴空区。 |
| 回波边界呈现明显锯齿或扇区错位 | 天线旋转过程中方位角采样不均匀,直接插值产生变形 | 在极坐标转直角坐标时优先使用 pcolormesh 原生四边形网格渲染,而非简单双线性重采样。 |
| 回波颜色与气象业务系统显示差异巨大 | 使用了 Matplotlib 默认的 viridis 或 jet 色阶 |
显式指定气象专用的 15 级离散色标(如 pyart_NWSRef),确保每 5 dBZ 对应固定色块。 |
六、总结
通过本文的步骤,我们梳理了雷达基数据反射率因子的物理背景,并通过 Python 的 cinrad 与 Py-ART 两大工具包实现了从原生二进制数据读取到高质量 PPI 图的完整生成过程:
- 快速出图场景:针对国内 CINRAD 单站基数据,优先使用
cinrad库的read_auto和PPI类,三行核心代码即可得到标准气象业务风格的反射率图。 - 科研与多源定制场景:当需要更精细地控制地图投影(Cartopy)、叠加多源地理信息或统一国际标准雷达数据时,选择
Py-ART配合RadarMapDisplay能提供最灵活的扩展能力。
读者可根据实际数据源与业务场景选用对应方案,并结合地物杂波过滤与标准气象色阶配置,即可稳定生成符合气象分析要求的高清反射率因子图。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









