MKMapView Zoom и Region

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

В API Карт Google я использовал целые уровни масштабирования, такие как 8, 9, 10, а также простая функция setZoom(). Единственный эквивалентный метод, который я вижу в структуре MapKit, - setRegion: анимированный. Насколько я понимаю, мне нужно установить значения широты широты и долготы области, чтобы указать масштаб. Но я действительно не знаю, что представляют эти значения (я прочитал документацию).

Когда я использую делегат MKMapView и трассирую значения span в результатах метода делегата regionDidChange, похоже, не коррелирует друг с другом. Это нормально, когда я уменьшаю масштаб и вижу, что значения дельта диапазона увеличиваются, как указано в документации. Но внезапно я перетаскиваю карту без масштабирования, а значения дельта становятся 0.0.

Может кто-нибудь объяснить, что является точкой отсчета для этих диапазонов и дельта? Или есть алгоритм для преобразования целочисленного уровня масштабирования (например, 9) в эти значения дельта?

В качестве бонусного вопроса можно указать минимально-максимальный уровень масштабирования для MKMapView:)

Спасибо

Ответ 1

Прежде всего, MKMapView не использует/не имеет предопределенного набора уровней масштабирования, например Google Maps.

Вместо этого видимая область MKMapView описывается с помощью MKCoordinateRegion, которая состоит из двух значений:

  • центр (центральная точка области) и
  • span (размер видимой области вокруг центра).

Центральная точка должна быть очевиден (это центральная точка области.)

Однако span (который является MKCoordinateSpan) состоит из:

  • latitudeDelta​​strong > (вертикальное расстояние, представленное областью), и
  • longitudeDelta​​strong > (горизонтальное расстояние, представленное областью).

Краткий пример. Здесь игрушка MKCoordinateRegion:

  • Центр:
    • широта: 0
    • долгота: 0
  • диапазон:
    • latitudeDelta: 8
    • longitudeDelta: 6

Область может быть описана с использованием ее минимальных и максимальных координат следующим образом:

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

Итак, вы можете указать уровни масштабирования вокруг центральной точки, используя MKCoordinateSpan соответствующего размера. В качестве приближения цифровых уровней масштабирования Google вы можете изменить размеры диапазонов, которые Google использует для заданного уровня масштабирования, и создать промежуток соответственно. (Google описывает свои области просмотра так же, как MKMapView, как центр + span, поэтому вы можете вывести эти значения из Карт Google.)

Что касается ограничения области, вы можете сыграть с этим методом делегата:

mapView:regionWillChangeAnimated

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

btw, в OS 3.1 есть определенные исправления/улучшения в аспектах MapKit, которые давали мне проблемы в версии 3.0.

Ответ 2

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

Ответ 3

Пролет в градусах широты и долготы. Существует метод построения структур MKCoordinateRegion, которые занимают дистанцию. Возможно, вы используете MKCoordinateRegionMakeWithDistance для указания диапазона, а затем, когда вы проверяете его в regionDidChange, вы видите на лат/длинном промежутке, который хранится в структуре MKCoordinateRegion.

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

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

Ответ 4

Быстрое сравнение уровней масштабирования для местоположения с помощью 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
  ...

Ответ 5

Категория Бранта на MKMapView хорошо работает. Тем не менее, похоже, что он не обновлялся для поддержки более новых устройств с сетчатыми экранами при расчете mapSizeInPixels.

Его можно исправить, заменив эту строку:

CGSize mapSizeInPixels = mapView.bounds.size;

С помощью этой строки:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);