CLLocation distanceFromLocation返回错误的答案,然后正确的答案

问题描述:

我正在开发一个正在运行的应用程序,因此计算某人旅行的总距离对于我的项目很重要。在我的didUpdateLocations方法中,我将新位置附加到一个数组,然后计算两个最近值之间的距离。然而,第一个计算是一个荒谬的数字。无论我使用何种精度设置,问题都会持续存在。CLLocation distanceFromLocation返回错误的答案,然后正确的答案

一些代码:

var locationIndex = 0 
    var distanceTraveled: CLLocationDistance = 0.0 
    var allLocations = [CLLocation]() 

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

     print(allLocations.count) 

     if locations[0].horizontalAccuracy < 15 { 

     self.allLocations.append(locations[0]) 

     if allLocations.count > 1 { 

      var distanceIncrement = CLLocationDistance() 

      distanceIncrement = allLocations[allLocations.endIndex - 2].distanceFromLocation(allLocations[allLocations.endIndex - 1]) 

      self.distanceTraveled += distanceIncrement 
      print(distanceTraveled) 

     } 

     } else { 

      print("Invalid") 

     } 

    } 

会发生什么事,当我打印(distanceTraveled)是第一个值,例如,34.5模拟运行,这是荒谬的,因为它意味着当跑步者在大约1.3秒内(更新之间的时间)移动了34.5米。然后,在第一次打印后,数字会增加合理的数量,例如:34.5,39.8,43.3等...有时第一次打印的数字甚至可能在500s内,这显然是不正确的。这是模拟器还是我的实现问题?我能做些什么来解决这个问题?

+0

http://*.com/a/28953613/2303865 –

根据我的经验,你从位置经理获得的第一个值是不好的。第一个位置读数通常是GPS上次“点亮”时的缓存读数。您可以通过检查位置上的时间戳来检测并拒绝陈旧的读数。如果它超过了一秒钟,就丢弃它。

接下来,您获得的前几个位置读数往往相当不准确。您想要检查水平精度读数,这实际上是一个“半径”值(以米为单位),用于指定位置可能位于的圆的半径。较小的值更好。

如果精度低于您选择的某个阈值,您应该检查水平精度读数并丢弃读数。我建议20米左右。根据条件,您可能无法获得比此更准确的任何读数。

模拟器对测试这些东西毫无价值。你需要创建一个测试应用程序,记录你得到的读数,然后出去走走(和/或乘坐汽车/公共汽车乘客)并测试。您甚至可以让某人在您拥有手机和Mac时驱动您,并在系绳时从Xcode运行应用程序。 (当我第一次弄清楚位置管理器的细微之处时,我这样做了。)

+0

谢谢。它并没有真正的帮助,但却提供了宝贵的建议。我认为这只是一个模拟器。我已经实施了你的安全卫士。为了模拟的目的,我刚刚抛出了第一个值。似乎工作得不错。 –

+0

它没有帮助?你有没有弄清楚为什么你会得到错误的答案,然后是好的答案?你在模拟器或设备上测试吗? –

+0

它没有帮助,因为无论我尝试了什么,我仍然在模拟器上看到错误的读数。这个问题可以在实际设备上解决。 –