把一个 S-101 数据集拆开看

上一篇讲了 S-101 和 S-57 的模型差异,这篇兑现承诺:把一个真实的 S-101 数据集拆开看。样本选官方 IC-TEST 测试集里的 10100AA_00001.000——整个文件只有 43KB,麻雀虽小五脏俱全。

先说一个很多人没意识到的点:S-101 的数据集文件后缀仍然是 .000,底层封装仍然是 ISO 8211——和 S-57 同一套容器。S-57 时代写过的 DDR 头解析、字段目录遍历、DR 读取循环,骨架全部能复用。变的是什么?往下看。

第一层:交换集目录从二进制变成了 XML

S-57 的交换集里有个 catalogue cross(CATALOG.031),是 8211 编码的,读起来生疼。S-101 换成了 S-100 定义的交换目录 XML(Exchange Catalogue,现行 S-100 版本里定义在 Part 17):S100_ROOT/CATALOG.XML,根元素 S100_ExchangeCatalogue,里面用人类可读的 XML 写清了数据集清单、每个数据集的元数据、以及要素目录和图示表达目录的引用。

S-101 还有个先天优势:数据集自描述。目录里直接引用了 FC(要素目录)文件——解析器不用再硬编码对象表,读哪个产品的数据就挂哪份目录。

第二层:8211 的字段字典

打开 .000 文件,先读 24 字节 DDR 头,再遍历字段目录。这个测试集的 DDR 里登记了 31 个记录类型,原样摘一批:

DSID、DSSI、FTCS、ITCS、ATCS、IACS、FACS、ARCS、CSID、CRSH、CSAX、VDAT、IRID、ATTR、INAS、PRID、C2IT、C2IL、C3IT、CRID、PTAS、SEGH、CCID、CUCO、SRID、RIAS、FRID、FOID、SPAS、FASC、MASK

对照 S-57 的字段字典(DSID/FRID/VRID/FOID…),似曾相识又不完全一样。几个值得注意的:

  • FTCS / ITCS / ATCS:要素类型、信息类型、属性的代码序列。这是 S-101 的设计——把本数据集用到的目录代码做成本地索引,数据记录里引用索引号,不用每个要素重复写长名字。
  • IRID / INAS:信息记录和它的属性。上一篇说的"要素与信息分家"在物理层就是这些新记录类型。
  • IACS / FACS / ARCS:关联的代码与绑定记录——关系在物理层真实存在,不再靠空间重叠脑补。

第三层:DSID 记录逐段读

DSID(数据集标识)字段拆出来是这样一串:

S-100 Part 10a|1.1|INT.IHO.S-101.1.1.0|1.1.0|10100AA_00001.000|Updated for S-58 Edition 7.0.0 (Converted using GEOMOD Converter)|20171221|EN|…

逐段对上:编码依据 S-100 第 10a 部分(ISO 8211 封装的规范出处);产品标识 INT.IHO.S-101.1.1.0(国际化海图产品,目录版本 1.1.0);数据集版本 1.1.0;后面是文件名、更新说明(这个测试集是从 S-58 校验数据转的)、发布日期和语言。一个 130 字节的字段,把"这是谁、哪个版本、从哪来"交代得干干净净。

拆出来的三个结论

  1. 容器延续,语义重写:8211 的壳降低了迁移成本,但记录内部按 S-100 通用模型重新组织,解析完语义完全是新世界。
  2. 目录驱动是标配:代码序列 + 目录引用让"数据带着自己的字典走",这是 S-57 做不到的。
  3. 关系是数据:IACS/FACS/ARCS 这些记录提醒你,S-101 解析器的输出不该再是孤立的要素列表,而是一张图。

工具页上新了S-100 要素目录解析器,把内置的 S-101 FC 2.0.0 拆成可搜索的表——完整盘点是 190 个要素类型、5 个信息类型、236 个简单属性加 42 个复杂属性,还有 18 组要素级关联;和这篇正好互为表里。


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

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

← 返回目录

评论

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