简介面向气象数据处理、雷达产品开发与教学科研人员的CINRAD雷达基数据格式参考文档聚焦SA/SB与CA/CB两类雷达帮助读者弄清基数据文件的字节级组织方式解决解析、读取与格式转换中字段定位不清的问题。压缩包内为1个doc文档约92KB以表格形式逐字节列出雷达信息头、径向数据收集时间、儒略日、不模糊距离、方位角、仰角、体扫仰角数、反射率与多普勒数据的首库距离、库长、库数、各类数据指针、VCP模式及Nyquist速度等字段并给出编码换算公式与取值含义。文档还说明每个体扫存为单独文件、径向数据按仰角顺序排列、径向长度固定为2432字节以及反射率库长1000米、速度与谱宽库长250米等关键参数便于对照编写解析程序或校验数据。已有2806人学习适合需要快速查阅字段定义与编码规则的读者。1. 雷达基数据格式一份被二进制藏起来的天气档案如果你用过天气 App 上的雷达回波图看到过那种红黄绿蓝拼成的“番茄炒蛋”色块那你其实已经见过雷达基数据的“成品照”了。但成品照和原始底片是两回事。雷达基数据格式说的就是那张底片怎么存、怎么排、每个字节代表什么。它不负责好看只负责把雷达扫回来的原始信号一个字节不差地装进文件里等后面的人来读。为什么值得搞懂因为只要你想自己处理雷达数据——哪怕只是想把某个时次的回波画出来——第一步就会撞上它。文件打开是一堆乱码读错一个字节整张图就偏了。这份资料把 CINRAD SA/SB 和 CA/CB 两类雷达的字节布局逐条列了出来从第 1 个字节到第 2432 个字节哪个位置放时间、哪个位置放仰角、哪个位置开始是反射率都写清楚了。它更像一张“字节地图”你拿着它才知道该从哪里下刀。2. 为什么雷达数据要按字节死磕固定长度背后的取舍2.1 一个体扫一个文件一条径向固定 2432 字节雷达不是拍一张照片就完事。它转一圈在每个仰角上发一次脉冲、收一串回波这叫一条径向。一个体扫volume scan就是把多个仰角从低到高扫一遍攒出一整套三维数据。这份格式说明里有一条很硬的规定每个体扫存成一个单独的文件径向数据按顺序排列而且每条径向的长度固定——SA/SB 是 2432 字节CA/CB 是 4132 字节。固定长度听起来很笨但它换来的是“可计算”。你知道第 1 条径向从第 129 字节开始第 2 条就从 1292432 开始第 n 条的位置不用查表直接乘一下就行。打个比方这就像一列火车每节车厢长度一样你想找第几节车厢的某个座位算一下就知道不用从头数。代价是浪费——有些径向实际用不到那么多距离库剩下的位置也得留着不能省。2.2 字节顺序和双字节顺序读反了就是另一个世界格式里反复出现“字节顺序”“双字节顺序”这两个词。通俗地说一个数在文件里可能占 1 个字节、2 个字节或 4 个字节占多个字节时高位在前还是低位在前必须提前约定好。约定错了读出来的方位角可能从 120 度变成 30000 多度图就彻底翻车。这份资料对每个字段都标了它占几个字节比如方位角占 2 个字节编码方式是[数值/8.]*[180./4096.]度。这个公式的意思是文件里存的是一个整数你先除以 8再乘以 180/4096才得到真正的度数。不按这个公式走读出来的就是一个没有物理意义的裸整数。类似地仰角、不模糊距离、Nyquist 速度都有各自的缩放系数这些系数就是“翻译密码”少一步都不行。2.3 指针字段告诉你数据从哪儿开始雷达信息头里有一组很关键的字段反射率数据指针、速度数据指针、谱宽数据指针它们表示“偏离雷达数据信息头的字节数”也就是第一个反射率数据在文件里的位置。为什么要有指针因为不同雷达、不同模式头部的实际长度可能略有差异数据区不一定紧挨着头部的固定位置。指针相当于路标告诉你“往前走这么多字节就是反射率的地盘”。这里有个容易踩坑的地方指针是相对“雷达数据信息头”算的不是相对文件开头。如果你直接从文件第 0 字节开始加位置就偏了。资料里还提到“用于回放的反射率数据指针同 33”意思是回放场景下这个指针的用法和前面那个一样读的时候别把它当成另一套逻辑。3. 拆开一条径向头部字段到底在记什么3.1 时间、儒略日与不模糊距离每条径向的开头都带着自己的“身份证”。第 29 到 32 字节是径向数据收集时间单位是毫秒从当天 00:00 开始算。第 33 到 34 字节是儒略日从 1970 年 1 月 1 日开始计天数。这两个合起来就能定位这条径向是哪天、几点几分几秒收的。别小看这个时间戳做多部雷达拼图或者动画回放时时间对不上帧序就乱了。第 35 到 36 字节是不模糊距离编码方式是“数值/10 千米”。不模糊距离指的是雷达能明确判断目标距离的最大范围超出这个范围的回波可能来自更远的距离但被“折叠”到近处形成假回波。这个字段告诉你当前这条径向的有效测距范围读距离库的时候要拿它做参照。3.2 方位角、仰角与径向状态方位角在第 37 到 38 字节仰角在第 43 到 44 字节两者用的是同一套编码[数值/8.]*[180./4096.]度。为什么用这么绕的公式因为文件里只能存整数而角度需要小数精度于是用定点数的方式把小数“放大”成整数存进去读的时候再缩回来。你只要记住读到的是整数除以 8 再乘 180/4096才是度数。第 41 到 42 字节是径向数据状态取值 0 到 4分别表示该仰角的第一条、中间、最后一条以及体扫开始的第一条和体扫结束的最后一条。这个字段在拼接整层数据时很有用——它告诉你什么时候该换层了什么时候整个体扫结束了。第 45 到 46 字节是体扫内的仰角数配合状态字段能帮你判断当前处在第几层。3.3 距离库参数反射率和多普勒各有一套第 47 到 58 字节是一组距离库参数反射率第一个距离库的实际距离、多普勒第一个距离库的实际距离、反射率距离库长、多普勒距离库长、反射率距离库数、多普勒距离库数。为什么分两套因为反射率和速度/谱宽的探测需求不同。SA/SB 雷达的反射率库长是 1000 米、最大 460 个库速度和谱宽库长是 250 米、最大 920 个库CA/CB 雷达反射率库长 500 米、最大 800 个库速度和谱宽库长 125 米、最大 1600 个库。通俗地说反射率看的是“雨有多大”不需要那么细的距离分辨率库可以长一点、数量少一点速度看的是“风怎么动”需要更细的采样库就短、数量就多。读数据时如果拿反射率的库长去算速度的距离位置会差出好几倍这是新手很容易翻车的地方。3.4 数据区编码0 和 1 不是数值是标记反射率数据从第 129 字节开始每个距离库占 1 个字节编码方式是(数值-2)/2.-32 DBZ。速度数据紧跟在反射率之后谱宽再跟在速度之后具体起点由前面的指针字段决定。这里有个必须记住的规则当数值为 0 时表示无回波数据低于信噪比阈值当数值为 1 时表示距离模糊基数据部分。也就是说0 和 1 不是“很小的反射率”而是特殊标记不能套公式算成 dBZ。速度的编码稍微复杂一点取决于多普勒速度分辨率分辨率是 0.5 米/秒时用(数值-2)/2.-63.5分辨率是 1.0 米/秒时用(数值-2)-127。谱宽统一用(数值-2)/2.-63.5。这些公式里的减 2、减 63.5、减 127都是为了把存储用的整数偏移回真实的物理量范围。读的时候先看分辨率字段第 71 到 72 字节2 表示 0.54 表示 1.0再选对应的公式顺序不能反。4. 易混概念辨析这些“看起来差不多”的地方最容易读错4.1 易混点一SA/SB 和 CA/CB 的径向长度为什么混两类雷达的头部字段布局几乎一模一样字段名、字节位置、编码公式都相同只有数据区的长度和库数不同。很多人读了一份 SA 的代码直接拿去读 CA结果数据全错位。怎么区分看径向固定长度。SA/SB 是 2432 字节CA/CB 是 4132 字节。再看距离库数上限SA/SB 反射率最大 460、速度最大 920CA/CB 反射率最大 800、速度最大 1600。资料里给了一个很实用的做法在头文件里用const int RGates、VGates、WGates三个常量控制库数读 S 波段设 460/920/920读 C 波段改成 800/1600/1600。改这三个数比改一堆循环边界安全得多。4.2 易混点二反射率指针和回放反射率指针为什么混两个字段名字只差“用于回放”四个字位置也挨着编码方式还一样很容易当成同一个东西读两遍。怎么区分第 65 到 66 字节是正常的反射率数据指针第 83 到 84 字节是用于回放的反射率数据指针。资料明确说“同 33”意思是回放指针的用法和正常指针一致但它服务的是回放场景。日常读取实时体扫数据时用正常指针只有做回放处理时才看回放指针。不确定的时候先读正常指针再看回放指针是否等于它相等就说明当前文件没有区分回放布局。4.3 易混点三仰角层数和 PPI 扫描次数为什么混VCP 21 模式下仰角序列写出来是 0.5、0.5、1.5、1.5、2.4、3.4……看起来有 11 个 PPI 扫描但数组里只存了 9 层。有人按 11 层去分配数组后面全越界。怎么区分低层每个仰角扫两次但在保存时记为一个仰角层。资料里说得很清楚0.5 和 1.5 各扫两次合并后Elvation[]里只有 9 个有效元素0.5、1.5、2.4、3.4、4.3、6.0、9.9、14.6、19.5。判断依据是径向状态字段和仰角值——同一个仰角值连续出现两次第二次不要新开一层覆盖或跳过即可。数组最大层数按 20 分配留足余量但有效层数要以实际仰角去重后的结果为准。4.4 易混点四无效数据和距离折叠标记为什么混数组里用 -999.0 表示无效数据用 999.0 表示距离折叠两个都是“特殊值”但含义完全相反。有人把 999.0 也当成无效值过滤掉结果把真实的折叠回波丢了。怎么区分-999.0 是“这里没有可用数据”比如超出探测范围或者信噪比不够999.0 是“这里有回波但距离判断不可靠可能是折叠过来的”。做质量控制时-999.0 可以直接置空999.0 要单独标记不能一视同仁。资料里还提醒文件里数值 0 和 1 也是特殊标记读进数组后要转成对应的浮点标记别让 0 混进 dBZ 计算里。4.5 易混点五字节位置和数组下标为什么混资料里的字节位置是从 1 开始数的而 C/C 数组下标从 0 开始。第 129 字节对应数组下标 128差一位读出来的就是隔壁字段。怎么区分养成习惯凡是资料写“第 N 字节”在代码里统一减 1 再当下标用。更稳妥的做法是先把整条径向读进一个unsigned char缓冲区再用宏或常量定义偏移量比如#define AZIMUTH_OFFSET 36注释写明“第 37-38 字节下标 36 起”。这样即使以后换雷达型号改常量比改散落各处的数字安全。5. 什么时候该用它什么时候别硬上这份字节级格式说明最适合的场景很明确你要从零写一个读取器或者要核对某个现成库读出来的字段对不对。比如某实验室拿到一批历史体扫文件现成工具读出来的仰角层数总是少两层翻回这份资料一对发现是把重复仰角当成了新层改一下去重逻辑就通了。再比如做算法验证需要确认反射率第一个距离库的实际距离到底是 0 米还是 1000 米直接按字节位置去查比猜库的默认值靠谱。但它不是万能的。如果你只是想把雷达图叠到地图上做个展示没必要从字节开始啃用成熟的解码库更省事如果你要做的是多雷达拼图或者长时间序列分析光有格式说明也不够还得配合质量控制、坐标转换那一套。格式说明解决的是“怎么把二进制翻译成物理量”不解决“翻译完怎么用”。还有一个边界要注意资料里的数组定义是按“每度保存一个径向”来设计的MaxRads对应方位数。实际扫描的径向间隔可能不是整度直接按度取整会丢精度。做高精度应用时得按实际方位角插值不能假设数组下标就是角度。我自己的习惯是每次拿到一批新雷达数据先不急着写解析循环而是用十六进制工具打开文件按资料里的偏移量手工读几个字段——时间、仰角、方位角、库数——和文件名、扫描日志对一遍。对上了再写代码对不上先查字节顺序和指针基准。这个笨办法救过我很多次比事后调试一堆错位数据省时间。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?