S-57电子海图文件基础处理库的设计实现

1引言

电子海图显示与信息系统ECDIS(ElectronicChartDisplayandInformationSystem)是以数字形式储存的海图及其相关数据与多种传感设备、图形显示终端、计算机软硬件等高度融合的船舶航行多参数电子综合信息处理系统。随着信息化在航海领域的不断深入,ECDIS的普及是必然趋势,国际海事组织IMO已开始讨论ECDIS的强制安装。目前全球电子海图技术标准以国际海道测量组织IHO的系列标准为主。

IHOS-52“电子海图现实与信息系统内容与显示规范”[1]规定:ECDIS必须以电子航海图ENC(ElectronicNautical/NavigationalChart)为数据来源,ENC必须符合IHOS-57“数字海道测量数据传输标准”[2]。S-57实质为针对数据传递和交换的传输标准,由于效率原因它不能作为ECDIS的内部数据格式。S-52标准规定ECDIS必须设计高效的系统电子航海图SENC的用户格式,将S-57文件的海图数据和改正数据导入到SENC中。S-57数据集文件的读取、数据改正和物标信息解析处理是构建ECDIS的三个基础环节。

Figure1S-57Theoreticaldatamodeldiagram图1S-57理论数据模型示意图目前,成熟的S-57电子海图开发工具主要为商业软件,由于价格昂贵,应用范围较小。现有的通用GIS软件对S-57格式的支持都较有限。林志辉[3]用GIS开源库OGR实现S-57数据导入空间数据库,但OGR不支持S-57目录文件,它在S-57数据集的整体处理上功能有限。近年来国内一些高校的科研人员在各自的电子海图软件中实现了S-57文件处理模块[4~9],它们都能对S-57数据文件进行解包读取,但都没有同时支持数据改正和物标信息解析这两项功能。而且它们都是面向自定义的用户数据格式设计的,通用性上存在不足。我国电子海图研究开发需要功能丰富、通用性好的S-57海图文件处理软件。

本文在分析S-57标准的理论数据模型、数据结构和产品规范的基础上,设计实现了一套S-57海图文件基础处理库,具备对S-57数据集文件进行读取、数据改正和物标信息解析三项基础处理功能。该库用C++编写,与具体的用户数据结构和格式无关,以较通用的方式提供处理功能。该库可应用于S-57电子海图研究和相关软件开发。

2S-57标准分析

S-57即《IHO数字海道测量数据传输标准》,目前为2000年11月修订的第3.1版。该规范由三部分组成,下含两个附录:第一部分“引言”;第二部分“理论数据模型”;第三部分“数据结构”;附录A“IHO物标类目”;附录B“ENC产品规范”。

2.1理论数据模型

在S-57标准的“模型概述”部分中,真实世界的实体被定义为描述特征和空间特征的组合;物标被定义为一组可标识的信息,由特征物标和空间物标组合而成。特征物标含有描述信息但不带几何信息,空间物标必须有几何信息同时可能带描述信息。特征物标可以不参照空间物标而存在,前者由与一个或多个空间物标的关系定位。空间物标必须参照特征物标而存在。关系模型如图1所示。

“模型实现”定义了四类特征物标:元物标、制图物标、地理物标、集合物标;定义了三类空间物标:矢量型、光栅型和矩阵型。目前S-57标准实际只使用矢量型空间物标,其几何图元分为点、边和面三种。当前S-57产品规范强制使用“链-结点”拓扑等级,该等级下矢量由一组结点和边表示:点被编码成孤立结点或连结点;线被编码成一组边和连结点,边必须以连结点为起点和终点;面被编码成一组边的闭合环,其起点和终点为同一连结点。

2.2文件数据结构

S-57数据结构中最基本的单位是子字段,一个或多个子字段组成字段;一个或多个字段组成记录;一个或多个记录构成文件;一个交换集由一个或多个文件组成。记录分为五种:数据集描述记录、目次记录、特征记录、空间记录、数据字典记录。S-57数据结构实现上采用树形结构。不同记录和字段中的信息由专门的指针字段关联。RCNM和RICD子字段标识共同作为记录的标识。

S-57文件使用ISO/IEC8211作为物理封装标准,实现不依赖具体计算机系统的数据交换。ISO/IEC8211是一个以文件为基础的交换格式,其基本结构是逻辑记录。

2.3海图改正机制

S-57定义了电子航海图数据改正机制,规定了EN(基本电子航海图数据)和ER(电子航海图修正数据)两种应用简档。ER中改正记录采用了与原版海图数据一致的数据结构,并在特征记录和空间记录中加入了特殊的字段用于改正。改正操作通过将改正记录作用于目标记录而完成。S-57改正机制可改正已发行的数据,而不必重新发布整个数据集。

2.4产品规范

附录B“产品规范”的第二章规定ENC数据必须采用“链-结点”拓扑关系编码。第三章给出了ENC中允许的物标和属性。第四章对ENC进行了制图方面的限定,要求所有坐标数据不能使用浮点数而必须用乘数因子转换为整数。第五章规定了S-57交换集的内容和形式:一个ENC交换集必须由一个目录文件和至少一个数据集文件组成,目录文件记录了交换集中所有文件的路径;初始版数据文件扩展名为000,之后的改正文件扩展名依次为001至999,每一新版加1。第六章规定了交换集中数据集文件和目录文件的结构与内容。

3总体设计

电子海图数据从S-57文件导入到SENC需经过三个环节:文件读取、海图改正处理和物标解析,故本程序库分为文件读取、改正处理和物标信息解析三个模块。读取模块完整地保持文件的海图数据,基本保持数据的原始逻辑结构。改正模块在内存中对海图数据进行改正处理。物标信息解析模块可提取几何信息、属性/类目信息。各功能可按需选用,不面向具体的用户格式数据结构。设计上采用面向对象方法,开发语言为C++,广泛应用STL技术。读取模块可独立工作,改正模块与解析模块互不依赖。本库的UML类图如图3所示。

4各模块的设计与实现

4.1文件读取模块

ISO8211Lib是一款用C++编写的用于ISO/IEC8211格式文件解包的开源库。本文使用ISO8211Lib,将其装到ReadSubField类作为函数对象,用于S-57文件解包。

为产品规范的应用简档所规定的各种结构设计对应的数据结构,各字段设计为结构体;各记录设计为类,FeatureBaseCell类与FeatureRecUp-dateCell类分别对应EN和ER的特征记录,Vec-torBaseCell类与VectorUpdateCell类分别对应EN和ER的空间记录;ChartBaseCell类、Char-tUpdateCell类和Catalogue类分别对应基础数据文件、改正数据文件和目录文件。记录类用STL容器和智能指针类模板auto_ptr存放各字段对应的结构体,文件类用STL容器存放规定的记录类,它们基本保持所对应的文件结构的原始逻辑关系。

各字段结构体中,整数型子字段用int型存储,字符型子字段用STL的string类型存储,外部指针子字段用unsignedchar数组存储。指针字段VRPT、FSPT、FFPT的结构体增设额外的成员变量以存储解码后的指针信息。VRPT字段对应的结构体的定义代码如下所示,其指针原始数据存于name数组,解码后的指针信息存于额外成员name_rcnm和name_rcid:

ChartBaseCell类、ChartUpdateCell类和Cat-alogue类提供公有方法Load用于文件读取,该方法的参数接受文件路径,将文件各记录、各字段的数据读入对应的类和结构体。Catalogue类从目录文件读取所有基础数据文件和改正文件的路径。本库实现FullPathDecomposor类提供路径和文件名处理功能,供Catalogue类使用。Catalogue类提供公共方法进行S-57标准要求的CRC(CyclicRedundancyCheck)文件校验。ChartBaseCell用三个map容器分别存储孤立结点空间记录、连结点空间记录、边空间记录,map的key为空间记录的RCID值。基础数据文件读取流程图如图4所示

4.2改正模块

改正UpdateProcessor类实现处理功能,它减小了ChartBaseCell类和ChartUpdateCell类的耦合。UpdateProcessor类提供公共方法Update执行改正处理,原型如下:

intUpdate(ChartBaseCell&chart,constCh-artUpdateCell&chart_updt);

Update方法将参数2中的改正数据应用于参数1

进行更新处理,改正完成后的海图数据仍保存于参数1。改正记录也分为特征记录和空间记录两种,它们的改正操作分为插入、删除、修改三类,记录的标识字段的RUIN子字段指示要进行何种操作。目标记录由改正记录的标识字段的子字段RCNM和RCID标识。记录的插入和删除操作皆以记录为整体进行,而记录修改则包括记录内字段的插入、删除和修改三种操作。字段修改的实现方式又分为两类,第一类以字段属性是否在目标记录中出现过指示操作,第二类以专门的控制字段指示操作。FeatureBaseCell类与VectorBaseCell类实现了三种字段修改操作的接口函数,ChartBaseCell类实现了记录改正操作的接口函数。UpdateProcessor的Update方法验证两参数的升级信息匹配正确后,调用前述接口进行改正处理。改正处理流程图如图5所示。

4.3物标信息解析模块

本库物标信息解析模块分为几何信息解析和属性/类目信息解析两个子模块,前者实现为GeomProcessor类,后者实现为AttrObjClassInfo-Processor类,两者互不依赖。

4.3.1物标几何信息解析

物标的几何信息解析,即获取物标的几何图元类型(点、线、面)和完整的几何坐标。物标的点、线、面图元都以点为基础。点分为二维点和三维点(后者只用于水深数据,第三维表示深度),前两维表示经纬度坐标。S-57文件中坐标数据皆为整型,SG2D和SG3D字段对应的结构体用于保存点坐标的数据结构;GeomProcessor类将解析得到的物标的整型坐标数据用乘数因子转换为浮点型,为此设计结构体PintFloat2D_t和PintFloat3D_t用于保存浮点型坐标值。

SG2D字段的结构:

物标的几何图元类型由特征记录FRID字段的PRIM子字段获得。坐标从特征记录的FSPT(特征记录到空间记录指针)字段指向的各个空间记录的坐标字段中提取。流程如下:

(1)点物标的坐标解析。从相应空间记录的SG2D、SG3D字段获取坐标数据;用STL的vector容器存储。

(2)线物标的坐标解析。按空间物标VRPT字段的ORNT子字段指示的方向,先获取起始连结点坐标,再获取边的各孤立点坐标,最后获取终止连结点坐标;用两层嵌套的vector容器存储,每个内层vector容器存储一条边。(3)面物标的坐标解析。先将构成面的各边解析出来;遍历这些边并判断是否构成闭环,若是,则获得面的一个封闭轮廓;用两层嵌套的vector容器存储,每个内层vector容器存储一个封闭轮廓。

GeomProcessor类提供公有方法GenObjGeo-mInt,对ChartBaseCell对象的所有物标进行几何解析,结果存储于STL的map容器中,map的key为特征物标的RCID值,物标的特征信息与几何信息通过map容器的key-value映射关系实现关联。GeomProcessor类亦提供数个接口用于处理单个物标。

4.3.2物标属性/类目信息解析

物标属性信息解析,即根据物标属性字段的值获得S-57规定的对应属性的信息,包括属性名称、缩略词等。物标类目信息解析,即根据文件物标特征记录FRID字段的OBJL子字段标记的S-57物标代码获得物标类目的信息,包括物标类名称、缩略词、相关属性等。

本库定义了两个多维char*型常量数组s57attributes[]和s57Classes[],以字符串分别存储S-57标准规定的物标属性和物标类目两个参考表的主要信息。AttrObjClassInfoProcessor类以这两个数组为基础,提供数种方法用于获取物标属性/类目信息,以STL的string类返回。

5功能演示与应用

采用本库在WindowsXP下编写了一个功能演示程序,其对S-57海图文件进行处理并在命令行界面以文本形式输出信息。图6为演示程序的部分输出结果,所读取的基础数据文件为US4NY24M.000(大小615KB),读取的改正文件为US4NY24M.001(大小26.6KB)和US4NY24M.002(大小2KB),读取后进行了数据改正和物标信息解析处理。

图6a显示了一个类目名为“Compilationscaleofdata”的物标,其第一个ATTF字段的属性名为“Compilationscale”(倒数第二行);图6b第二行显示物标几何类型为“面”,后续显示各点未用乘数因子转换的经纬度原始值。

目前该库在我们的项目《基于LINUX/GTK的嵌入式ECDIS软件》中,应用于S-57数据集文件读取及用户格式数据库导入底层模块的开发。

6结束语

本文实现的程序库具备S-57电子海图数据集文件读取、改正处理和物标信息解析功能。文件读取模块能够读取S-57数据集目录文件、基础数据文件和改正文件,保证数据完整性,较好地保持了数据的原始逻辑结构。改正模块对读取到内存的海图数据进行改正处理。物标信息解析模块可获取物标的几何信息和属性/类目信息。各功能模块之间独立性较好,与具体的用户格式数据结构无关,具备一定的通用性。在当前S-57海图文件处理软件数量和功能都不丰富的情况下,本库对电子海图研究和软件开发具有一定实际意义。