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

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

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

введите здесь описание изображения

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

введите здесь описание изображения

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

            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()

person Anand Suthar    schedule 12.11.2018    source источник


Ответы (1)


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)
}

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

person Datt Patel    schedule 16.11.2018