使用以下代码,行驶距离始终低于行驶至少几英里时行驶的实际距离20-40%。这是在一个大城市旅行,整个行程都有强大的小区和GPS信号,所以我知道这不是问题。我使用Google地图和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
}
我还尝试了所有类型的所需类型,如kCLLocationAccuracyBest和kCLLocationAccuracyNearestTenMeters等,并且根本没有设置activityType,并且还将它设置为AutomotiveNavigation / Fitness都无济于事。
答案 0 :(得分:1)
您可能会获得一系列位置更新,因为它会在您的精确位置上显示为零。这些更新表明精度的变化,而不是实际的运动 - 但看起来你的代码将把它们注册为运动。无论您设置desiredAccuracy
多高,都会发生这种情况,因为it’s a maximum accuracy, not a minimum。
您可以通过记录horizontalAccuracy
的{{1}}和verticalAccuracy
属性进行调试。
如果问题确实是您获得的报告具有不同的准确性,一些可能的解决方案是:
CLLocations
上的distace过滤器忽略小行程。CLLocationManager
。如果这是偶然的话,我会做#1或#2;如果你真的在意,我会做#3;如果最高准确度是必要的话,我会做#4 ...而且你对数学的了解比我更多。