ios - 计算总行驶距离不准确

标签 ios swift

使用以下代码,当行驶至少几英里时,行驶距离始终比实际行驶距离低 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 .

您可以通过记录 CLLocationshorizo​​ntalAccuracyverticalAccuracy 属性进行调试。

如果问题确实是您得到的报告具有不同的准确性,一些可能的解决方案是:

  • 使用 CLLocationManager 上的距离过滤器忽略小行程。
  • 根据您设置的某个阈值,丢弃任何不够准确的 CLLocation
  • 如果最新位置落在前一个位置的精度圆内(因此可能不代表实际运动),替换最后一个位置而不是添加新位置。
  • 使用某种复杂的贝叶斯推理通过所有报告的点找到最大似然路径。

如果这是偶然的,我会做#1 或#2,如果你真的关心,我会做#3,只有当最大的准确性是必不可少的时候,我会做#4……而且你比我更了解数学。

关于ios - 计算总行驶距离不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36094223/

相关文章:

android - 适用于网站的 iOS 和 Android App Shell - 哪种技术最有效? WebView ?渐进式应用程序?

ios - React Native - BVLinearGradient - 找不到 'React/RCTViewManager.h' 文件

objective-c - NSUserDefaults 无法在应用程序关闭/启动期间持续存在

ios - SwiftyJSON 不断返回空对象

ios - 玩家与物体碰撞时如何更改 View Controller ?

objective-c - IOS JSON转义特殊字符

Swift Uint32 将所有偶数识别为相同

ios - 如何使用像 TikTok App 这样的平移手势来缩放相机

swift - 将评分添加到值并计算 Firebase 中的平均值

ios - Xcode/Swift 'filename used twice' 构建错误