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

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

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

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

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

Вид на карту

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

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

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

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

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

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

Широта может находиться в пределах от -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 градусов, объекты между камерой и положением карты кажутся пропорционально больше, а объекты за пределами положения карты кажутся пропорционально меньшими, создавая трехмерный эффект.

Увеличить

Уровень масштабирования камеры определяет масштаб карты. При более высоких уровнях масштабирования на экране можно увидеть больше деталей, а при меньших уровнях масштабирования на экране можно увидеть большую часть мира. При уровне масштабирования 0 масштаб карты таков, что ширина всего мира составляет примерно 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)

Цель-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)

Цель-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
      

Цель-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)
      

Цель-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)
      

Цель-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)
      

Цель-C

[mapView animateToViewingAngle:45];
      

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

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

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

Быстрый

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

Цель-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))
      

Цель-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)
      

Цель-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)
      

Цель-C

[mapView animateToBearing:0];
      

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

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

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

Установите угол обзора программно с помощью GMSCameraPosition или GMSCameraUpdate или с помощью метода animateToViewingAngle: GMSMapView .

Быстрый

mapView.animate(toViewingAngle: 45)
      

Цель-C

[mapView animateToViewingAngle:45];
      

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

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

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

Быстрый

mapView.animate(toZoom: 12)
      

Цель-C

[mapView animateToZoom:12];
      

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

Быстрый

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

Цель-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
      

Цель-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
      

Цель-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)
      

Цель-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)
      

Цель-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)
      

Цель-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];
      

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

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

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

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

Вид на карту

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

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

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

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

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

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

Широта может находиться в пределах от -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 градусов, объекты между камерой и положением карты кажутся пропорционально больше, а объекты за пределами положения карты кажутся пропорционально меньшими, создавая трехмерный эффект.

Увеличить

Уровень масштабирования камеры определяет масштаб карты. При более высоких уровнях масштабирования на экране можно увидеть больше деталей, а при меньших уровнях масштабирования на экране можно увидеть большую часть мира. При уровне масштабирования 0 масштаб карты таков, что ширина всего мира составляет примерно 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)

Цель-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)

Цель-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
      

Цель-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)
      

Цель-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)
      

Цель-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)
      

Цель-C

[mapView animateToViewingAngle:45];
      

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

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

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

Быстрый

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

Цель-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))
      

Цель-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)
      

Цель-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)
      

Цель-C

[mapView animateToBearing:0];
      

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

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

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

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

Быстрый

mapView.animate(toViewingAngle: 45)
      

Цель-C

[mapView animateToViewingAngle:45];
      

Установить Zoom

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

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

Быстрый

mapView.animate(toZoom: 12)
      

Цель-C

[mapView animateToZoom:12];
      

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

Быстрый

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

Цель-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
      

Цель-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 of GMSMapView на объект GMSCoordinateBounds , который определяет требуемые границы. Чтобы позднее удалить ограничение, установите cameraTargetBounds в ноль.

Быстрый

mapView.cameraTargetBounds = bounds
      

Цель-C

mapView.cameraTargetBounds = bounds;
      

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

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

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

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

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

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

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

Глобальные константы kGMSMinZoomLevel и kGMSMaxZoomLevel определяют минимальные или максимальные значения масштабирования. По умолчанию свойства minZoom и maxZoom of 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)
      

Цель-C

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

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

Быстрый

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

Цель-C

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

Если, после обновления минимального и максимального увеличения, уровень масштабирования камеры устанавливается на значение за пределами нового диапазона, текущий Zoom автоматически обновляет для отображения ближайшего допустимого значения. Например, в следующем коде исходный масштаб определяется как 4. Когда диапазон Zoom позже устанавливается на 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)
      

Цель-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];
      

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

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

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

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

Представление карты

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

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

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

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

Цель (место)

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

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

Подшипник (ориентация)

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

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

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

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

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

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

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

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

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

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

Увеличить

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

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

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

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

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

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

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

Быстрый

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

Цель-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)

Цель-C

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

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

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

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

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

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

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

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

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

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

Быстрый

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

Цель-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 в GMSMapView animateWithCameraUpdate: Метод.

Быстрый

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

Цель-C

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

Используйте GMSMapView moveCamera: метод для привязки камеры в новую позицию.

В следующем примере вы используете 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)
      

Цель-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)
      

Цель-C

[mapView animateToViewingAngle:45];
      

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

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

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

Быстрый

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

Цель-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))
      

Цель-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)
      

Цель-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)
      

Цель-C

[mapView animateToBearing:0];
      

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

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

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

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

Быстрый

mapView.animate(toViewingAngle: 45)
      

Цель-C

[mapView animateToViewingAngle:45];
      

Установить Zoom

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

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

Быстрый

mapView.animate(toZoom: 12)
      

Цель-C

[mapView animateToZoom:12];
      

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

Быстрый

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

Цель-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
      

Цель-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 of GMSMapView на объект GMSCoordinateBounds , который определяет требуемые границы. Чтобы позднее удалить ограничение, установите cameraTargetBounds в ноль.

Быстрый

mapView.cameraTargetBounds = bounds
      

Цель-C

mapView.cameraTargetBounds = bounds;
      

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

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

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

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

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

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

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

Глобальные константы kGMSMinZoomLevel и kGMSMaxZoomLevel определяют минимальные или максимальные значения масштабирования. По умолчанию свойства minZoom и maxZoom of 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)
      

Цель-C

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

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

Быстрый

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

Цель-C

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

Если, после обновления минимального и максимального увеличения, уровень масштабирования камеры устанавливается на значение за пределами нового диапазона, текущий Zoom автоматически обновляет для отображения ближайшего допустимого значения. Например, в следующем коде исходный масштаб определяется как 4. Когда диапазон Zoom позже устанавливается на 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)
      

Цель-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];