微軟Bing 地圖服務提供了全球地圖,使用者可以進行平移、放大或縮小操作。但是我們可曾考慮過,地圖系統的後台是怎麼工作的?在進行地圖操作的時候,我們會發現並不是整個地圖一次性載入顯示的,而是一塊塊的小地圖分別顯示。沒錯,為了使地圖的瀏覽速度更快,地圖互動更流暢,目前包括微軟Bing 地圖服務在內的幾乎所有線上電子地圖都事先對地圖圖片(Tile)進行預先處理。本文主要描述地圖映射、座標系以及地圖Tile編碼體系,統稱為Bing 地圖服務圖片系統(Bing Maps Tile System)。 【地圖映射】為了使地圖看起來是無縫(Seamless)的,並且確保來自不同資料來源的衛星照片能夠完美的拼接,必須有一個統一的地圖映射系統,這就是Bing 地圖服務所採用的墨卡托映射(Mercator Projection)。在上一篇文章中我們已經簡單介紹了Mercator Projection。通過Mercator Projection,整個地球可以展示為如下平面地圖:儘管Mercator Projection會使地球比例尺和某些地區變形,尤其在兩極,它還是有不可磨滅的貢獻的:1)首先它是共形映射(Conformal Projection),即保留了物體的原有形狀。這在展示衛星照片的時候很重要,因為我們所看到的正方形建築就應該是正方形的,而不是長方形的。2)其次它是柱狀體映射,即南北極在地圖的正下、上方,而東西方向處於地圖的正右、左。由於Mercator Projection在兩極附近是趨於無限值得,因此它並沒完整展現了整個世界,地圖上最高緯度是85.05度。為了簡化計算,我們採用球形映射,而不是橢球體形狀。雖然採用Mercator Projection只是為了方便展示地圖,需要知道的是,這種映射會給Y軸方向帶來0.33%的誤差。 【精度和比例尺】 為了準確顯示地圖,除了地圖映射我們還需要指定地圖精度或者比例尺。在最低地圖放大層級(1級),地圖是512 x 512像素。每下一個放大層級,地圖的高度和寬度分別乘於2:2級是1024 x 1024像素,3級是2048 x 2048像素,4級是4096 x 4096像素,等等。通常而言,地圖的寬度和高度可以由以下式子計算得到:
map width = map height = 256 * 2^level
pixels
地圖精度表示螢幕上每個像素所代表的實際距離,例如精度為10m,表示每個像素代表10m的距離。在每個放大層級(Xoom Level)和不同緯度下,地圖的精度都是不同的。假設地球直徑為6378137米,地圖精度(米/像素)可以由如下式子計算得到:
ground resolution = cos(latitude * pi/180) * earth circumference / map width
= (cos(latitude * pi/180) * 2 * pi * 6378137 meters) / (256 * 2^level pixels)
地圖比例尺是指測量相同目標時,地圖上距離與實際距離的比例。例如,在地圖比例尺為1:10萬時,地圖上每厘米代表地面距離為10萬厘米。和地圖精度一樣,比例尺也隨著地圖放大層級和緯度的不同而不同。假設螢幕的解析度為96dpi,比例尺可以由如下式子計算得到:
map scale = 1 : ground resolution * screen dpi / 0.0254 meters/inch
= 1 : (cos(latitude * pi/180) * 2 * pi * 6378137 * screen dpi) / (256 * 2^level * 0.0254)
下表顯示了在赤道上,不同放大層級下對應的地圖精度和比例尺: