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