本文首发于个人博客航图笔记nightchart.cn(S-57 / S-52 / S-100 / 渲染引擎源码走读,持续更新)。CSDN 同步发布,转载请保留出处。
S-57 时代我们把显示规则叫做 Look-up 表:要素类型加属性条件,查出一支笔、一个符号、一个显示组。到了 S-101,这套机制换了名字也换了分发方式——图示表达目录(Portrayal Catalogue,PC)。这篇拿真实分发件拆给你看,顺带说清一个容易踩的坑:哪些东西在公开包里,哪些不在。
PC 分发件里有什么
把官方 PC 2.0.0 分发包解开,核心是三个文件加一堆绘图资源:
- portrayal_catalogue.xml——目录的索引中枢。里面登记着 718 个符号(每个有 ID 和描述)、67 个视图组图层(viewingGroupLayer)、3 个样式表、215 个规则文件的引用。注意最后这条:是"引用"。
- colorProfile.xml——颜色配置。67 个颜色令牌,每个令牌给出Day / Dusk / Night 三套调色板的取值,而且同时给 CIE 坐标(x, y, L)和 sRGB 两套表达。CIE 给校准软件用,sRGB 给屏幕直接用——一份定义,两种用途。
- 绘图资源 XML——AreaFills、LineStyles 一类的矢量绘图定义,每个文件画一种纹样或线型(目录里登记了 59 个线样式和 25 个面填充,每个都是这样一份纯数据文件)。
一个真实的线样式长什么样
拿锚地边界的线样式 ACHARE51 开刀,全文结构拆开是这样:
intervalLength32.3——这条线的"一个循环"长 32.3 个单位,重复图案按这个长度排布pen宽 0.32,颜色CHMGD——品红深色,S-52 令牌直接引用- 三个
dash——起点和长度写死,虚线段的位置是数据不是猜测 - 四个
symbol引用——在 5、13.1、21.2、29.3 四个位置各放一枚小符号
整份文件没有一个"渲染逻辑",全是纯数据。渲染器就是个解释器:读间隔、下笔、画虚线、摆符号。数据驱动到这个程度,换一套主题或者加一种线型,渲染器一行代码都不用改——这是 PC 设计里最值得抄的一课。
文件头里还有一行 lineage 注释:source="S52Preslib4.0",创建日期 2015 年 3 月。S-101 的图示表达就是从 S-52 PresLib 4.0 迁移来的,符号体系一脉相承——你在 S-52 上的显示层积累,又一次不作废。
Look-up 表去哪了
拆包拆到这你会发现少了东西:目录索引里引用了 215 个规则文件(ruleFile),但公开分发件里并没有这些文件。Look-up 的核心逻辑——哪个要素类型在什么属性条件下用什么符号、属于哪个视图组——不在公开包里。
这不是事故,是分发策略:PC 公开包给的是"骨架 + 资源",完整规则随授权渠道走。对开发者的现实影响是:自研显示端要么走授权拿全量规则,要么按行为兼容自己实现查表(开源社区如 OpenCPN 走的是后者,行为对齐而非数据复制)。好在查表机制的"形状"是公开且稳定的:要素类型 + 属性条件 → 符号、视图组、显示优先级——理解了这个模式,规则数据从哪来只是工程问题。
视图组:用户说了算的图层开关
PC 里的 67 个视图组图层是容易被忽略的一块。每个图层绑一组视图组编号,用户在 ECDIS 里勾掉"航标类"或者"水深注记",本质就是按视图组批量过滤绘制队列。渲染端要把视图组做成绘制管线里的一等过滤条件,而不是画完再擦。
工具联动
这些内容都已经进了我们的图示表达解析器:符号注册表 718 条可搜、视图组图层清单、颜色配置直接渲染成三栏对照色表(可点复制 HEX)。拆 PC 分发包时不用再手翻 XML。
我是夜航海图,做海图与地图渲染开发的工程师。博客「航图笔记」:https://nightchart.cn ,同步更新全部文章,欢迎收藏。
这个系列持续更新(S-100 全家族拆解中),关注博主不迷路;完整在线工具与最新文章见 nightchart.cn。