地圖與圖塊座標

選取平台: Android iOS JavaScript

Maps SDK for iOS 使用下列座標系統:

  • 經緯度值,對應世界上某一點的專屬位置 (Google 使用世界大地測量系統 WGS84 標準)。
  • 世界座標,對應地圖上某一點的專屬位置。
  • 像素座標,對應特定縮放等級下地圖上的特定像素。
  • 圖塊座標,對應特定縮放等級下地圖上的特定圖塊。

世界座標

每次 API 需要將世界上的某個地點轉譯成地圖上的某個位置時,會先將緯度值和經度值轉譯為「世界」座標。API 會使用麥卡托投影執行這項轉譯。

為方便計算像素座標 (如下方所示),我們假設縮放等級為 0 的地圖是採用基本圖塊大小的單一圖塊。接著,我們依照縮放等級為 0 的像素座標定義世界座標,使用投影法將經緯度轉換成基本圖塊上的像素位置。此世界座標是從地圖投影的原點測量至特定位置的浮點值。請注意,由於這個座標是浮點值,相較於目前顯示的地圖解析度,這個浮點值的精確度可能會高很多。也就是說,世界座標與目前的縮放等級無關。

Google 地圖中的世界座標是從麥卡托投影的原點 (地圖的西北角,經度 180 度,緯度約 85 度) 開始測量;向東 (右) 增加 x 向度,向南 (下) 增加 y 向度。基本的麥卡托 Google 地圖圖塊是 256 x 256 像素,因此可用的世界座標空間是 {0-256}, {0-256}

請注意,麥卡托投影的經度寬度有限制,但緯度高度沒有限制。我們利用麥卡托投影在大約 +/- 85 度的位置裁切基本地圖圖像,讓最終地圖呈正方形,以簡化選取圖塊的方式。請注意,在某些情況下 (例如您繪製的地點非常接近極點時),投影可能會產生落在基本地圖可用座標空間以外的世界座標。

像素座標

「像素座標」對應特定縮放等級下地圖上的特定像素;世界座標則會反映特定投影的絕對位置。像素座標是利用下列公式計算而得:

pixelCoordinate = worldCoordinate * 2zoomLevel

在上述公式中,請留意每增加一個縮放等級,xy 向度都會變成原來的兩倍。因此,每增加一個縮放等級,其解析度就會是前一個等級的四倍。例如,縮放等級為 1 時,地圖包含 4 個 256x256 像素圖塊,因此像素空間為 512x512。縮放等級為 19 時,可使用 0 到 256 * 219 之間的值,對應到地圖上的每一個 xy 像素。

世界座標是以地圖的圖塊大小為基準,因此我們可以利用像素座標的整數部分,找出在目前縮放等級下該位置的確切像素。請注意,縮放等級為 0 時,像素座標與世界座標相等。

現在,我們可以在每個縮放等級下,精確表示地圖上的各個位置。Maps SDK for iOS 會根據縮放等級、地圖中心 (以 LatLng 的形式表示) 和內含 DOM 元素的尺寸,建立一個可視區域,並將這個定界框轉譯為像素座標。接下來,API 就可以按照邏輯判斷落在指定像素範圍內的所有地圖圖塊。每個地圖圖塊都可用圖塊座標參照,因此能大幅簡化地圖圖像的顯示作業。

圖塊座標

API 無法在較高的縮放等級下,一次載入所有地圖圖像,而是會將各個縮放等級的圖像,分解成一組依照應用程式理解的邏輯順序排列的地圖圖塊。地圖捲動到新位置或調至新的縮放等級時,API 會使用像素座標來判斷需要哪些圖塊,然後將這些值轉譯成要擷取的一組圖塊。系統會利用一套可依照邏輯輕易判斷的配置指定這些圖塊座標;透過這套配置,即可得知哪些圖塊包含任意特定點的圖像。

Google 地圖中的圖塊是從與像素原點相同的位置開始編號。在 Google 的麥卡托投影實作中,原點圖塊一律位於地圖的西北角,同時 x 值會從西到東遞增,y 值則從北到南遞增。圖塊是使用從該原點開始的 x,y 座標來建立索引。舉例來說,縮放等級為 2 時,如果將地球區分成 16 個圖塊,每個圖塊都可使用不重複的 x,y 組合參照:

由四列和四欄圖塊組成的世界地圖。

請注意,只要將像素座標除以圖塊大小 (256) 並取計算結果的整數部分,即可得到目前縮放等級附帶產生的圖塊座標。

範例

下方範例顯示伊利諾州芝加哥市的各類座標:緯度值/經度值、世界座標、像素座標和圖塊座標。使用縮放控制項即可查看各個縮放等級的座標值。

如要瞭解座標的計算方式,請查看程式碼