基于嵌入式Linux的MapInfo格式地圖顯示
1. 引言
農(nóng)田信息采集裝置,車載導(dǎo)航儀和PDA等機(jī)載和手持式小型設(shè)備都需要GPS定位和地圖顯示功能的支持。而市場上實(shí)現(xiàn)這種功能的大部分平臺都是基于WINCE這種操作系統(tǒng),可以采用EVC開發(fā),開發(fā)流程明確,驅(qū)動(dòng)支持較豐富,但總體開發(fā)成本較高。由于Linux其免費(fèi),可配置,網(wǎng)絡(luò)性能,MiniGUI也是輕型、高性能、高可靠性、可配置的GUI,本文采用MiniGUI在ARM-linux平臺上實(shí)現(xiàn)了簡單的地圖顯示功能。
在硬件環(huán)境上,使用一塊AT91rm9200為核心的開發(fā)板,32M SDRAM,16M FLASH, LCD顯示,選取嵌入式Linux作為操作系統(tǒng),為了實(shí)現(xiàn)地圖顯示的功能,首先在宿主機(jī)上建立交叉編譯環(huán)境,移植MiniGUI到開發(fā)平臺上,使平臺支持圖形顯示,接著根據(jù)MapInfo格式的一系列文件的內(nèi)部結(jié)構(gòu)和相互關(guān)系編程分析,得到基礎(chǔ)圖元數(shù)據(jù)和類型,再通過一系列坐標(biāo)轉(zhuǎn)換,最后在LCD上顯示出地圖。最終使平臺支持了MapInfo這種主流的地圖,并為以后的地圖匹配,農(nóng)田信息采集、分布圖生成打下了基礎(chǔ)。
2. MiniGUI的移植
對嵌入式平臺的開發(fā)首先都要建立交叉編譯環(huán)境和最終的運(yùn)行環(huán)境。針對筆者所采用的ARM-Linux平臺,交叉編譯是為了在采用linux的宿主PC機(jī)上生成最終在ARM處理器上linux操作系統(tǒng)下可運(yùn)行的代碼。而建立運(yùn)行環(huán)境是將一些必要的資源文件安裝到程序運(yùn)行的 ARM-Linux平臺上。接下來以MiniGUI1.3.3版為例,介紹在它該ARM板上的移植過程。該版本可在飛漫軟件的網(wǎng)站上免費(fèi)下載,并需要遵守 GPL協(xié)議。
2.1 PC機(jī)上交叉編譯環(huán)境的建立
主要是安裝交叉編譯器,并交叉編譯MiniGUI庫的源代碼,生成應(yīng)用程序需要的鏈接的動(dòng)態(tài)和靜態(tài)的庫文件。
首先需要安裝和板載linux相同版本的arm-linux-gcc編譯器到采用linux操作系統(tǒng)的宿主機(jī)的某個(gè)路徑下(如:/usr/local/arm/bin,若編譯器有特殊要求,則一定要安裝到它指定的路徑下),并將該路徑添加到宿主機(jī)的PATH環(huán)境變量中,如果此時(shí)在字符終端中命令行下輸入arm-linux-gcc有使用格式提示,則說明PATH變量添加成功。
第二步解壓libminigui-1.3.3.tar.gz軟件包,進(jìn)入該目錄,運(yùn)行./configure(產(chǎn)生 Makfile文件),需要指定一些選項(xiàng),CC=arm-linux-gcc(指定編譯器),target=arm-linux(指定目標(biāo)平臺),prefix=…(MiniGUI函數(shù)庫的安裝路徑),host=i686-pc-linux-gnu(宿主機(jī)類型,本文的宿主機(jī)的版本是 RedHet9.0),然后使用make編譯庫,make install安裝庫、頭文件、配置文件到prefix選項(xiàng)指定的地方。
最后,在編寫或移植應(yīng)用程序的時(shí)候,Makefile里面指定的編譯器和鏈接的庫的位置如上所述,所以需要注意的一般是CC項(xiàng)--指定編譯器,LIBS項(xiàng)--指定庫文件位置,DEFAULT_INCLUDES項(xiàng)--指定頭文件位置。
2.2 平臺運(yùn)行環(huán)境的建立
運(yùn)行環(huán)境建立在目標(biāo)板的文件系統(tǒng)中。
下載并解壓minigui-res-1.3.3.tar.gz壓縮包,修改其中的configure.linux文件,prefix選項(xiàng)指定了以后make install命令安裝資源文件的位置,默認(rèn)是本機(jī)(宿主機(jī))的/usr/local下,可以修改這個(gè)選項(xiàng)以符合系統(tǒng)要求。因?yàn)樽罱K可執(zhí)行文件運(yùn)行在目標(biāo)板上,所以prefix項(xiàng)一般指定到目標(biāo)板文件系統(tǒng)的***/usr/local路徑下,它會在目標(biāo)板的文件系統(tǒng)的***/usr/local/lib /minigui/res目錄下(***為目標(biāo)板文件系統(tǒng)在宿主機(jī)上的位置)。
最后,還要保證嵌入式平臺LINUX支持MiniGUI。在基于Linux的系統(tǒng)上,MiniGUI在LinuxFrameBuffer驅(qū)動(dòng)程序的基礎(chǔ)上建立圖形引擎[6]。一般而言,基于Linux的嵌入式系統(tǒng)均會提供FrameBuffer支持,為了確定FrameBuffer驅(qū)動(dòng)程序是否被激活,可以通過查看嵌入式平臺運(yùn)行時(shí)的/proc/devices目錄下是否有fb設(shè)備,如果啟動(dòng)后存在fb設(shè)備,那么在平臺的文件系統(tǒng)中/usr/local/etc下的 MiniGUI.cfg中指定使用fbcon的引擎。
如果顯卡驅(qū)動(dòng)支持FrameBuffer驅(qū)動(dòng),則可以在內(nèi)核編譯的時(shí)候加入FrameBuffer項(xiàng)。如果顯卡的驅(qū)動(dòng)不是FrameBuffer的,則使用其它的圖形引擎或者編寫一個(gè),如修改MiniGUI庫的源代碼目錄libminigui-1.3.3/src /newgal/dummy中的dummy引擎,把顯示驅(qū)動(dòng)加進(jìn)來構(gòu)造自己的顯示引擎。在dummy文件夾下的nullvideo.c 中,DUMMY_CreateDevice函數(shù)初始化MiniGUI的負(fù)責(zé)顯示的數(shù)據(jù)結(jié)構(gòu)GAL_VideoDevice。 DUMMY_VideoInit函數(shù)處理硬件驅(qū)動(dòng)中底層設(shè)備初始化,設(shè)置視頻輸出的格式(NTSC,PAL,DRGB,VGA)。 DUMMY_SetVideoMode函數(shù)重點(diǎn)處理緩存的分配,RGB的位數(shù)和透明效果。DUMMY_VideoQuit釋放驅(qū)動(dòng)的底層設(shè)備的數(shù)據(jù)結(jié)構(gòu)和顯示包的緩沖隊(duì)列。DUMMY_UpdateRects是更新新的顯示包的地方,第一次調(diào)用時(shí)構(gòu)造顯示包或者包的隊(duì)列,之后可以根據(jù)一定的算法計(jì)算需要重繪的區(qū)域。并在MiniGUI.cfg中需要指定使用新構(gòu)造的Dummy引擎。
3.MapInfo格式地圖的顯示
MapInfo是面向應(yīng)用的桌面地圖信息系統(tǒng),數(shù)據(jù)組織方式靈活,查詢、統(tǒng)計(jì)、分析及專題制圖功能較強(qiáng),其格式的地圖較豐富。在一些農(nóng)田采集平臺,城市交通GPS引導(dǎo)中往往使用一些MapInfo格式的地圖。由于在Linux平臺下,沒有控件的支持,但是可以通過分析 MapInfo格式,使用MiniGUI實(shí)現(xiàn)簡單的地圖顯示。
MapInfo的數(shù)據(jù)格式主要分為TAB和MIF(MID)兩種格式,TAB格式是MapInfo唯一的數(shù)據(jù)存儲格式, 所有基于該軟件上的應(yīng)用系統(tǒng)都要以這種格式為依托。MapInfo數(shù)據(jù)采用雙數(shù)據(jù)庫存儲模式,屬性數(shù)據(jù)存儲在屬性數(shù)據(jù)的表結(jié)構(gòu)文件(.tab)與屬性數(shù)據(jù)文件(.dat)中,空間數(shù)據(jù)保存在空間數(shù)據(jù)文件(.map) 中,兩者通過交叉索引文件(.id)聯(lián)系(如圖1所示)。通常TAB格式的文件主要由以下幾個(gè)文件組成:.tab文件描述表結(jié)構(gòu),.dat或.dbf文件包含表的數(shù)據(jù),.map文件表的圖形對象,.id文件包含表的地理索引,.ind文件包含表的列索引。
MIF(MID)是MapInfo的外部數(shù)據(jù)交換文件。MapInfo主要通過MIF、MID兩個(gè)文件與其他GIS軟件建立數(shù)據(jù)接口,其中MIF數(shù)據(jù)文件主要保存空間數(shù)據(jù)的圖形信息,MID 數(shù)據(jù)文件主要保存空間數(shù)據(jù)的屬性信息。MIF由文件頭和數(shù)據(jù)段組成,數(shù)據(jù)段包含MapInfo定義的點(diǎn)、線、面、多義線、區(qū)域、圓弧、文本、矩形、圓角矩形和橢圓等實(shí)體。MID文件為對應(yīng)實(shí)體的屬性。IND文件不是必需的,它對應(yīng)于每個(gè)索引字段都有一個(gè)索引表。它們之間關(guān)系如圖1所示。
MIF文件包括MIF File Header和MIF Data Section兩個(gè)部分。在MIF File Header部分中我們通過格式分析可以得到該圖層使用的坐標(biāo)系是何種格式,使用的橢球標(biāo)準(zhǔn)(如WGS84,International 1924),轉(zhuǎn)換坐標(biāo)系使用的七參數(shù)等等。具體可以針對將要顯示的地圖的坐標(biāo)系格式實(shí)現(xiàn)一種,如WGS84這種坐標(biāo)系。而在MIF Data Section部分中地理對象被描述為point、line、polyline、region、arc、text、rectangle、rounded rectangle、ellipse、multipoint、collection這幾種類型,并按照一定的格式存儲。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
評論