百度是從中心點經緯度(0,0)度開始計算瓦片,在第1級時百度將世界地圖分為4塊。
中心點右上部分(中國地區)佔1塊。
Google是從左上方經緯度(-180,90)度開始計算瓦片,在第1級時Google將世界地圖分為1塊。
在第2級時,百度地圖(中心點右上部分)分為2塊,
這是因為在這級百度的地圖解析度為65536米/像素,解析度=math.pow(2,(18 - n))。
WGS84球體周長:40075016.685578488,球體周長一半為20037508.34米。
瓦片個數=20037508.34/(65536*256)=1.19。
因此在第2級百度地圖(中心點右上部分)有2塊瓦片。
瓦片編號類似於Excel表格儲存格編號,原點向上和向右為正,向下和向左為負。儲存格X,Y編號從0開始,如右上方第一格X=0,Y=0,X是指向右方向即水平,Y是指向上方向即垂直。
而Google地圖在第2級將世界地圖分為4塊,瓦片編號是向右和向下,沒有負數。
在經緯度(0,0) 的右上方部分即中國區,只有1塊瓦片,而百度卻是2塊。這是為何呢?
這是由於兩者在這級的解析度不同導致的。
經緯度(0,0)右上方瓦片計算:
百度瓦片個數=20037508.34/(65536*256)=1.19,取最大整數為2塊。
Google瓦片個數=20037508.34/( 78271.5169639999*256)=1塊。
百度解析度計算公式:
Double res = math.pow(2,(18 - n)) // n為層數(1-18)
Google解析度計算公式:
Double tileSize=256 //瓦片尺寸(256*256)
Double initialResolution = 2 * math.pi * 6378137 / tileSize //6378137為球體半徑
Double res = initialResolution /math.pow(2,zoom) //zoom為層數(0-21)
ArcGISServer的瓦片組織方式與Google類似。如果想在AGS for Flex中採用百度地圖作為底圖,且想將百度地圖下載為離線資料,並發布瓦片地圖服務供flex 調用,有什麼方法?
以下提供一種解決方案:
1) 開發一個工具,下載百度地圖成離線資料。
2) 開發一個工具,將百度地圖瓦片編號轉成AGS地圖瓦片編號。當然這樣做的話底圖資料就與Google地圖無法吻合。但我們假設底圖只用百度地圖,業務圖座標也是從百度中採集的情況。
3) 如何將百度的瓦片編號轉成AGS瓦片編號,這個沒有什麼公式,我建議固定一個經緯度點,並計算該點的百度和Google的瓦片編號,做為瓦片轉換的參照目標。
以北京天安門的地理座標點(116.407945,39.91349)計算出百度與Google各層瓦片編號。
|
百度 |
Google |
|
層級 |
行 |
列 |
層級 |
行 |
列 |
|
1 |
0 |
0 |
0 |
0 |
0 |
|
2 |
0 |
0 |
1 |
1 |
0 |
|
3 |
1 |
0 |
2 |
3 |
1 |
|
4 |
3 |
1 |
3 |
6 |
2 |
|
5 |
6 |
2 |
4 |
13 |
5 |
|
6 |
12 |
4 |
5 |
26 |
12 |
|
7 |
24 |
9 |
6 |
52 |
24 |
|
8 |
49 |
18 |
7 |
105 |
48 |
|
9 |
98 |
36 |
8 |
210 |
97 |
|
10 |
197 |
73 |
9 |
421 |
194 |
|
11 |
395 |
147 |
10 |
843 |
387 |
|
12 |
790 |
294 |
11 |
1685 |
776 |
|
13 |
1581 |
589 |
12 |
3372 |
1551 |
|
14 |
3163 |
1178 |
13 |
6744 |
3103 |
|
15 |
6327 |
2356 |
14 |
13489 |
6207 |
|
16 |
12654 |
4712 |
15 |
26979 |
12415 |
|
17 |
25308 |
9425 |
16 |
53958 |
24830 |
|
18 |
50617 |
18851 |
17 |
107917 |
49661 |
4) 有了這張對照表,我們就可以通過百度的瓦片編號來計算對應的Google瓦片編號。
計算公式如下:
Google瓦片行編號=[Google參照瓦片行編號+(百度行編號 – 百度參照瓦片行編號)] //向右,行為遞增
Google瓦片列編號=[Google參照瓦片列編號- (百度列編號 – 百度參照瓦片列編號)] //向上,列為遞減