在mini6410嵌入式linux上使用QT4和mitab显示mapinfo或mif格式电子地图

来源:互联网 发布:研发费用软件外包 编辑:程序博客网 时间:2024/05/15 15:06

 

Mapinfo是目前较为常用的一种电子地图。市面上的各种电子地图基本都是这种格式,或是由这种格式演变来的。这种格式的电子地图,在网上较容易下载或购买到。这篇文章描述了如何在嵌入式linux上显示mapinfo地图。

 

先介绍一下mapinfo地图的大致构成。这种地图是由一个个的地图要素构成的。Mapinfo把这些要素共分成九类:点(point)、直线(line)、折线(polyline)、区域(region)、圆弧(arc)、文本(text)、矩形(rectangle)、圆角矩形(rounded rectangle)、椭圆(ellipse)。每个要素由多个属性构成,如名称,是否显示,更新时间,点,对应点的经纬度等属性,每种要素的属性类型和个数是不相同的。但要素的名字和经纬度数据则是必须的。Mapinfo把地图分为多层,每一层都有上述要素的一种或多种构成。Mapinfo实际上是用一个dbase兼容的数据库来维护这些数据的。通常,每层地图用数据库的一个表(table)来表示,每个表的字段来表示地图要素的一些属性,如名称,是否显示,更新时间等。而每个要素就是表中的一个记录。这里要注意,数据库中存贮的仅是这些维护信息。每个地图要素的真正信息(点,对应的点的经纬度等)是存在与数据库文件同名,但不同扩展名的那些文件中,因此,mapinfo格式的地图是由四个文件构成的,如map.TAB,map.ID,map.MAP,map.DAT四个文件共同构成一个地图。再请注意,这四个文件仅构成了地图的一层,一个完整的地图是多层的,因此要由多个这样的文件组构成。

 

了解了mapinfo地图的构成,那么要想在嵌入式linux上显示此种格式的地图,基本思路自然就是将电子地图的要素一一显示出来。要显示,就要用到图形GUI,这里,选用QT4,这个跨平台的GUI图形库。QT4中,有现成的类可以显示点,线,多边形,椭圆,矩形,文本,显然,mapinfo的地图要素是可以用上述的类来绘出的。每个地图要素要绘在哪里,则由要素中的经纬度来决定。当然,这个经纬度要转换成QT4绘图坐标才行。

 

接下来,就是读取mapinfo地图要素的问题了。这个国外有个开源的项目叫mitab,它是一个动态连接库,程序可以调用库来实现文件的读写,目前最新版为1.7.0。它可以把mapinfo格式的文件中的地图要素信息全部读出,它的网址是http://mitab.maptools.org/,大家可以到这里下载源码。

 

QT4中绘图有多种类都可以,考虑到电子地图绘制所要求的高效和可放大缩小,这里使用QGraphicsView类来实现地图的绘制。Mitab本身是C++编写的,它的功能很强大,不仅可以读取,也可写入即实现地图的编辑,但C++的接口函数没有说明,也缺少使用实例。同时,为了方便调用,此项目还提供了一个简便的C语言的函数接口(这个接口,主要用于读取信息),并提供了详细说明和示例。这里,选用C接口来调用mtiab的库函数。Mitab最初是为了能读取mif格式的地图文件来设计的,mif格式也是mapinfo支持的一种格式,mapinfo软件提供了把mapinfo的地图文件转换为mif地图文件的功能,mif地图文件由mifmid两个文件构成。现在mitab已能直接读取mapinfo格式的地图,但显然,用它来读取mif文件将更为高效。Mitab也提供了将mapinfo转换为mif格式的功能。

 

程序的具体编写就不多说了。这里,我把我写的一个QT4+mitab的读取并显示mif地图文件的程序源码发布出来,以求抛砖引玉。

 

下载链接如下:

 

http://cid-6b7a311158eebf59.office.live.com/self.aspx/%e5%8e%9f%e5%88%9b%e5%85%b1%e4%ba%ab%e8%bd%af%e4%bb%b6/qt4^_mitab^_mif.rar

 

目前,此程序还比较简单,仅固定显示南京市地图(源码包内附了2003版的mif格式南京地图),并且,有些地图显示的相关细节还未完成。

 

这个程序是在mini6410的开发板的嵌入式linux上做出来的,而实际上,因为QT4的跨平台特性,它也可以在X11版的linuxwindows上运行。

附上windowsXP下的截图

X11 linux下的截图

原创粉丝点击