programing

MK맵 보기 줌 및 영역

sourcetip 2023. 9. 9. 22:39
반응형

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은 두 개의 값으로 구성됩니다.

  1. 중심(영역의 중심점) 및
  2. 스팬(중심 주위에 보이는 영역의 크기).

중심점이 분명해야 합니다(지역의 중심점입니다).

그러나 스팬(MK 좌표 스팬)은 다음과 같이 구성됩니다.

  1. 위도 델타(영역이 나타내는 수직 거리) 및
  2. 경도 델타(영역이 나타내는 수평 거리).

간단한 예.장난감 MK 좌표 지역:

  1. 중심:
    • 위도: 0
    • 경도: 0
  2. 스팬:
    • 위도 델타: 8
    • 경도 델타: 6

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

  1. 최소 좌표(좌측 하단 지점):
    • 위도: -4
    • 경도: -3
  2. 최대 좌표(우측 상단 점):
    • 위도: 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

반응형