从气象雷达基数据到可视化产品用Python cinrad库一键生成组合反射率PPI图气象雷达数据是天气监测和预警的重要工具但原始基数据对于非专业人员来说往往难以直接理解。本文将带你从零开始使用Python的cinrad库将晦涩的雷达基数据转化为直观的可视化图表让数据真正说话。1. 环境准备与数据获取在开始之前我们需要搭建一个适合处理雷达数据的工作环境。推荐使用Anaconda创建独立的Python环境conda create -n radar python3.8 conda activate radar pip install cinrad matplotlib cartopy雷达基数据通常以二进制格式存储中国气象局的标准格式为SA/SB/SC雷达基数据。这些数据可以从气象部门获取或者使用公开的测试数据。cinrad库支持直接读取这些格式from cinrad.io import CinradReader # 读取雷达基数据文件 f CinradReader(Z_RADR_I_Z9570_20210812000600_O_DOR_SA_CAP.bin)注意实际使用时需替换为你的雷达数据文件路径。文件名通常包含雷达站代码、观测时间等信息。2. 数据解析与元信息提取成功读取数据后我们首先需要了解数据的结构和内容。cinrad提供了丰富的元数据访问方法# 获取雷达站信息 station_info f.station print(f雷达站: {station_info[stname]}({station_id})) print(f经纬度: {station_info[lon]}E, {station_info[lat]}N) # 获取扫描参数 scan_info f.scan_config print(f扫描模式: {scan_info[scan_type]}) print(f仰角数量: {scan_info[n_elevation]})雷达数据通常包含多个仰角的扫描数据我们可以查看各个仰角的具体信息elevations f.available_elevation() print(可用仰角(度):, elevations) # 获取特定仰角的数据 elev_angle 1.5 # 选择1.5度仰角 data f.get_data(elev_angle, REF) # 获取反射率数据3. 组合反射率(CR)的快速生成组合反射率(Composite Reflectivity)是雷达产品中最重要的参数之一它表示在所有仰角中每个位置的最大反射率值。cinrad提供了快速生成CR的函数from cinrad.proc import quick_cr # 生成组合反射率 cr_data quick_cr(f)quick_cr函数有几个重要参数可以调整dtype: 指定数据类型默认为REF(反射率)r_min: 最小半径(km)默认为0r_max: 最大半径(km)默认为230coords: 输出坐标类型可选polar(极坐标)或geo(地理坐标)我们可以通过调整这些参数来满足不同需求# 只计算100km范围内的组合反射率 cr_data_100km quick_cr(f, r_max100)4. 专业级PPI图的绘制与定制有了组合反射率数据后我们可以使用cinrad的可视化模块创建专业的PPI(平面位置显示)图from cinrad.visualize import PPI # 基本绘图 fig PPI(cr_data) plt.show()为了使图表更具专业性和实用性我们可以进行多种定制4.1 色彩映射与色标定制雷达图的色彩映射直接影响数据的可读性。cinrad提供了多种预设色标也支持自定义# 使用不同的色标 fig PPI(cr_data, cmapCN_ref) # 中国气象局标准色标 fig PPI(cr_data, cmapNWS_ref) # 美国国家气象局标准色标 # 自定义色标 custom_cmap [#FFFFFF, #00FFFF, #00AAFF, #0055FF, #0000FF, #00FF00, #00AA00, #FFFF00, #FFAA00, #FF0000] fig PPI(cr_data, cmapcustom_cmap, norm[0, 10, 20, 30, 40, 50, 60, 70])4.2 地理信息叠加在实际业务中叠加地理信息有助于定位天气系统的位置# 添加地理信息图层 fig PPI(cr_data, add_city_namesTrue, # 添加城市名称 coastlineTrue, # 添加海岸线 gridlinesTrue) # 添加网格线 # 自定义显示范围(经纬度) fig PPI(cr_data, extent[115, 117, 38, 40]) # 经度115-117E纬度38-40N4.3 多图层叠加与标注我们可以叠加多个雷达产品并添加标注信息# 获取速度场数据 vel_data quick_cr(f, dtypeVEL) # 创建叠加图 fig PPI(cr_data, styleblack) fig.plot_ppi(vel_data, stylewhite, alpha0.5) # 半透明叠加 # 添加标题和标注 fig.set_title(组合反射率与径向速度叠加图, fontsize14) fig.add_colorbar(label反射率(dBZ), locright) fig.add_distance_ring(100) # 添加100km距离圈5. 高级技巧与实战案例在实际应用中我们经常需要处理一些特殊情况或优化图表效果5.1 数据质量控制雷达数据可能存在各种质量问题需要进行预处理# 去除噪声 clean_data np.where(data 0, np.nan, data) # 去除负值 clean_data np.where(data 80, 80, data) # 截断过高值 # 填补缺失数据 from scipy import interpolate # 创建插值函数 x np.linspace(0, data.shape[1]-1, data.shape[1]) y np.linspace(0, data.shape[0]-1, data.shape[0]) f_interp interpolate.interp2d(x, y, clean_data, kindlinear) # 应用插值 filled_data f_interp(x, y)5.2 批量处理与自动化对于业务应用通常需要批量处理多个时次的雷达数据import glob from tqdm import tqdm # 获取所有雷达数据文件 radar_files glob.glob(radar_data/*.bin) # 批量处理 for file in tqdm(radar_files): try: f CinradReader(file) cr_data quick_cr(f) fig PPI(cr_data, add_city_namesTrue) # 保存图片 out_name file.replace(.bin, .png) fig.savefig(out_name, dpi300, bbox_inchestight) plt.close() except Exception as e: print(f处理{file}时出错: {e})5.3 与其他气象数据融合雷达数据常需要与其他气象数据配合使用import xarray as xr # 读取ERA5再分析数据 era5 xr.open_dataset(era5_data.nc) # 提取与雷达数据同时间的ERA5数据 radar_time f.scantime # 获取雷达扫描时间 era5_slice era5.sel(timeradar_time) # 绘制叠加图 fig PPI(cr_data) # 添加ERA5风场 fig.ax.barbs(era5_slice.longitude, era5_slice.latitude, era5_slice.u10, era5_slice.v10, length5, colorwhite)在实际项目中我发现最常遇到的挑战是数据质量问题。特别是在强对流天气过程中雷达信号可能受到多种干扰。通过设置合理的质量控制参数可以显著提高数据的可用性。另一个实用技巧是使用quick_cr的r_max参数限制计算范围这不仅能提高处理速度还能避免远距离数据的质量问题。
从气象雷达基数据到可视化产品:用Python cinrad库一键生成组合反射率PPI图
从气象雷达基数据到可视化产品用Python cinrad库一键生成组合反射率PPI图气象雷达数据是天气监测和预警的重要工具但原始基数据对于非专业人员来说往往难以直接理解。本文将带你从零开始使用Python的cinrad库将晦涩的雷达基数据转化为直观的可视化图表让数据真正说话。1. 环境准备与数据获取在开始之前我们需要搭建一个适合处理雷达数据的工作环境。推荐使用Anaconda创建独立的Python环境conda create -n radar python3.8 conda activate radar pip install cinrad matplotlib cartopy雷达基数据通常以二进制格式存储中国气象局的标准格式为SA/SB/SC雷达基数据。这些数据可以从气象部门获取或者使用公开的测试数据。cinrad库支持直接读取这些格式from cinrad.io import CinradReader # 读取雷达基数据文件 f CinradReader(Z_RADR_I_Z9570_20210812000600_O_DOR_SA_CAP.bin)注意实际使用时需替换为你的雷达数据文件路径。文件名通常包含雷达站代码、观测时间等信息。2. 数据解析与元信息提取成功读取数据后我们首先需要了解数据的结构和内容。cinrad提供了丰富的元数据访问方法# 获取雷达站信息 station_info f.station print(f雷达站: {station_info[stname]}({station_id})) print(f经纬度: {station_info[lon]}E, {station_info[lat]}N) # 获取扫描参数 scan_info f.scan_config print(f扫描模式: {scan_info[scan_type]}) print(f仰角数量: {scan_info[n_elevation]})雷达数据通常包含多个仰角的扫描数据我们可以查看各个仰角的具体信息elevations f.available_elevation() print(可用仰角(度):, elevations) # 获取特定仰角的数据 elev_angle 1.5 # 选择1.5度仰角 data f.get_data(elev_angle, REF) # 获取反射率数据3. 组合反射率(CR)的快速生成组合反射率(Composite Reflectivity)是雷达产品中最重要的参数之一它表示在所有仰角中每个位置的最大反射率值。cinrad提供了快速生成CR的函数from cinrad.proc import quick_cr # 生成组合反射率 cr_data quick_cr(f)quick_cr函数有几个重要参数可以调整dtype: 指定数据类型默认为REF(反射率)r_min: 最小半径(km)默认为0r_max: 最大半径(km)默认为230coords: 输出坐标类型可选polar(极坐标)或geo(地理坐标)我们可以通过调整这些参数来满足不同需求# 只计算100km范围内的组合反射率 cr_data_100km quick_cr(f, r_max100)4. 专业级PPI图的绘制与定制有了组合反射率数据后我们可以使用cinrad的可视化模块创建专业的PPI(平面位置显示)图from cinrad.visualize import PPI # 基本绘图 fig PPI(cr_data) plt.show()为了使图表更具专业性和实用性我们可以进行多种定制4.1 色彩映射与色标定制雷达图的色彩映射直接影响数据的可读性。cinrad提供了多种预设色标也支持自定义# 使用不同的色标 fig PPI(cr_data, cmapCN_ref) # 中国气象局标准色标 fig PPI(cr_data, cmapNWS_ref) # 美国国家气象局标准色标 # 自定义色标 custom_cmap [#FFFFFF, #00FFFF, #00AAFF, #0055FF, #0000FF, #00FF00, #00AA00, #FFFF00, #FFAA00, #FF0000] fig PPI(cr_data, cmapcustom_cmap, norm[0, 10, 20, 30, 40, 50, 60, 70])4.2 地理信息叠加在实际业务中叠加地理信息有助于定位天气系统的位置# 添加地理信息图层 fig PPI(cr_data, add_city_namesTrue, # 添加城市名称 coastlineTrue, # 添加海岸线 gridlinesTrue) # 添加网格线 # 自定义显示范围(经纬度) fig PPI(cr_data, extent[115, 117, 38, 40]) # 经度115-117E纬度38-40N4.3 多图层叠加与标注我们可以叠加多个雷达产品并添加标注信息# 获取速度场数据 vel_data quick_cr(f, dtypeVEL) # 创建叠加图 fig PPI(cr_data, styleblack) fig.plot_ppi(vel_data, stylewhite, alpha0.5) # 半透明叠加 # 添加标题和标注 fig.set_title(组合反射率与径向速度叠加图, fontsize14) fig.add_colorbar(label反射率(dBZ), locright) fig.add_distance_ring(100) # 添加100km距离圈5. 高级技巧与实战案例在实际应用中我们经常需要处理一些特殊情况或优化图表效果5.1 数据质量控制雷达数据可能存在各种质量问题需要进行预处理# 去除噪声 clean_data np.where(data 0, np.nan, data) # 去除负值 clean_data np.where(data 80, 80, data) # 截断过高值 # 填补缺失数据 from scipy import interpolate # 创建插值函数 x np.linspace(0, data.shape[1]-1, data.shape[1]) y np.linspace(0, data.shape[0]-1, data.shape[0]) f_interp interpolate.interp2d(x, y, clean_data, kindlinear) # 应用插值 filled_data f_interp(x, y)5.2 批量处理与自动化对于业务应用通常需要批量处理多个时次的雷达数据import glob from tqdm import tqdm # 获取所有雷达数据文件 radar_files glob.glob(radar_data/*.bin) # 批量处理 for file in tqdm(radar_files): try: f CinradReader(file) cr_data quick_cr(f) fig PPI(cr_data, add_city_namesTrue) # 保存图片 out_name file.replace(.bin, .png) fig.savefig(out_name, dpi300, bbox_inchestight) plt.close() except Exception as e: print(f处理{file}时出错: {e})5.3 与其他气象数据融合雷达数据常需要与其他气象数据配合使用import xarray as xr # 读取ERA5再分析数据 era5 xr.open_dataset(era5_data.nc) # 提取与雷达数据同时间的ERA5数据 radar_time f.scantime # 获取雷达扫描时间 era5_slice era5.sel(timeradar_time) # 绘制叠加图 fig PPI(cr_data) # 添加ERA5风场 fig.ax.barbs(era5_slice.longitude, era5_slice.latitude, era5_slice.u10, era5_slice.v10, length5, colorwhite)在实际项目中我发现最常遇到的挑战是数据质量问题。特别是在强对流天气过程中雷达信号可能受到多种干扰。通过设置合理的质量控制参数可以显著提高数据的可用性。另一个实用技巧是使用quick_cr的r_max参数限制计算范围这不仅能提高处理速度还能避免远距离数据的质量问题。