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 ответов:
прежде всего,MKMapView не использует/имеет предопределенный набор уровней масштабирования, как это делает Google Maps.
вместо этого видимая область MKMapView описывается с помощью MKCoordinateRegion, которая состоит из двух значений:
- центр (центральная точка области), и
- span (размер видимой области вокруг центра).
центральная точка должна быть очевидно (это центральная точка региона.)
однако, span (который является MKCoordinateSpan) состоит из:
- latitudeDelta (вертикальное расстояние, представленное областью), и
- longitudeDelta (горизонтальное расстояние, представленное областью).
краткий пример. Вот такая игрушка MKCoordinateRegion:
- центр:
- широта: 0
- долгота: 0
- span:
- широта: 8
- longitudeDelta: 6
область может быть описана с использованием ее минимальных и максимальных координат следующим образом:
- минимальная координата (нижняя левая точка):
- широта: -4
- долгота: -3
- максимальная координата (верхняя правая точка):
- широта: 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);