Bing地圖切片原理


Bing地圖切片系統

  Bing地圖提供了一個可以直接平移和縮放的世界地圖。為了讓地圖操作更加平滑和及時響應,我們選擇提前渲染地圖不同層級的細節,並把每個層級的地圖切割成為瓦片以便快速的還原展示。這篇文檔描述了,投影,坐標系統和地圖瓦片編碼的方案,這些統稱為Bing地圖的切片系統。

地圖投影

  為了確保地圖中來自不同航拍影像的排版沒有縫隙,我們不得不對整個地球進行投影,我們選擇使用墨卡托投影,如下圖所示:

  盡管墨卡托投影極大的扭曲了地圖比例和面積(特別是在極點附近),但它具有兩個重要特征,這兩個重要特征超過了它的比例失真帶來的問題。

  1. 他是一個保持形狀的投影,這意味着它保留了相對較小物體的形狀。這在我們展示航拍影像的時候尤為重要,我們希望避免航拍影像中建築物的形狀不被扭曲,建築物的形狀應該是方形,而不是矩形。
  2. 他是一個圓柱投影,這意味着南北方向總是直上直下,東西總是左右延伸。

  因為墨卡托投影在極點方向無窮大的特性,所以它沒有真正展示整個世界。用一個方形寬高比來講,最大唯獨約為85.05度。

  為了簡化計算,我們使用球形來進行這種投影的,而不用橢球形式。由於投影僅用來顯示地圖,而不用來顯示數字坐標,因此我們不需要對橢球投影帶來的額外精度。球形投影在Y方向上大約會引起0.33%的比例失真,這在視覺上不明顯。

地圖分辨率和地圖比例尺


  除了地圖投影外,在渲染地圖之前地圖分辨率和地圖比例尺必須指定。在最低的地圖層級(Level1),地圖是512X512像素,在各個連續的地圖層級,地圖的寬度和高度以2的level次方形式增長,Level2 是1024X1024像素,Level3是2048X2048像素,等等。總之地圖的寬度和高度可以通過以下方式計算:

 1 地圖 width = 地圖 height = 256 * 2level 像素 

  地圖分辨率表示地圖上一像素代表的實際距離,例如,地圖分辨率為10m/pixel,表示地圖上沒像素代表真實距離10米。地圖分辨率是通過地圖層級(Level)和緯度來計算的。使用地球半徑6378137米,地圖的分辨率可以通過如下方式計算:

地圖 resolution = cos(latitude * pi/180) * 地球周長 / map width =(cos(latitude * pi/180) * 2 * pi * 6378137 meters) / (256 * 2level 像素)

  地圖的比例尺表示了在同一個單位體系下地圖上距離和地面距離的比值。舉個例子,地圖比例尺1::100000每英寸表示,地圖上一英寸表示實際距離100000英寸。類似地圖分辨率,地圖比例尺也是通過地圖層級和緯度確定的。通過給定了屏幕分辨率(通常96dpi),則可以根據地圖分辨率計算得出:

scale = 1 : resolution * screen dpi / 0.0254 meters/inch = 1 : (cos(latitude * pi/180) * 2 * pi * 6378137 * screen dpi) / (256 * 2level * 0.0254)

  以下表格展示了從赤道出計算的每個層級上面的具體地圖長寬、分辨率和比例尺信息。

 

層級

地圖高度和寬度 (pixels)

地圖分辨率(meters / pixel)

地圖比例尺(at 96 dpi)

1

512

78,271.5170

1 : 295,829,355.45

2

1,024

39,135.7585

1 : 147,914,677.73

3

2,048

19,567.8792

1 : 73,957,338.86

4

4,096

9,783.9396

1 : 36,978,669.43

5

8,192

4,891.9698

1 : 18,489,334.72

6

16,384

2,445.9849

1 : 9,244,667.36

7

32,768

1,222.9925

1 : 4,622,333.68

8

65,536

611.4962

1 : 2,311,166.84

9

131,072

305.7481

1 : 1,155,583.42

10

262,144

152.8741

1 : 577,791.71

11

524,288

76.4370

1 : 288,895.85

12

1,048,576

38.2185

1 : 144,447.93

13

2,097,152

19.1093

1 : 72,223.96

14

4,194,304

9.5546

1 : 36,111.98

15

8,388,608

4.7773

1 : 18,055.99

16

16,777,216

2.3887

1 : 9,028.00

17

33,554,432

1.1943

1 : 4,514.00

18

67,108,864

0.5972

1 : 2,257.00

19

134,217,728

0.2986

1 : 1,128.50

20

268,435,456

0.1493

1 : 564.25

21

536,870,912

0.0746

1 : 282.12

22

1,073,741,824

0.0373

1 : 141.06

23

2,147,483,648

0.0187

1 : 70.53

像素坐標


  再通過使用地圖層級確定分辨率和比例尺后,我們可以將地理坐標轉換成為像素坐標。由於地圖的高度和寬度在不同地圖層級不一樣,所以像素坐標也是如此。像素坐標在左上角總是(0,0),地圖右上角為(width-1,height-1),或者參考之前的計算公式為:(256X2level-1,256X2level-1),舉個例子,如果地圖級別為3,則像素坐標從(0,0),到(2047,2047),如下:

  給定經度緯度和地圖縮放級別,像素坐標可以通過以下方式進行計算:

  sinLatitude = sin(latitude * pi/180)

  pixelX = ((longitude + 180) / 360) * 256 * 2level

  pixelY = (0.5 – log((1 + sinLatitude) / (1 – sinLatitude)) / (4 * pi)) * 256 * 2level

  其中經度緯度假設是在WGS84參考系統下的。即使Bing地圖使用的是球形投影,將所有地理坐標轉換為常用的橢球坐標也很重要,這里我們選擇WGS84橢球坐標。我們假設經度范圍從-180到+180度,緯度必須限制在-85.05112878到+85.05112878之間。這避免了投影到極點的嚴重變形,並且使得投影能是正方形。、

切片坐標和Quadkeys


  為了優化地圖檢索和顯示性能,每個層級渲染的地圖都被切割成若干個256X256像素的瓦片。由於每個地圖級別的像素數量不相同,因此切片的數量也是不同;

  map width = map height = 2level tiles

  所有切片給定了XY坐標,從左上角的(0,0)到右下角的(2level-1,2level-1)。例如,Level3切片坐標從(0,0)到(7,7),如圖:

  給定一個像素坐標,你可以根據以下公式很快的計算出包含該坐標的瓦片的XY坐標。

tileX = floor(pixelX / 256)

tileY = floor(pixelY / 256)

  為了優化瓦片的所有和存儲,二位瓦片坐標被組合成為四叉樹的以為字符串,簡稱為“QuadKeys”。每個quadkey以特定的地圖級別來唯一表示一個瓦片。並且可以將其用作常用的數據庫B-tree索引中的鍵。為了將瓦片坐標轉換成為quadkey,y和x坐標轉換成二進制(補齊位數為最長結果二進制位數),然后依次從y到x的二進制位數由高到底組合成一個新的二進制數字。然后將其轉為四進制字符串,過程如下:

tileX = 3 =011(二進制)
tileY = 5 =101(二進制)

quadKey = 100111(二進制) = 213(四進制) = “231”

  quadKey有一些很有趣的特性:

  第一:quadKey的長度(組成quadKey的數字的個數)等於相應瓦片所對應的地圖級別。

  第二:任何一個瓦片的quadKey的前面幾位都是他所在父瓦片(上一級別中包含該瓦片的瓦片)的前幾位。

  如下所示:瓦片2 瓦片20到23的父瓦片,瓦片13 是瓦片130到133的父瓦片。

  最后,quadkeys提供了一個可以保留xy空間中所在切片位置的一維索引的關鍵字,換句話說,也就是,具有連接x,y坐標的兩個瓦片通常具有相對靠近在一起的四個秘鑰,這對於優化數據庫性能非常重要,因為通常輝耀組的形式請求相鄰的瓦片,並且希望將這些瓦片保留在想通的磁盤上,以盡量減少磁盤的讀取次數。

 

Sample Code

 

文章翻譯自:Bing Maps Tile System


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM