使用以下代码,当行驶至少几英里时,行驶距离始终比实际行驶距离低 20-40%。这是在一个大城市中旅行,整个行程中手机和 GPS 信号都很强,所以我知道这不是问题。我使用 Google map 和 MapMyHike 验证了实际距离。有任何想法吗? 下面粘贴代码的相关部分:
let metersToMiles: Double = 0.000621371
var startLocation: CLLocation!
var lastLocation: CLLocation!
var distanceTraveled: Double = 0
override func viewDidLoad() {
super.viewDidLoad()
self.locationManager.requestAlwaysAuthorization() // Location permission for background
self.locationManager.requestWhenInUseAuthorization() // Location permission for foreground
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.distanceFilter = kCLDistanceFilterNone
locationManager.activityType = CLActivityType.Fitness
locationManager.pausesLocationUpdatesAutomatically = false
}
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if startLocation == nil {
print("startLocation is null")
startLocation = locations.first
} else {
let lastLocation = locations.last
let distance = startLocation.distanceFromLocation(lastLocation!)
startLocation = lastLocation
distanceTraveled += distance
}
updateDistanceTraveledText()
}
func updateDistanceTraveledText() {
let distanceTraveledString = "\(String(format:"%.1f", distanceTraveled * metersToMiles))"
distanceTraveledText.text = distanceTraveledString
}
我还尝试了所有类型的desiredAccuracy,例如kCLLocationAccuracyBest和kCLLocationAccuracyNearestTenMeters等,并且根本不设置activityType,并将其设置为AutomotiveNavigation/Fitness,但均无济于事。
最佳答案
当它对准您的精确位置时,您可能会收到一串位置更新。这些更新表明精度发生了变化,而不是实际运动——但看起来您的代码无论如何都会将它们注册为运动。无论您将 desiredAccuracy
设置多高,这都可能发生,因为 it’s a maximum accuracy, not a minimum .
您可以通过记录 CLLocations
的 horizontalAccuracy
和 verticalAccuracy
属性进行调试。
如果问题确实是您得到的报告具有不同的准确性,一些可能的解决方案是:
- 使用
CLLocationManager
上的距离过滤器忽略小行程。 - 根据您设置的某个阈值,丢弃任何不够准确的
CLLocation
。 - 如果最新位置落在前一个位置的精度圆内(因此可能不代表实际运动),替换最后一个位置而不是添加新位置。
- 使用某种复杂的贝叶斯推理通过所有报告的点找到最大似然路径。
如果这是偶然的,我会做#1 或#2,如果你真的关心,我会做#3,只有当最大的准确性是必不可少的时候,我会做#4……而且你比我更了解数学。
关于ios - 计算总行驶距离不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36094223/