雷达图反解析操作指南
观天者数据站的“雷达图反解析”工具是帮助用户将中央气象台实时发布的单站雷达组合反射率图片反解析为带有经纬度坐标信息的 NetCDF 格式文件的在线工具。
一、数据准备:获取原始分辨率的单站雷达图片
“雷达图反解析”工具目前只支持中央气象台发布的原始分辨率单站雷达图片;站点拼图、全国拼图以及经过缩放或压缩处理的图片一律不支持,会直接导致任务失败。因此,在使用本工具前,请先按下面步骤获取对应站点的原始图片地址。
1. 打开目标雷达站的大图
- 在浏览器中打开 中央气象台雷达图页面,进入对应站点的单站雷达页面。
- 在页面中间找到该站点当前时次的雷达图预览图,并点击一次,小图会在新窗口或浮层中放大显示为一张单独的大图,本文中把这一状态称为 「大图模式」,后续步骤都以这张大图为准。
单站雷达页面示意:

进入大图模式后的示意:

2. 获取原始图片地址 / 文件(方案 A / 方案 B)
在大图模式下,你可以选择以下两种方式之一获取原始雷达图:
- 方案 A:复制图片地址(推荐)
- 在大图模式下,将鼠标移动到这张雷达大图上。
- 在图片上点击鼠标右键,选择 “复制图片地址”(不同浏览器文案略有差异)。
- 此时,这一帧雷达图对应的原始分辨率图片 URL 已经复制到剪贴板。
右键菜单示意:

- 方案 B:下载图片文件
- 在大图上点击鼠标右键,选择 “图片另存为…” 或浏览器中含义相同的菜单项。
- 选择一个你容易找到的本地目录(例如桌面),保存该雷达图片文件。
- 后续在工具中上传的就是这张原始分辨率的雷达图文件。
二、数据导入:在反解析工具中提交任务
完成上面的数据准备(拿到单站原始雷达图片 URL 或文件)之后,可按下面步骤在观天者数据站中发起一次反解析任务:
- 打开“雷达图反解析”工具页面,在数据来源区域选择其一:
- 方式 A:使用图片 URL:在「雷达图片地址」输入框中粘贴刚才复制的 URL。
- 方式 B:上传图片文件:点击「上传图片」按钮,支持两种上传模式:
- 上传单张图片:选择前面另存为到本地的那张雷达图片(PNG 格式)。
- 批量上传(ZIP 压缩包):将多张雷达图片打包成 ZIP 文件后上传(注意打包 ZIP 时图片要保持平铺结构,不要有多级目录结构),系统会自动解压并批量处理。
在观天者数据站中使用该 URL 的示例:

上传单张 PNG 图片的示例:

上传包含多张图片的 ZIP 压缩包的示例:

三、结果下载
反解析任务提交后,系统会在后台处理。你可以通过以下步骤查看任务状态并下载结果:
1. 查看任务状态
- 在观天者数据站左侧导航栏中点击「任务列表」。
- 在任务列表中可以看到所有提交的反解析任务,包括任务状态(处理中、已完成、失败等)。
- 找到对应的反解析任务,点击「查看详情」进入任务详情页面。
任务列表页面示意:

2. 查看任务详情与预览
任务详情页面会显示任务的基本信息(任务ID、创建时间、状态、处理时间等)和任务参数:
- 图片预览:如果上传的是单张 PNG 图片,会显示原始雷达图的预览。
- 原始文件:如果上传的是 ZIP 压缩包,会显示"已上传 ZIP 压缩包",并提供「原始文件」按钮用于下载原始上传的 ZIP 文件。
- 图片数量:显示本次任务处理的雷达图片数量。
任务详情页面示意:
单张图片上传:

ZIP 压缩包上传:

3. 下载结果文件
- 任务完成后,在任务详情页面点击「下载结果」按钮(蓝色按钮)。
- 系统会提供 ZIP 压缩包的下载链接,压缩包内包含反解析后的 NetCDF 格式文件(
.nc扩展名)。 - 下载压缩包后,需要解压才能获取其中的
.nc文件。每个.nc文件包含反解析后的雷达反射率数据及其对应的地理坐标信息。
任务详情页面中的下载按钮位置可参考上面的任务详情页面截图。
重要提示:
- 下载链接有效期为 10 天,请在有效期内及时下载并保存到本地。
- 如需长期保存结果,请及时下载到本地存储,避免链接过期后需要重新发起任务。
- 如果任务失败,系统会显示错误信息,你可以根据提示调整参数后重新提交。
4. 其他操作
在任务详情页面,你还可以:
- 删除任务:点击「删除任务」按钮可以删除该任务记录。
- 返回列表:点击「返回列表」按钮可以返回任务列表页面查看其他任务。
四、输出格式
反解析任务完成后,系统会生成 ZIP 压缩包,压缩包内包含 NetCDF 格式文件(.nc 扩展名)。下载压缩包后需要解压,解压后的 .nc 文件包含反解析后的雷达反射率数据及其对应的地理坐标信息。
文件结构
NetCDF 文件包含以下变量:
lat:纬度数组,维度为(n, n),单位为度lon:经度数组,维度为(n, n),单位为度dbz:反射率等级数组,维度为(n, n)
重要说明:
-
缺省值处理:
dbz数组中的值-99为缺省值(填充值),表示该位置无有效雷达回波数据,在使用数据时需将其 mask 掉。 -
等级与数值转换:
dbz数组中存储的是反射率等级,而非实际的 dBZ 数值。按照中央气象台的绘图风格,每 5 个 dBZ 为一个等级,使用同一个颜色。因此,在绘图或进行数值计算时,需要将等级值乘以 5 才能得到实际的 dBZ 值。例如,等级值为1对应实际 dBZ 值为5,等级值为2对应实际 dBZ 值为10,以此类推。
数据读取示例
以下是一个极简的 Python 脚本示例(基于 Python3.6 及以上版本语法),用于读取并可视化 NetCDF 文件中的雷达数据:
#!/usr/bin/env python3
"""
极简脚本:读取并绘制 NetCDF 文件中的雷达数据。
"""
import os
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import BoundaryNorm, ListedColormap
from netCDF4 import Dataset
from PIL import Image
# NetCDF 文件路径
nc_file = "data/b76f356f-1789-440b-a8e9-0c6fecff3521_bundle/山东/济南/20251202/AZ9531_20251202T011900Z.nc"
# 读取 NetCDF 文件
with Dataset(nc_file, "r") as f:
lat = f.variables["lat"][:]
lon = f.variables["lon"][:]
dbz = f.variables["dbz"][:]
# 检查所有唯一值
unique_values = np.unique(dbz)
print("NetCDF 文件中 dbz 的所有唯一值(排序后):")
print(unique_values)
print(f"\n唯一值总数: {len(unique_values)}")
print(f"数据形状: {dbz.shape}")
print(f"总元素数: {dbz.size}")
# 统计每个值的出现次数
value_counts = {}
for val in unique_values:
count = np.sum(dbz == val)
value_counts[val] = count
print(f"值 {val}: 出现 {count} 次 ({100 * count / dbz.size:.2f}%)")
# 标记缺省值(-99 为填充值)
dbz_masked = np.ma.masked_where(dbz == -99, dbz)
# 转换为实际 dBZ 值:NetCDF 中存储的是等级,每 5 个 dBZ 为一个等级
dbz_actual = dbz_masked * 5
# 定义颜色映射(按照中央气象台标准)
colors = [
"#3F01EF", # 0-5
"#4D9DF1", # 5-10
"#64E7EB", # 10-15
"#6DFA3D", # 15-20
"#3ED800", # 20-25
"#279000", # 25-30
"#F8FF01", # 30-35
"#E7C000", # 35-40
"#F29005", # 40-45
"#F00704", # 45-50
"#D60601", # 50-55
"#C00400", # 55-60
"#F600F0", # 60-65
"#9600B4", # 65-70
"#AD90F0", # >70
]
boundaries = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 100]
cmap = ListedColormap(colors)
norm = BoundaryNorm(boundaries, cmap.N)
# Plot - 确保输出是正方形
fig, ax = plt.subplots(figsize=(10, 10))
im = ax.imshow(
dbz_actual,
cmap=cmap,
norm=norm,
extent=[lon.min(), lon.max(), lat.min(), lat.max()],
origin="lower",
aspect="equal",
)
# 添加经纬线网格(只画线,不显示标签)
lon_min, lon_max = lon.min(), lon.max()
lat_min, lat_max = lat.min(), lat.max()
# 计算合适的网格间隔(大约每度一条线)
lon_ticks = np.arange(np.floor(lon_min), np.ceil(lon_max) + 0.5, 1.0)
lat_ticks = np.arange(np.floor(lat_min), np.ceil(lat_max) + 0.5, 1.0)
ax.set_xticks(lon_ticks)
ax.set_yticks(lat_ticks)
ax.tick_params(
left=False, bottom=False, labelleft=False, labelbottom=False
) # 隐藏刻度线和标签
ax.grid(True, color="gray", linestyle="--", linewidth=0.5, alpha=0.5)
plt.subplots_adjust(left=0, right=1, top=1, bottom=0) # 移除所有边距
plt.savefig(
"radar_plot_temp.png", dpi=150, bbox_inches="tight", pad_inches=0, facecolor="white"
)
# 裁剪成正方形
img = Image.open("radar_plot_temp.png")
width, height = img.size
size = min(width, height) # 取较小的边作为正方形边长
# 居中裁剪
left = (width - size) // 2
top = (height - size) // 2
right = left + size
bottom = top + size
img_cropped = img.crop((left, top, right, bottom))
img_cropped.save("radar_plot.png")
os.remove("radar_plot_temp.png")
print(f"图片已保存至: radar_plot.png")
print(f"数据维度: {dbz.shape}")
print(f"纬度范围: [{lat.min():.4f}, {lat.max():.4f}]")
print(f"经度范围: [{lon.min():.4f}, {lon.max():.4f}]")
print(f"反射率范围(有效数据): [{dbz_actual.min():.2f}, {dbz_actual.max():.2f}] dBZ")
print(
f"缺省值数量: {np.sum(dbz == -99)} 个像素点 ({100 * np.sum(dbz == -99) / dbz.size:.1f}%)"
)
依赖库:运行上述脚本需要安装 netCDF4、matplotlib 和 numpy。可通过以下命令安装:
pip install netCDF4 matplotlib numpy
效果对比
下图展示了反解析前后的效果对比:左侧为解析前的原始雷达图片,右侧为从反解后的 NetCDF 文件重新绘制的雷达图(上述 Python 程序的输出图)。

附录:可支持反解析的雷达列表
详细的雷达站点列表请参见:可支持反解析的雷达列表。