Камера и область просмотра

Выберите платформу: Android iOS JavaScript

С помощью Maps SDK для iOS вы можете изменить точку обзора карты для пользователя, изменив положение камеры на карте.

С помощью Maps SDK для iOS ваши пользователи могут наклонять и вращать карты, чтобы настроить их ориентацию в соответствии со своим контекстом. При любом уровне масштабирования пользователи могут перемещать карту или изменять ее перспективу с минимальной задержкой.

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

Вид карты

В SDK для iOS карты используют проекцию Меркатора для отображения поверхности Земли (сферы) на экране вашего устройства (плоской плоскости).

Положение камеры

Карта отображается в виде камеры, направленной вниз на плоскую поверхность. Положение камеры (и, следовательно, отображение карты) задается следующими свойствами: цель (координаты широты/долготы) , азимут , наклон и масштабирование .

Диаграмма свойств камеры

Цель (местоположение)

Целью съемки является местоположение центра карты, заданное в виде координат широты и долготы.

Широта может находиться в диапазоне от -85 до 85 градусов включительно. Значения выше или ниже этого диапазона будут ограничены ближайшим значением в этом диапазоне. Например, указание широты 100 установит значение равным 85. Долгота находится в диапазоне от -180 до 180 градусов включительно. Значения выше или ниже этого диапазона будут округлены таким образом, чтобы они попадали в диапазон (-180, 180). Например, 480, 840 и 1200 будут округлены до 120 градусов.

Опорный подшипник (ориентация)

Азимут камеры указывает направление по компасу, измеряемое в градусах от истинного севера, соответствующее верхнему краю карты. Если провести вертикальную линию от центра карты до ее верхнего края, то азимут будет соответствовать направлению камеры (измеренному в градусах) относительно истинного севера.

Азимут 0 означает, что верхняя часть карты указывает на истинный север. Значение азимута 90 означает, что верхняя часть карты указывает строго на восток (90 градусов по компасу). Значение 180 означает, что верхняя часть карты указывает строго на юг.

API карт позволяет изменять азимут карты. Например, водитель автомобиля часто поворачивает дорожную карту, чтобы выровнять ее по направлению движения, в то время как туристы, использующие карту и компас, обычно ориентируют карту так, чтобы вертикальная линия указывала на север.

Наклон (угол обзора)

Угол наклона определяет положение камеры на дуге, расположенной непосредственно над центром карты, измеряемое в градусах от надира (направления, указывающего прямо под камеру). Значение 0 соответствует камере, направленной строго вниз. Значения больше 0 соответствуют камере, наклоненной к горизонту на указанное количество градусов. При изменении угла обзора карта отображается в перспективе: удаленные объекты кажутся меньше, а близлежащие — больше. Следующие иллюстрации демонстрируют это.

На изображениях ниже угол обзора равен 0 градусам. На первом изображении показана схема этого процесса; позиция 1 — это положение камеры, а позиция 2 — текущее положение на карте. Полученная карта показана ниже.

Скриншот карты, полученный с помощью камеры, расположенной под углом обзора 0 градусов, при уровне масштабирования 18.
Карта отображается с углом обзора, заданным камерой по умолчанию.
Диаграмма, показывающая стандартное положение камеры, непосредственно над картой, под углом 0 градусов.
Угол обзора камеры по умолчанию.

На изображениях ниже угол обзора составляет 45 градусов. Обратите внимание, что камера перемещается на половину дуги между прямой линией над головой (0 градусов) и землей (90 градусов), в положение 3. Камера по-прежнему направлена ​​на центр карты, но область, представленная линией в положении 4 , теперь видна.

Скриншот карты, полученный с помощью камеры, расположенной под углом обзора 45 градусов, при уровне масштабирования 18.
Карта отображается под углом обзора 45 градусов.
Диаграмма, показывающая угол обзора камеры, установленный на 45 градусов, при уровне масштабирования, по-прежнему установленном на 18.
Угол обзора камеры составляет 45 градусов.

Карта на этом скриншоте по-прежнему центрирована на той же точке, что и на исходной карте, но в верхней части карты появилось больше объектов. При увеличении угла обзора более чем на 45 градусов объекты между камерой и точкой на карте кажутся пропорционально больше, а объекты за пределами точки на карте — пропорционально меньше, создавая трехмерный эффект.

Зум

Уровень масштабирования камеры определяет масштаб карты. При большем масштабе на экране отображается больше деталей, а при меньшем — большая часть мира. При нулевом масштабе масштаб карты таков, что весь мир имеет ширину приблизительно 256 точек.

Увеличение масштаба на 1 удваивает ширину мира на экране. Следовательно, при масштабе N ширина мира составляет приблизительно 256 * 2 N точек. Например, при масштабе 2 ширина всего мира составляет приблизительно 1024 точки.

Уровень масштабирования не обязательно должен быть целым числом. Диапазон уровней масштабирования, разрешенных картой, зависит от ряда факторов, включая цель, тип карты и размер экрана. Любое число, выходящее за пределы диапазона, будет преобразовано в следующее ближайшее допустимое значение, которое может быть либо минимальным, либо максимальным уровнем масштабирования. В следующем списке показан приблизительный уровень детализации, который вы можете ожидать увидеть на каждом уровне масштабирования:

  • 1: Мир
  • 5: Суша/континент
  • 10: Город
  • 15: Улицы
  • 20: Здания
На следующих изображениях показано визуальное отображение различных уровней масштабирования:
Скриншот карты при уровне масштабирования 5.
Карта при уровне масштабирования 5.
Скриншот карты при уровне масштабирования 15.
Карта при уровне масштабирования 15.
Скриншот карты при уровне масштабирования 20.
Карта при уровне масштабирования 20.

Установите начальное положение камеры.

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

Чтобы задать начальное положение камеры, создайте объект GMSMapViewOptions и установите свойство camera в значение GMSCameraPosition . Затем передайте ваши параметры в конструктор класса GMSMapView .

Быстрый

let options = GMSMapViewOptions()
options.camera = GMSCameraPosition.camera(withLatitude: -33.8683, longitude: 151.2086, zoom: 16)
let mapView = GMSMapView(options:options)

Objective-C

GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init];
options.camera = [GMSCameraPosition cameraWithLatitude:-33.8683
                                                        longitude:151.2086
                                                             zoom:16];
GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options];

Вы также можете создать объект GMSMapView , используя стандартный метод инициализации UIView . В этом случае положение камеры изначально находится в точке по умолчанию, и вы можете изменить его после создания объекта.

Быстрый

let options = GMSMapViewOptions()
options.frame = self.view.bounds
let mapView = GMSMapView(options:options)

Objective-C

GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init];
options.frame = self.view.bounds;
GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options];

Измените положение камеры

Вы можете программно изменять положение камеры, чтобы задать местоположение, направление, наклон и масштаб. Хотя GMSMapView предоставляет несколько методов для изменения положения камеры, обычно используются GMSCameraPosition или GMSCameraUpdate :

  • GMSCameraPosition содержит свойства и методы, которые вы используете для изменения каждого параметра положения камеры: цели, направления, наклона и масштабирования.

  • GMSCameraUpdate позволяет изменять цель, азимут, наклон и масштабирование, а также содержит дополнительные удобные методы для поддержки прокрутки, расширенного масштабирования, центрирования камеры в пределах заданных границ и многого другого.

При перемещении камеры вы можете выбрать вариант «фиксации» камеры в новом положении (без анимации) или анимацию перемещения. Например, если вы анимируете изменение целевого положения камеры, анимация будет перемещаться от предыдущего положения к новому.

Анимация интерполирует значения между текущими и новыми параметрами камеры. Длительность анимации можно контролировать с помощью модуля Core Animation .

Используйте GMSCameraPosition

Чтобы изменить положение камеры с помощью GMSCameraPosition , создайте новый объект или скопируйте существующий, а затем установите его для объекта GMSMapView . Используйте объект GMSCameraPosition для привязки камеры к новому местоположению с анимацией или без нее.

Используйте объект GMSCameraPosition для настройки любых свойств камеры, таких как широта, долгота, масштабирование, азимут и угол обзора. Затем используйте этот объект для установки свойства camera объекта GMSMapView .

Быстрый

let fancy = GMSCameraPosition(
  latitude: -33,
  longitude: 151,
  zoom: 6,
  bearing: 270,
  viewingAngle: 45
)
mapView.camera = fancy
      

Objective-C

GMSCameraPosition *fancy = [GMSCameraPosition cameraWithLatitude:-33.8683
                                                       longitude:151.2086
                                                            zoom:6
                                                         bearing:30
                                                    viewingAngle:45];
[mapView setCamera:fancy];
      

Не указывайте значение свойства GMSCameraPosition , которое вы хотите установить по умолчанию.

Для анимации движения используйте метод animateToCameraPosition: вместо установки свойства camera .

Используйте GMSCameraUpdate

GMSCameraUpdate позволяет обновлять положение камеры и выбирать, следует ли привязываться к этому новому положению или анимировать его. Преимущество GMSCameraUpdate — удобство. Вы можете использовать GMSCameraPosition для выполнения тех же задач, что и GMSCameraUpdate , но GMSCameraUpdate предоставляет дополнительные вспомогательные методы, упрощающие управление камерой.

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

В качестве альтернативы, создайте объект GMSCameraUpdate с методом zoomIn: :. Затем обновите камеру, передав объект GMSCameraUpdate методу animateWithCameraUpdate: объекта GMSMapView .

Быстрый

// Zoom in one zoom level
let zoomCamera = GMSCameraUpdate.zoomIn()
mapView.animate(with: zoomCamera)
      

Objective-C

// Zoom in one zoom level
GMSCameraUpdate *zoomCamera = [GMSCameraUpdate zoomIn];
[mapView animateWithCameraUpdate:zoomCamera];
      

Вместо этого используйте метод moveCamera: GMSMapView , чтобы привязать камеру к новой позиции.

В следующем примере вы используете GMSCameraUpdate для анимации перемещения камеры с целью центрирования её на Ванкувере.

Быстрый

// Center the camera on Vancouver, Canada
let vancouver = CLLocationCoordinate2D(latitude: 49.26, longitude: -123.11)
let vancouverCam = GMSCameraUpdate.setTarget(vancouver)
mapView.animate(with: vancouverCam)
      

Objective-C

// Center the camera on Vancouver, Canada
CLLocationCoordinate2D vancouver = CLLocationCoordinate2DMake(49.26, -123.11);
GMSCameraUpdate *vancouverCam = [GMSCameraUpdate setTarget:vancouver];
[mapView animateWithCameraUpdate:vancouverCam];
      

Создайте объект GMSCameraUpdate

Создайте объект GMSCameraUpdate , используя один из его методов.

zoomIn: и zoomOut:
Измените текущий уровень масштабирования на 1,0, сохранив при этом все остальные параметры без изменений.
zoomTo:
Изменяет уровень масштабирования на заданное значение, сохраняя при этом все остальные свойства без изменений.
zoomBy:
Увеличивает (или уменьшает, если значение отрицательное) уровень масштабирования на заданное значение.
zoomBy:atPoint:
Увеличивает (или уменьшает, если значение отрицательное) уровень масштабирования на заданное значение, сохраняя при этом положение указанной точки на экране.
setTarget:
Изменяет широту и долготу камеры, сохраняя при этом все остальные свойства.
setTarget:zoom:
Изменяет широту, долготу и масштаб камеры, сохраняя при этом все остальные свойства.
setCamera:
Устанавливает новое значение GMSCameraPosition .
scrollByX:Y:
Изменяет широту и долготу камеры, чтобы переместить карту на указанное количество точек. Положительное значение x приводит к перемещению камеры вправо, так что карта кажется перемещенной влево. Положительное значение y приводит к перемещению камеры вниз, так что карта кажется перемещенной вверх. Прокрутка осуществляется относительно текущего направления камеры. Например, если направление камеры составляет 90 градусов, то восток — это «вверх».
fitBounds:
Преобразует камеру таким образом, чтобы она центрировалась в заданных пределах на экране при максимально возможном уровне масштабирования. Применяет отступ по умолчанию в 64 точки к этим границам.
fitBounds:withPadding:
Преобразует камеру таким образом, чтобы она центрировалась в заданных пределах на экране при максимально возможном уровне масштабирования. Используйте этот метод, чтобы задать одинаковый отступ в пунктах для всех сторон ограничивающего прямоугольника.
fitBounds:withEdgeInsets:
Преобразует камеру таким образом, чтобы она центрировалась в заданных пределах на экране при максимально возможном уровне масштабирования. С помощью UIEdgeInsets вы можете независимо задать отступы для каждой стороны ограничивающего прямоугольника.

Используйте GMSMapView для изменения отдельного свойства.

GMSMapView предоставляет несколько методов, позволяющих перемещать камеру без использования объектов GMSCameraPosition или GMSCameraUpdate . С помощью таких методов, как animateToLocation: или animateToZoom: можно анимировать изменение одного свойства камеры.

Например, используйте метод toViewingAngle: для анимации изменения наклона камеры.

Быстрый

mapView.animate(toViewingAngle: 45)
      

Objective-C

[mapView animateToViewingAngle:45];
      

Установить цель (местоположение)

Местоположение определяет центр карты. Местоположение задается широтой и долготой и программно представляется объектом CLLocationCoordinate2D , созданным с помощью CLLocationCoordinate2DMake .

Используйте GMSCameraPosition для изменения местоположения. В этом примере карта автоматически привязывается к новому местоположению.

Быстрый

let target = CLLocationCoordinate2D(latitude: -33.868, longitude: 151.208)
mapView.camera = GMSCameraPosition(target: target, zoom: 6)
      

Objective-C

CLLocationCoordinate2D target =
    CLLocationCoordinate2DMake(-33.868, 151.208);
mapView.camera = [GMSCameraPosition cameraWithTarget:target zoom:6];
      

Чтобы анимировать изменение местоположения и переместить карту в новое место, можно использовать метод ` animateToCameraPosition: ` вместо установки свойства camera . Или же используйте метод ` animateToLocation: ` в классе GMSMapView .

Быстрый

mapView.animate(toLocation: CLLocationCoordinate2D(latitude: -33.868, longitude: 151.208))
      

Objective-C

[mapView animateToLocation:CLLocationCoordinate2DMake(-33.868, 151.208)];
      

Вы также можете создать объект GMSCameraUpdate для перемещения камеры. Используйте его встроенный метод scrollByX:Y: чтобы указать количество точек для прокрутки камеры в направлениях X и Y. В этом примере вы прокручиваете камеру на 200 точек вправо и на 100 точек вниз:

Быстрый

// Move the camera 200 points to the right, and 100 points downwards
let downwards = GMSCameraUpdate.scrollBy(x: 200, y: 100)
mapView.animate(with: downwards)
      

Objective-C

// Move the camera 200 points to the right, and 100 points downwards
GMSCameraUpdate *downwards = [GMSCameraUpdate scrollByX:200.0 Y:100.0];
[mapView animateWithCameraUpdate:downwards];
      

Установлен подшипник (ориентация)

Азимут — это направление по компасу, измеряемое в градусах от истинного севера, относительно верхнего края карты. Например, азимут в 90 градусов означает, что верхний край карты будет направлен строго на восток.

Задайте азимут программно с помощью GMSCameraPosition или GMSCameraUpdate , либо с помощью метода animateToBearing: класса GMSMapView .

Быстрый

mapView.animate(toBearing: 0)
      

Objective-C

[mapView animateToBearing:0];
      

Установите угол наклона (угол обзора).

Угол обзора — это положение камеры на дуге между точкой непосредственно над центром карты и поверхностью Земли, измеряемое в градусах от надира (направления, указывающего прямо под камеру). При изменении угла обзора карта отображается в перспективе: объекты между камерой и точкой на карте кажутся пропорционально больше, а объекты за точкой на карте — пропорционально меньше, создавая трехмерный эффект.

Угол обзора может варьироваться от 0 (направление прямо вниз на карту) до максимального значения, зависящего от уровня масштабирования. При уровне масштабирования 16 и выше максимальный угол составляет 65 градусов. При уровне масштабирования 10 и ниже максимальный угол составляет 30 градусов.

Задайте угол обзора программно, используя GMSCameraPosition или GMSCameraUpdate , либо с помощью метода animateToViewingAngle: класса GMSMapView .

Быстрый

mapView.animate(toViewingAngle: 45)
      

Objective-C

[mapView animateToViewingAngle:45];
      

Установить масштаб

Уровень масштабирования камеры определяет масштаб карты. При большем масштабе на экране отображается больше деталей, а при меньшем — большая часть мира.

Установите масштаб программно с помощью GMSCameraPosition или GMSCameraUpdate , либо с помощью метода animateToZoom: класса GMSMapView .

Быстрый

mapView.animate(toZoom: 12)
      

Objective-C

[mapView animateToZoom:12];
      

В следующем примере метод zoomIn: используется для создания объекта GMSCameraUpdate , который анимирует увеличение масштаба на один уровень от текущего уровня.

Быстрый

// Zoom in one zoom level
let zoomCamera = GMSCameraUpdate.zoomIn()
mapView.animate(with: zoomCamera)
      

Objective-C

// Zoom in one zoom level
GMSCameraUpdate *zoomCamera = [GMSCameraUpdate zoomIn];
[mapView animateWithCameraUpdate:zoomCamera];
      

Установите границы

Чтобы переместить камеру так, чтобы вся интересующая область была видна при максимально возможном масштабировании, задайте границы поля зрения камеры. Например, если вы хотите отобразить все автозаправочные станции в радиусе пяти миль от текущего местоположения пользователя, переместите камеру так, чтобы все они были видны на экране:

  1. Рассчитайте значения GMSCoordinateBounds , которые вы хотите отобразить на экране.
  2. Используйте метод cameraForBounds:insets: класса GMSMapView , чтобы получить новый объект GMSCameraPosition .

Установите эти границы таким образом, чтобы заданная область GMSCoordinateBounds полностью соответствовала размеру текущей карты. Обратите внимание, что этот метод устанавливает наклон и азимут карты равными 0.

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

Быстрый

let vancouver = CLLocationCoordinate2D(latitude: 49.26, longitude: -123.11)
let calgary = CLLocationCoordinate2D(latitude: 51.05,longitude: -114.05)
let bounds = GMSCoordinateBounds(coordinate: vancouver, coordinate: calgary)
let camera = mapView.camera(for: bounds, insets: UIEdgeInsets())!
mapView.camera = camera
      

Objective-C

CLLocationCoordinate2D vancouver = CLLocationCoordinate2DMake(49.26, -123.11);
CLLocationCoordinate2D calgary = CLLocationCoordinate2DMake(51.05, -114.05);
GMSCoordinateBounds *bounds =
    [[GMSCoordinateBounds alloc] initWithCoordinate:vancouver coordinate:calgary];
GMSCameraPosition *camera = [mapView cameraForBounds:bounds insets:UIEdgeInsetsZero];
mapView.camera = camera;
      

Ограничить перемещение курсора пользователем определенной областью.

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

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

Чтобы ограничить панорамирование определенными границами, установите свойство cameraTargetBounds объекта GMSMapView в объект GMSCoordinateBounds , определяющий необходимые границы. Чтобы впоследствии снять ограничение, установите cameraTargetBounds в значение nil.

Быстрый

mapView.cameraTargetBounds = bounds
      

Objective-C

mapView.cameraTargetBounds = bounds;
      

На следующей диаграмме показан сценарий, когда область, в которую направлена ​​камера, немного превышает размер области просмотра. Пользователь может прокручивать и перемещать изображение, при условии, что объект камеры остается в пределах этой области. Крестик обозначает объект камеры:

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

Карта всегда заполняет область просмотра, даже если это приводит к отображению областей, выходящих за её пределы. Например, если вы расположите цель камеры в углу ограниченной области, область за углом будет видна в области просмотра, но пользователи не смогут прокрутить её дальше. Следующая диаграмма иллюстрирует этот сценарий. Крестик обозначает цель камеры:

Диаграмма, показывающая расположение мишени камеры в правом нижнем углу границ камеры.

На следующей диаграмме область действия камеры имеет очень ограниченные границы, предоставляя пользователю очень мало возможностей для прокрутки или перемещения карты. Крестик обозначает область действия камеры:

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

Установите минимальное или максимальное увеличение.

Глобальные константы kGMSMinZoomLevel и kGMSMaxZoomLevel определяют минимальное или максимальное значение масштабирования. По умолчанию свойства minZoom и maxZoom объекта GMSMapView установлены на эти константы.

Чтобы ограничить диапазон уровней масштабирования карты, задайте минимальный и максимальный уровни масштабирования. Следующий код ограничивает уровень масштабирования значениями от 10 до 15.

Быстрый

let camera = GMSCameraPosition(
  latitude: 41.887,
  longitude: -87.622,
  zoom: 12
)
let mapView = GMSMapView(frame: .zero, camera: camera)
mapView.setMinZoom(10, maxZoom: 15)
      

Objective-C

GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:41.887
                                                       longitude:-87.622
                                                             zoom:12];
GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero
                                        camera:camera];
[mapView setMinZoom:10 maxZoom:15];
      

Диапазон масштабирования необходимо задать с помощью метода setMinZoom:maxZoom: однако текущие значения можно считать, используя свойства minZoom и maxZoom . Такой подход полезен, когда ограничивается только одно из значений. Приведенный ниже код изменяет только минимальный уровень масштабирования.

Быстрый

mapView.setMinZoom(12, maxZoom: mapView.maxZoom)
      

Objective-C

[mapView setMinZoom:12 maxZoom:mapView.maxZoom];
      

Если после обновления минимального и максимального масштабирования уровень масштабирования камеры устанавливается на значение, выходящее за пределы нового диапазона, текущий масштаб автоматически обновляется, отображая ближайшее допустимое значение. Например, в приведенном ниже коде исходный масштаб определен как 4. Когда диапазон масштабирования позже устанавливается в 10-15, текущий масштаб обновляется до 10.

Быстрый

// Sets the zoom level to 4.
let camera2 = GMSCameraPosition(
  latitude: 41.887,
  longitude: -87.622,
  zoom: 4
)
let mapView2 = GMSMapView(frame: .zero, camera: camera)

// The current zoom, 4, is outside of the range. The zoom will change to 10.
mapView.setMinZoom(10, maxZoom: 15)
      

Objective-C

// Sets the zoom level to 4.
GMSCameraPosition *camera2 = [GMSCameraPosition cameraWithLatitude:41.887
                                                         longitude:-87.622
                                                              zoom:4];
GMSMapView *mapView2 = [GMSMapView mapWithFrame:CGRectZero
                                         camera:camera];
// The current zoom, 4, is outside of the range. The zoom will change to 10.
[mapView setMinZoom:10 maxZoom:15];