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