.NET開發筆記(二十三) 谷歌地圖下載

周見智發表於2014-02-19

關於如何將地球經緯度座標系統轉換成程式中常用到的平面2D座標系統,網上的文章很多,參考http://www.cnblogs.com/beniao/archive/2010/04/18/1714544.html(本文圖1 圖3來自此處).谷歌地圖採用的投影方式為“墨卡託投影法”(維基百科網址http://en.wikipedia.org/wiki/Mercator_projection),大概意思就是將地球放在一個圓柱中,讓地球赤道和圓柱壁相接觸,在地球中心放一盞燈,地球上的影象在圓柱壁上會產生陰影,然後將圓柱壁展開,得到的一張“長方形地圖”即為轉換之後的平面2D地圖,描述很簡單,實際展開後的地圖還進行了其他處理。

圖1

可以想象到,地球上的經度經過燈光的照射之後,在圓柱壁上生成的陰影應該是均勻分步的,而緯度就不一樣了,緯度經過燈光照射之後,離赤道越近的分佈越密,離赤道越遠的分步越稀,到了地球兩極(南極和北極),就會趨向無窮稀,因此谷歌地圖並沒有包含地球兩極的區域(北邊到北緯85度,南邊到南緯85度,大概)。

谷歌地圖包含的地球範圍為 經度:0度~東經180,0度~西經180(共360度),緯度:0度~北緯85,0度~南緯85(共170度)。注:以上0經度表示通過英國的本初子午線,0緯度指赤道。轉換成平面2D圖之後,原點(0,0)在左上方(跟程式中一致),用畫素作為單位,這樣一來,地球上任何一個點(經度,緯度)都能轉換成平面2D座標系統中的一個點(x,y),轉換演算法已經提供了,直接可以拿來使用。前面說到,經度和緯度在圓柱壁上的陰影分步密度不同,緯度遠離赤道分步越稀,因此,雖然經度範圍為360度(-180~180,西經為負,東經為正,自西往東,經度越來越大),遠遠大於緯度170度(-85~85,南緯為負,北緯為正),但是對映到圓柱壁之後生成的圖片的長寬卻是相等的(這個也有後期經過處理的原因),實質上,谷歌地圖的長寬確實是相同的。

由於平面地圖是可以放大縮小的,因此地圖不可能使用同一張圖,這樣放大後就會失真,谷歌地圖的做法就是給地圖預先定義縮放等級(0級~22級,常用的0~17),每一個縮放級別均對應許許多多的小方塊圖片(稱為瓦片),這些小方塊都是256*256畫素,然後將這些瓦片拼接起來生成一張大的清晰的地圖。谷歌地圖的縮放級別與瓦片數目有一個對應關係:瓦片數目=2的n次方*2的n次方(n為縮放級別)。也就是說,當縮放級別為0時,整個世界地圖只1*1張256*256的圖,當縮放級別為1,整個世界地圖包含2*2張256*256大小的圖,當縮放級別為2,整個世界地圖包含4*4張256*256大小的圖。下圖為縮放級別為0時,座標對應關係:

圖2

當縮放級別改變時,整個世界地圖組成變化如下圖:

圖3

谷歌地圖背景顯示原理就是將每個縮放級別下的瓦片下載下來,然後拼接在一起,如果我們知道了下載瓦片的方法,那麼我們也能模擬一個類似谷歌地圖的顯示介面。下面提供的一個demo演示瞭如何根據你提供的兩個經緯度點(左上角,右下角),以及縮放級別,下載這兩點包含區域的瓦片,最後拼接起來。

demo不做過多說明,程式碼中註釋很詳細,注意一下幾點:

  • 谷歌地圖提供API,通過http請求,給出瓦片的列、行以及縮放級別,就可以下載對應的瓦片,

國內地址:http://mt0.google.cn/vt/lyrs=m@234000000&hl=zh-CN&gl=CN&src=app&x=0&y=0&z=0

國外地址:http://mts0.googleapis.com/vt?lyrs=m&x=0&y=0&z=0

其中,地址前面的mt0可以是mt1、mt2、mt3,分別為不同伺服器,對應的,mts0可以為mts1、mts2、mts3。x、y、z分別表示瓦片的列號、行號以及縮放級別。

lyrs表示地圖型別:

m:路線圖

t:地形圖

p:帶標籤的地形圖

s:衛星圖

y:帶標籤的衛星圖

  • demo中填寫的左上角和右下角點的經緯度範圍分別為(-180~180)和(-85~85),而且左上角點的經度一定要小於右下角的經度,左上角的緯度一定要大於右下角的緯度,至於為什麼,原因就是必須能通過這兩點確定一個區域。demo程式中未作判斷。
  • 不要選擇區域過大,或者縮放級別過大,因為包含的要下載瓦片太多,程式沒做任何效能優化,可能出現bug。執行緒不宜太多,太多反而速度慢。如果下載圖片有失敗的,可以重新下載幾次,可以完善一下,比如只下載上次失敗的圖片。
  • demo針對google map,其他地圖類似。本人公司實際專案中用到了從谷歌地圖中下載下來的這些瓦片,模仿谷歌地圖顯示原理做了一個地圖顯示模組。

效果圖:

圖4 demo主介面

圖5 下載完成的瓦片

圖6 拼接瓦片成一張大圖

原始碼下載地址:http://files.cnblogs.com/xiaozhi_5638/GoogleMapDownLoader.rar

VS2010 win7除錯通過,希望有幫助!

相關文章