


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