梅榮月
摘要:提出并實現(xiàn)了一種基于Qt的輕量級電子地圖。該地圖在墨卡托投影坐標系下,使用當前流行的地圖瓦片技術(shù),利用nginx搭建地圖瓦片服務(wù)器,滿足企業(yè)輕量級應(yīng)用業(yè)務(wù)開發(fā)需求,具有跨平臺、功能豐富、效率高等特性,具有良好的移植性、維護性和擴展性。
關(guān)鍵詞:電子地圖;地圖瓦片;墨卡托投影;Qt;Nginx
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2021)09-0076-02
開放科學(xué)(資源服務(wù))標識碼(OSID):
1 背景
隨著社會和科技的發(fā)展,地理信息系統(tǒng)(GIS)在社會信息化的進程中起到了不可或缺的作用。地理信息系統(tǒng)作為人口、資源與環(huán)境問題的公共展示平臺,在國家推動信息化和現(xiàn)代化的過程中起到非常重要的作用[4]。地理信息系統(tǒng)以其跨行業(yè)、多功能的優(yōu)勢,不斷開拓新的應(yīng)用領(lǐng)域,廣泛應(yīng)用于教育、醫(yī)療、自動駕駛、建筑等行業(yè)。為了滿足自動化辦公需求,企業(yè)在業(yè)務(wù)開發(fā)中對地理信息系統(tǒng)的需求日益增加。當前流行的Arc GIS平臺以及開源的Geo Server平臺對計算機的硬件配置要求非常高,而在輕量級業(yè)務(wù)開發(fā)中,由于成本問題,大型商用GIS平臺都不適用。所以輕量級的電子地圖在小型業(yè)務(wù)開發(fā)中具有廣闊的應(yīng)用場景。
2 概述
眾所周知地球是一個三維的橢圓球體,人們平時使用的地圖都是在一個二維平面上,將三維的經(jīng)緯度信息(即球面坐標信息)轉(zhuǎn)換成二維的平面坐標信息的過程就稱為投影。本文中的電子地圖使用的是墨卡托(Mercator) 投影[3],墨卡托投影具有等角特性,在當今的導(dǎo)航產(chǎn)業(yè)中發(fā)揮著重要的作用。
投影完成后,橢圓的地球就變成了一幅正方形的平面地圖。在投影的過程中存在不可避免的誤差,本文中的電子地圖緯度表示范圍為(-85.09—85.09),但這并不影響正常的使用。由于地球上的元素信息太多太多,一張圖片肯定不能涵蓋全部信息,本文中的電子地圖使用了當前流行的地圖瓦片技術(shù),地圖瓦片按層級存儲在地圖瓦片服務(wù)器中。在第0級的時候,世界地圖用1張256 × 256像素的圖片就可以表示,地圖上只有一些宏觀的地理信息;在第1級的時候,世界地圖用4張256 × 256像素的圖片表示,地圖上的地理信息更豐富一些;依次類推,在第n級的時候,世界地圖用
本文的電子地圖使用的地圖瓦片是從Google地圖瓦片服務(wù)器上下載下來的,具體的瓦片地址如下:http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x=420&y=193&z=9&s=Galil。其中mt2.google.cn表示Google地圖瓦片服務(wù)器地址,替換為mt1.google.cn依然有效,為減輕服務(wù)器負載,提高網(wǎng)絡(luò)訪問效率,Google提供多臺瓦片服務(wù)器;lyrs表示的是瓦片類型,具體含義如下,m:路線圖,t:地形圖,p:帶標簽的地形圖,s:衛(wèi)星圖,y:帶標簽的衛(wèi)星圖,h:標簽層(路名,地名等);x表示瓦片的橫向索引,起始位置在最左邊,數(shù)值為0,向右+1遞增;y表示瓦片的縱向索引,起始位置在最上面,數(shù)值為0,向下+1遞增;z表示地圖的級別,最高一級為0,向下+1遞增[1]。為方便瓦片地圖的拼接,本文將地圖瓦片以x_y_z.png格式命名,分類型按層級保存在服務(wù)器上,將同一層級的地圖瓦片存儲在同一個文件夾中。
3 設(shè)計
3.1 架構(gòu)設(shè)計
為了滿足電子地圖的跨平臺需求,本文選擇具有跨平臺特性的開發(fā)庫Qt。Qt 是一個1991年由Qt Company開發(fā)的跨平臺C++圖形用戶界面應(yīng)用程序開發(fā)框架,具有優(yōu)良的跨平臺特性、良好的封裝機制、豐富的API以及大量的開發(fā)文檔[5]。為了滿足電子地圖的可移植性和可維護性需求,本文使用nginx搭建圖片服務(wù)器。nginx 是一個高性能的HTTP和反向代理web服務(wù)器,同時也提供了IMAP/POP3/SMTP服務(wù),因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名[6]。
本文的電子地圖可以分為服務(wù)器和客戶端兩部分,客戶端使用Qt開發(fā),封裝成庫,可以在應(yīng)用軟件開發(fā)中直接調(diào)用,服務(wù)器使用nginx配置圖片服務(wù)器,存儲地圖瓦片,客戶端和服務(wù)器之間的通信使用HTTP協(xié)議,Qt提供了QNetworkAccessManager類。服務(wù)器和客戶端獨立設(shè)計、獨立實現(xiàn),可以使本文的電子地圖具有良好的維護性和移植性。
3.2 功能設(shè)計
本文中的電子地圖功能豐富,交互性強,實現(xiàn)了地圖顯示、地圖縮放、地圖漫游和地圖標繪等功能。地圖顯示功能:根據(jù)用戶的個性化選擇,顯示用戶需要的地圖,支持多種類型的地圖(例如:路線圖、地形圖、衛(wèi)星圖等);縮放功能:本文在圖片服務(wù)器上存儲了多個層級的地圖瓦片,可以根據(jù)用戶的需求顯示對應(yīng)層級的地圖,地圖層級的變換就是地圖的縮放,放大地圖時用戶可以看到更多的細節(jié),縮小地圖時,用戶可以看到更廣闊的范圍;漫游功能:在比例尺不變的情況下,用戶通過拖曳等操作對地圖內(nèi)容進行選擇,調(diào)整地圖的表達區(qū)域,在屏幕上形成一張新的地圖;標繪功能:為了增強人機交互體驗,本文中的電子地圖提供了輔助標繪接口,用戶可以使用這些接口在地圖上繪制點、線、多邊形、矢量圖、圖片和文字等信息。
從業(yè)務(wù)邏輯出發(fā),本文的電子地圖分為地圖層、事件層和標繪層。地圖層負責顯示各種類型的地圖,如路線圖、地形圖和衛(wèi)星圖等;事件層負責處理鼠標事件(如點擊、移動、滾輪等)和鍵盤事件(如上、下、左、右和Enter等),電子地圖在事件層捕捉事件,在地圖層做出對應(yīng)的操作,如滾動鼠標滾輪,放大或縮小地圖比例尺;標繪層是本文的電子地圖對外提供的接口,用戶可根據(jù)自身需求調(diào)用相應(yīng)接口在地圖上繪制需要顯示的信息。
4 實現(xiàn)
Qt的2D繪圖功能非常強大,使用Qt提供的繪圖引擎可以直接在設(shè)備屏幕或圖片上繪制圖形,本文中的電子地圖就是先將地圖瓦片繪制在QPixmap之上,然后通過引擎顯示在屏幕上,用這種方式用戶可以很方便地將當前地圖保存為本地圖片。本文中的電子地圖基于Qt的繪圖系統(tǒng)實現(xiàn)了地圖層和標繪層的各項功能,基于Qt的事件處理機制實現(xiàn)了事件層的各項功能。
4.1 地圖層
為了在客戶端得到一幅完整的地圖,本文需要將服務(wù)器中的一張張256 × 256像素的地圖瓦片拼接起來,而實現(xiàn)上述功能,最重要的就是完成屏幕像素與墨卡托投影坐標系下地理經(jīng)緯度之間的相互轉(zhuǎn)換。在此基礎(chǔ)上,只要知道地圖中心點的經(jīng)緯度、屏幕像素大小和地圖層級,就可以拼接出一幅完整的地圖。
式(1)和式(2)中已知一個點的經(jīng)緯度和地圖層級,計算該點所在地圖瓦片的索引值,其中l(wèi)ongitude為已知的經(jīng)度,latitude為已知的緯度,zoom為當前地圖層級,tileX為當前層級下所求地圖瓦片的橫向索引,tileY為當前層級下所求地圖瓦片的縱向索引。根據(jù)上述兩個公式,已知屏幕中心點經(jīng)緯度和地圖層級,可以計算出屏幕中心點所在的瓦片索引,再根據(jù)顯示設(shè)備的屏幕大小計算出鋪滿整個屏幕所需要的所有瓦片的起始索引和結(jié)束索引,遍歷就可以將得到的地圖瓦片拼接成一幅完整的地圖。利用式(1)和式(2)也可以實現(xiàn)地圖縮放功能,地圖縮放時,屏幕中心點的經(jīng)緯度不變,地圖層級發(fā)生變化,根據(jù)當前層級重新計算地圖瓦片的起始索引和結(jié)束索引,遍歷就可以得到縮放后的地圖。
4.2 事件層
根據(jù)式(1)和式(2)拼接出的地圖只是一幅靜態(tài)的地圖,并不能滿足用戶地圖漫游需求。本文利用Qt的事件機制,重寫了鼠標事件和鍵盤事件,實現(xiàn)了地圖縮放和地圖漫游功能。在地圖進行縮放或漫游時,一個點在地圖上的像素值是相對的,跟屏幕的大小相關(guān),而它的經(jīng)緯度是絕對的,和屏幕的大小無關(guān)。為了保證地圖顯示的正確性,需要將點在屏幕上的像素值轉(zhuǎn)換為點在地圖上的經(jīng)緯度。
式(3)和式(4)中,已知一個點的地圖瓦片索引值和該點在瓦片上的相對像素值以及地圖層級,計算該點的經(jīng)緯度,其中l(wèi)ongitude為所求的經(jīng)度,latitude為所求的緯度,zoom為當前地圖層級,tileX為當前層級下的地圖瓦片的橫向索引,tileY為當前層級下的地圖瓦片的豎向索引,pixelX為該點在當前瓦片上的橫向像素值,pixelY為該點在當前瓦片上的豎向像素值。通過上述公式就可以將鼠標拖動造成的像素變化轉(zhuǎn)換為中心點的經(jīng)緯度變化,再依據(jù)4.1中的式(1)和式(2)就可以得到一張新的地圖,這樣就實現(xiàn)了地圖漫游功能。
4.3 標繪層
為了實現(xiàn)信息表達的多樣性,本文中的電子地圖在地圖層和事件層的基礎(chǔ)上實現(xiàn)了標繪層。利用標繪層,用戶可以在地圖上繪制點、線、面、矢量圖和文字等多種類型的信息。線、面和矢量圖等信息所占用的像素大小與地圖標尺息息相關(guān),它們會隨著地圖標尺的變化而變化,這時就需要知道地圖的地面分辨率。地面分辨率是一個像素(pixel)代表的地面尺寸(米),單位為米/像素[2]。
式(5)中已知地圖層級以及當前層級下屏幕中心點的緯度,計算當前層級地圖的地面分辨率,其中D為常量,是墨卡托投影下地球周長的一半,值為20037508.3427892,zoom為地圖層級,centerLatitude為屏幕中心點的緯度,resolution為地面分辨率。
利用屏幕像素與經(jīng)緯度之間的轉(zhuǎn)換公式和地面分辨率就可以在地圖上繪制各種復(fù)雜的標繪信息。本文中的電子地圖對外提供了點、線、面、矢量圖和文字等接口,用戶也可根據(jù)自身的信息表達需求自定義標繪內(nèi)容。在智慧哨兵項目中,利用標繪層實現(xiàn)了攝像頭、警戒區(qū)和影響區(qū)域等繪制。
4.4 瓦片服務(wù)器
由于地圖瓦片的數(shù)量多,占用的磁盤空間大,為了使電子地圖具有更好的移植性和維護性,本文使用了nginx創(chuàng)建圖片服務(wù)器。在一臺裝有Linux RedHat7.6系統(tǒng)的服務(wù)器上安裝nginx1.18.0,配置nginx.conf文件,修改root路徑為地圖瓦片存儲的根目錄,通過ftp將地圖瓦片上傳到服務(wù)器。以本文為例,圖片服務(wù)器創(chuàng)建成功后,帶標簽衛(wèi)星圖第七層橫向索引102縱向索引48的瓦片url地址為192.168.1.100/map/y/7/7_102_48.png,在客戶端使用該url地址就可以訪問此瓦片。
5 結(jié)束語
本文設(shè)計并實現(xiàn)了一種基于Qt的輕量級電子地圖,具有跨平臺、功能豐富和效率高等特性,兼顧了可移植性、可維護性和可擴展性,對現(xiàn)行的大型地理信息系統(tǒng)具有良好的補充作用。本文中的電子地圖在多個輕量級的應(yīng)用開發(fā)中表現(xiàn)良好,能夠很好地滿足用戶的需求。
參考文獻:
[1] 崔金紅,王旭.Google地圖算法研究及實現(xiàn)[J].計算機科學(xué),2007,34(11):193-195.
[2] 胡水平,岳淑英,張求喜.谷歌地圖衛(wèi)星影像數(shù)據(jù)獲取關(guān)鍵技術(shù)研究[J].測繪與空間地理信息,2018,41(10):79-81,85.
[3] 任留成,楊曉梅,趙忠明.空間墨卡托投影研究[J].測繪學(xué)報,2003,32(1):78-81.
[4] 龍毅,溫永寧,盛業(yè)華.電子地圖學(xué)[M].北京:科學(xué)出版社,2006.
[5] 布蘭切特,薩默菲爾德.C++ GUI Qt4編程:C++ GUI programming with Qt 4[M]. 閆鋒欣,曾泉人, 張志強,等譯.北京:電子工業(yè)出版社,2008.
[6] Reese W.Nginx:the high-performance web server and reverse proxy[EB/OL].[2020-08-20].https://www.linuxjournal.com/article/10108.
【通聯(lián)編輯:謝媛媛】