基于Mitab库的嵌入式linux平台GIS地图导航设计与实现
发布日期:2011-05-17
0引言
地理信息系统(geographic information system,GIS)是借助
计算机软硬件设备,以处理地理相关数据的收集、存储、管理、
查询、分析和辅助决策的信息系统。嵌入式系统是以应用为
中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用
系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算
机系统。嵌入式地理信息系统是GIS与嵌入式设备集成的产
物,是当前GIS研究领域的一个重要趋势
[1-2]
。但传统的地理
信息系统大部分都安装在PC机上,且通常采用MapInfo作为
理信息数据分析和处理的平台
[3]
,不具备移动性和便携性。随
着地理信息系统与嵌入式技术的飞速发展,把GIS移植到嵌
入式系统中,将图形管理和数据管理有机地结合起来,提供空
间数据和属性数据,实现便携移动式嵌入式GIS集成平台已
成为可能。
与传统GIS技术相比,嵌入式GIS具有跨平台、易集成等
特点,但受自身条件限制,其数据存储和处理能力有限。导航
电子地图是嵌入式GIS的应用核心,如车载导航、个人导航和
PDA等应用都需要电子地图的支持,但MapInfo原始数据不
能在嵌入式GIS平台上直接应用,需要输出为包含地理目标
空间属性信息的MIF(MapInfointerchangeformat)格式文件。因
此针对嵌入式GIS系统特点,利用开源的MITAB库对MIF文
件进行读写转换和适当裁减,选择合适的数据结构来组织矢
量地图数据,实现了以嵌入式Linux为操作系统的GIS电子地
图导航系统。
1 Mitab库介绍
Mitab库是一个开放源码的C++库,提供了丰富的接口函
数和C++类,支持MIF文件读写、空间对象几何图形和属性数
据读取、设置投影方式等,使用抽象数据模型来解析它所支持
的空间对象的数据结构
[4]
。Mitab的基本结构是由Mitab
Package、CPL library和OGR library共3个部分组成。其中,
Mitab Package是操作MapInfo文件的主要接口,CPL Library和
OGR Library是Mitab的两个支持库,CPL(common portability li-
brary)是一个可移植的公用库,封装了通用的地理数据结构和
对不同平台的库操作;OGR(OpenGIS simple features reference
是用来封装简单地理特征(如点、线、面等)数据结构和操作的
C++库。
2系统体系结构
系统体系结构如图1所示。系统由用户应用程序、GIS电
子地图数据源、MiniGUI图形支持系统和嵌入式Linux操作系
统4部分组成。系统利用MapInfo的中间转换格式MIF/MID
数据文件作为地图数据,通过Mitab库读取矢量地图,并进行
坐标、投影等相关转换处理,采用MiniGUI编程将地图绘制到
显示设备中,起到可视化定位导航的目的。
操作系统内核负责处理器管理、存储器管理和进程调度
等,其系统调用为应用层提供硬件接口和开发API函数。本
系统选择嵌入式Linux操作系统,它遵循GPL条款发布,成本
低,内核稳定而精悍,运行所需资源少,方便裁剪定制,支持广
泛的硬件平台。
电子地图数据源采用MapInfo地图的MIF格式,利用基
于C++的开放源码Mitab库提供的核心函数对MIF/MID文件
字段内容进行读写操作。
MiniGUI实现图形用户界面设计
[5]
,遵循GPL条款发布,
是基于线程的轻型、高性能、高可靠性、可配置的图形界面系
统,界面控制和应用逻辑中的数据传递在不同线程之间通过
消息来完成。
用户应用程序负责具体的业务逻辑,实现系统地图显示、
漫游、缩放和定位导航等功能,并提供良好的人机交互界面。
3地图数据组织
MapInfo是面向应用的桌面地图信息系统,数据组织方式
灵活,查询、统计、分析及制图功能强大,是目前使用最为广泛
的地图格式,主要采用TAB格式和MIF格式两种格式存贮。
MapInfo公司没有公布以矢量形式存储的TAB文件格式,但提
供了与外界交换数据的MIF文件格式
[6]
。
3.1 MIF格式
本系统选择完全开放的MIF格式作为地图数据源,矢量
地图数据是由MIF文件和MID文件共同组成。其中,MIF数
据文件主要保存空间数据的几何图形信息;MID数据文件则
按记录顺序保存了每个空间对象的所有属性信息。
MIF数据文件由文件头区域和数据段组成,有关如何创
建MapInfo表的信息保存在文件头中,图形对象定义保存在数
据段中,数据段包含MapInfo定义的点、线、区域、圆弧、文本
和椭圆等实体对象,可以有任意多个图形初值,每个初值代表
一个图形对象。如:区域对象通常是包括一个或几个多边形,
这由跟在Region后的numPolygons参数来指定多边形个数,每
个多边形再通过numPts参数来表明该多边形中的节点数,然
后跟着每个节点的(x,y)坐标对,并且通过可选项Pen和Brush
子句分别指定画线笔的宽度、模式、颜色和填充时采用的模
式、前景色及背景色,用可选项Center子句说明几何对象中心
位置坐标。
MID数据文件为对应实体的属性。MIF和MID文件中的
条目相互匹配,MIF文件中的第一个对象与MID文件中的第
一行关联,MIF文件中的第二个对象与MID文件中的第二行
关联,依此类推。如果MID文件中特定的一行没有对应的图
形对象,那么必须在MIF文件中的相应位置上写一个“空白”
对象(NONE)以保留该位置。
3.2地图对象结构模型
地图由各图层(对应MIF文件和MID文件)构成,图层管
理各种类型图形对象,包含对象的几何图形数据和属性信息,
并提供绘制、数据转换、几何操作相关等方法。几何图形数据
可用于对象的绘制和几何操作,属性数据则用于对象的标注
和查找。本系统电子地图源的图形对象主要由点(TABFC-
Point)、线(TABFCPolyline)和区域(TABFCRegion)3类组成。
TABFCPoint型——用于点位置图层绘制,TABFCPolyline
型——用于道路图层绘制,TABFCRegion型——用于区域型图
层的绘制。点、线、区域图形对象类则定义各自的特有属性,
并实现自身的绘制方法。
3.3地图数据提取
将MapInfo地图输出为记录图层空间信息的MIF文件和
记录图层属性信息的MID文件,利用Mitab库按图层读取地
图数据MIF/MID文件。读取地图数据的流程如图3所示。
(1)调用IMapInfoFile类的SmartOpen()函数,打开包含图
层数据的.MIF格式文件。打开成功则返回相应的MIFFILE类
对象指针,如果打开失败返回NULL。
(2)调用GetLayerDefn()函数,获取图层属性信息,并利用
GetFieldCount()读取图层字段数。
(3)调用GetNextFeaturesId(1)函数获得图层中对象首指
针,该函数返回一个整型值。
(4)判断函数返回值是否为1。若为1,进入过程(6),否
则进入过程(5)。
(5)调用GetFeatureRef()函数,返回TABFeature类对象,通
过GetFeatureClass()函数获得对象类型值,根据整型返回值判
断对象类型。把获得的TABFeature类指针强制类型转换为对
应的对象类指针。调用对象类函数读取属性数据和几何数据
到内存。然后指针下移进入过程(4),遍历所有对象。
(6)对象数据读取完毕,调用Close()函数关闭MIF格式文
件,释放MIFFILE类指针。
3.4坐标转换实现
地图数据源使用所处经纬度的地理坐标系,而电子地图
在终端上进行绘制和几何操作,使用的是平面直角坐标系。因
此通过高斯--克吕格投影变换
[7]
,可将地理空间中的实体对象
经纬度坐标转换为地图平面坐标。虽然地图平面坐标系与屏
幕坐标系都是平面直角坐标系,但它们的坐标原点不同,坐标
轴方向和刻度单位不同,因此要把地图绘制在嵌入式设备屏
幕上,还需要通过映射模式实现从“窗口”(逻辑坐标)到“视口”
(设备坐标)的变换
[8-9]
。窗口是地图平面坐标空间中的一个矩
形区域,决定地图平面空间中的几何模型的哪一部分应该被
显示,是基于逻辑坐标的。而视口是设备坐标空间中的一个
矩形区域,决定应该绘制在设备表面的何处,是基于设备坐标
(像素)的。它们之间的比例决定坐标的缩放。
窗口坐标转换为地图坐标原理在于:设备空间中某段距
离值和坐标范围值的比例与页面空间中的比例保持一致,即
逻辑原点(xWinOrg,yWinOrg)总是被映射为设备原点
(xViewOrg,yViewOrg)。地图平面坐标到设备像素坐标的转换
公式如下
xViewPort=((xWindow-xWinOrg)*xViewExt/xWinExt)+xViewOrg
yViewPort=((yWindow-yWinOrg)*yViewExt/yWinExt)+yViewOrg
式中:xViewPort,yViewPort——设备单位的(x,y)值;xWindow,
yWindow——逻辑单位的(x,y)值;xWinOrg,yWinOrg——窗口
原点(x,y)值;xViewOrg,yViewOrg——视口原点(x,y)值;
xWinExt,yWinExt——窗口(x,y)范围;xViewExt,yViewExt——
视口(x,y)范围。
4实验与结果分析
嵌入式GIS导航电子地图是以地理空间数据为基础,主
要实现地图绘制、显示、浏览、定位以及模块间消息的获取和
处理。界面控制和应用逻辑通过线程交互数据,线程处理函
数读取实体对象的地理经、纬度数据,将经纬度坐标转换为屏
幕的像素坐标,绘制并实时刷新电子地图。
4.1 MiniGUI主程序框架
MiniGUI是基于消息驱动的系统,应用程序功能模块将
触发的事件转换为消息,并将消息放入目标程序的消息队列
中,窗口过程函数执行用户的各项动作。利用SetDesktopRect
()函数指定显示区域,调用CrearMainWindow()函数创建主窗
口,通过ShowWindow()函数把所创建的主窗口显示在屏幕上,
然后进入消息循环。在需要进行窗口重绘时,发送绘制消息
MSG_PAINT。应用程序在响应MSG_PAINT消息时,利用Get-
Message()函数从消息队列中获取消息,利用DispatchMessage()
函数将消息发送到指定窗口并绘制。
4.2电子地图导航
在地图窗口中,为了方便操作,设计工具栏。当用户点击
工具栏上图标时,响应地图的放大、缩小、漫游等操作功能。
采用MiniGUI的CTRL_NEWTOOLBAR控件类调用crea-
tewindow()函数创建工具栏。填充NTBINFO结构,并将该结
构指针通过CreateWindow()函数的dwAddData参数传递给控
件类的窗口过程。NTBINFO结构用来定义工具栏所用位图信
息,向工具栏控件发送NTBM_ADDITEM消息并传递NTBITE-
MINFO结构,可向工具栏中添加工具项。工具栏在用户单击
某个按钮时触发消息,工具栏的通知码就是用户单击的按钮
的标识符,该标识符将作为工具栏通知消息的通知码传递到
工具栏回调函数。
对地图进行缩放和漫游等方式导航,可设定相应的平移/
缩放因子改变地图显示的区域方向和大小。地图的缩放需要
首先计算地图的显示比例尺,将点击的位置的经纬度坐标作
为新的参考点,把点击的位置移动到屏幕中心,根据具体的操
作乘以该缩放因子,改变地图的显示区域。地图的漫游只改
变地图的中心点,而不改变单位屏幕像素对应的地图距离,它
是将地图的整体或者部分移动到坐标系中的另外位置,改变
地图的观察区域。
4.3实验结果
将图层对象几何图形数据和属性数据读入内存,然后进
行坐标变换,获取并设置不同对象的画笔、字体、颜色等信息
绘制图层,电子地图绘制流程如图5所示。根据位置变化确
定需要重绘的区域,通过MiniGUI的消息响应机制调用Inva-
lidateRect()函数,在电子地图上实时绘制显示。
5结束语
电子地图设计是嵌入式GIS应用的关键,本文以Maplnfo
格式的桌面电子地图文件为数据来源,针对嵌入式GIS的特
点选用合适的数据结构来组织数据。在Linux操作系统下,以
图形用户界面MiniGUI为开发环境,通过Mitab库读取MIF格
式矢量地图几何数据和属性数据,实现了嵌入式GIS地图可
视化定位导航功能,实验结果表明该电子地图方案具有可行
性和实用性。本设计为嵌入式电子地图的发展和应用提供良
好支持,可在嵌入式设备(如手持终端、车载终端等)上使用,
适合用在旅游景点导航、城市路径规划、车辆导航等方面,具
有较好的实用意义和经济价值。