MKMapCamera меняет заголовок, чтобы посмотреть на другой центр карты
Я пытаюсь использовать MKMapView и MKMapCamera. До сих пор я был в состоянии настроить все и настроить карту в режиме 3D / эстакаду. Я беру, например, для центра моих карт здание Empire State Building в Нью-Йорке и настраиваю MKMapCamera с помощью конструктора:
public init(lookingAtCenterCoordinate centerCoordinate:
CLLocationCoordinate2D, fromDistance distance: CLLocationDistance,
pitch: CGFloat, heading: CLLocationDirection)
Теперь я могу видеть в центре Эмпайр Стейт Билдинг. Теперь я хотел бы изменить "направление" (CLLocationDirection) моей MKMapCamera так, чтобы оно указывало на другое направление: то есть отсутствие центра Эмпайр Стейт Билдинг.
Прямо сейчас, если я изменю направление на камеру, она на самом деле переместит камеру и сохранит здание Эмпайр Стейтс в центре моего MKMapView.
Глядя на различные API, я не могу найти, какой API можно использовать для "перерасчета" нового центра MKMapView после изменения заголовка.
Я хотел бы получить противоположное поведение текущего MKMapView, где я хочу, чтобы моя MKMapCamera была зафиксирована там, где центр карты перемещается в соответствии с указанным мною заголовком.
Каков будет правильный путь для достижения этого?
1 ответ
Когда вы меняете заголовок MKMapCamera
Объект, который смотрит в центр карты, вы меняете угол поворота камеры вокруг этой центральной точки. Представьте, что камера привязана к центральной точке куском веревки. Камера может двигаться только по кругу вокруг центральной точки. То, как далеко камера перемещается вокруг центральной точки, определяется курсом камеры. В вашем примере, центральная точка - Эмпайр-Стейт-Билдинг, поэтому изменение направления камеры будет перемещать камеру вокруг Эмпайр-Стейт-Билдинг по кругу, удерживая камеру лицом к зданию.
Если я правильно понимаю ваше требование, вы хотите сохранить фиксированное местоположение камеры и изменить местоположение, показанное в центре карты, используя заголовок камеры. Для этого вам нужно рассчитать новую координату центра для карты. Новая координата центра будет точкой на окружности воображаемого круга с центром в вашей камере. Радиус круга - это расстояние от точки в центре карты до камеры.
Этот расчет использует местоположение камеры, курс от камеры и расстояние от камеры, чтобы вычислить координаты широты и долготы, которые будут новым центром карты. GreatCircle - это библиотека Objective-C, которая обеспечивает locationWithBearing:distance:
метод как продолжение CLLocation
который выполняет необходимые вам расчеты:
- (nonnull CLLocation *)locationWithBearing:(CLLocationDirection)bearing
distance:(CLLocationDistance)distance;
Итак, учитывая местоположение вашей камеры c
Заголовок (подшипник) h
(в градусах) и расстояние d
(в метрах), новый центр карты m
будет (в Swift):
let m = c.locationWithBearing(h, distance: d)