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

时间:2016-04-22 20:32:51

标签: ios iphone swift cllocationmanager cllocation

我正在开发一个正在运行的应用程序,因此计算某人旅行的总距离对我的项目非常重要。在我的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中,这显然是不正确的。这是模拟器或我的实现的问题吗?我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:2)

根据我的经验,您从位置经理那里得到的第一个价值很糟糕。第一个位置读数通常是GPS最后“点亮”时的缓存读数。您可以通过检查位置上的时间戳来检测和拒绝陈旧读数。如果超过一秒钟,请丢弃它。

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

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

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