S-123:无线电服务也能成为海图产品
海图上的大多数物标都有形状:海岸线、水深区、浮标、码头。S-123——Marine Radio Services(海上无线电服务)产品规范,Ed 1.0.0——管的偏偏是没有形状的东西:海岸电台的值守频段、NAVTEX 的播发范围、GMDSS 海区的边界、气象警报的生效区域。无线电服务看不见摸不着,船却靠它们保命。这套规范做的事,就是把看不见的服务画成海图上的多边形。
素材依旧是真实分发件:S-123 的 Portrayal 包(87 个 XML、657 个 SVG、26 个 XSLT 规则、8 个调色板 CSS,连 4 个字体文件都随包分发),全部喂给工具页的 PC 解析器实测通过。这篇讲三个东西:它的物标面有多"软"、它的 XSLT 规则怎么组织、以及官方包里两个有意思的细节。
物标面:把电磁波画成多边形
S-57 时代,VHF 岸台、NAVTEX 播发这些信息住在航标表和无线电信号表(ALL)里——表格形态,人查的。S-123 把它们升格成空间物标:
- RadioStation / RadioServiceArea:无线电台和它的服务区——服务区是个多边形,覆盖边界就是几何
- GMDSSArea:全球海上安全通信系统(GMDSS)的海区划分
- NavtexStationArea:NAVTEX 播发站的覆盖区
- InmarsatOceanRegionArea:Inmarsat 卫星的洋区
- WeatherForecastWarningArea / NavigationalMeteorologicalArea:气象预报与警报区
- ForecastAreaAggregate / FuzzyAreaAggregate / IndeterminateZone:预报聚合区、模糊聚合区与不确定区——服务覆盖的边界本来就有渐变和不确定性,规范直接给了表达它们的物标
GMDSSArea 值得单独展开。GMDSS 把全球海域按无线电保障能力分成四级:A1 是岸台 VHF-DSC 覆盖圈( roughly 二三十海里);往外 A2 接 MF 中频覆盖;再往外 A3 靠 Inmarsat 静止卫星撑着(南北纬 70° 之间);极地最后的空白是 A4。四个等级一圈圈套出去,物标的几何画的就是电波能到哪——岸边一个新电台开通,A1 的圈就往外长一截。这是 S-123 最"物理"的一类物标:几何直接编码了无线电传播工程。
FC 的体量不大:18 个要素类型加 13 个信息类型(其中两个是抽象底座——泛化根类型和模糊聚合区),但每一个都对应一类真实的海上服务能力。这份目录我也丢进了要素目录解析器实测,16 个非抽象要素类型直接解析成表。
这套物标面的共同点:几何画的是"服务能力的边界",不是自然物。生产这些数据的也正是一线服务方——VTS 中心、海岸电台、水文气象机构,每家维护自己的覆盖与时刻,聚到一起就是全国的无线电服务图景。信号覆盖、播发范围、预报分区,边界随台站开关、功率调整、气象过程动态变化。这也是为什么 S-123 的图示表达大量依赖文字注记。拿海警站的规则原文看:
<xsl:if test="communicationChannel!= ''">
<textInstruction>...Prod 频道号注记...</textInstruction>
</xsl:if>
服务的核心信息是频道号,符号旁边必须跟着字——有频道才出注记,没有就不出,一个 xsl:if 的事。
一条规则的解剖:GMDSSArea
把整个包里最有代表性的一条规则摊开看。GMDSSArea.xsl 全文 42 行,匹配 GMDSSArea[@primitive='Surface'],核心是三连指令——一个面状物标,同时输出三种绘制指令:
<pointInstruction>
<symbol reference="GMDSSArea"/> <!-- 面中心放一枚符号 -->
</pointInstruction>
<lineInstruction>
<pen width="0.32"><color>TESTB</color></pen> <!-- 围线 -->
</lineInstruction>
<areaInstruction>
<colorFill>
<color transparency="0.30">TESTC</color> <!-- 半透明填充 -->
</colorFill>
</areaInstruction>
三个指令共用同一套属性:查看组 12310(S-123 自己的号段)、显示平面 OVERRADAR(画在雷达回波之上)、绘制优先级 15。一个"无线电服务区"在屏幕上的完整形象就这三件套:中心一枚符号、一圈围线、一片半透明的底色。
填充色 TESTC 查了调色板:#EE6D24,橙色,三套色板(日/晨昏/夜)各自给了 CIE 值。橙色 + 30% 透明 + 雷达层之上,这套组合让服务区"看得见但不碍事"——边界的几何是确定的,它代表的服务能力却是概率性的,透明度就是这两者之间的诚实。顺带一个观察:这一族颜色 token 直接以 TEST 开头(TESTB/TESTC),全包唯一的 TEST 系命名,像是 S-123 包从模板孵化时留下的命名痕迹。
XSLT 规则的工程化分层
S-123 的图示表达用 XSLT(和 S-111 同一条技术线)。26 个 XSLT 不是平铺的,分了三层:
- 公共模板层:
main.xsl、textStyle.xsl、simpleLineStyle.xsl、attributeRules.xsl——字体、线型、属性转文本的复用模板 - 物标规则层:
RadioStation.xsl、GMDSSArea.xsl……每个物标一个文件,xsl:template match按物标名和几何类型匹配 - 变体层:
_COMMON后缀的共享变体(Building_COMMON.xsl、Landmark_COMMON.xsl)——同一物标在不同上下文复用的模板组
另外还有一个 Default.xsl——没有任何规则命中时的兜底渲染。规则体系的完整性,连"没写规则怎么办"都定义了。上限和下限也值得对照:CoastguardStation.xsl 有条件分支、频道注记、偏移排版;RadioStation.xsl 则短到只有十来行——一个模板、一枚符号、完事。规则体系里既有 150 余行的深度区那种巨无霸,也有十行的小透明,复杂度跟着物标的语义走,而不是为了显得严谨而堆分支。
这个分层让"改一个物标的画法"和"改全局字体"是两个互不干扰的提交——对规则包的维护来说,工程结构和渲染逻辑同等重要。
官方包里的两个细节
拆包的快乐在于总有彩蛋。其一:Rules 目录里 NavigationalMeteorologicalArea.xsl 和 NavigationalMeterorologicalArea.xsl 同时存在——一个是正确拼写,一个是少了个 o 的 typo 版本,同一物标的两份规则并排躺在官方分发件里。标准不是圣旨,是工程产物。其二:一个规则文件的文件名是韩语("规则 基本"),多国协作的产品规范,工作语言痕迹就这样留在了分发件里。
工具实测的完整数字再报一遍:S-123 包 87 个 XML、657 个 SVG、26 个 XSLT——6 个公共模板、14 个物标规则文件(覆盖 13 个物标,其中气象区的正误两个拼写版本并存)、3 个物标级 _COMMON 变体(Building / Landmark / DataCoverage)、2 个框架级 _COMMON,外加 1 个韩语文件名的文件,PC 解析器双引擎里的 XSLT 那条管道全通过,符号按调色板着色渲染。
S-123 和 S-124 合起来看,S-100 里"信息类产品"的两种形态就都见了:事件类(警告,突然出现要求被看见)和服务类(覆盖与能力,长期存在供查询)。渲染端的挑战不同——前者要抢注意力,后者要可检索。港口场景的 S-131 已在上一篇拆过;至此,事件、服务、场景三种信息产品的图示表达就都过了一遍。
我是夜航海图,做海图与地图渲染开发的工程师。博客「航图笔记」同步更新全部文章,欢迎 RSS 订阅;如果内容帮到了你,也欢迎在爱发电请我喝杯咖啡。
♥ 这篇对你有用?在爱发电支持夜航海图——请我喝杯咖啡,工具和文章都会继续更新。
评论
评论基于 GitHub Discussions,需要 GitHub 账号;没有也欢迎通过 RSS 阅读器或各平台评论区交流。