Linux 平台下基于Qt 的电子地图的绘制
生活随笔
收集整理的這篇文章主要介紹了
Linux 平台下基于Qt 的电子地图的绘制
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Linux 平臺(tái)下基于Qt 的電子地圖的繪制
摘要…………………………………………………………………………………………………………………1
??關(guān)鍵詞………………………………………………………………………………………………………………2
??0 引言………………………………………………………………………………………………………………3
??1 電子地圖實(shí)現(xiàn)總體設(shè)計(jì)…………………………………………………………………………………………4
??2 MITAB 庫(kù)提取地圖數(shù)據(jù)模塊……………………………………………………………………………………5
??2.1 讀取MIF 格式文件的空間數(shù)據(jù)………………………………………………………………………………6
??3 SQLite 數(shù)據(jù)庫(kù)存儲(chǔ)地圖數(shù)據(jù)模塊 ……………………………………………………………………………7
??4 利用Qt 顯示地圖模塊 …………………………………………………………………………………………8
??4.1 地圖坐標(biāo)轉(zhuǎn)換…………………………………………………………………………………………………9
??4.2 圖形對(duì)象的顯示………………………………………………………………………………………………10
??4.4 電子地圖的縮放………………………………………………………………………………………………11
??4.5 GPS 模塊………………………………………………………………………………………………………12
??5 結(jié)束語(yǔ)……………………………………………………………………………………………………………13
??[參考文獻(xiàn) (References) ……………………………………………………………………………………14
-
????
--------------------------------------------------------------------------------
正文
4.4 電子地圖的縮放
QGraphicsView 支持幾何變換,當(dāng)進(jìn)行視圖變換時(shí),QGraphicsView 保持視圖的中心,通過(guò)應(yīng)用變換,可以很容易地實(shí)現(xiàn)縮放。在視圖類中定義一個(gè)放大的槽函數(shù)和一個(gè)縮小的槽函數(shù),將槽和具有autoRepeat 屬性的QPushButton 進(jìn)行連接,就可以實(shí)現(xiàn)連續(xù)的縮放操作。下面是兩個(gè)槽函數(shù)Public slots:Void zoomIn() {scale(1.5,1.5);}Void zoomOut() {scale(1.5,1.5);}通過(guò)以上步驟就可以實(shí)現(xiàn)簡(jiǎn)單的電子地圖瀏覽,最終程序運(yùn)行的結(jié)果如圖4,放大之后的結(jié)果如圖 。其中zoomin 是地圖縮小按鈕,zoomout 是地圖放大按鈕。地圖數(shù)據(jù)來(lái)源于太原市MapInfo 格式的地圖的第一層。圖 太原市電子地圖的第一層圖 放大的電子地圖Fig. First Layer of Taiyuan Electrnic Map Fig. Ampplification of The Electrnic Map
5 結(jié)束語(yǔ)
該系統(tǒng) 實(shí)現(xiàn)電子地圖瀏覽和定位等功能,是嵌入式GPS 定位導(dǎo)航系統(tǒng)的基礎(chǔ)。本文詳細(xì)說(shuō)明了具體的實(shí)現(xiàn)步驟。還有很多功能沒(méi)有實(shí)現(xiàn),例如導(dǎo)航,值得進(jìn)一步研究。本方案設(shè)計(jì)的電子地圖,運(yùn)行速度快,費(fèi)用低,很適 合用在旅游景點(diǎn)導(dǎo)游,城市路徑規(guī)劃,車輛導(dǎo)航等方面,具有一定的實(shí)用價(jià)值和經(jīng)濟(jì)價(jià)值。
摘要…………………………………………………………………………………………………………………1
??關(guān)鍵詞………………………………………………………………………………………………………………2
??0 引言………………………………………………………………………………………………………………3
??1 電子地圖實(shí)現(xiàn)總體設(shè)計(jì)…………………………………………………………………………………………4
??2 MITAB 庫(kù)提取地圖數(shù)據(jù)模塊……………………………………………………………………………………5
??2.1 讀取MIF 格式文件的空間數(shù)據(jù)………………………………………………………………………………6
??3 SQLite 數(shù)據(jù)庫(kù)存儲(chǔ)地圖數(shù)據(jù)模塊 ……………………………………………………………………………7
??4 利用Qt 顯示地圖模塊 …………………………………………………………………………………………8
??4.1 地圖坐標(biāo)轉(zhuǎn)換…………………………………………………………………………………………………9
??4.2 圖形對(duì)象的顯示………………………………………………………………………………………………10
??4.4 電子地圖的縮放………………………………………………………………………………………………11
??4.5 GPS 模塊………………………………………………………………………………………………………12
??5 結(jié)束語(yǔ)……………………………………………………………………………………………………………13
??[參考文獻(xiàn) (References) ……………………………………………………………………………………14
-
????
--------------------------------------------------------------------------------
正文
1 電子地圖實(shí)現(xiàn)總體設(shè)計(jì)
2 MITAB 庫(kù)提取地圖數(shù)據(jù)模塊
MAPINFO 公司并沒(méi)有對(duì)外公布原始的以矢量形式存儲(chǔ)的數(shù)據(jù)格式,即TAB 格式。但其提供地圖交換數(shù)據(jù)格式(MIF,MapInfo Interchange Fomat)[2]供開(kāi)發(fā)人員作二次開(kāi)發(fā),這種格式的空間數(shù)據(jù)以ASCII 格式存儲(chǔ),易生成且可編輯,包含兩個(gè)文件(*.mif 和 .mid)。其中 .mif 文件保存了該MapInfo 格式地圖的結(jié)構(gòu)及空間對(duì)象的空間信息,而 .mid 文件順序保存了空間的所有屬性信息。嵌入式Linux 中并沒(méi)有專門的軟件或插件直接支持MIF 格式的電子地圖。本文采用開(kāi)放源碼工具M(jìn)ITAB[3]庫(kù)從MIF 格式地圖中提取地圖數(shù)據(jù)。MITAB 提供了兩種讀取MIF 格式地圖的方法:一種是提供 語(yǔ)言應(yīng)用程序接口,通過(guò)調(diào)用其中的函數(shù)來(lái)實(shí)現(xiàn)數(shù)據(jù)的讀寫(xiě)操作。MITAB 為 語(yǔ)言應(yīng)用程序接口提供了很完整的文檔資料,編程簡(jiǎn)單;另一種是提供C++的接口函數(shù)庫(kù),該函數(shù)庫(kù)可以實(shí)現(xiàn)MITAB 的所有功能,但是沒(méi)有文檔資料的支持。本課題采用 語(yǔ)言接口讀取地圖,圖 是用MITAB 的語(yǔ)言接口讀取MIF 文件的流程圖。圖 使用MITAB 提取地圖數(shù)據(jù)流程Fig. Process of using MITAB to obtain map data
? ? ?2.1 讀取MIF 格式文件的空間數(shù)據(jù)
首先調(diào)用mitab_c_open(const char *pzFilename)打開(kāi)MIF 格式的文件,返回mitab_handle類型的數(shù)據(jù),該數(shù)據(jù)保存了整個(gè)mif 文件的所有數(shù)據(jù)。地圖中有很多圖形對(duì)象 MIF 文件把這些圖形對(duì)象分為點(diǎn)(point)、直線 line)、折線polyline)、區(qū)域 region)、圓弧 arc)、文本 text)、矩形 rectangle)、圓角矩形 rounded rectangle)、橢圓 ellipse)九類。具體提取過(guò)程如下:首先,通過(guò)調(diào)用mitab_c_get_field_count(mitab_handle dataset)函數(shù)得到該文件中圖形對(duì)象的個(gè)數(shù),其參數(shù)dataset 為打開(kāi)地圖文件時(shí)返回的數(shù)據(jù)。讀取圖形對(duì)象的feature_id(即該圖形對(duì)象在文件中的標(biāo)識(shí));其次,通過(guò)調(diào)用 mitab_c_read_feature(mitab_handle dataset,intfeature_id)獲取圖形對(duì)象,返回值是mitab_feature 類型的數(shù)據(jù),該返回?cái)?shù)據(jù)包含了當(dāng)前圖形對(duì)象的所有信息;然后,獲取當(dāng)前圖形對(duì)象的類型,通過(guò)調(diào)用 mitab_c_get_type(mitab_featurefeature)函數(shù);最后,調(diào)用相應(yīng)的函數(shù)提取對(duì)象里面的數(shù)據(jù)。調(diào)用 mitab_c_get_vertex_x()函數(shù)提取緯度,mitab_c_get_vertex_y()函數(shù)提取經(jīng)度,調(diào)用 mitab_c_get_pen_color()函數(shù)提取畫(huà)筆顏色等。最終就可以把所有的圖形對(duì)象的數(shù)據(jù)都提取出來(lái)了。讀取完一個(gè)圖形對(duì)象必須調(diào)用 mitab_c_destroy_feature()函數(shù)銷毀對(duì)象。最后調(diào)用mitab_c_close()函數(shù)關(guān)閉文件。SQLite 數(shù)據(jù)庫(kù)存儲(chǔ)地圖模塊
? ? 3 SQLite 數(shù)據(jù)庫(kù)存儲(chǔ)地圖數(shù)據(jù)模塊
在Linux 系統(tǒng)下讀取地圖數(shù)據(jù),由于地圖數(shù)據(jù)量大,并且有不斷增大的趨勢(shì),所以單純的文件數(shù)據(jù)讀取的效率變得越發(fā)的不理想,為了提高數(shù)據(jù)讀取的效率、定位和導(dǎo)航的效 率,我們考慮了采用一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù)系統(tǒng)來(lái)檢索地圖數(shù)據(jù)。SQLite[4]是2000 年開(kāi)發(fā)出來(lái)的一種中小型嵌入式數(shù)據(jù)庫(kù),可以較為方便的運(yùn)用到嵌入式系統(tǒng)中,它的源代碼完全開(kāi)放,可以免費(fèi)用于任何用途,包括商業(yè)目的。SQLite 提供了對(duì)SQL92 的大多數(shù)支持:支持多表、索引、事務(wù)、視圖、觸發(fā)和一系列的用戶接口及驅(qū)動(dòng),簡(jiǎn)單易用,速度很快,同時(shí)提供了豐富的數(shù)據(jù)庫(kù)接口。它的一個(gè)重要的特點(diǎn)是體積 非常小,編譯后也不過(guò)幾十KB。根據(jù)mif 文件保存圖形對(duì)象的格式,在SQLite 數(shù)據(jù)庫(kù)中設(shè)計(jì)相應(yīng)的數(shù)據(jù)表來(lái)存儲(chǔ)相應(yīng)的圖形對(duì)象。下面以region 對(duì)象為例 如表 。表 數(shù)據(jù)庫(kù)中的地圖數(shù)據(jù)表Tab. Table of map in database圖形對(duì)象類型表結(jié)構(gòu)定義表名對(duì)應(yīng)的SQLite 語(yǔ)句區(qū)域經(jīng)度集緯度集節(jié)點(diǎn)數(shù)畫(huà)筆寬畫(huà)筆顏色前景色背景色屬性數(shù)據(jù)regionCREATE TABLE regionTabale(longitude VARCHAR(300),latitude VARCHAR(300),pointnum INTEGER,penwidth INTEGER,pencolor INTERGER,forecolor INTEGER,backcolor INTERGER,property VACHAR(100))QtSql 模塊提供了與平臺(tái)以及數(shù)據(jù)庫(kù)種類無(wú)關(guān)的訪問(wèn)SQL 數(shù)據(jù)庫(kù)的接口。Qt 內(nèi)含SQLite數(shù)據(jù)庫(kù)的驅(qū)動(dòng),Qt 與SQLite 建立連接之后,就可以使用查詢類(QSqlQuery)執(zhí)行底層數(shù)據(jù)庫(kù)支持的任何SQL 語(yǔ)句了。利用Qt 數(shù)據(jù)庫(kù)查詢類里面的INSERT 函數(shù)就可以把地圖數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù),利用SELECT 函數(shù)可以把地圖數(shù)據(jù)從數(shù)據(jù)庫(kù)中導(dǎo)出。然后調(diào)用Qt 的繪圖類實(shí)現(xiàn)地圖的顯示。
? ? 4 利用Qt 顯示地圖模塊
地圖顯示主要是通過(guò)mif 格式地圖中的地圖數(shù)據(jù),結(jié)合Qt 中的圖形繪圖類實(shí)現(xiàn)地圖的顯示。本文中使用的是Qt 中繪圖功能強(qiáng)大的Graphics View[5]。Graphics View 提供了用于管理和交互大量定制的2D 圖形對(duì)象平面以及可視化顯示對(duì)象的視圖widget,并支持縮放和旋轉(zhuǎn)功能。Graphics View 使用BSP(二進(jìn)制空間劃分)樹(shù)形可以快速地找到對(duì)象,因此即使是包含百萬(wàn)個(gè)對(duì)象的大型場(chǎng)景,也能實(shí)時(shí)圖形化顯示。主要用到的類有 QGraphicsItem、QGraphicsView 和QGraphicsScene 這三個(gè)類。Graphics View 提供一個(gè)QGraphicsScene 充當(dāng)?shù)膱?chǎng)景即是我們添加圖形的空間,相當(dāng)于整個(gè)世界;一個(gè)QGraphicsView 作為視口,也就是我們觀察的窗口,相當(dāng)于照相機(jī)的取景框,這個(gè)取景框可以覆蓋整個(gè)場(chǎng)景,也可以是場(chǎng)景的一部分;一些QGraphicsItem 作為圖元,Qt內(nèi)置了很多圖形,比如line、polygon 等,都是繼承自QGraphicsItem。其結(jié)構(gòu)圖參看圖 。圖 Graphics View 結(jié)構(gòu)圖Fig. Structure of Graphics View
? ? 4.1 地圖坐標(biāo)轉(zhuǎn)換
Graphics View 坐標(biāo)基于笛卡爾坐標(biāo)系統(tǒng),一個(gè)圖元的場(chǎng)景坐標(biāo)具有 坐標(biāo)和 坐標(biāo)。當(dāng)使用沒(méi)有變換的視圖觀察場(chǎng)景時(shí),場(chǎng)景中的一個(gè)單元對(duì)應(yīng)屏幕上的一個(gè)像素。在GraphicsView 中有三個(gè)有效的坐標(biāo)系統(tǒng):圖元坐標(biāo),場(chǎng)景坐標(biāo)和視圖坐標(biāo)。從地圖中提取的經(jīng)緯度坐標(biāo)是不能在直接繪制的,需要轉(zhuǎn)換成Graphics View 里的場(chǎng)景坐標(biāo)才能顯示的。所以必須要進(jìn)行坐標(biāo)轉(zhuǎn)換。地圖文件中的坐標(biāo)系統(tǒng)采取的是經(jīng)緯度坐標(biāo),顯示時(shí)采取的是場(chǎng)景(Scene)坐標(biāo),因此從地圖文件解析 出圖元坐標(biāo)系統(tǒng)時(shí),需要將圖元的經(jīng)緯度坐標(biāo)轉(zhuǎn)化為場(chǎng)景(Scene)坐標(biāo)后才能知道在畫(huà)布的什么位置顯示圖元。畫(huà)布的大小是始終固定不變的,但是它表示的 經(jīng)緯度范圍可變,而它表示的經(jīng)緯度范圍就是進(jìn)行坐標(biāo)轉(zhuǎn)換,地圖縮放,地圖平移的基準(zhǔn)。為了實(shí)現(xiàn)地圖坐標(biāo)的轉(zhuǎn)換,自定義一個(gè)類Convert,利用這個(gè)類, 所有圖元都可以在畫(huà)布上找到準(zhǔn)確的位置顯示,最終顯示整幅地圖。類定義如下:Class Convert{public:convert();double x1;//畫(huà)布左上角代表的經(jīng)度double y1;//畫(huà)布左上角代表的緯度double x2;//畫(huà)布右下角代表的經(jīng)度double y2;//畫(huà)布右下角代表的緯度double x;//當(dāng)前點(diǎn)的經(jīng)度double y;//當(dāng)前點(diǎn)的緯度double w;//當(dāng)前顯示區(qū)域的寬度double h;//當(dāng)前顯示區(qū)域的高度double wx;//當(dāng)前顯示區(qū)域經(jīng)度的范圍double hy;//當(dāng)前顯示區(qū)域緯度的范圍QPoint *point;//存儲(chǔ)坐標(biāo)轉(zhuǎn)換后的點(diǎn)QPoint *convertfun(double x,double y);//轉(zhuǎn)換函數(shù)}轉(zhuǎn)換函數(shù)的實(shí)現(xiàn)如下:QPointF Convert::convertfun(double x,double y){point=new QPointF(((x-x1)/wx)*w-w/2,((y-y1)/hy)*h-h/2);return *point;}
? ? 4.2 圖形對(duì)象的顯示
地圖文件中的圖形對(duì)象就是Graphics View 中的圖元。地圖顯示功能就是把地圖數(shù)據(jù)繪制還原成地圖。將經(jīng)過(guò)坐標(biāo)轉(zhuǎn)換后的圖元存儲(chǔ)到QGraphicsItem 類對(duì)象, 然后在QGraphicsScene 類對(duì)象中繪制出來(lái),最后就能在QGraphicsView 類對(duì)象中顯示出來(lái)。下面以讀取region 對(duì)象為例QPoint *point;//存放圖元節(jié)點(diǎn)QPen pen;QVectot pointRegion;//存放一個(gè)多邊形所有節(jié)點(diǎn)容器QPointgonF *pPolygonF;//多邊形指針QGraphicsPolygonItem *pPolygonItem;/*QGraphicsView 框架下的多邊形圖元,要把圖元封裝成QGraphicsItem 才能夠在該框架里面顯示。 /double brushColor;//存放當(dāng)前填充顏色double penColor;//存放當(dāng)前畫(huà)筆顏色penColor=mitab_c_get_pen_color(feature);//獲取當(dāng)前圖形對(duì)象的畫(huà)筆 顏色if(feature_type==7){for(int pointno=0;i4.4 電子地圖的縮放
QGraphicsView 支持幾何變換,當(dāng)進(jìn)行視圖變換時(shí),QGraphicsView 保持視圖的中心,通過(guò)應(yīng)用變換,可以很容易地實(shí)現(xiàn)縮放。在視圖類中定義一個(gè)放大的槽函數(shù)和一個(gè)縮小的槽函數(shù),將槽和具有autoRepeat 屬性的QPushButton 進(jìn)行連接,就可以實(shí)現(xiàn)連續(xù)的縮放操作。下面是兩個(gè)槽函數(shù)Public slots:Void zoomIn() {scale(1.5,1.5);}Void zoomOut() {scale(1.5,1.5);}通過(guò)以上步驟就可以實(shí)現(xiàn)簡(jiǎn)單的電子地圖瀏覽,最終程序運(yùn)行的結(jié)果如圖4,放大之后的結(jié)果如圖 。其中zoomin 是地圖縮小按鈕,zoomout 是地圖放大按鈕。地圖數(shù)據(jù)來(lái)源于太原市MapInfo 格式的地圖的第一層。圖 太原市電子地圖的第一層圖 放大的電子地圖Fig. First Layer of Taiyuan Electrnic Map Fig. Ampplification of The Electrnic Map
? ? 4.5 GPS 模塊
由于GPS 定位信息內(nèi)容較少,因此多用RS-232 串口將定位信息 6][7](NAME0183 語(yǔ)句從GPS 接收機(jī)送到計(jì)算機(jī)中進(jìn)行信息提取處理。通常采取輪詢串口和事件觸發(fā)兩種方式對(duì)數(shù)據(jù)進(jìn)行接收和處理,本系統(tǒng)采用事件觸發(fā)方式來(lái)提取讀取串口信息。事件采用 Qt 類庫(kù)中的Qtimer 類 8],將Qtimer 的timeout 信號(hào)與自定義槽slotReadGPSInfo()連接起來(lái)。當(dāng)時(shí)間到時(shí)(比如1s)系統(tǒng)就會(huì)調(diào)用slotReadGPSInfo 函數(shù)讀取串口信息。對(duì)于本文所使用的GPS 接收板,其發(fā)送到計(jì)算機(jī)的數(shù)據(jù)主要是由幀頭、幀尾和幀內(nèi)數(shù)據(jù)組成,根據(jù)數(shù)據(jù)幀的不同,幀頭也不相同,主要有 $GPGGA“、 $GPGSA“、 GPGSV“[5]以及 $GPRMC“等。每種幀頭后的數(shù)據(jù)也有固定的格式,各幀均以回車符和換行符作為幀尾標(biāo)識(shí)一幀的結(jié)束。我們所關(guān)心的定位數(shù)據(jù)如經(jīng)緯度、速度、時(shí)間等均可以 從 $GPRMC“幀中獲得。然后把經(jīng)緯度坐標(biāo)轉(zhuǎn)換成場(chǎng)景坐標(biāo),以圖元的形式加載到場(chǎng)景中,就可以實(shí)現(xiàn)定位了。5 結(jié)束語(yǔ)
該系統(tǒng) 實(shí)現(xiàn)電子地圖瀏覽和定位等功能,是嵌入式GPS 定位導(dǎo)航系統(tǒng)的基礎(chǔ)。本文詳細(xì)說(shuō)明了具體的實(shí)現(xiàn)步驟。還有很多功能沒(méi)有實(shí)現(xiàn),例如導(dǎo)航,值得進(jìn)一步研究。本方案設(shè)計(jì)的電子地圖,運(yùn)行速度快,費(fèi)用低,很適 合用在旅游景點(diǎn)導(dǎo)游,城市路徑規(guī)劃,車輛導(dǎo)航等方面,具有一定的實(shí)用價(jià)值和經(jīng)濟(jì)價(jià)值。
總結(jié)
以上是生活随笔為你收集整理的Linux 平台下基于Qt 的电子地图的绘制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 心理测评软件php mysql_心理测评
- 下一篇: linux qq 中文输入法下载,百度输