CLLocation distanceFromLocation returns 错误答案,然后正确答案
CLLocation distanceFromLocation returns wrong answer, then correct answers
我正在开发一个 运行ning 应用程序,因此计算某人走过的总距离对我的项目很重要。在我的 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,这是荒谬的,因为它暗示 运行ner 移动了 34.5米在大约 1.3 秒(更新之间的时间)。然后,在第一次打印后,数字以合理的数量增加,例如:34.5、39.8、43.3 等……有时第一次打印的数字甚至可以在 500s 左右,这显然是不正确的。这是模拟器的问题还是我的实现?我该怎么做才能解决这个问题?
根据我的经验,您从位置管理器获得的第一个值很糟糕。第一个位置读数通常是 GPS 上次使用时的缓存读数 "lit." 您可以通过检查位置上的时间戳来检测和拒绝陈旧的读数。如果超过一秒,则丢弃它。
其次,您获得的前几个位置读数通常非常不准确。您想要检查水平精度读数,它实际上是一个 "radius" 值(以米为单位),它指定了该位置可能所在的圆的半径。值越小越好。
您应该检查水平精度读数并丢弃精度低于某个阈值的读数 select。我建议20米左右。根据条件,您可能无法获得比这更准确的任何读数。
模拟器对于测试这些东西几乎毫无价值。您需要创建一个测试应用程序来记录您获得的读数,然后带着它出去走走(and/or 作为乘客乘坐 car/bus)并进行测试。您甚至可以在 phone 和 Mac 以及 运行 来自 Xcode 的应用程序被拴住时找人开车兜风。 (当我第一次弄清楚位置管理器的微妙之处时,我就这样做了。)
我正在开发一个 运行ning 应用程序,因此计算某人走过的总距离对我的项目很重要。在我的 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,这是荒谬的,因为它暗示 运行ner 移动了 34.5米在大约 1.3 秒(更新之间的时间)。然后,在第一次打印后,数字以合理的数量增加,例如:34.5、39.8、43.3 等……有时第一次打印的数字甚至可以在 500s 左右,这显然是不正确的。这是模拟器的问题还是我的实现?我该怎么做才能解决这个问题?
根据我的经验,您从位置管理器获得的第一个值很糟糕。第一个位置读数通常是 GPS 上次使用时的缓存读数 "lit." 您可以通过检查位置上的时间戳来检测和拒绝陈旧的读数。如果超过一秒,则丢弃它。
其次,您获得的前几个位置读数通常非常不准确。您想要检查水平精度读数,它实际上是一个 "radius" 值(以米为单位),它指定了该位置可能所在的圆的半径。值越小越好。
您应该检查水平精度读数并丢弃精度低于某个阈值的读数 select。我建议20米左右。根据条件,您可能无法获得比这更准确的任何读数。
模拟器对于测试这些东西几乎毫无价值。您需要创建一个测试应用程序来记录您获得的读数,然后带着它出去走走(and/or 作为乘客乘坐 car/bus)并进行测试。您甚至可以在 phone 和 Mac 以及 运行 来自 Xcode 的应用程序被拴住时找人开车兜风。 (当我第一次弄清楚位置管理器的微妙之处时,我就这样做了。)