티스토리 뷰

네이버지도 SDK에는 지도 확대 축소를 원할 때 카메라 포지션의 zoom 속성을 사용하는데 이 속성 외에는 카메라 포지션을 변경할 방법이 없어서 불편함이 있었다. 특정 직사각형 범위를 포함할 정도로 줌 레벨을 조절하기 위해 직사각형의 왼쪽위, 오른쪽아래 좌표값을 기반으로 중심점과 줌 레벨을 찾기 위해 조사한 것을 공유하고자 한다.

줌 레벨에 대하여

네이버 지도에서 줌 레벨은 0~22까지의 값으로 +1 될때마다 화면 기준점 사이의 실제 거리는 절반이 된다. 아래는 옛날 정보이지만(최신 정보를 찾지 못함) 대략적으로 어떤 방식으로 계산되는지 확인할 수 있다.

레벨 지도 상 거리 실제 거리
14 1px 0.25m
13 1px 0.50m
12 1px 1.00m
11 1px 2.00m
10 1px 4.00m
...
1 1 pixel 2048.00 m

출처: https://d2.naver.com/helloworld/1174

중심점 구하기

왼쪽 위 지점과 오른쪽 아래 지점의 좌표값이 있다면 중심점 구하는 것은 매우 간단하다. rect라는 타입이 topLeft 및 bottomRight라는 좌표를 가지고 있다고 가정한다.

let centerLat = (rect.topLeft.latitude + rect.bottomRight.latitude) / 2
let centerLng = (rect.topLeft.longitude + rect.bottomRight.longitude) / 2
let center = NMGLatLng(lat: centerLat, lng: centerLng)

줌 레벨 구하기

너비와 높이 중 큰 값을 기준으로 지도에 표시해주어야 하므로 우선 너비와 높이 중 큰 값을 구한다. 그리고 +1이 될 때마다 축척이 두배가 되므로 log2 함수를 이용한다. 그리고 실제 거리는 2배가 아닌 1/2가 되므로 임의의 값 100을 size로 나누어 반비례하도록 변경한다. 화면에 표시되는 상황에 따라서 100을 변경하여 배율을 맞춰줄 수 있다.

let width = rect.bottomRight.latitude - rect.topLeft.latitude
let height = rect.bottomRight.longitude - rect.topLeft.longitude
let size = max(width, height)
let zoom = log2(100 / size)

이제 각 값을 사용해 카메라 포지션 객체를 생성할 수 있다.

let cameraPosition = NMFCameraPosition(center, zoom: zoom)
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함