gpt4 book ai didi

ios - 像 uber 一样在 Mapbox map 上移动 MGLPointAnnotation

转载 作者:行者123 更新时间:2023-11-29 05:33:55 24 4
gpt4 key购买 nike

我正在将 Mapbox iOS SDK 集成到我的应用程序中。现在我陷入了一个困境,我想实现像 Uber 应用程序这样的汽车跟踪功能。

我曾经在 Google Maps SDK 中使用过该功能,但无法使其与 Mapbox SDK 一起使用。

我正在添加 MGLPointAnnotation 对象以将其添加到 map 上,并希望通过动画将其从 A 点移动到 B 点。

我正在使用

UIView.animate(withDuration: TimeInterval(duration), animations: {
// Update annotation coordinate to be the destination coordinate
point.coordinate = newCoordinate
}, completion: nil)

但是对于 MGLPointAnnotation 我无法更改其图像,因为当转弯时我想旋转图像(注释)。

如果我使用 MGLAnnotationView 对象,我可以更改图像,但无法更改其坐标,因为它是只读的。

我应该在这里做什么来实现该功能?

最佳答案

几年前我写过类似的东西,我使用GoggleMaps,浏览一下代码,也许会有帮助,我真的不记得角度计数中的所有数字是什么

    extension Double {

var degrees: Double {
return self * 180.0 / Double.pi
}

}


extension CLLocationCoordinate2D {

func angleToPosition(position : CLLocationCoordinate2D) -> CLLocationDegrees {
let bearingRadians = atan2(Double(position.latitude - latitude), Double(position.longitude - longitude))
var bearingDegrees = bearingRadians.degrees
// print("\(bearingDegrees)")
var roundDegrees = 360.0
if bearingDegrees < 0 {
if bearingDegrees > -90 {
roundDegrees = 350
}
if bearingDegrees < -90 && bearingDegrees > -180 {
roundDegrees = 370
}
bearingDegrees += roundDegrees
return 360 - bearingDegrees
}
roundDegrees = bearingDegrees < 90 ? 350 : 360
if bearingDegrees > 90 && bearingDegrees < 180 {
roundDegrees = 370
}
UserDefaults.standard.set(bearingDegrees, forKey: "bearingDegrees")
return roundDegrees - bearingDegrees
}

func duration(toDestination destination: CLLocationCoordinate2D, withSpeed speed : Double) -> Double {
let distance = GMSGeometryDistance(self, destination)
return distance / (speed * (1000 / 3600))
}

}

这是执行旋转的函数,您可以在收到新坐标后立即使用它,或者如果您有特定的折线,则在 for 循环中调用它

func animateCarDrive(info: [String: Any]) {
let speed = info["speed"] as? Double ?? 40 // if your car's speed is changeable
let position = info["position"] as? CLLocationCoordinate2D // new point position
let duration = marker.position.duration(toDestination: position, withSpeed: speed)
marker.rotation = marker.position.angleToPosition(position: position)
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
marker.position = position
CATransaction.commit()
}

关于ios - 像 uber 一样在 Mapbox map 上移动 MGLPointAnnotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57247757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com