电子海图文件的读取与显示程序开发

1电子海图的定义

电子海图是指描写海域地理信息和航海图的数字化产品,是数字海图的一种,通过将纸质海图信息经过数字化处理后,形成一个电子海图数据库。具有携带方便、容易保存的优点,其主要内容是以海域要素为主,详细的表示河道或者海底的地形,航道上的障碍物,灯塔导航标志等要素。电子海图一般是由国家官方权威海道测量机构提供,这些机构同时还负责电子海图的更新与修正,以保证电子海图的准确性及时性。

本文中所涉及到的电子海图是与AutoCAD格式相兼容的DXF文件,通过特定的程序,读写电子海图的DXF文件,通过将文件中的有用信息在PC系统的主界面中实时显示,同时与配合GPS系统配合使用,从而实时显示船体在运动过程中的实际位置,为船舶的航线航行提供准确的参考信息。

2DXF文件的结构

DXF是美国Autodesk公司制定并首先用于AutoCAD的图形交换的文件格式,它是一种基于矢量的ASCII格式,文件的扩展名为“.DXF”,用于外部程序和图形系统或不同的图形系统之间交换图形信息。由于它结构简单、可读性好,易于被其他程序处理,因此已是事实上的工业标准。DXF是一种开放的矢量数据格式,可以分为两类:ASCII格式和二进制格式;ASCII具有可读性好,但占有空间较大;二进制格式占有空间小、读取速度快。目前,绝大多数CAD系统都能读入或输出DXF文件

DXF文件虽然看上去结构复杂,但由于其数据具有严格的存储格式,各种实体都以编码标出,因此可以较容易的读懂它,而且还可以提取所需的所有信息。在用高级语言编写接口程序时,由于DXF文件有较严格的规定,所以必须清楚的了解DXF文件的结构。

一个完整的DXF文件主要由四个段和一个文件结尾组成。它们是:标题(HEADER)段、表(TABLES)段、块(BLOCKS)段、实体(ENTITIES)段、结尾(EOF)段。DXF文件的每一个段由若干个组构成,每个组占两行,第一行为组的代码,第二行为组值。组代码相当于数据类型的代码,它由CAD图形系统所规定,而组值为具体的数值,二者结合起来表示一个数据的含义和值。DXF文件各段主要内容如下:

(1)标题(HEADER)段该段记录了AutoCAD系统所有标题变量的当前值或当前状态。这些标题变量记录了AutoCAD系统当前工作环境。例如,AutoCAD的版本号、插入基点、栅格间距、式样、当前图层名、当前线型、当前额色等。

(2)类(CLASSES)段保存应用程序定义的类的信息。

(3)表(TABLES)段表段包含了四种表,每个表又包含了可变数目的表项。按照这些表在文件中出现的顺序是线型(LTYPE)表、图层(LAYER)表、字样(STYLE)表、视图(VIEW)表。这些表记录了当前图形编辑的支撑环境。

(4)块(BLOCKS)段块段记录了定义每一个块的块名、当前图层名、块的种类、块的插入基点及组成该块的所有成员。

(5)实体(ENTITIES)段该段定义了每个实体的种类,所有图层名、颜色、线型、厚度、实体描述字及有关的几何数据。

(6)对象(OBJECT)段记录了包含非传统的绘图对象的一些非实体的符号信息。

(7)文件结束(EOF)。DXF文件的结构相当复杂,完整读取DXF文件也是一项异常繁琐的工程.在实际应用中,为了提取图形的实体信息,可以省略DXF文件中的许多项,只要获取其中的层表,块段和实体段,就可以完成相应几何图形的描述.在层表中说明每一层的颜色,线型,在块段中说明块所在的层,属性及其在图形中的位置,在实体段中说明直线的起点,终点及圆的圆心,半径等几何信息和各实体所在的层.根据实体所在的层,在层表中搜索每一层的颜色,线型并将其添加到实体对象中.

3电子海图程序读写方法及流程

3.1读写程序开发方法

目前有两种可以实现DXF格式文件的读写。一种是使用OpenDWG函数库,OpenDWG函数库是一个能直接访问DXF文件的静态连接函数库,是由一些对DWG文件有研究的一些公司和个人组成的团体开发的,具有完善的读写DXF文件的接口函数。二是用户自主开发读写程序,这种方法是根据DXF文件基本结构并结合实际需要,舍去一些DXF文件中可对显示关系不大的信息,只显示跟电子海图文件相关联的部分。具有一定的灵活性。

两种方法相比第一种使用OpenDWG函数库缺点比较明显,此函数库不是免费使用的,功能相对固定,如要实现实时显示,方法复杂,而且成本很高。而第二种方法则具有相当的灵活性,而且成本较低。考虑到开发成本及应用的灵活性,本设计采用第二种方法开发DXF文件的读写程序。

电子海图读写模块在电子导航软件中是相对独立的模块,本文采用基于Windows程序设计的动态链接库开发此模块。这样在建立应用程序的可执行文件时,不必将库中的代码拷贝到可执行文件中,而是运行时动态加载动态链接库DLL(DynamicLinkLi-brary),装载的DLL被映射到进程地址空间中。使用动态链接库可以减少内存资源的浪费,同时可提高程序的可读性、维护性及保密性。

具体使用方法是在读写并显示海图时,在主程序中加载读写DXF文件动态链接库接口函数的入口地址,定义相关的调用动态链接库的C++类,通过对类的对象的函数调用,即可实现电子海图在主界面中的实时显示。

3.2DXF文件程序开发框图

根据DXF文件的格式,电子海图读写模块程序框图如图1所示,可以以此框图为基础完成DXF接口程序的开发。

4海图图元坐标的转换

电子海图的DXF文件是以大地坐标系下的海平面坐标为基准绘制的图形文件,但是在计算机屏幕上显示电子海图时,屏幕上显示使用的是显示器设备的坐标,因此为了能让设备屏幕上正常的显示电子海图信息,需要在编写电子海图显示程序时解决实现海平面基准的坐标系转换到设备使用的坐标系的问题,为了实现这个功能,需要在在程序中定义坐标转换的宏,实现逻辑坐标到设备坐标的转换。

通过程序的实际调试和运行证明,这种转换方法可以正确的实现海图的显示,并能实现电子海图与航道航线、DGPS定位坐标的正确匹配。

5结论

本文所介绍的航道电子海图文件程序开发方法采用库文件读取DXF海图文件的方法,实际操作时应用调用定义在类中的DXF文件读写函数的方法实现对电子海图的读写操作。同时通过宏定义的方式实现电子海图在屏幕显示时存在屏幕坐标与逻辑坐标转换问题,实际运行表明,本程序开发方法是实用可靠的。