티스토리 뷰
네이버지도 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)'가이드' 카테고리의 다른 글
| SwiftUI에서 원형 프로그래스 뷰 만들기 (0) | 2022.08.20 |
|---|---|
| iOS에서 이미지/동영상 Orientation 정보 읽고 적용하기 (0) | 2022.08.10 |
| SwiftUI에서 뷰 스크린샷 캡쳐하기 (0) | 2022.07.30 |
| SwiftUI에서 구글로그인 띄우기 (0) | 2022.07.30 |
| SwiftUI 프로젝트에서 커스텀 Scheme 또는 파일 연결 처리하기 (0) | 2022.04.13 |
