S-52:海图的颜色和符号,谁说了算

前面几篇把 S-57 数据怎么拆、S-100 家族怎么分讲完了,但渲染工程师每天真正对着干的另一套标准还没正名:S-52。S-57 说"这里有个 DEPARE、深度 8 米",S-52 说"它该填什么颜色、有没有边界线、叠不叠符号"。一个管数据,一个管画法——画法不是开发者的审美,是标准写死的规则。

很多第一眼看电子海图的人都觉得配色奇怪:浅水是蓝的,越深越绿,深水反而发白——和"蓝色代表深"的地图直觉正好相反。这不是审美问题,是安全设计,下面从机制讲起。

look-up 表:渲染器不是 CSS,是规则引擎

S-52 的核心机制是一组 look-up 表:对象类不直接绑定样式,而是按"对象类 + 属性条件"去表里查,查出四种画法之一——SY(点符号)、LC(复合线型)、AP(区域填充图案)、AC(区域颜色填充)。

关键是表里的条件项。同一个 DEPARE,会按深度和安全等深线的关系查到不同的 AC:比安全等深线浅的填极浅水色,深的填深水色。而安全等深线是船员按本船吃水调的参数——用户改一个数,整张图的填色分布实时重算。这不是"样式表",是带运行时状态的规则引擎:渲染器要监听参数变化重走一遍 look-up,而不是改个 CSS 变量了事。

颜色 token:63 个命名色,5 套色板

S-52 不允许在代码里写死 RGB。所有颜色都叫命名色 token:CHBLK(黑,线划注记)、CHGRD/CHGRF(灰)、DEPVS(极浅水)、DEPMS/DEPMD(中浅/中深水)、DEPIT(中间色调)、NODTA(无数据区)……一共 63 个。每个 token 在 5 套色板里各有一个值:Day 白底、Day 黑底、Day 亮底、Dusk(黄昏)、Night(夜航)。

为什么这么麻烦?看一组我们工具页里的真实色值——同一个 DEPVS:

Day 白底 #629acb(浅蓝,一眼识别"这里比你的安全等深线浅")→ Night #030413(近乎全黑)

夜航时人眼靠视杆细胞工作,对亮蓝光极其敏感,一块刺眼的浅蓝色水域能把暗适应毁掉,雷达屏旁边看不清的东西就多了。所以夜间色板把"浅水"压到几乎隐形,靠等深线和符号提醒,靠大面积低亮度保住暗视觉。把白天的色值原样搬到夜航模式,是 ECDIS 开发最经典的错误之一——颜色是安全机制,不是皮肤。

顺带一个开发习惯:色板校验要在构建期做。我们工具页的 63 色 × 5 板直接内嵌数据(s52.html 可查每个 token 五套色值),渲染代码里只允许出现 token 名,出现十六进制值直接过不了检查——就为防某个深夜手滑写死一个 #629acb。

符号库:矢量、会随色板换装

点符号同样是标准资产:矢量定义,颜色引用上面的 token,所以符号会和色板联动换装——白天的绿色灯标符号到夜里自动换成暗色版本。S-52 还规定了不少"显示语义":浮标顶标本身就是信息(IALA A 区:罐形顶标=左舷侧标、锥形顶标=右舷侧标;北界标双锥朝上、南界标双锥朝下),符号画错形状,等于报错航海信息。

我们先把常用的部分做成了速查页:s52.html 收了 14 类 166 个常用符号(带 INT 1 图式编号),按分类浏览,点击可复制编号——查"这个缩写是什么符号"不用再翻标准 PDF。

显示档位:Base / Standard / All

S-52 还定义了显示档位:Base(保命最小集,永远显示)、Standard(正常航行,ECDIS 默认),其余要素归入"其他信息"(Other,默认不显示)——船员把 Standard 和其他信息全打开,就是俗称的 Full 显示。同一份数据,档位不同显示的内容集合不同——不是透明度渐变,是 look-up 表里明确标了每类要素属于哪一档。渲染器要支持按档位过滤要素流,船员在拥挤水域切到 Full、远洋航行用 Standard,是日常操作。叠加之前讲过的安全等深线重算,ECDIS 渲染器的状态空间其实不小:档位 × 色板 × 安全参数,每一维都会改写最终画面。

画法标准化正在换代

S-52 是 ECDIS 时代的图示表达。S-101 的画法换成了新的 S-100 Portrayal Catalogue(PC),机制从"查表"演进到目录化的样式资产——线型、区域填充都成了可独立分发的条目(我们做了个 pc.html 速查页,解析了目录里的 59 个线型和 25 个区域填充,支持昼夜色板预览)。双标准并存的年代,两套画法机制都得养:老 S-52 还有至少十年的存量生命周期。


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

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

← 返回目录

评论

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