osm 圖磚(tile)簡介 與 經緯度座標 互換方式
openstreemap tile conversion
開放街圖 圖磚 換算方法
這邊講的Tile是指osm儲存圖資的方式之一,簡單來說,你在www.openstreetmap.org的地圖縮放時,可以看到慢慢讀取出來一塊塊方塊的圖片,湊成大地圖,一塊塊的東西就是tile,這些tile就是把圓的地球表面,投影到平面上所做出來的資料。
為了方便分別不同資料密度,tile有一個「zoom level」也就是縮放等級,從0~19,[Level 0]代表把地球投影成一張正方形圖片,[Level 1]就是把[Level 0]切成四個正方形,依此往下,呈現的資料越來越精細,下圖簡略表示之。
而由於球體有弧度,所以經緯度對應到平面上時,也有相應的計算方式。
所以說,以 [東經121.012345, 北緯23.543210, 縮放倍率15] 算出來的圖磚ID是 (15,27398,14178) 可以用網址 a.tile.openstreetmap.org/15/27398/14178.png 看到這塊圖磚 (僅供參考,這樣的圖磚讀取方法違反OSM使用規範) 反之,我現在知道了圖磚的ID,我想知道該圖磚的經緯度就要反算
算出來的經緯度是23.543845136505837, 121.00341796875,為毛呢QAQ,因為這是計算「該圖磚最左上角(North-West)的經緯度」,所以如果你要算圖磚中心的經緯度,就要把x_tile跟y_tile加0.5就可以了,同理可知,要計算圖磚上任意點的經緯度,就是用比例去算一下,再往回推囉。
而由於球體有弧度,所以經緯度對應到平面上時,也有相應的計算方式。
###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就可以了,同理可知,要計算圖磚上任意點的經緯度,就是用比例去算一下,再往回推囉。
沒有留言:
張貼留言