【问题标题】:Calculating total distance traveled not accurate计算总行驶距离不准确
【发布时间】:2016-03-18 21:06:16
【问题描述】:

使用下面的代码,当行驶至少几英里时,行驶距离总是比实际行驶距离低 20-40%。这是在一个大城市旅行,整个旅行都拥有强大的手机和 GPS 信号,所以我知道这不是问题。我使用 Google Maps 和 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 均无济于事。

【问题讨论】:

  • 如果您有always 权限,则不需要whenInUse 权限。 locations in didUpdateLocations 是一个数组;您可能会在此方法中获得多个位置更新。你应该迭代这个数组并添加任何中间距离

标签: ios swift


【解决方案1】:

您可能会收到一串位置更新,因为它会将您的精确位置归零。这些更新表明精度发生了变化,而不是实际运动 - 但看起来您的代码无论如何都会将它们注册为运动。无论您将desiredAccuracy 设置多高,都可能发生这种情况,因为it’s a maximum accuracy, not a minimum

您可以通过记录 CLLocationshorizontalAccuracyverticalAccuracy 属性来进行调试。

如果问题确实在于您收到的报告的准确性各不相同,一些可能的解决方案是:

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

如果这是随意的,我会做 #1 或 #2,如果你真的很在意,我会做 #3,并且只有在最大准确性是必不可少的情况下才会做 #4……而且你比我更了解数学。

【讨论】:

  • 我之前加了水平距离滤镜,没有任何效果
  • 但是您是否首先进行了答案中描述的实验以确定这是否是您的问题?您需要从更好的诊断开始。
猜你喜欢
  • 2015-05-11
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
相关资源
最近更新 更多