基于嵌入式Linux的MapInfo格式地图显示
包或者包的队列,之后可以根据一定的算法计算需要重绘的区域。并在MiniGUI.cfg中需要指定使用新构造的Dummy引擎。
3.MapInfo格式地图的显示
MapInfo是面向应用的桌面地图信息系统,数据组织方式灵活,查询、统计、分析及专题制图功能较强,其格式的地图较丰富。在一些农田采集平台,城市交通GPS引导中往往使用一些MapInfo格式的地图。由于在Linux平台下,没有控件的支持,但是可以通过分析 MapInfo格式,使用MiniGUI实现简单的地图显示。
MapInfo的数据格式主要分为TAB和MIF(MID)两种格式,TAB格式是MapInfo唯一的数据存储格式, 所有基于该软件上的应用系统都要以这种格式为依托。MapInfo数据采用双数据库存储模式,属性数据存储在属性数据的表结构文件(.tab)与属性数据文件(.dat)中,空间数据保存在空间数据文件(.map) 中,两者通过交叉索引文件(.id)联系(如图1所示)。通常TAB格式的文件主要由以下几个文件组成:.tab文件描述表结构,.dat或.dbf文件包含表的数据,.map文件表的图形对象,.id文件包含表的地理索引,.ind文件包含表的列索引。
MIF(MID)是MapInfo的外部数据交换文件。MapInfo主要通过MIF、MID两个文件与其他GIS软件建立数据接口,其中MIF数据文件主要保存空间数据的图形信息,MID 数据文件主要保存空间数据的属性信息。MIF由文件头和数据段组成,数据段包含MapInfo定义的点、线、面、多义线、区域、圆弧、文本、矩形、圆角矩形和椭圆等实体。MID文件为对应实体的属性。IND文件不是必需的,它对应于每个索引字段都有一个索引表。它们之间关系如图1所示。
MIF文件包括MIF File Header和MIF Data Section两个部分。在MIF File Header部分中我们通过格式分析可以得到该图层使用的坐标系是何种格式,使用的椭球标准(如WGS84,International 1924),转换坐标系使用的七参数等等。具体可以针对将要显示的地图的坐标系格式实现一种,如WGS84这种坐标系。而在MIF Data Section部分中地理对象被描述为point、line、polyline、region、arc、text、rectangle、rounded rectangle、ellipse、multipoint、collection这几种类型,并按照一定的格式存储。
掌握了文件之间的关系之后,可以用C或C++语言编程实现对.TAB或.MIF文件的读取。为了存储对应地理图元的记录的信息,本文构造了如下的数据结构,如图2所示:
其中NTz结构指明该文件包含多少个字段,ONETz指明该字段包含多少个部分,kind指明改部分是点、线还是标注,ONEPART又给出了各个部分包含的坐标点的数量和位置信息。接下来在MiniGUI中主要对这个ONETz结构进行处理。
图 2 存储地理图元数据结构 |
4. 地图的绘制
4.1 基本的点、线、多边形的绘制
在把将上一步得到的坐标和坐标系的定义通过高斯投影变换[5],再将得到的坐标经过变换到MiniGUI的显示窗口,在本文中即平台的LCD的某个区域上,按照MiniGUI中定义的POINT类型,最后在MiniGUI中的MSG_PAINT消息中进行地图的绘制。
进入MiniGUI的绘制窗口前,首先完成对MapInfo格式文件的解析,得到上述的数据结构。进入窗口后,根据不同的地图元数据中指示的类型特点,如点、线、面、文本,调用不同的MiniGUI的绘图函数,如PollyLineTo、FillPolygon、 TextOut、Circle等函数在绘制区进行图元的绘制。增加坐标的变换和比例尺的分析后,可实现放大,缩小,漫游,测距功能。
4.2 功能扩展
在基本的绘制完成后,还可以根据之前得到的数据结构和MiniGUI库函数的API扩展其他的功能。
选取图元的功能可以通过截取鼠标键弹起的信息,得到当前的屏幕位置信息,如果将该位置与线元素的距离比较,如果小于一定的像素阈值,则认为选中,并显示提示信息;如果是选取面,可以用是否在多边形内部来判断是否被选中。
另外,对一些特殊的标注点的图形显示,如医院、学校,可以采用加载bmp格式的图标在显示区标注。
笔者的平台要实时的通过串口接受GPS定位坐标和农田采集的信息,通过一个按钮控制一个线程的开关,该线程读取串口数据记录到文件中。该线程和MiniGUI之间可采用信号量同步,最终根据属性信息对农田区,即MiniGUI的API对多边形区域进行着色,产生某种属性的分布图。最后还可以将所有农田数据整合,得到预测的产量等分布图等等。
5. 结束语
本文提供了一种面向手持设备的工具嵌入式地图显示的具体方案,通过对MiniGUI的移植和对MapInfo格式文件的分析,达到最终地图的显示。采用北京市二环以内的MapInfo地图进行显示(含1000个左右的各种图元),将嵌入式平台显示结果(图3)和PC机上的 MapInfo软件显示的结果
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于Winodws CE的嵌入式网络监控系统的设计与实现(03-05)
- 嵌入式系统实时性的问题(06-21)
- 嵌入式实时系统中的优先级反转问题(06-10)
- 嵌入式Linux系统中MMC卡驱动管理技术研究(06-10)
- FPGA的DSP性能揭秘(06-16)