Как перемещаться по значку транспортного средства для текущего местоположения с помощью SDK Google Map в Swift? - PullRequest
0 голосов
/ 18 февраля 2020

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

  • при перемещении значка , Похоже, что значок получил наклон.
  • Он не отображает фактическую позицию пользователя на маршруте, Значок отображается так, как будто он движется в стороне от маршрута.
  • Значок моего местоположения (синий значок) на карте Google постоянно меняет свою позицию.
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
    let direction = newHeading.trueHeading
        lastDriverAngleFromNorth = direction
        self.sourceMarker?.rotation = (lastDriverAngleFromNorth - mapBearing) - bearingValue

        DispatchQueue.main.async {
            CATransaction.begin()
            CATransaction.setValue(2, forKey: kCATransactionAnimationDuration)
                self.gmsmapView?.animate(toBearing: newHeading.magneticHeading)
                    CATransaction.commit()
    }
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let lastLocation = locations.last {

        self.currentLocation = lastLocation
            let zoom = self.gmsmapView?.camera.zoom ?? 20.0
            zoomLevel = zoom
            let destination = CLLocation.init(latitude: viewModel.marker.location[0], longitude: viewModel.marker.location[1])
            let bearing = getBearingBetweenTwoPoints(point1: lastLocation.coordinate, point2: destination.coordinate)
            self.cameraMoveToLocation(toLocation: lastLocation, zoom:zoom, bearing: bearing)
    }
}

func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) {
    mapBearing  = position.bearing
    if let coordinate = self.currentLocation?.coordinate{
            self.rerouteCalculation(currentLocation:coordinate)
    }

    self.sourceMarker?.rotation = (lastDriverAngleFromNorth - mapBearing) - bearingValue
}

func cameraMoveToLocation(toLocation: CLLocation, zoom : Float, bearing : Double) {
    self.gmsmapView?.animate(toLocation: toLocation.coordinate)
    self.sourceMarker?.position = toLocation.coordinate
}

Может кто-нибудь, пожалуйста, помогите мне, я застрял здесь.

enter image description here

1 Ответ

0 голосов
/ 18 февраля 2020

Убедитесь, что вы выбрали правильную точность местоположения для своих нужд.
CCLocationAccuracy предлагает следующие опции:

  • kCLLocationAccuracyBestForNavigation: <= Вы должны использовать это, когда устройство подключено к источнику питания </em>
    Максимально возможная точность, которая использует дополнительные данные датчика для облегчения навигации приложений.

  • kCLLocationAccuracyBest: <= Вы должны использовать это, когда устройство работает от батареи </em>
    Наилучший доступный уровень точности.

  • kCLLocationAccuracyNearestTenMeters: с точностью до десяти метров от желаемой цели.

  • kCLLocationAccuracyHundredMeters : с точностью до ста метров.

  • kCLLocationAccuracyKilometer: с точностью до ближайшего километра.

  • kCLLocationAccuracyThreeKilometers: с точностью до трех километров.

...