MKMapView 확대 및 영역
Google Maps Javascript API 사용에 익숙합니다. 최근에 iPhone 프로젝트에 MapKit 프레임 워크를 사용하기 시작했지만지도에서 확대 / 축소 및 지역 설정을 파악하는 데 어려움을 겪고 있습니다.
Google Maps API에서는 간단한 함수 setZoom ()과 함께 8, 9, 10과 같은 정수 줌 레벨을 사용했습니다. MapKit 프레임 워크에서 볼 수있는 유일한 방법은 setRegion : animated입니다. 내가 이해 한대로 확대 / 축소 수준을 지정하려면 지역의 범위의 위도와 경도 "델타"값을 설정해야합니다. 그러나 나는이 값이 무엇을 나타내는 지 정말로 모른다 (문서를 읽었다).
MKMapView 대리자를 사용하고 regionDidChange 대리자 메서드 결과에서 범위 값을 추적하면 서로 상관 관계가없는 것 같습니다. 축소하고 문서에 지정된대로 범위 델타 값이 증가하는 것을 보면 괜찮습니다. 하지만 갑자기 확대 / 축소하지 않고지도를 드래그하면 델타 값이 0.0이됩니다.
누군가이 스팬과 델타의 기준점이 무엇인지 설명해 주시겠습니까? 아니면 정수 확대 / 축소 수준 (예 : 9)을 이러한 델타 값으로 변환하는 알고리즘이 있습니까?
보너스 질문으로 MKMapView에 최소-최대 확대 / 축소 수준을 지정하는 방법이 있습니다. :)
감사
우선, MKMapView 는 Google지도처럼 미리 정의 된 확대 / 축소 수준 집합을 사용하지 않습니다.
대신 MKMapView의 가시 영역은 다음 두 값으로 구성된 MKCoordinateRegion을 사용하여 설명 됩니다.
- 중심 (지역의 중심점) 및
- 범위 (중앙 주변의 가시 영역 크기).
중심점은 분명해야합니다 (영역의 중심점).
그러나 범위 ( MKCoordinateSpan )는 다음으로 구성됩니다.
- latitudeDelta (지역이 나타내는 수직 거리) 및
- longitudeDelta (지역이 나타내는 수평 거리).
간단한 예입니다. 다음은 장난감 MKCoordinateRegion입니다.
- 센터:
- 위도 : 0
- 경도 : 0
- 스팬:
- latitudeDelta : 8
- longitudeDelta : 6
지역은 다음과 같이 최소 및 최대 좌표를 사용하여 설명 할 수 있습니다.
- 최소 좌표 (왼쪽 아래 지점) :
- 위도 : -4
- 경도 : -3
- 최대 좌표 (오른쪽 상단 지점) :
- 위도 : 4
- 경도 : 3
따라서 적절한 크기의 MKCoordinateSpan을 사용하여 중심점 주변의 확대 / 축소 수준을 지정할 수 있습니다. Google의 숫자 확대 / 축소 수준의 근사치로 Google이 주어진 확대 / 축소 수준에 사용하는 범위 크기를 리버스 엔지니어링하고 그에 따라 범위를 만들 수 있습니다. (Google은 MKMapView와 동일한 방식으로 해당 뷰 영역을 중심 + 범위로 설명하므로 이러한 값을 Google지도에서 가져올 수 있습니다.)
지역 제한에 관해서는이 델리게이트 메소드로 플레이 할 수 있습니다.
mapView:regionWillChangeAnimated
예를 들어 지역을 허용 된 확대 / 축소 수준으로 다시 조정합니다. (테이블 뷰를 사용하면 가장자리를 지나서 스크롤 할 수 있지만 고무 밴드가 제자리로 다시 돌아 오는 것과 비슷합니다.) 그러나이 용도로 사용하지 않았기 때문에 마일리지가 다를 수 있습니다.
btw, 3.0에서 문제를 일으켰던 MapKit의 측면에 대한 OS 3.1의 확실한 수정 / 개선 사항이 있습니다.
MKCoordinateSpan을 정의하는 대신 명시 적 확대 / 축소 수준을 사용하는 것을 선호하는 경우 MKMapView의 확대 / 축소 수준을 지정하는 지원을 추가하는 범주를 작성했습니다. 코드는 여기 에서 찾을 수 있습니다 .
범위는 위도와 경도입니다. 대신 거리를 차지하는 MKCoordinateRegion 구조체를 생성하는 방법이 있습니다. MKCoordinateRegionMakeWithDistance를 사용하여 범위를 지정하고 regionDidChange에서 확인할 때 위도 / 경도 범위에서 볼 수 있으며, 이는 MKCoordinateRegion 구조체에 저장되는 방식입니다.
내가 아는 한, MKMapKit으로 작업 할 때 정수 확대 / 축소 수준을 사용할 수 없거나 전혀 유용하지 않습니다. 나는 개인적으로 더 유연한 스팬 수치를 사용하는 것을 선호합니다.
최대 및 최소 확대 / 축소를 지정할 수 없으며 해킹하는 방법도 모르겠습니다. MKMapKit은 실제로 현재 매우 약합니다. 기능이 부족하여 실망 스럽습니다.
A quick comparison of zoom levels for a location using maps.google.com by inspecting the link querystring shows that the dx and dy span values increase by a factor of 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
...
Brant's category on MKMapView works well. However, it appears that it has not been updated to support newer devices with retina screens when calculating mapSizeInPixels.
It can be fixed by replacing this line:
CGSize mapSizeInPixels = mapView.bounds.size;
With this line:
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
'program story' 카테고리의 다른 글
C ++ / CLI System :: String ^에서 std :: string으로 변환 (0) | 2020.09.15 |
---|---|
CSS에 높이가 설정되지 않은 상태에서 div의 높이 가져 오기 (0) | 2020.09.15 |
PendingIntent는 첫 번째 알림에 대해서는 올바르게 작동하지만 나머지 알림에는 올바르지 않습니다. (0) | 2020.09.15 |
문자열에서 부동 숫자를 추출하는 방법 (0) | 2020.09.15 |
jQuery 날짜 선택기-과거 날짜 비활성화 (0) | 2020.09.15 |