摘? 要: 在GIS應(yīng)用中,許多現(xiàn)有的商業(yè)GIS方案需要聯(lián)網(wǎng)在線訪問地圖數(shù)據(jù),如果網(wǎng)絡(luò)狀況不佳可能會訪問延遲甚至失敗,影響用戶使用體驗。本文使用C++編程技術(shù)實現(xiàn)了一種低成本的不依賴于網(wǎng)絡(luò)的離線地圖GIS解決方案。
關(guān)鍵詞: GIS;WebGIS;離線地圖;在線地圖
中圖分類號: TP302.1? ? 文獻標識碼: A? ? DOI:10.3969/j.issn.1003-6970.2019.10.032
本文著錄格式:朱森光. 一種低成本的離線地圖GIS解決方案[J]. 軟件,2019,40(10):142146
A Low-cost Offline Map GIS Solution
ZHU Sen-guang
(Shanghai Yazhu Intelligent Technology Co., Ltd., Shanghai 201100, China)
【Abstract】: In GIS applications, many existing commercial GIS solutions require online access to map data. If the network is not in good condition, the access delay or even failure may affect the user experience. This paper uses C++ programming technology to implement a low-cost offline map GIS solution.
【Key words】: GIS; WebGIS; Offline map; Online map
0? 引言
越來越越多的項目需要使用GIS地圖功能[1-6],商業(yè)GIS地圖軟件功能繁多、復(fù)雜度高,核心功能模塊封裝成庫,對外只提供二次開發(fā)接口,編程靈活度不高,價格也較貴,普通用戶承受不起。本文研究實現(xiàn)了一種低成本的離線地圖GIS方案,可在某些預(yù)算較少的項目中使用。
1? 原理
我們平??吹降牡貓D都是平面地圖,而地球是個球體,這就需要一種將球體表面曲面映射成二維平面的方法,比較常用的映射方法是墨卡托投影法[7]。
墨卡托投影算法有好幾個變種,各GIS地圖廠家使用自己的變種算法,本文的方案由于要用到開放地圖openstreetmap網(wǎng)站的地圖瓦片資源,所以使用openstreetmap的投影算法進行描述,設(shè)lon為經(jīng)度,lat為緯度,z為地圖放大層級,(x,y)為平面地圖的像素坐標,則有:
(1)
(2)
這里解釋一下地圖放大層級z這個參數(shù),當我們?yōu)g覽平面地圖時通過鼠標滾輪上下滾動可以縮放地圖,當?shù)貓D縮小時z就減小,當?shù)貓D放大時z就增大。圖1示意了當z=1時的世界地圖。
從圖1中可以看到,當z=1時,世界地圖被分成了4小塊,每小塊小地圖為256*256像素大小稱之為一個瓦片,每個瓦片的坐標用列col和行row來表示,z=1時4個瓦片小地圖拼成了一幅世界地圖,地圖在硬盤上就是以這4個瓦片小圖片的形式存儲的。
圖2為z=5時的中國中部地區(qū)地圖,可以看到此時地圖上的西安市所在的瓦片坐標為列col=25,行row=12,瓦片個數(shù)已經(jīng)遠遠大于4了,z越大組成地圖的瓦片個數(shù)就越多,地圖分辨率也越高。
2? 軟件實現(xiàn)
2.1? 地圖拼接顯示
既然是離線GIS地圖方案那么首先要把地圖從網(wǎng)絡(luò)下載到本地硬盤,可以從開放地圖openstreet map網(wǎng)站下載。離線GIS地圖是以瓦片小圖片形式存儲在本地硬盤的,圖3為瓦片小圖片在文件管理器里的瀏覽視圖,每個瓦片小圖片大小為256*256像素,以png圖像格式存儲。
將這些瓦片拼接在一起就形成了一幅完整的地圖,軟件顯示地圖時,首先根據(jù)當前分辨率計算出對應(yīng)的放大層級z,然后根據(jù)地圖顯示區(qū)域計算出所需的一系列瓦片的行號和列號,最后將這些瓦片在內(nèi)存中拼接成完整的地圖在界面上顯示。圖4為地圖在軟件界面上顯示的效果圖。
需要指出的是本文使用的地圖拼接方法跟目前流行的WebGIS[8]有所不同。WebGIS使用HTML5[9]的canvas畫布技術(shù),使用javascrip腳本來完成地圖拼接顯示,本文是用C++編程技術(shù)實現(xiàn)的,C++的編譯后運行比腳本語言的解釋運行效率要高很多,本地硬盤訪問瓦片數(shù)據(jù)也比WebGIS通過網(wǎng)絡(luò)在線訪問服務(wù)器上的瓦片數(shù)據(jù)要快。
2.2? 縮放平移
2.2.1? 縮放
在圖4所示的軟件界面中,鼠標點擊“放大”按鈕,地圖放大層級z增大,地圖分辨率提高,點擊“縮小”按鈕,地圖放大層級z減小,地圖分辨率降低。z變化后拼接地圖的瓦片列col,行row也相應(yīng)變化,軟件到硬盤上讀取新的瓦片小圖片重新拼接后在界面上顯示即可。放大縮小也可以通過鼠標滾輪上下滾動來觸發(fā),滾輪上滾地圖放大,滾輪下滾地圖縮小。
圖5為將圖4的地圖放大后的地圖效果圖。
圖6為將圖4的地圖縮小后的地圖效果圖。
2.2.2? 平移
通過鼠標點擊拖拽可以實現(xiàn)平移,平移不會改變放大層級z,但平移后界面視野內(nèi)的地圖內(nèi)容發(fā)生了變化,也就是視野內(nèi)組成地圖的瓦片列col,行row發(fā)生了變化,軟件到硬盤上讀取新的瓦片小圖片重新拼接后在界面上顯示就實現(xiàn)了平移效果。
圖7為對圖4的地圖進行平移后的地圖效果圖,可以看到地圖上黃浦江的位置往右明顯平移了。
2.3? 坐標計算
2.3.1? 根據(jù)經(jīng)緯度坐標計算地圖像素坐標
GIS地圖一個常用的功能就是根據(jù)經(jīng)緯度坐標計算地圖上的位置,這是通過式(1)、式(2)來計算的。為了驗證此功能,事先通過GPS在上海市世紀大道沿線采集了如下16個經(jīng)緯度坐標數(shù)據(jù):
通過式(1)、式(2)計算出對應(yīng)平面地圖上的16個點的像素坐標,為了直觀顯示效果,軟件以每個像素點為中心畫出了16個紅顏色填充的小圓圈,效果如圖8所示。
圖8中16個密集的紅色小圓圈示意出了世紀大道上的一系列采集點的位置,擬合出來的路徑跟實際GPS采集的路徑數(shù)據(jù)基本吻合。
2.3.2? 根據(jù)地圖像素坐標計算經(jīng)緯度坐標
計算地圖上某點的經(jīng)緯度坐標只要將式(1)、式(2)反推得到如下式(3)、式(4)所示的公式進行計算就可以了。
lon = *360 – 180 (3)
*(4)
在軟件界面中通過縮放平移操作讓上海國際會議中心位于地圖正中心,然后將鼠標移至上海國際會議中心正上方位置取其在地圖上的像素坐標(x,y),使用式(3)、式(4)的公式計算得到上海國際會議中心的經(jīng)緯度坐標是(121.492395,31.241517),結(jié)果顯示在界面左上角如圖9所示。
2.4? 位置標注
位置標注是指可以在地圖上點擊某個位置放置一個圖標并標注描述文字,點擊“標注”按鈕然后在地圖的北京位置上方點擊鼠標左鍵彈出圖10所示的輸入框。
輸入“北京測試點”后點“確定”按鈕,此時在地圖上上海的位置就出現(xiàn)了一個圖標,圖標下方顯示“北京測試點”字樣,用同樣的方法再添加其它幾個標注點,最終效果如圖11所示。
這里有三個編程實現(xiàn)技術(shù):位置定位、圖標在地圖上疊加和文字醒目顯示。位置定位是指記錄標注位置時記錄的是換算后的經(jīng)緯度數(shù)據(jù)而不是屏幕坐標數(shù)據(jù),這樣才能保證地圖縮放平移后可以計算出新的屏幕坐標正確顯示;圖標在地圖上疊加時要保證圖標矩形區(qū)域不能完全遮住地圖,要用到圖像掩碼技術(shù)[10];文字顯示采用在藍色矩形背景色上畫白色文字的方法使其看上去更醒目。
2.5? 矢量圖疊加
矢量圖包括點、線、面以及由它們組成的圖案,矢量圖在地圖上疊加后的效果如圖12所示。
畫矢量圖時矢量圖的幾何參數(shù)要轉(zhuǎn)換為經(jīng)緯度坐標數(shù)據(jù),并且需要設(shè)計統(tǒng)一的格式進行存儲[11],這樣便于與其它軟件進行數(shù)據(jù)交換,具備導(dǎo)入其它軟件生成的矢量圖數(shù)據(jù)文件在地圖上疊加顯示的 功能。
2.6? 測距離
測距離指計算地圖上兩點之間的最短距離。地
球是個球體,地球表面兩點之間的最短距離是通過這兩點的大圓的劣弧線的長度。
設(shè)地球半徑為R,起始點A經(jīng)度為lng1,緯度為lat1,終點B經(jīng)度為lng2,緯度為lat2,以球心O為原點,球心指向零經(jīng)度、零緯度點方向為X軸,球心指向90度經(jīng)度、零緯度點方向為Y軸,球心指向北極為Z軸建立XYZ坐標系。則:
起始點A在XYZ坐標系下的坐標為
Ax = R*cos(lat1)*cos(lng1) (5)
Ay = R*cos(lat1)*sin(lng1) (6)
Az = R*sin(lat1) (7)
終點B在XYZ坐標系下的坐標為
Bx = R*cos(lat2)*cos(lng2) (8)
By = R*cos(lat2)*sin(lng2) (9)
Bz = R*sin(lat2) (10)
設(shè)OA與OB的夾角為θ,則由向量點積公式得到:
(11)
那么AB兩點的距離s就是過AB兩點的圓弧長度,公式如式(12)所示。
(12)
如圖13所示,點擊“測距”按鈕,然后在地圖上先后點擊南京和武漢兩個位置,軟件通過式(12)計算出南京和武漢之間的最短距離為458.212千米。
3? 結(jié)語
本離線地圖GIS方案使用C++編程技術(shù)實現(xiàn),由于是自主開發(fā),技術(shù)可控,后續(xù)進行功能擴展非常方便,可以實現(xiàn)很多在線WebGIS方案實現(xiàn)不了的功能,比如:通過圖像邊緣分析算法[12]對地圖內(nèi)容進行分析可以實現(xiàn)自動計算出某個地區(qū)邊界線的長度和區(qū)域面積、根據(jù)道路圖像特征自動提取道路坐標數(shù)據(jù)、根據(jù)建筑物圖像特征自動統(tǒng)計人口居住密度等等,WebGIS方案由于采用的是腳本語言編程很難實現(xiàn)這些高級功能。目前是在windows平臺下開發(fā)的,后面計劃將其移植到linux平臺下,實現(xiàn)跨平臺的離線地圖GIS方案。
參考文獻
[1]趙桔青, 陶福壽. 基于GIS的城鎮(zhèn)土地資源承載力評價[J]. 軟件, 2018, 39(7): 52-56.
[2]沈亮. 基于手機APP\GIS\OLAP的移動運營商網(wǎng)格集中管理中心系統(tǒng)的設(shè)計與實現(xiàn)[J]. 軟件, 2016, 37(4): 74-83.
[3]張思佳. 基于RS/GIS的長沙市土地利用和穩(wěn)定性分析[J]. 軟件, 2018, 39(7): 124-129.
[4]李振星, 邵峰晶, 孫仁誠, 李淑靜, 吳舜堯. 基于分類的GIS地圖符號快速標注算法[J]. 軟件, 2012, 33(2): 108-110.
[5]陳美伊. 基于GIS 的旅游景區(qū)虛擬實現(xiàn)技術(shù)的研究[J]. 軟件, 2015, 36(10): 30-32.
[6]梁秋實, 桑新柱, 邢樹軍. 利用多視點自由立體顯示系統(tǒng)實時顯示GIS 信息[J]. 軟件, 2016, 37(01): 44-47.
[7]何碧容, 蔡倩. 基于Web墨卡托投影的導(dǎo)航電子地圖設(shè)計[J]. 計算機測量與控制, 2017, 25(1): 119-122.
[8]徐子惠, 王方雄, 顧雙飛, 等. 城市交通警情 WebGIS 設(shè)計與開發(fā)[J]. 軟件, 2018, 39(9): 166-169.
[9]徐莎, 楊帆, 徐昌慶. 基于HTML5的WebGIS 的研究與應(yīng)用[J]. 信息技術(shù), 2012, (4): 149-151.
[10]黃靜, 王希, 齊東旭, 唐澤圣. 基于二值掩碼圖像的圖像合成方法及其應(yīng)用[J]. 計算機輔助設(shè)計與圖形學(xué)學(xué)報, 2009, 21(5): 674-679.
[11]鐘云海, 鄭海, 王孝通. 矢量圖的統(tǒng)一表示框架[J]. 中國航海, 2006, (4): 20-22.
[12]李立宗. OpenCV編程案例詳解[M]. 北京: 電子工業(yè)出版社, 2016: 99-140.