MKMapView 확대 및 영역


85

Google Maps Javascript API 사용에 익숙합니다. 최근에 iPhone 프로젝트에 MapKit 프레임 워크를 사용하기 시작했지만지도에서 확대 / 축소 및 지역 설정을 파악하는 데 어려움을 겪고 있습니다.

Google Maps API에서는 간단한 함수 setZoom ()과 함께 8, 9, 10과 같은 정수 줌 레벨을 사용했습니다. MapKit 프레임 워크에서 볼 수있는 유일한 방법은 setRegion : animated입니다. 내가 이해 한대로 확대 / 축소 수준을 지정하려면 지역의 범위의 위도와 경도 "델타"값을 설정해야합니다. 그러나 나는이 값이 무엇을 나타내는 지 정말로 모른다 (문서를 읽었다).

MKMapView 대리자를 사용하고 regionDidChange 대리자 메서드 결과에서 범위 값을 추적하면 서로 상관 관계가없는 것 같습니다. 축소하고 문서에 지정된대로 범위 델타 값이 증가하는 것을 보면 괜찮습니다. 하지만 갑자기 확대 / 축소하지 않고지도를 드래그하면 델타 값이 0.0이됩니다.

누군가이 스팬과 델타의 기준점이 무엇인지 설명해 주시겠습니까? 아니면 정수 확대 / 축소 수준 (예 : 9)을 이러한 델타 값으로 변환하는 알고리즘이 있습니까?

보너스 질문으로 MKMapView에 최소-최대 확대 / 축소 수준을 지정하는 방법이 있습니다. :)

감사

답변:


134

우선, MKMapView 는 Google지도처럼 미리 정의 된 확대 / 축소 수준 집합을 사용하지 않습니다.

대신 MKMapView의 가시 영역은 다음 두 값으로 구성된 MKCoordinateRegion을 사용하여 설명 됩니다.

  1. 중심 (지역의 중심점) 및
  2. 범위 (중앙 주변의 가시 영역의 크기).

중심점은 분명해야합니다 (영역의 중심점).

그러나 스팬 ( MKCoordinateSpan )은 다음으로 구성됩니다.

  1. latitudeDelta (지역이 나타내는 수직 거리) 및
  2. longitudeDelta (지역이 나타내는 수평 거리).

간단한 예. 다음은 장난감 MKCoordinateRegion입니다.

  1. 센터:
    • 위도 : 0
    • 경도 : 0
  2. 스팬:
    • latitudeDelta : 8
    • longitudeDelta : 6

지역은 다음과 같이 최소 및 최대 좌표를 사용하여 설명 할 수 있습니다.

  1. 최소 좌표 (왼쪽 아래 지점) :
    • 위도 : -4
    • 경도 : -3
  2. 최대 좌표 (오른쪽 위 점) :
    • 위도 : 4
    • 경도 : 3

따라서 적절한 크기의 MKCoordinateSpan을 사용하여 중심점 주변의 확대 / 축소 수준을 지정할 수 있습니다. Google의 숫자 확대 / 축소 수준의 근사치로 Google이 주어진 확대 / 축소 수준에 사용하는 범위 크기를 리버스 엔지니어링하고 그에 따라 범위를 만들 수 있습니다. (Google은 MKMapView와 동일한 방식으로 해당 뷰 영역을 중심 + 범위로 설명하므로 이러한 값을 Google지도에서 가져올 수 있습니다.)

지역 제한에 관해서는 다음 델리게이트 메소드로 플레이 할 수 있습니다.

mapView:regionWillChangeAnimated

예를 들어 지역을 허용 된 확대 / 축소 수준으로 다시 조정합니다. (테이블 뷰를 사용하면 가장자리를 지나서 스크롤 할 수 있지만 고무 밴드가 다시 제자리로 돌아 오는 것과 비슷합니다.) 그러나이 용도로 사용하지 않았기 때문에 마일리지가 다를 수 있습니다.

btw, 3.0에서 문제를 일으킨 MapKit의 측면에 대한 OS 3.1의 명확한 수정 / 개선 사항이 있습니다.


@Kelvin 님, "Google이 지정된 줌 레벨에 사용하는 범위 크기를 리버스 엔지니어링하고 범위를 만드는 방법"에 대해 자세히 설명해 주시겠습니까? 정말 필요합니다
Scofield Tran 2015 년

118

MKCoordinateSpan을 정의하는 대신 명시 적 확대 / 축소 수준을 사용하는 것을 선호하는 경우 MKMapView의 확대 / 축소 수준을 지정하는 지원을 추가하는 범주를 작성했습니다. 코드는 여기 에서 찾을 수 있습니다 .


4
Troy의 블로그 게시물을 통해 맵킷과 Google 맵이 작동하는 방식을 잘 이해할 수있었습니다. 나는 그것을 읽는 것이 좋습니다.
아론

5
자식 : //github.com/jdp-global/MKMapViewZoom.git
johndpope

@JohnMerlino 예 그렇습니다
졸탄 Matók

5

범위는 위도와 경도입니다. 대신 거리를 차지하는 MKCoordinateRegion 구조체를 생성하는 방법이 있습니다. MKCoordinateRegionMakeWithDistance를 사용하여 범위를 지정하고 regionDidChange에서 확인할 때 위도 / 경도 범위에서 볼 수 있으며, 이는 MKCoordinateRegion 구조체에 저장되는 방식입니다.

내가 아는 한, MKMapKit으로 작업 할 때 정수 확대 / 축소 수준을 사용할 수 없거나 전혀 유용하지 않습니다. 나는 개인적으로 더 유연한 스팬 수치를 사용하는 것을 선호합니다.

최대 및 최소 확대 / 축소를 지정할 수 없으며 해킹하는 방법도 모르겠습니다. MKMapKit은 실제로 현재 매우 약합니다. 기능이 부족하여 매우 실망 스럽습니다.


3

링크 쿼리 문자열을 검사하여 maps.google.com을 사용하여 위치의 확대 / 축소 수준을 빠르게 비교하면 dx 및 dy 범위 값이 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
  ...

2

MKMapView의 Brant 카테고리는 잘 작동합니다. 그러나 mapSizeInPixels를 계산할 때 망막 화면이있는 최신 장치를 지원하도록 업데이트되지 않은 것으로 보입니다.

다음 줄을 바꾸면 문제를 해결할 수 있습니다.

CGSize mapSizeInPixels = mapView.bounds.size;

이 라인으로 :

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.