GMSMapView обновляет положение камеры, чтобы она всегда показывала направление вверх во время навигации - PullRequest
0 голосов
/ 12 ноября 2018

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

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

enter image description here

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

enter image description here

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

            let cameraPosition = GMSCameraPosition.camera(withTarget: currentLocation, zoom: self.camera.zoom, bearing: MyRide.shared.bearing, viewingAngle: 45)
        let cameraUpdate = GMSCameraUpdate.setCamera(cameraPosition)

        CATransaction.begin()
        CATransaction.setValue(1.0, forKey: kCATransactionAnimationDuration)
        self.animate(with: cameraUpdate)
        CATransaction.commit()

1 Ответ

0 голосов
/ 16 ноября 2018
let camera = GMSCameraPosition.camera(withTarget: CLLocationCoordinate2DMake(startLat, startLong), zoom: 17, bearing: getBearingBetweenTwoPoints(point1: CLLocationCoordinate2DMake(startLat, startLong), point2:CLLocationCoordinate2DMake(endLat, endLong)), viewingAngle: 45)

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

func degreesToRadians(degrees: Double) -> Double { return degrees * .pi / 180.0 }
func radiansToDegrees(radians: Double) -> Double { return radians * 180.0 / .pi }

func getBearingBetweenTwoPoints(point1 : CLLocationCoordinate2D, point2 : CLLocationCoordinate2D) -> Double {

    let lat1 = degreesToRadians(degrees: point1.latitude)
    let lon1 = degreesToRadians(degrees: point1.longitude)

    let lat2 = degreesToRadians(degrees: point2.latitude)
    let lon2 = degreesToRadians(degrees: point2.longitude)

    let dLon = lon2 - lon1

    let y = sin(dLon) * cos(lat2)
    let x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon)
    let radiansBearing = atan2(y, x)

    return radiansToDegrees(radians: radiansBearing)
}

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

...