MK맵 보기 줌 및 영역
구글 지도 자바스크립트 API 사용법에 익숙합니다.최근 아이폰 프로젝트에 맵킷 프레임워크를 사용하기 시작했지만, 지도에서 줌잉과 지역 설정을 파악하는 데 어려움을 겪고 있습니다.
구글 지도 API에서 나는 간단한 함수 setZoom()과 함께 8, 9, 10과 같은 정수 줌 레벨을 사용했습니다.MapKit 프레임워크에서 볼 수 있는 동등한 방법은 setRegion:animated뿐입니다.줌 레벨을 지정하려면 지역의 스팬의 위도 및 경도 "델타" 값을 설정해야 하는 것으로 알고 있습니다.하지만 저는 이 값들이 무엇을 나타내는지 정말로 모르겠습니다. (설명서를 읽었습니다.)
MKMapView Delegate를 사용하고 regionDidChange Delegate 메서드의 span 값을 추적하면 결과가 서로 상관관계가 없는 것 같습니다.축소해서 보면 스팬 델타 값이 설명서에 명시된 대로 증가하는 것을 볼 수 있습니다.그런데 갑자기 확대하지 않고 지도를 끌면 델타 값이 0.0이 됩니다.
누가 이 스판과 델타의 기준점이 무엇인지 설명해 주시겠습니까?아니면 정수 줌 레벨(9와 같은)을 이러한 델타 값으로 변환하는 알고리즘이 있습니까?
보너스 질문으로 MKMapView에서 최소-최대 줌 레벨을 지정할 수 있는 방법이 있습니다 :)
감사해요.
첫째, MKMapView는 Google Maps처럼 미리 정의된 줌 레벨 집합을 사용하지 않습니다.
대신 MKMapView의 보이는 영역은 MKCoordinateRegion을 사용하여 설명됩니다. MKCoordinateRegion은 두 개의 값으로 구성됩니다.
- 중심(영역의 중심점) 및
- 스팬(중심 주위에 보이는 영역의 크기).
중심점이 분명해야 합니다(지역의 중심점입니다).
그러나 스팬(MK 좌표 스팬)은 다음과 같이 구성됩니다.
- 위도 델타(영역이 나타내는 수직 거리) 및
- 경도 델타(영역이 나타내는 수평 거리).
간단한 예.장난감 MK 좌표 지역:
- 중심:
- 위도: 0
- 경도: 0
- 스팬:
- 위도 델타: 8
- 경도 델타: 6
영역은 최소 및 최대 좌표를 사용하여 다음과 같이 설명할 수 있습니다.
- 최소 좌표(좌측 하단 지점):
- 위도: -4
- 경도: -3
- 최대 좌표(우측 상단 점):
- 위도: 4
- 경도: 3
따라서 적절한 크기의 MKCoordinateSpan을 사용하여 중심점 주변의 확대/축소 수준을 지정할 수 있습니다.Google의 숫자 확대/축소 수준의 근사치로, 주어진 확대/축소 수준에서 Google이 사용하는 확대/축소 크기를 역설계하고 그에 따라 확대/축소 범위를 만들 수 있습니다. (Google은 MKMapView와 동일한 방식으로 보기 영역을 중심 + 확대로 설명하므로 Google 지도에서 이 값을 끌어낼 수 있습니다.)
지역을 제한하는 방법은 다음과 같은 위임자 방법으로 플레이할 수 있습니다.
mapView:regionWillChangeAnimated
예를 들어, 영역의 크기를 다시 허용된 줌 레벨로 조정합니다. (테이블 보기를 통해 가장자리를 스크롤할 수 있지만 고무 밴드를 다시 제자리에 고정하는 방법과 유사합니다.)하지만 제가 마일리지를 사용한 것은 아니기 때문에 마일리지가 달라질 수 있습니다.
그런데 OS 3.1에서 맵킷의 측면을 수정/개선하여 3.0에서 문제를 일으켰습니다.
MKCoordinateSpan을 정의하는 대신 명시적인 줌 레벨을 사용하는 것을 선호하는 경우 MKMapView의 줌 레벨을 지정하기 위한 지원을 추가하는 카테고리를 작성했습니다.코드는 여기서 찾을 수 있습니다.
경간은 위도와 경도로 되어 있습니다.대신 거리를 두는 MK좌표영역 구조를 구성하는 방법이 있습니다.스팬을 지정하기 위해 MKCoordinateRegionMakeWithDistance를 사용하고 있을 수 있으며, 이 스팬을 regionDidChange에서 확인하면 Lat/Long 스팬이 표시됩니다. 이는 MKCoordinateRegion 구조에 저장되는 방식입니다.
MKMapKit으로 작업할 때 정수 줌 레벨을 사용할 수 없거나 유용한 것으로 알고 있습니다.저는 개인적으로 스판 피규어를 사용하는 것을 더 좋아하고, 유연합니다.
max와 min zoom을 지정할 수 없고 해킹할 방법도 없습니다.MKMap Kit은 사실 지금 상당히 약해서, 기능이 부족해서 상당히 실망스럽습니다.
링크 쿼리 문자열을 검사하여 maps.google.com 을 사용하여 위치에 대한 줌 레벨을 빠르게 비교하면 dx 및 dy span 값이 2배 증가하는 것으로 나타납니다.
(0.005334, 0.011834) starting span
(0.010668, 0.023668) dx: x2, dy: x2
(0.021335, 0.047337) dx: x2, dy: x2
(0.042671, 0.094671) dx: x2, dy: x2
...
MK맵뷰에 있는 브랜트의 카테고리는 잘 작동합니다.그러나 mapSizeInPixels를 계산할 때 망막 화면이 있는 최신 장치를 지원하도록 업데이트되지 않은 것으로 보입니다.
다음 라인을 교체하여 수리할 수 있습니다.
CGSize mapSizeInPixels = mapView.bounds.size;
다음 줄 사용:
CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
언급URL : https://stackoverflow.com/questions/1166444/mkmapview-zoom-and-region
'programing' 카테고리의 다른 글
기능: @RunWith(Spring)JUNIT4ClassRunner.class) (0) | 2023.09.09 |
---|---|
git AuthorDate가 CommitDate와 다른 이유는 무엇입니까? (0) | 2023.09.09 |
현재 파이썬 세션에서 모든 변수를 저장하는 방법은 무엇입니까? (0) | 2023.08.20 |
Android Studio Run/Debug 구성 오류: 모듈이 지정되지 않았습니다. (0) | 2023.08.20 |
Spring Boot/Junit, 다중 프로파일에 대한 모든 장치 테스트 실행 (0) | 2023.08.20 |