Ko:Slippy map tilenames

From OpenStreetMap Wiki
Jump to navigation Jump to search
Tile numbering for zoom=2

이 문서는 미끄러운 지도 애플리케이션의 파일 명명 규칙을 설명합니다.

  • 타일은 256 × 256 픽셀 PNG 파일입니다.
  • 각 확대 레벨은 디렉터리이고, 각 열은 하위 디렉터리이며, 그 열의 각 타일은 파일입니다.
  • 파일 이름(또는 URL) 형식은 /zoom/x/y.png입니다.

미끄러운 지도는 이러한 형식을 따르는 URL에서 타일을 제공받기를 기대하기 때문에 모든 타일 서버 URL은 매우 유사하게 보입니다.


타일 서버

two merging arrows

이 페이지나 섹션은 TMS과 병합하는것이 제안되었습니다. (토의하기)

URL의 첫 번째 부분은 타일 서버를 지정합니다. 타일 좌표는 일반적으로 /zoom/x/y.png 형식의 꼬리로 지정됩니다. 일부 타일 서버는 특정 스타일시트를 지정하기 위해 디렉터리(e.g. "/cycle/")를 사용할 수 있습니다. (역사적으로 여러 서브도메인이 제공되어 각 호스트에 대한 동시에 열릴 수 있는 HTTP 연결 수의 브라우저 제한을 회피했지만, 현대 브라우저에서는 덜 중요합니다 - 예: a.tile, b.tile, c.tile).

다음은 몇 가지 예입니다:

이름 URL 템플릿 확대 레벨
OSM '표준' 스타일 https://tile.openstreetmap.org/zoom/x/y.png 0-19
OpenCycleMap http://[abc].tile.thunderforest.com/cycle/zoom/x/y.png 0-22
Thunderforest Transport http://[abc].tile.thunderforest.com/transport/zoom/x/y.png 0-22
MapTiles API Standard https://maptiles.p.rapidapi.com/local/osm/v1/zoom/x/y.png?rapidapi-key=YOUR-KEY 전 세계적으로 0-19
MapTiles API English https://maptiles.p.rapidapi.com/en/map/v1/zoom/x/y.png?rapidapi-key=YOUR-KEY 전 세계적으로 0-19 (영어 타일셋 제공)

다양한 '써드파티' 출처로부터 추가 타일셋을 사용할 수 있습니다.

확대 레벨

확대 파라미터는 0(축소)에서 18(확대) 사이의 정수입니다. 18이 일반적으로 최대이지만, 일부 타일 서버는 그 이상을 지원할 수 있습니다.

확대 레벨 타일 커버 범위 타일 수 타일 크기(*) (도 단위)
0 1개의 타일이 전 세계를 덮음 1개 360° x 170.1022°
1 2 × 2 타일 4개 180° x 85.0511°
2 4 × 4 타일 16개 90° x [변수]
n 2n × 2n 타일 22n 360/2n° x [변수]
12 4096 x 4096 타일 1677만 7216개 0.0879° x [변수]
16 232 ≈ 42억 9500만개
17 172억개
18 687억개
19 Mapnik 레이어의 최대 확대 2749억 개의 타일

(*) 모든 타일의 너비(경도)는 일정하지만, 같은 확대 수준에서 높이(위도)는 일정하지 않습니다. 일반적으로 같은 행에 속한 타일은 동일한 높이(도 단위)를 가지지만, 적도에서 극지방으로 이동할수록 높이는 줄어듭니다.

자세한 내용은 확대 레벨을 참조하세요.

타일 이름의 유도

다음은 잘 알려진 웹 메르카토르 투영법과 동일합니다.

  • 좌표를 구형 메르카토르 투영법으로 재투영합니다 (EPSG:4326에서 EPSG:3857로):
    • x = lon
    • y = arsinh(tan(lat)) = log[tan(lat) + sec(lat)]
    (latlon은 라디안 단위입니다)
  • xy의 범위를 0 – 1로 변환하고 원점을 왼쪽 상단 모서리로 이동합니다:
    • x = [1 + (x / π)] / 2
    • y = [1 − (y / π)] / 2
  • 확대를 사용하여 지도 전체의 타일 수, n를 계산합니다, 2zoom
  • xyn을 곱합니다. 결과를 내림하여 tilextiley를 구합니다.

구현

의사 코드

의사 코드를 좋아하는 사람들을 위해 몇 가지 힌트를 제공합니다:

sec = 1/cos
arsinh(x) = log(x + (x^2 + 1)^0.5)
sec^2(x) = tan^2(x) + 1
→ arsinh(tan(x)) = log(tan(x) + sec(x))

"log"는 상용로그(log10)가 아닌 자연 로그(ln 또는 loge)를 의미합니다. 일부 계산기에서 사용되는 상용로그와 혼동하지 마세요.

경도/위도를 타일 번호로 변환

n = 2 ^ zoom
xtile = n * ((lon_deg + 180) / 360)
ytile = n * (1 - (log(tan(lat_rad) + sec(lat_rad)) / π)) / 2

타일 번호를 경도/위도로 변환

n = 2 ^ zoom
lon_deg = xtile / n * 360.0 - 180.0
lat_rad = arctan(sinh(π * (1 - 2 * ytile / n)))
lat_deg = lat_rad * 180.0 / π

이 코드는 타일의 왼쪽 상단 (북서쪽) 점의 좌표를 반환합니다.

수학

수학 기호를 사용한 동일한 내용 (위도와 경도는 도 단위):

Latlon to tile.pngTile to latlon.png

예: GPS 좌표를 웹 메르카토르 타일의 픽셀 위치로 변환

관심 있는 좌표를 선택합니다.

이 예는 시부야 스크램블 교차로 근처의 하치코 동상이 어느 타일에 속해 있는지 (그리고 타일 내에서 어떤 픽셀 좌표에 위치하는지) 찾는 방법을 보여줍니다:

https://www.openstreetmap.org/node/597685675

변수 공식 예시 (하치코 동상)
lonEPSG:4326 OpenStreetMap의 노드에 기록된 익숙한 "GPS"-스타일의 경도. 양수는 동쪽이고, 음수는 서쪽입니다. +139.7006793°
latEPSG:4326 OpenStreetMap의 노드에 기록된 익숙한 "GPS"-스타일의 위도. 양수는 북쪽이고, 음수는 남쪽입니다. +35.6590699°
좌표를 웹 메르카토르 투영법으로 변환합니다. (https://epsg.io/3857)
xEPSG:3857 lonEPSG:4326이 값은 (-180°, 180°) 범위에 속하게 됩니다. 139.7006793°
yEPSG:3857 ln(tan(latEPSG:4326) + 1 / cos(latEPSG:4326))또는 arsinh(tan(latEPSG:4326))

이 값은 위도 85.0511 °S와 85.0511 °N 사이에서 (-π, π) 범위에 속하게 됩니다. 참고로, 숫자 85.0511은 arctan(sinh(π))의 결과입니다. 이 범위를 사용하면 전체 지도가 (매우 큰)정사각형이 됩니다.

0.66693624687
투영된 점을 단위 정사각형으로 변환합니다.
x 0.5 + xEPSG:3857 / 360°

이 값은 (0, 1) 범위에 속하게 됩니다. x=0은 지도에서 왼쪽 가장자리 (180° 서쪽)입니다. x=1은 지도에서 오른쪽 가장자리 (180° 동쪽)입니다. x=0.5는 중앙, 즉 본초 자오선입니다.

0.8880574425
y 0.5 − yEPSG:3857 / (2π)

이 값은 (0, 1) 범위에 속하게 됩니다. y=0은 지도에서 상단 (북쪽 가장자리)으로 85.0511 °N에 위치합니다. y=1은 지도에서 하단 (남쪽 가장자리)으로 85.0511 °S에 위치합니다. y=0.5는 중앙, 즉 적도입니다.

0.3938537996
확대 레벨과 개별 타일의 크기를 결정합니다.
확대 확대 레벨이 0일 때, 전체 지구는 단일 타일로 표시됩니다.

확대 레벨이 18일 때, 개별 도시 블록의 세부 사항이 보입니다.

18
투영된 점을 타일 공간으로 변환합니다.
N 2zoom

이는 지도 한쪽 가장자리에서 다른 가장자리까지의 가로 또는 세로 타일 수입니다.

262144
xtile N * x

xtile의 정수 부분은 해당 타일의 "x" 값을 나타냅니다. xtile의 소수 부분은 그 타일 내에서 좌표의 내부 수평 위치를 나타냅니다.

첫 번째 타일은 xtile=0이며, 왼쪽 가장자리는 180° W에 위치합니다. 마지막 타일은 xtile=2zoom−1이며, 오른쪽 가장자리는 180° E에 위치합니다.

232798.930207

tile x = 232798

fractional x = 93.02%

ytile N * y

ytile의 정수 부분은 해당 타일의 "y" 값을 나타냅니다. ytile의 소수 부분은 그 타일 내에서 좌표의 내부 수직 위치를 나타냅니다.

첫 번째 타일은 ytile=0이며, 상단 가장자리는 85.0511 °N에 위치합니다. 마지막 타일은 ytile=2zoom−1이며, 하단 가장자리는 85.0511 °S에 위치합니다.

103246.410442

tile y = 103246

fractional y = 41.04%

URL /(zoom)/(xtile)/(ytile).png대부분의 타일 서버는 위와 유사한 경로를 사용합니다.

예를 들어, 위의 계산에 따르면 하치코는 다음 위치에 있습니다:

https://tile.openstreetmap.org/18/232798/103246.png
103246.png
크기 관례적으로 "표준 해상도" 타일의 경우 256 픽셀입니다.

"고해상도" 또는 "레티나" 타일의 경우 일반적으로 512 픽셀입니다.

xpixel fract(xtile) * dimension

이는 0에서 크기 사이의 숫자로, 타일 내에서 이 좌표의 x 오프셋입니다.

238.1 px
ypixel fract(xtile) * dimension

이는 0에서 크기 사이의 숫자로, 타일 내에서 이 좌표의 y 오프셋입니다.

105.1 px

일반적인 프로그래밍 언어

서브타일

타일 x,y에서 더 확대하고 싶다면, 서브타일은 (다음 확대 수준의 좌표 시스템에서) 다음과 같습니다:

2x, 2y 2x + 1, 2y
2x, 2y + 1 2x + 1, 2y + 1

마찬가지로, xy를 절반으로 줄이면 (이전 확대 수준에서) 축소할 수 있습니다.

해상도와 축척

적도(위키백과에 따르면)의 정확한 길이는 WGS-84 기준으로 40075.016686 km입니다. 확대 수준 0에서 한 픽셀은 156543.03 미터에 해당합니다 (타일 크기가 256 픽셀이라고 가정):

40075.016686 * 1000 / 256 ≈ 6378137.0 * 2 * pi / 256 ≈ 156543.03

이는 임의의 확대 수준에서 해상도를 계산하는 공식을 제공합니다:

resolution = 156543.03 meters/pixel * cos(latitude) / (2 ^ zoomlevel)

일부 애플리케이션은 화면에서 1 cm가 지도의 1 cm에 해당하는 비율을 알아야 합니다.

scale = 1 : (screen_dpi * 1/0.0254 in/m * resolution)

다음 표는 이러한 계산을 피할 수 있도록 도와줍니다. 모든 값은 적도 기준으로 표시되며, 주어진 위도에 맞추기 위해 cos(latitude)를 곱해야 합니다. 예를 들어, 위도 60 (오슬로, 헬싱키, 상트페테르부르크)의 경우 값을 2로 나누어 조정합니다.

확대 수준 해상도, m/px 축척 90 dpi 화면 1 cm당 축척 축척 96 dpi 축척 120 dpi
0 156543.03 1 : 554 680 041 5547 km 1 : 591 658 711 1 : 739 573 389
1 78271.52 1 : 277 340 021 2773 km 1 : 295 829 355 1 : 369 786 694
2 39135.76 1 : 138 670 010 1387 km 1 : 147 914 678 1 : 184 893 347
3 19567.88 1 : 69 335 005 693 km 1 : 73 957 339 1 : 92 446 674
4 9783.94 1 : 34 667 503 347 km 1 : 36 978 669 1 : 46 223 337
5 4891.97 1 : 17 333 751 173 km 1 : 18 489 335 1 : 23 111 668
6 2445.98 1 : 8 666 876 86.7 km 1 : 9 244 667 1 : 11 555 834
7 1222.99 1 : 4 333 438 43.3 km 1 : 4 622 334 1 : 5 777 917
8 611.50 1 : 2 166 719 21.7 km 1 : 2 311 167 1 : 2 888 959
9 305.75 1 : 1 083 359 10.8 km 1 : 1 155 583 1 : 1 444 479
10 152.87 1 : 541 680 5.4 km 1 : 577 792 1 : 722 240
11 76.437 1 : 270 840 2.7 km 1 : 288 896 1 : 361 120
12 38.219 1 : 135 420 1.35 km 1 : 144 448 1 : 180 560
13 19.109 1 : 67 710 677 m 1 : 72 224 1 : 90 280
14 9.5546 1 : 33 855 339 m 1 : 36 112 1 : 45 140
15 4.7773 1 : 16 927 169 m 1 : 18 056 1 : 22 570
16 2.3887 1 : 8 464 84.6 m 1 : 9 028 1 : 11 285
17 1.1943 1 : 4 232 42.3 m 1 : 4 514 1 : 5 642
18 0.5972 1 : 2 116 21.2 m 1 : 2 257 1 : 2 821

확대 레벨을 참고하세요

도구

참고 자료

(note: Slippy tiles and Google map tiles count tile 0,0 down from the top-left of the tile grid; the TMS spec specifies tiles count up from 0,0 in the lower-left!)