我正在开发一个正在运行的应用程序,因此计算某人走过的总距离对我的项目很重要。在我的 didUpdateLocations 方法中,我将新位置附加到数组,然后计算两个最新值之间的距离。然而,第一个计算是一个大得离谱的数字。无论我使用何种精度设置,问题仍然存在。
部分代码:
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 左右,这显然是不正确的。这是模拟器的问题还是我的实现?我该怎么做才能解决这个问题?
最佳答案
根据我的经验,您从位置管理器获得的第一个值是不好的。第一个位置读数通常是 GPS 上次“点亮”时的缓存读数。您可以通过检查位置上的时间戳来检测和拒绝过时的读数。如果超过一秒,则丢弃它。
接下来,您获得的前几个位置读数通常非常不准确。您想要检查水平精度读数,它实际上是一个“半径”值(以米为单位),它指定了该位置可能位于的圆的半径。值越小越好。
您应该检查水平精度读数并丢弃精度低于您选择的某个阈值的读数。我建议20米左右。根据条件,您可能无法获得比这更准确的任何读数。
模拟器对于测试这些东西几乎毫无值(value)。您需要创建一个测试应用程序来记录您获得的读数,然后带着它出去走走(和/或作为乘客乘坐汽车/公共(public)汽车)并进行测试。您甚至可以在拥有手机和 Mac 的情况下找人开车带您四处转转,并在系留状态下从 Xcode 运行应用程序。 (当我第一次弄清楚位置管理器的微妙之处时,我就这样做了。)
关于ios - CLLocation distanceFromLocation 返回错误答案,然后返回正确答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36802863/