基于 MapX 的电子海图显示系统开发

随着航海技术的发展,电子海图正逐渐取代传统的纸质海图,得到愈加广泛的应用。IHOS57是国际海道测量组织颁布的数字化海道测量数据传输标准,已在世界范围内得到广泛认可和应用。为加快我国对S-57国际标准电子海图的应用和普及,开发符合S-57标准的电子海图显示系统是当务之急。

ENC中海图信息的描述采用S-57中给出的物标分类编码系统,数据文件逻辑格式采用S-57格式,物理存储和传输格式采用ISO/IEC8211。而S-57格式涉及到比较复杂的数据模型和结构,因此,对其进行解析并建立海图数据库,完整地导入海图数据,是电子海图显示的重要步骤[。

不同于以往海图显示中建立单一数据库的方法,本设计中利用了Delphi强大的数据库功能。首先对ISO/IEC8211进行解封装并建立Access数据库和空间信息文件,以提高查询和显示速度;然后逐条访问数据库中的记录,利用集成的MapX控件逐层绘制电子海图,完成显示,并实现了放大、缩小、漫游等基本功能。

1ISO/IEC8211解封装和数据库的建立

1.1S-57标准的数据结构

对海图文件进行解封装,首先必须了解其封装结构。S-57电子海图使用ISO/IEC8211作为其数据封装标准。ISO/IEC8211文件的基本成分是逻辑记录(LR),ISO/IEC8211文件的第一个逻辑记录叫做“数据描述记录”(DDR),它包含该文件中实际数据的描述和逻辑结构。ISO/IEC8211文件中的其他部分则称为“数据记录(DR)”,其中包含了所有交换文件中的实际数据。

每一个逻辑记录(包含DDR和DR)有3个基本元素:头标区、目次区和字段区。头标区包括读取记录分解到每个实体的所需参数,而对于DDR来说还包括了用于整个文件的一些描述参数;目次区包含了确定每一个字段在字段区的标识和定位参数。目次区由重复的目次项目组成,包括字段标记、字段长度、字段位置等;字段区是要解析的逻辑记录的主体。

1.2ISO/IEC8211解封装

本设计中利用Delphi编程,对ISO/IEC8211进行解封装。解读时必须按照前序遍历的顺序,从DDR中得到能解开DR数据所需的描述信息,DR的字段区包含需转换的具体数据。其中,固定位长的子字段按规范指定的格式以字节单位读取,变长字段在数据结构中由无范围限定的格式指示符规定。

矢量电子海图中图元分为3种基本类型:点、线和面。常见的点状物标有标志地物、居民地;线状物有河流、街道、行政界限、等高物等;面状物有植被、街区、行政区域等。点状物用(X,Y)一对坐标来表示;线状物用(X1,Y1)、…、(Xn,Yn)一系列坐标表示;而面状物则用(X1,Y1)、(X2,Y2)、…、(Xn,Yn)、…,等一系列坐标表示。因此,解读后的文件分为属性数据和空间信息数据两部分。Access数据库文件见图1。


其中包含文件头信息、点状要素、线划、拓扑区、水深5个数据表,分别存储文件头、点状物标、线状物标、面状物标和水深属性信息,以及点和水深数据的空间坐标信息,而线和面的空间坐标信息则包含在另外一个后缀名为.xy的二进制文件[2]中,例如CN440401长江口及附近.xy,其数据结构为struct(latasdouble,logasdouble,penasint)。lat为纬度信息;log为经度信息;pen为抬笔信息,如果该点为起点,则pen定义为1,否则为0,这样定义是为方便绘图时使用。这样,面向数据传输和数据交换的原电子海图数据就被转换成了能够有效支持电子海图显示、存储和操纵的数据。

2电子海图的绘制、显示与操作

2.1MapX

MapX是一个基于ActiveX(OCX)技术的可编程控件。它使用与MapInfoProfessional一致的地图数据格式,并实现了大多数MapInfoProfessional的功能。在VB,Delphi,PowerBuilder,VC等可视化开发环境中,只需在设计阶段将MapX控件放入窗体中,并对其进行编程,设置属性或调用方法或相应事件,即可实现数据可视化,专题分析,地理查询,地理编码等丰富的地图信息系统功能。MapX定义了一个类体系,以有效地组织地图图形元素、图层、属性数据等对象。

2.2电子海图的绘制

根据S-52等相关标准建立查找表(描述电子海图中图元样式的文件,例如描述海岸线的线型、线宽、线色等)。并通过访问数据库记录,调用空间信息文件与查找表,利用MapX控件的CreateLayer、CreateRegion、EraseFeature、CreateLine、CreateSymbol、AddFeature等方法来逐层绘制电子海图,以完成电子海图的显示。

2.3区域图元的绘制绘制

区域图元,需要利用MapX的FeatureFactory.CreateRegion方法,对复杂的区域图元(区域轮廓非一笔所能画成的)还需要用到FeatureFactory.EraseFeature方法。区域图元的绘制思想是先绘制最大的区域,然后再在此基础上逐个擦除其所包含的各个小的区域。例如:Object.CreateRegion([Points],[Style])//绘制最大的区域

其中,Object为FeatureFactory对象;Points为表示用于定义区域或Rectangle对象的经纬度点的集合;Style为定义图元外观的对象(例如:区域边框的线型,线宽、线的颜色、区域的填充颜色及填充样式等)。此方法返回独立的Feature对象。这个独立的Feature对象就是所要绘制的简单区域图元。

Object.EraseFeature(SourceFeature,EraserFeature)//擦除各个小的区域

其中,Object为FeatureFactory对象;SourceFeature为一个Feature对象,表示需要擦除的源图元;同样,EraserFeature也为一个Feature对象,其表示要从SourceFeature中擦除的那部分小的区域。此方法通过从一图元“消除”另一个图元面积,返回独立的Feature对象,这个独立的Feature对象就是要绘制的复杂区域图元。

2.4线图元的绘制

可以利用MapX的FeatureFactory.CreateLine方法来绘制线图元。例如:

Object.CreateLine([Points],[Style])//绘制线图元

其中:Object为FeatureFactory对象;Points集合,为用于定义线的经纬度点的集合;Style为用于定义图元的外观(包括线型、线宽、线的颜色等)。对于特殊的线型,本文通过利用MapInfoLineStyleEditor2.0来编辑MapX.pen文件,实现起来比较简单,这里不再赘述。

2.5点图元的绘制

电子海图中点图元(例如:灯标、沉船、障碍物等)的样式非常复杂,如何绘制这些复杂的点图元是必须解决的难题,在开发过程中发现利用TrueType制作符号库可以非常有效地解决这一问题。TrueType是由Apple公司最早为解决图形系统下字体显示问题而提出的新技术,是一种矢量化符号的描述。字体文件是整个电子海图符号库的载体,为避免单个文件过于庞大,影响系统执行速度,在制作字体时需要将符号分类存储[3]。基于TrueType的文本只支持单色输出,为了显示一个有多种颜色的复杂符号,例如:一个灯标,则至少要用到黑色和另外一种颜色(红色、绿色、黄色等),那么就需要把黑色部分和另外一种颜色的部分分别制作成两个独立的符号,并且这两个符号要中心对准。在绘图的时候,需要分别绘制这两个独立的符号以构成完整的灯标符号。为了不影响绘图速度,需要把构成一个完整符号的所有独立符号置于同一个字体文件中。而许多复杂的符号又具有相同的部分,因此把这些相同部分提取出来,可以大大减少制作的工作量。在使用字体编辑工具(例如FontCreator5.0)来制作符号时还需要考虑符号的相对大小及每个符号相对于中心的偏移量等。将字体文件(*.ttf)安装后,MapX就可以通过调用字体文件,结合查找表,并利用FeatureFactory.CreateSymbol方法来绘制各种各样的点图元。

2.6数据绑定

如果仅仅用上面的方法,最后得到的将是一些不包含任何属性信息的海图,这不是用户所期望的。这就需要利用MapX的Datasets.Add方法(数据绑定方法)来使海图中的每个图元与数据库中的一条记录相对应,以便用户查询图元的相关属性信息。

2.7电子海图的海量存储、无缝拼接与多比例尺显示

在利用MapX进行海图显示时,为了能够正确显示各幅海图间的上下叠加关系,需要事先将所有需要显示的海图的所有图层加入到一个Geoset数据集中(*.gst文件)。由于海图数据量很大,一次载入过多图层不仅使载入速度变慢,而且会造成电子海图对用户操作的响应变得迟缓,从而大大限制了其灵活性。MapX是按地图分层的方式进行空间数据的组织,因此,可根据当前的船位,通过程序搜索所有海图的覆盖范围来判断是否加载或卸载某幅海图,利用Layers.Add/Layers.Remove方法可逐层加载或卸载海图图层,并设置图层的最大最小显示尺度,以达到减少数据量的目的,同时还能实现多幅海图的无缝拼接与多比例尺显示。当然,在加载图层的过程中,需要根据比例尺来调整正在加载的图层与已加载图层的上下叠加关系。

2.8电子海图的操作

通过设置MapX的CurrentTool属性可轻松实现电子海图的放大、缩小、漫游等功能。例如:Map1.CurrentTool:=miZoomIn;//放大海图。

在没有可被直接调用的工具时,可以使用CreateCustomTool方法来创建自定义工具,并在ToolUsed等事件中编写对应工具的功能代码,然后通过设置CurrentTool属性来调用该工具[4]。

3结果及分析

图2所示的是利用本方案开发的电子海图显示软件界面。基于全国海区电子海图,显示了长江口及附近的电子海图。在该界面中,用户不仅可以自由地对海图进行放大、缩小、漫游等操作,而且也可根据实际需要,实现航线设定、偏航报警、轨迹回放等功能。


利用该方案开发的电子海图显示系统已被成功应用于某船舶监测系统中,具有良好的显示效果,达到了用户对系统性能指标的要求。

4结束语

为加快电子海图在我国的应用与普及,本文提出了一种电子海图的显示方案。在Delphi平台上嵌入MapX控件,开发出了具有较高显示速度和较好显示效果的电子海图显示系统。并可在此基础上实现后续开发,叠加AIS信息、雷达信息和实现导航功能等。