MKMapView Збільшення та регіон


85

Я знайомий з використанням API Карт Google Javascript. Нещодавно я почав використовувати фреймворк MapKit для проекту iphone, але мені важко зрозуміти масштабування та встановлення регіону на карті.

В API Карт Google я раніше використовував цілі рівні масштабування, такі як 8, 9, 10, а також просту функцію setZoom (). Єдиним еквівалентним методом, який я бачу в рамках MapKit, є setRegion: animated. Як я розумію, мені потрібно встановити значення «дельти» широти та довготи регіону, щоб визначити рівень масштабування. Але я справді не уявляю, що представляють ці значення (я читаю документацію).

Коли я використовую делегат MKMapView і відстежую значення діапазону в методі делегата regionDidChange, результати, здається, не співвідносяться між собою. Це нормально, коли я зменшую масштаб і побачу, що значення дельта-діапазону збільшуються, як зазначено в документації. Але раптом я перетягую карту без масштабування, і значення дельти стають 0.0.

Хто-небудь може пояснити, що є орієнтиром для цих прольотів і дельт? Або існує який-небудь алгоритм для перетворення цілочисельного рівня масштабування (наприклад 9) у ці дельта-значення?

Як бонусне питання, чи є спосіб вказати мінімально-максимальний рівень масштабування на MKMapView :)

Дякую

Відповіді:


134

Перш за все, MKMapView не використовує / має заздалегідь визначений набір рівнів масштабування, як це робить Google Maps.

Натомість видима область MKMapView описується за допомогою MKCoordinateRegion , що складається з двох значень:

  1. центр (центральна точка регіону) та
  2. діапазон (розмір видимої області навколо центру).

Центральна точка повинна бути очевидною (це центральна точка регіону.)

Однак проміжок (який є MKCoordinateSpan ) складається з:

  1. latitudeDelta (вертикальна відстань, представлена ​​регіоном), і
  2. longitudeDelta (горизонтальна відстань, представлена ​​регіоном).

Короткий приклад. Ось іграшка MKCoordinateRegion:

  1. центр:
    • широта: 0
    • довгота: 0
  2. проміжок:
    • Дельта: 8
    • довгота Дельта: 6

Регіон можна описати за допомогою його мінімальної та максимальної координат наступним чином:

  1. мінімальна координата (нижня ліва точка):
    • широта: -4
    • довгота: -3
  2. максимальна координата (верхня права точка):
    • широта: 4
    • довгота: 3

Отже, ви можете вказати рівні масштабування навколо центральної точки, використовуючи MKCoordinateSpan відповідного розміру. Як наближення цифрових рівнів масштабування Google, ви можете здійснити зворотне проектування розмірів діапазону, які Google використовує для даного рівня масштабування, і відповідно створити діапазон. (Google описує їхні області перегляду так само, як це робить MKMapView, як центр + інтервал, тому ви можете витягти ці значення з Карт Google.)

Що стосується обмеження регіону, ви можете грати за допомогою цього методу делегування:

mapView:regionWillChangeAnimated

наприклад, шляхом зміни розміру регіону назад до дозволеного рівня масштабування. (Приблизно так, як подання таблиці дозволять вам прокрутити край, але потім повернуть гумку на місце.) Однак ваш пробіг може відрізнятися, оскільки я не використовував його для цієї мети.

До речі, в OS 3.1 є певні виправлення / вдосконалення аспектів MapKit, які доставляли мені проблеми в 3.0.


@Kelvin, чи можете ви описати детальніше, як "здійснити зворотне проектування розмірів діапазону, які Google використовує для даного рівня масштабування, і створити діапазон". Мені це дуже потрібно
Скофілд Тран

118

Якщо ви віддаєте перевагу використовувати явні рівні масштабування замість того, щоб визначати MKCoordinateSpan, я написав категорію, яка додає підтримку для визначення рівня масштабування MKMapView. Код можна знайти тут .


4
Дописи в блозі Троя дали мені прекрасне розуміння того, як працюють mapkit та google maps. Я настійно рекомендую прочитати його.
Аарон,

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

@JohnMerlino так, так
Zoltán Matók

5

Розмах в градусах широти та довготи. Існує метод побудови структур MKCoordinateRegion, який замість цього займає відстань. Може бути, ви використовуєте MKCoordinateRegionMakeWithDistance для вказівки діапазону, а потім, коли ви перевіряєте його в regionDidChange, ви бачите на lat / long span, саме так він зберігається в структурі MKCoordinateRegion.

Наскільки мені відомо, цілі рівні масштабування недоступні або взагалі корисні при роботі з MKMapKit. Я особисто віддаю перевагу використанню фігур розмаху, вони більш гнучкі.

Ви не можете вказати максимальне та мінімальне масштабування, і я не знаю способу його злому. MKMapKit насправді зараз досить слабкий, я розчарований відсутністю функцій.


3

Швидке порівняння рівнів масштабування для певного місця за допомогою 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
  ...

2

Категорія Бранта на MKMapView працює добре. Однак, схоже, він не був оновлений для підтримки новіших пристроїв з екранами сітківки при обчисленні mapSizeInPixels.

Це можна виправити, замінивши цей рядок:

CGSize mapSizeInPixels = mapView.bounds.size;

За допомогою цього рядка:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.