Движение маркера на карте Google - PullRequest
0 голосов
/ 15 сентября 2018

Я создаю Uber-подобное приложение для iOS (swift). Я интегрировал карту Google и добавил маркер. Также я получаю текущую широту и долготу транспортного средства из бэкэнд-API.Теперь я хочу показать движение транспортного средства в моем приложении.Я написал некоторый код, и он работает.Но есть некоторые проблемы с движением автомобиля.Существует некоторое различие между положением маркера в моем приложении и фактическим местоположением транспортного средства.Точность не очень хорошая.Здесь я делюсь своим кодом. Я вызываю бэкэнд API каждые 5 секунд.

func moveCab()
{
    let oldCoordinate: CLLocationCoordinate2D? = CLLocationCoordinate2DMake(Double(oldLatitude)!,Double(oldLongitude)!)
    let newCoordinate: CLLocationCoordinate2D? = CLLocationCoordinate2DMake(Double(currentLatitude)!,Double(currentLongitude)!)
    mMarker.groundAnchor = CGPoint(x: CGFloat(0.5), y: CGFloat(0.5))
    mMarker.rotation = CLLocationDegrees(getHeadingForDirection(fromCoordinate: oldCoordinate!, toCoordinate: newCoordinate!))
    //found bearing value by calculation when marker add
    mMarker.position = oldCoordinate!
    //this can be old position to make car movement to new position
    mMarker.map = mapView

    //marker movement animation
    CATransaction.begin()
    CATransaction.setValue(Int(2.0), forKey: kCATransactionAnimationDuration)
    CATransaction.setCompletionBlock({() -> Void in
        self.mMarker.groundAnchor = CGPoint(x: CGFloat(0.5), y: CGFloat(0.5))
       // mMarker.rotation = CDouble(data.value(forKey: "bearing"))
        //New bearing value from backend after car movement is done
    })
    mMarker.position = newCoordinate!


    mMarker.map = mapView
    mMarker.groundAnchor = CGPoint(x: CGFloat(0.5), y: CGFloat(0.5))
    mMarker.rotation = CLLocationDegrees(getHeadingForDirection(fromCoordinate: oldCoordinate!, toCoordinate: newCoordinate!))
    //found bearing value by calculation
    CATransaction.commit()
    oldLatitude = currentLatitude
    oldLongitude = currentLongitude   
}



  func getHeadingForDirection(fromCoordinate fromLoc: CLLocationCoordinate2D, toCoordinate toLoc: CLLocationCoordinate2D) -> Float {

        let fLat: Float = Float((fromLoc.latitude).degreesToRadians)
        let fLng: Float = Float((fromLoc.longitude).degreesToRadians)
        let tLat: Float = Float((toLoc.latitude).degreesToRadians)
        let tLng: Float = Float((toLoc.longitude).degreesToRadians)
        let degree: Float = (atan2(sin(tLng - fLng) * cos(tLat), cos(fLat) * sin(tLat) - sin(fLat) * cos(tLat) * cos(tLng - fLng))).radiansToDegrees
        if degree >= 0 {
            return degree
        }
        else {
            return 360 + degree
        }



  extension Int {
    var degreesToRadians: Double { return Double(self) * .pi / 180 }
}
extension FloatingPoint {
    var degreesToRadians: Self { return self * .pi / 180 }
    var radiansToDegrees: Self { return self * 180 / .pi }
}
...