S-104:让海图知道"现在水位几米"

S-102 解决了"海底长什么样",但有一件事它解决不了:水深是相对基准面说的,而基准面本身在动。潮差四五米的港口,高潮和低潮差出的可通行水深,比任何测深精度都大。把"此刻的水位"变成标准化数据流,这就是 S-104(水位)。

上一篇拆 S-102,这篇拆它的邻居:NOAA 官方 S-104 样本里的切萨皮克湾水位预报文件。文件只有 53KB,拆开的信息密度却很高。

它长什么样:站点时序,不是网格

和 S-102 的 340 万单元网格不同,S-104 v1.0 的形态是离散站点 + 时间序列。

补一句版本演进:Ed 2.0.0(2024 年 12 月,与 S-101 PS 2.0.0 同批发布)起,产品形态已升级为网格化时序——规范原文写得直白,"The data product is a gridded data product",不确定度也升格为可选属性。NOAA 这份 v1.0 样本仍是站点形态,但数据模型一脉相承,站点本质就是"格点退化的网格"。

拆开这个预报文件(2019-07-03T00Z 起报的切萨皮克湾):

  • 根属性直接把"这是谁"写在脸上:产品规范 INT.IHO.S-104.1.0、地理标识 Chesapeake Bay、范围西经 76.41°~76.19°、北纬 38.21°~39.25°、垂直基准与坐标系统一登记
  • /WaterLevel/WaterLevel.01 下挂 25 个 Group——每个 Group 是一个水位站点
  • 每个站点 4 个时刻的预报值,每个值是一个二元组:水位高(米)+ 趋势码
  • 站点坐标在 Positioning/geometryValues:四个经纬度对,比如 (-76.29, 39.25)

用我们上线的 HDF5 解析器打开任何一个 S-104 文件,这棵树直接可见——S-102 和 S-104 同为 HDF5 家族,一套解析骨架通吃。

趋势码:不只是水位,还有水位往哪走

每个预报值除了水位高度,还带一个趋势码——枚举三值:1 = Decreasing(降)、2 = Increasing(涨)、3 = Steady(平稳)。根属性里专门有个字段叫 waterLevelTrendThreshold = 0.2——判定阈值由生产机构设定(NOAA 这份是 0.2 米,规范约定精度到厘米),时段内变化小于阈值就报"平稳"。

这个设计的聪明之处:水位数值是给计算用的(净空、富余水深),趋势码是给值班驾驶员直接看的——"未来几小时水位在涨"不需要计算,扫一眼就行。一个字段两种消费者,数据设计里少见的好品味。

填充值:数据工程的教科书细节

目录定义里明确写着水位的填充值是 -9999.0,合法区间 -99.99 ~ 99.99 米闭区间(Ed 2.0.0 的 Table 10-3 把时序数组三个元素的约定一次写死:水位 -9999.00、趋势码 0、不确定度 -1.00,区间全为闭)。没有测量值的时空组合,填充值顶上——解析端遇到 -9999 要跳过而不是当成"水深负一万米"画进渲染。我们上次的 S-102 统计里滤掉 1000000 填充值踩的坑,S-104 在规范层面就把这个约定写死了:标准里多写一行约定,下游少写一万行防御代码。

和 S-102 叠起来才有答案

单独的 S-104 只是"某站某刻水位几米"。真正的价值在叠加。规范对"怎么用"写得很克制:这一版只设计了一种显示方式——调整显示(Adjusted display),用水位实时修正海图/水深数据里的深度值(具体行为定义在 S-98 Annex C),另一个用途是给吃水净空管理(S-129)供数:

船底净空 = (S-102 网格水深 + S-104 站点水位插值) − 船型吃水

渲染端的功课也清楚了:站点水位要在空间上插值成面、在时间上按预报时刻插值成动画,再按调整显示的约定作用到深度表达上。动态图层家族(S-104 水位、S-111 流场、S-124 警告)每一个都带着"时间"这个新维度——静态海图引擎不补时间轴,就接不住这个家族。


我是夜航海图,做海图与地图渲染开发的工程师。博客「航图笔记」同步更新全部文章,欢迎 RSS 订阅;如果内容帮到了你,也欢迎在爱发电请我喝杯咖啡。

♥ 这篇对你有用?在爱发电支持夜航海图——请我喝杯咖啡,工具和文章都会继续更新。

← 返回目录

评论

评论基于 GitHub Discussions,需要 GitHub 账号;没有也欢迎通过 RSS 阅读器或各平台评论区交流。