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 的应用程序被拴住时找人开车兜风。 (当我第一次弄清楚位置管理器的微妙之处时,我就这样做了。)