2017年10月19日 星期四

Open Street Map (OSM) 圖磚(tile map)簡介、經緯度座標互換方式

osm 圖磚(tile)簡介 與 經緯度座標 互換方式

openstreemap tile conversion
開放街圖 圖磚 換算方法

這邊講的Tile是指osm儲存圖資的方式之一,簡單來說,你在www.openstreetmap.org的地圖縮放時,可以看到慢慢讀取出來一塊塊方塊的圖片,湊成大地圖,一塊塊的東西就是tile,這些tile就是把圓的地球表面,投影到平面上所做出來的資料。

為了方便分別不同資料密度,tile有一個「zoom level」也就是縮放等級,從0~19,[Level 0]代表把地球投影成一張正方形圖片,[Level 1]就是把[Level 0]切成四個正方形,依此往下,呈現的資料越來越精細,下圖簡略表示之。


而由於球體有弧度,所以經緯度對應到平面上時,也有相應的計算方式。

###long/lat to tile num 經緯度換算圖磚ID###
###2017/10/19###

#coding: utf8

import math

lat_degree = 23.543210 #緯度
lon_degree = 121.012345 #經度
zoom_level = 15 #縮放倍率

lat_radian = math.radians(lat_degree) #角度轉弧度
n = 2.0 ** zoom_level #tile數的單邊格子數
x_tile = int((lon_degree + 180.0) / 360.0 * n)
y_tile = int((1.0 - math.log(math.tan(lat_radian) + (1 / math.cos(lat_radian))) / math.pi) / 2.0 * n)
print(x_tile, y_tile) #圖磚x 圖磚y


所以說,以 [東經121.012345, 北緯23.543210, 縮放倍率15] 算出來的圖磚ID是 (15,27398,14178) 可以用網址 a.tile.openstreetmap.org/15/27398/14178.png 看到這塊圖磚 (僅供參考,這樣的圖磚讀取方法違反OSM使用規範) 反之,我現在知道了圖磚的ID,我想知道該圖磚的經緯度就要反算

###Tile to long/lat 圖磚轉經緯度###
###2017/10/19###

#coding: utf8

import math

x_tile = 27398
y_tile = 14178
zoom_level = 15
n = 2.0 ** zoom_level
lon_degree = x_tile / n * 360.0 - 180.0
lat_radian= math.atan(math.sinh(math.pi * (1 - 2 * y_tile / n)))
lat_degree = math.degrees(lat_radian)
print(lat_degree, lon_degree)

算出來的經緯度是23.543845136505837, 121.00341796875,為毛呢QAQ,因為這是計算「該圖磚最左上角(North-West)的經緯度」,所以如果你要算圖磚中心的經緯度,就要把x_tile跟y_tile加0.5就可以了,同理可知,要計算圖磚上任意點的經緯度,就是用比例去算一下,再往回推囉。

沒有留言:

張貼留言