综合船桥系统(IBS)将船舶上的各种导航设备有机地结合起来,为驾驶人员提供了高精度的导航信息,并在此基础上实现了船舶航行管理、航行计划、船舶自动识别、自动监测和报警等功能,提高了航行的安全性、经济性。电子海图显示与信息系统(ECDIS)是综合船桥系统不可或缺的一个重要组成部分,然而传统的电子海图数据是以文件形式存储的,不便于查询。地理信息系统(GIS)是对与地理空间相关的数据进行有效管理和综合分析的计算机系统,是当前正蓬勃发展的技术。目前已经出现了许多优秀的GIS系统,其中不乏免费的开源项目,PostGIS空间数据库就是其中之一。将电子海图数据库系统构建于GIS数据库系统之上,实现ECDIS与GIS技术的集成,可以充分发挥GIS强大的空间数据处理能力和空间分析功能,提高ECDIS的数据处理与分析能力,促进航海信息化和海上交通安全管理。ECDIS与GIS集成的技术核心是数据的集成。本文讨论S—57和PostGIS的数据模型,分析S—57海图文件格式,并在此基础上提出基于PostGIS的电子海图数据库建设方案。
1S—57与PostGIS的数据模型
1.1S—57的理论数据模型
S—57标准将真实世界的实体抽象为“特征物标”(FeatureObject)和“空间物标”(SpatialObject)的联合。特征物标描述了实体的种类、性质、特征等属性信息,而空间物标则描述了实体的空间位置特性。S—57的理论数据模型如图1所示。
特征物标只具有描述性信息但不含任何空间几何信息,特征物标由它与一个或多个空间物标的关系定位,可以不参照任何空间物标而独立存在。IHO(国际海道测量组织)共制定了181种特征物标,分为元物标(META)、制图物标(CARTO)、地理物标(GEO)和集合物标(COLLECTION)4类,共181种。空间物标目前只有向量类型(VECTOR),向量类型又分为节点(NODE)、边(EDGE)和面(FACE)3种。节点具体又分为孤立节点(ISOLATEDNODE)和关联节点(CONNECTEDNODE)。
1.2PostGIS的空间数据模型
PostGIS是对象关系型数据库系统PostgreSQL的一个空间数据库扩展,遵循OpenGIS的规范。图2是OpenGIS的简单要素数据模型的关系图。比较图1和图2可以发现,OpenGIS的数据类型比S—57的空间物标类型要丰富得多,完全可以表示S—57的空间物标。
2S—57到PostGIS的转换
数据库的设计其实就是建立S—57到PostGIS数据库的转换关系,转换的思路是为IHO定义的每一种特征物标建立一个表,每一个特征物标以一条记录存储,特征的不同属性对应到表的不同字段。并把与其相关联的空间物标转换成一个geometry类型的字段,以方便空间查询。水深数据比较特殊,单独讨论。
2.1空间物标的转换
S—57标准里空间物标不能脱离特征物标独立存在,必须被某个特征物标引用。为了方便根据空间信息对物标进行查询,本方案将空间物标看成对应特征物标的一个属性,在特征物标表对应一个字段,并且将字段统一命名为wkbgeometry,类型是geometry。S—57的空间物标可以分成节点、边和面三种,分别用Point,Linestring和Polygon来实现。
2.2特征物标的转换
以下结合S57特征纪录的结构对数据库表进行讨论,特征物标记路的结构如表1所示:
(1)0001域是固有的域,不包含任何有用信息,所以忽略此域;
(2)FRID由RCNM、RCID、PRIM、GRUP、OBJL、RVER、RUIN七个子域组成;其中RCNM始终是“FE”,表示此纪录为特征纪录,无需在数据库里保存此子域内容,忽略此子域;RCID为纪录的编号,是单个数据文件范围内特征物标纪录的唯一标识,保留此子域作为一个字段;PRIM表示特征纪录所对应空间物标的几何图元类型,保留此子域作为一个字段;GRUP为分组编号,只有固定的7种物标取值为1,其余均为2(详见文献[5]),因而没有必要保存此子域内容,忽略此子域;OBJL为物标的代码,IHO为每种特征物标定义了一个代码,因为本方案为每一种特征物标建立一张表,所以不需要保存此子域内容,忽略此子域;RVER表示纪录的版本号,用于版本控制,保留此子域;RUIN是纪录更新指令,用于记录集更新,无需保存此子域内容,忽略此子域;
(3)FOID由AGEN、FIND、FIDS三个子域组成;其中AGEN表示发行机构,与FIND、FIDS组合在一起构成LNAM,用于唯一标识一个特征物标;由于实际中通常只应用LNAM,因此只保留LNAM作为一个字段;
(4)ATTF由重复的ATTL(属性代码)和ATVL(属性值)子域构成,具体数目与具体的特征物标有关;保留所有的子域,每个子域作为一个字段,字段名取为相应的属性名称的缩写;
(5)NATF和ATTF类似,保留所有子域,每个子域作为一个字段,字段名取为相应的属性名称的缩写;
(6)FFPC用于记录集更新,内容无需在数据库里存放,忽略此域;
(7)FFPT由可重复的LNAM、RIND和COMT子域组成;用于表示与其他特征物标之间的关系;保留着此3个子域,作为3个字段;
(8)FSPC用于记录集更新,内容无需在数据库里存放,忽略此域;
(9)FSPT是特征物标到相应的空间物标的指针,因为我们将空间数据保存成表的一列,所以不需要保存这个域的内容,忽略此域;根据以上讨论,我们可以确定数据表里的各个字段,每张特征物标表里保存wkbgeometry、RCID、PRIM、RVER、LNAM、FFPTREFS、FFPTRIND、FFPTCOMT等8个子段以及相应的属性字段;以特征物标灯标lights为例,它有它有如下34个属性:
A类属性:CATLIT; COLOUR; DATEND; DATSTA; EXCLIT; HEIGHT; LITCHR; LITVIS; MARSYS; MLTYLT; NOBJNM; OBJNAM; ORIENT; PEREND; PERSTA; SECTR1; SECTR2; SIGGRP; SIGPER; SIGSEQ; STATUS; VERACC; VALNMR; VERDAT;
B类属性: INFORM; NINFOM; NTXTDS; SCAMAX; SCAMIN; TXTDSC;
C类属性: RECDAT; RECIND; SORDAT; SORIND;
这样就确定了lights表里的所有字段,8个通用字段加上34个属性字段总共42个字段。其他特征物标表可以用相同的方法确定所有的字段。
2.3水深数据的处理
在S—57里面,多个水深点数据以一个soundg特征记录来保存。如果以一条记录来保存多个水深点数据的话,会造成查询的不方便。为此将S—57格式文件里的水深数据以多个纪录来存储,每个纪录只保存一个水深点的数据,把水深点位置保存在wkbgeometry字段中,把水深单独出来保存在depth字段中。所以soundg特征物标表除了以上讨论的字段外,还要添加一个depth字段。
3辅助表和索引
3.1辅助表
虽然通过建立上述的特征物标表可以保留S—57海图文件的有用信息,但是在使用LNAM定位特征物标时很不方便。所以建立一张包含LNAM、TBNM、FLNM和OBJL字段的辅助表以方便查询。TBNM表示特征物标所在表的表名,FLNM表示特征物标记录所在S—57文件的文件名,LNAM和OBJL的意义同上。
3.2索引
为了加快查询的速度,需要在各个表上建立索引。为此,在wkbgeometry字段上建立gist空间索引[6],以加快空间查询速度。在LNAM字段上建立索引,以加快查询速度。对水深数据,除了在wkbgeometry建立索引之外,还需要在depth字段建立btree索引,以加快对水深的查询速度。辅助表除了LNAM字段外还应在FLNM字段建立索引,原因是防止数据重复导入的机制需要利用该字段进行查询(见4.4)。
4数据的导入
4.1参考坐标系和水深单位的约定
在数据库中存储海图数据,不可避免的要关心参考坐标系和单位的问题。S—57规定ENC必须采用WGS84参考坐标系并以米作为水深和高程的单位,所以这里也以WGS84作为参考坐标系,即规定所有特征物标表的wkbgeometry字段的空间数据的SRID为4326。并且以米作为水深和高程的单位。
4.2读取S—57格式文件
OGR是一个被广泛使用的GIS开源库,支持包括S—57在内多种矢量图形格式。借助于OGR库,可以省去编写S—57格式文件解析程序的麻烦。在处理水深数据时,它可以自动实现水深数据的分割。相关资料可以参考文献[7]。
4.3添加记录
从S—57文件读取数据之后,利用简单的SQL语句即可将数据添加到已建好的表中。以灯标lights为例,假设某个灯标位于东经110度,北纬39度,该特征纪录的RCID为100,则使用语句“insertintolights(wkbgeometry,RCID)values(`SRID=4326;POINT(11039)',100)”即可将纪录添加进lights表(实际上lights表有42个字段,这里为求简洁省略掉其他字段)。导入数据的时候应该同时在辅助表添加相应的记录。
4.4防止重复导入数据
为了防止重复导入数据造成数据冗余,在数据导入之前应当先判断数据集是否曾经导入过;这一点可以通过事先查询辅助表的FLNM字段来实现。 参考文章:电子海图、AIS、雷达