我正在开发一个正在运行的应用程序,因此计算某人旅行的总距离对我的项目非常重要。在我的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中,这显然是不正确的。这是模拟器或我的实现的问题吗?我该怎么做才能解决这个问题?
答案 0 :(得分:2)
根据我的经验,您从位置经理那里得到的第一个价值很糟糕。第一个位置读数通常是GPS最后“点亮”时的缓存读数。您可以通过检查位置上的时间戳来检测和拒绝陈旧读数。如果超过一秒钟,请丢弃它。
接下来,您获得的前几个位置读数通常非常不准确。您想要检查水平精度读数,它实际上是一个“半径”值(以米为单位),用于指定位置可能位于的圆的半径。较小的值更好。
您应该检查水平精度读数并丢弃读数,其中精度小于您选择的某个阈值。我建议20米左右。根据条件,您可能无法获得比这更准确的读数。
模拟器对测试这些东西毫无价值。您需要创建一个测试应用程序,记录您获得的读数,然后走出去(和/或乘坐汽车/公共汽车的乘客)并测试它。当你拥有手机和Mac并且在连接时从Xcode运行应用程序时,你甚至可能会有人带你到处走动。 (当我第一次弄清楚位置经理的微妙之处时,我这样做了。)