基于嵌入式Linux的MapInfo格式地图制作
农田信息采集装置,车载导航仪和PDA等机载和手持式小型设备都需要GPS定位和地图显示功能的支持。而市场上实现这种功能的大部分平台都是基于WINCE这种操作系统,可以采用EVC开发,开发流程明确,驱动支持较丰富,但总体开发成本较高。由于Linux其免费,可配置,网络性能,MiniGUI也是轻型、高性能、高可靠性、可配置的GUI,本文采用MiniGUI在ARM-linux平台上实现了简单的地图显示功能。在硬件环境上,使用一块AT91rm9200为核心的开发板,32M SDRAM,16M FLASH, LCD显示,选取嵌入式Linux作为操作系统,为了实现地图显示的功能,首先在宿主机上建立交叉编译环境,移植MiniGUI到开发平台上,使平台支持图形显示,接着根据MapInfo格式的一系列文件的内部结构和相互关系编程分析,得到基础图元数据和类型,再通过一系列坐标转换,最后在LCD上显示出地图。最终使平台支持了MapInfo这种主流的地图,并为以后的地图制作匹配,农田信息采集、分布图生成打下了基础。
对嵌入式平台的开发首先都要建立交叉编译环境和最终的运行环境。针对笔者所采用的ARM-Linux平台,交叉编译是为了在采用linux的宿主PC机上生成最终在ARM处理器上linux操作系统下可运行的代码。而建立运行环境是将一些必要的资源文件安装到程序运行的 ARM-Linux平台上。接下来以MiniGUI1.3.3版为例,介绍在它该ARM板上的移植过程。该版本可在飞漫软件的网站上免费下载,并需要遵守 GPL协议。
2.1 PC机上交叉编译环境的建立
主要是安装交叉编译器,并交叉编译MiniGUI库的源代码,生成应用程序需要的链接的动态和静态的库文件。
首先需要安装和板载linux相同版本的arm-linux-gcc编译器到采用linux操作系统的宿主机的某个路径下(如:/usr/local/arm/bin,若编译器有特殊要求,则一定要安装到它指定的路径下),并将该路径添加到宿主机的PATH环境变量中,如果此时在字符终端中命令行下输入arm-linux-gcc有使用格式提示,则说明PATH变量添加成功。
第二步解压libminigui-1.3.3.tar.gz软件包,进入该目录,运行./configure(产生 Makfile文件),需要指定一些选项,CC=arm-linux-gcc(指定编译器),target=arm-linux(指定目标平台),prefix=…(MiniGUI函数库的安装路径),host=i686-pc-linux-gnu(宿主机类型,本文的宿主机的版本是 RedHet9.0),然后使用make编译库,make install安装库、头文件、配置文件到prefix选项指定的地方。
最后,在编写或移植应用程序的时候,Makefile里面指定的编译器和链接的库的位置如上所述,所以需要注意的一般是CC项--指定编译器,LIBS项--指定库文件位置,DEFAULT_INCLUDES项--指定头文件位置。
2.2 平台运行环境的建立
运行环境建立在目标板的文件系统中。
下载并解压minigui-res-1.3.3.tar.gz压缩包,修改其中的configure.linux文件,prefix选项指定了以后make install命令安装资源文件的位置,默认是本机(宿主机)的/usr/local下,可以修改这个选项以符合系统要求。因为最终可执行文件运行在目标板上,所以prefix项一般指定到目标板文件系统的***/usr/local路径下,它会在目标板的文件系统的***/usr/local/lib /minigui/res目录下(***为目标板文件系统在宿主机上的位置)。
最后,还要保证嵌入式平台LINUX支持MiniGUI。在基于Linux的系统上,MiniGUI在LinuxFrameBuffer驱动程序的基础上建立图形引擎[6]。一般而言,基于Linux的嵌入式系统均会提供FrameBuffer支持,为了确定FrameBuffer驱动程序是否被激活,可以通过查看嵌入式平台运行时的/proc/devices目录下是否有fb设备,如果启动后存在fb设备,那么在平台的文件系统中/usr/local/etc下的 MiniGUI.cfg中指定使用fbcon的引擎。
如果显卡驱动支持FrameBuffer驱动,则可以在内核编译的时候加入FrameBuffer项。如果显卡的驱动不是FrameBuffer的,则使用其它的图形引擎或者编写一个,如修改MiniGUI库的源代码目录libminigui-1.3.3/src /newgal/dummy中的dummy引擎,把显示驱动加进来构造自己的显示引擎。在dummy文件夹下的nullvideo.c 中,DUMMY_CreateDevice函数初始化MiniGUI的负责显示的数据结构GAL_VideoDevice。 DUMMY_VideoInit函数处理硬件驱动中底层设备初始化,设置视频输出的格式(NTSC,PAL,DRGB,VGA)。 DUMMY_SetVideoMode函数重点处理缓存的分配,RGB的位数和透明效果。DUMMY_VideoQuit释放驱动的底层设备的数据结构和显示包的缓冲队列。DUMMY_UpdateRects是更新新的显示包的地方,第一次调用时构造显示包或者包的队列,之后可以根据一定的算法计算需要重绘的区域。并在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这几种类型,并按照一定的格式存储。