1. 預備知識
1.1 參考橢球
地球表面是一個凸凹不平的表面,而對於地球測量而言,地表是一個無法用數學公式表達的曲面,這樣的曲面不能作為測量和製圖的基準面。假想一個扁率極小的橢圓,繞地球體短軸旋轉所形成的規則橢球體稱之為地球橢球體。
地球橢球體與地球形體非常接近,是一個形狀規則的數學表面,在其上可以做嚴密的計算,而且所推算的元素(如長度、角度)同大地水準面上的相應元素非常接近。
在滿足地心定位和雙平行條件下,確定橢球引數(長半軸、扁率)使它在全球範圍內與大地體最密合的地球橢球,稱為總地球橢球。
在區域性區域,具有確定的橢球引數,經過區域性定位和定向,同某一地區的國家大地水準面最佳擬合的地球橢球,稱為參考橢球。
國際標準的參考橢球是 WGS84,Open Street Map、Google Maps 等都採用 WGS84;高德地圖使用的參考橢球是 GCJ-02;百度地圖使用的參考橢球是 BD-09。
1.2 地圖投影
在地圖學中,地圖投影是一種將地球表面展平的方法,以便製作地圖,這就需要一種方法將球面上的點轉換為平面上的點。將球體投影到平面上,球面必然會有一定程度的變形,根據地圖的目的,有些變形是可以接受的,有些則是不可以接受的,因此,為了保留球面的某些性質而犧牲其他性質,就存在不同的地圖投影。
(1) 墨卡託投影
墨卡託投影法,又稱麥卡托投影法、正軸等角圓柱投影,是一種等角的圓柱形地圖投影法。
假想一個與地軸方向一致的圓柱切或割於地球,按等角條件,將經緯網投影到圓柱面上,將圓柱面展為平面後,即得本投影。
墨卡託投影可顯示任兩點間的正確方位,指出真實的經緯度;但會使面積產生變形,赤道地區變化最小,南北兩極的變形最大。
(2) Web墨卡託投影
Web 墨卡託投影是墨卡託投影的一種變體,被 Web 地圖應用業界普遍採納。
在投影過程中,將表示地球的參考橢球體近似的作為正球體處理(正球體半徑 R = 橢球體半長軸 a)。
2. 什麼是瓦片地圖
瓦片,是指將一定範圍內的地圖按照一定的尺寸和格式,按縮放級別或者比例尺,切成若干行和列的正方形柵格圖片,切片後的正方形柵格圖片被形象的稱為瓦片。
瓦片地圖金字塔模型是一種多解析度層次模型,從瓦片金字塔的底層到頂層,解析度越來越低,但表示的地理範圍不變。即,每一層表示的地理範圍是相同的,但自頂向下,每層劃分的瓦片數越來越多,不同層間每個瓦片的解析度相同。
瓦片的劃分數量,對應不同的縮放級別(Zoom Level)。每一級別的瓦片數為:\(\displaystyle\text{\#Tiles} = 2^{level} \times 2^{level}\)
級別 | 瓦片數 | 每個瓦片表示的經度 | 赤道處每個畫素表示的範圍(m / pixel,每個瓦片寬為256畫素) | 比例尺 | 表示的區域例項 |
---|---|---|---|---|---|
0 | 1 | 360 | 156 543 | 1:5億 | 全球 |
1 | 4 | 180 | 78 272 | 1:2.5億 | |
2 | 16 | 90 | 39 136 | 1:1.5億 | 次大陸地區 |
3 | 64 | 45 | 19 568 | 1:7千萬 | 最大的國家 |
4 | 256 | 22.5 | 9 784 | 1:3.5千萬 | |
5 | 1 024 | 11.25 | 4 892 | 1:1.5千萬 | 非洲大國 |
6 | 4 096 | 5.625 | 2 446 | 1:1千萬 | 歐洲大國 |
7 | 16 384 | 2.813 | 1 223 | 1:4百萬 | 小國家;美國的州 |
8 | 65 536 | 1.406 | 611.496 | 1:2百萬 | |
9 | 262 144 | 0.703 | 305.748 | 1:1百萬 | 廣域;大都市區 |
10 | 1 048 576 | 0.352 | 152.874 | 1:50萬 | 都市區 |
11 | 4 194 304 | 0.176 | 76.437 | 1:25萬 | 城市 |
12 | 16 777 216 | 0.088 | 38.219 | 1:15萬 | 城鎮;市區 |
13 | 67 108 864 | 0.044 | 19.109 | 1:7萬 | 村莊;郊區 |
14 | 268 435 456 | 0.022 | 9.555 | 1:3.5萬 | |
15 | 1 073 741 824 | 0.011 | 4.777 | 1:1.5萬 | 小型公路 |
16 | 4 294 967 296 | 0.005 | 2.389 | 1:8千 | 街道 |
17 | 17 179 869 184 | 0.003 | 1.194 | 1:4千 | 街區;公園;住址 |
18 | 68 719 476 736 | 0.001 | 0.597 | 1:2千 | 一些建築、樹 |
19 | 274 877 906 944 | 0.0005 | 0.299 | 1:1千 | 當地高速公路和交叉路口詳細資訊 |
20 | 1 099 511 627 776 | 0.00025 | 0.149 | 1:5千 | 一座中型建築 |
3. 瓦片座標
對於經過Web 墨卡託投影為平面的世界地圖,在不同的縮放級別下,將其劃分為畫素為256 x 256 的瓦片。為了將瓦片載入到正確的位置拼接成完整的地圖,需要對每個瓦片進行編號。不同的地圖服務商採用的編號方式有所不同:
- 谷歌XYZ:Z 表示縮放層級;X、Y 的原點在左上角,X 從左向右,Y 從上向下。Google Maps、OpenStreetMap、Azure Maps、高德地圖都採用這種編號方式。
- QuadTree:微軟 Bing 地圖使用的編碼規範,Z 表示縮放層級,同一層級的瓦片不用 X、Y 兩個維度表示,而只用一個整數表示,該整數服從四叉樹編碼規則。微軟 Bing 地圖即將停用,Azure Maps 使用谷歌 XYZ 的方式進行編號。
- 百度XYZ:百度地圖使用的編碼規範。Z 從 1 開始,在最高階就把地圖分為四塊瓦片;X、Y 的原點在經度為 0 緯度為 0 的位置,X 從左向右,Y 從下向上。
需要注意的是,雖然各地圖服務商經緯度座標系(參考橢球)不同,但某一網際網路地圖的經緯度座標與瓦片座標相互轉換隻與該地圖商的墨卡託投影和瓦片編號的定義有關,跟地圖商採用的參考橢球無關。
3.1 谷歌XYZ轉換
使用谷歌XYZ時,墨卡託投影擷取緯度(約85.05ºS, 約85.05ºN)之間部分的地球,使得投影后的平面地圖水平方向和垂直方向長度相等。
瓦片座標系的原點位於左上角(東經 180°,北緯約 85.05°),X 從左向右,Y 從上向下。設縮放級別為 Z,則地圖被均勻切分為 \(2^Z \times 2^Z\) 個瓦片,每個瓦片畫素為 \(256 \times 256\)。
-
經緯度座標 \((\text{lon}, \text{lat})\) 轉瓦片座標 \((\text{tileX}, \text{tileY})\):
- \(\displaystyle\text{tileX} = \lfloor \frac{\text{lon} + 180}{360} \times 2^Z \rfloor\)
- \(\displaystyle\text{tileY} = \lfloor (\frac{1}{2} - \frac{\ln(\tan{(\frac{\text{lat}\times \pi}{180})} + sec{(\frac{\text{lat}\times \pi}{180})})}{2\pi}) \times 2^Z \rfloor\)
-
經緯度座標 \((\text{lon}, \text{lat})\) 轉畫素座標 \((\text{pixelX}, \text{pixelY})\):
- \(\displaystyle\text{pixelX} = \lfloor \frac{\text{lon} + 180}{360} \times 2^Z \times 256\ \% \ 256 \rfloor\)
- \(\displaystyle\text{pixelY} = \lfloor (\frac{1}{2} - \frac{\ln(\tan{(\frac{\text{lat}\times \pi}{180})} + sec{(\frac{\text{lat}\times \pi}{180})})}{2\pi}) \times 2^Z \times 256\ \% \ 256 \rfloor\)
-
瓦片座標 \((\text{tileX}, \text{tileY})\) 轉經緯度座標 \((\text{lon}, \text{lat})\):
- \(\displaystyle\text{lon} = \frac{\text{tileX}}{2^Z} \cdot 360 - 180\)
- \(\displaystyle\text{lat} = \arctan{(\sinh{(\pi - \frac{\text{tileY}}{2^Z} \cdot 2\pi)})} \cdot \frac{180}{\pi}\)
-
瓦片 \((\text{tileX}, \text{tileY})\) 內部的畫素座標 \((\text{pixelX}, \text{pixelY})\) 轉經緯度座標 \((\text{lon}, \text{lat})\):
- \(\displaystyle\text{lon} = \frac{\text{tileX} + \frac{\text{pixelX}}{256}}{2^Z} \cdot 360 - 180\)
- \(\displaystyle\text{lat} = \arctan{(\sinh{(\pi - \frac{\text{tileY} + \frac{\text{pixelY}}{256}}{2^Z} \cdot 2\pi)})} \cdot \frac{180}{\pi}\)
另附經緯度座標 \((\text{lon}, \text{lat})\) 轉瓦片座標 \((\text{tileX}, \text{tileY})\) 推導過程:
經緯度座標 \((\text{lon}, \text{lat})\) 轉瓦片座標 \((\text{tileX}, \text{tileY})\) 推導過程:
- 將經緯度座標 \((\text{lon}, \text{lat})\) 轉換為Web墨卡託投影地圖中的座標(\(x'\)以角度為單位,\(y'\)以弧度為單位):
- \(x' = \text{lon}\)
- \(\displaystyle y' = \ln(\tan{(\frac{\text{lat}\times \pi}{180})} + sec{(\frac{\text{lat}\times \pi}{180})})\)
- 將Web墨卡託投影地圖中的座標原點變換到左上角,並改變 Y 軸方向(\(x'\)以角度為單位,\(y'\)以弧度為單位):
- \(x'' = x' + 180\)
- \(y'' = -(y' - \pi) = \pi - y'\)
- 轉為瓦片座標
- \(\displaystyle x = \lfloor \frac{x''}{360} \times 2^Z \rfloor = \lfloor \frac{\text{lon} + 180}{360} \times 2^Z \rfloor\)
- \(\displaystyle y = \lfloor \frac{y''}{2\pi} \times 2^Z \rfloor = \lfloor (\frac{1}{2} - \frac{\ln(\tan{(\frac{\text{lat}\times \pi}{180})} + sec{(\frac{\text{lat}\times \pi}{180})})}{2\pi}) \times 2^Z \rfloor\)
3.2 百度XYZ轉換
百度 XYZ 座標原點在經度為 0、緯度為 0 的位置,X 從左向右,Y 從下向上。顯然,百度XYZ座標原點與 Web 墨卡託投影地圖中的座標原點相同,X 軸方向和 Y 軸方向也與 Web 墨卡託投影地圖的一致。
百度地圖定義了另一種二維座標系,稱為百度平面座標系。百度平面座標系的座標原點與百度 XYZ 座標原點相同,以縮放等級 18 級為基準,規定 18 級時百度平面座標的一個單位等於螢幕上的一個畫素。平面座標與地圖所展示的級別沒有關係,也就是說在 1 級和 18 級下,同一個經緯度座標的百度平面座標都是一致的。
百度經緯度座標與百度平面座標可以直接相互轉換,並且與瓦片地圖等級無關。經緯度座標與瓦片座標、畫素座標的相互轉換需要以平面座標為中間量進行轉換。
百度地圖的座標轉換公式如下:
- 經緯度座標 \((\text{lon}, \text{lat})\) 轉平面座標 \((\text{pointX}, \text{pointY})\):呼叫百度地圖 API
- 平面座標 \((\text{pointX}, \text{pointY})\) 轉經緯度座標 \((\text{lon}, \text{lat})\):呼叫百度地圖 API
- 平面座標 \((\text{pointX}, \text{pointY})\) 轉瓦片座標 \((\text{tileX}, \text{tileY})\):
- \(\displaystyle\text{tileX} = \lfloor \frac{\text{pointX} \times 2^{Z-18} }{256}\rfloor\)
- \(\displaystyle\text{tileY} = \lfloor \frac{\text{pointY} \times 2^{Z-18} }{256}\rfloor\)
- 平面座標 \((\text{pointX}, \text{pointY})\) 轉畫素座標 \((\text{pixelX}, \text{pixelY})\):
- \(\displaystyle\text{pixelX} = \lfloor \text{pointX} \times 2^{Z-18} - \lfloor \frac{\text{pointX} \times 2^{Z-18}}{256}\rfloor \times 256\rfloor\)
- \(\displaystyle\text{pixelY} = \lfloor \text{pointY} \times 2^{Z-18} - \lfloor \frac{\text{pointY} \times 2^{Z-18}}{256}\rfloor \times 256\rfloor\)
- 瓦片 \((\text{tileX}, \text{tileY})\) 內部的畫素座標 \((\text{pixelX}, \text{pixelY})\) 轉平面座標 \((\text{pointX}, \text{pointY})\):
- \(\displaystyle\text{pointX} = \frac{\text{tileX} \times 256 + \text{pixelX}}{2^{Z-18}}\)
- \(\displaystyle\text{pointY} = \frac{\text{tileY} \times 256 + \text{pixelY}}{2^{Z-18}}\)
參考資料
- 瓦片
- 瓦片地圖
- Zoom levels - OpenStreetMap Wiki
- 什麼是地球橢球、總地球橢球和參考橢球?
- 墨卡託投影 - wenglabs
- 國內主要地圖瓦片座標系定義及計算原理 | CntChen Blog
- 瓦片(Tile)地圖原理 | xcsf's Blog
- Slippy map tilenames - OpenStreetMap Wiki