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)
Другие вопросы по тегам