MKMapView масштаб и регион


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

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

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

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

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

спасибо

5 83

5 ответов:

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

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

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

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

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

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

краткий пример. Вот такая игрушка MKCoordinateRegion:

  1. центр:
    • широта: 0
    • долгота: 0
  2. span:
    • широта: 8
    • longitudeDelta: 6

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

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

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

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

mapView:regionWillChangeAnimated

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

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

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

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

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

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

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

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

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

CGSize mapSizeInPixels = mapView.bounds.size;

С этой строки:

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