MKMapView Увеличить и область

голоса
83

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

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

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

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

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

благодаря

Задан 22/07/2009 в 17:16
источник пользователем
На других языках...                            


5 ответов

голоса
133

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

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

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

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

Тем не менее, продолжительность (который является MKCoordinateSpan ) состоит из:

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

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

  1. центр:
    • широта: 0
    • долгота: 0
  2. продолжительность:
    • latitudeDelta: 8
    • longitudeDelta: 6

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

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

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

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

mapView:regionWillChangeAnimated

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

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

Ответил 22/07/2009 в 20:36
источник пользователем

голоса
117

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

Ответил 23/01/2010 в 03:49
источник пользователем

голоса
4

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

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

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

Ответил 22/07/2009 в 19:09
источник пользователем

голоса
3

Быстрое сравнение уровней масштабирования для местоположения с использованием maps.google.com путем проверки линии связи показывает строку запроса, что ое и д значения пролетного увеличение в 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
  ...
Ответил 11/12/2009 в 01:30
источник пользователем

голоса
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);
Ответил 19/06/2014 в 16:43
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more