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

Posted

技术标签:

【中文标题】CLLocation distanceFromLocation 返回错误答案,然后是正确答案【英文标题】:CLLocation distanceFromLocation returns wrong answer, then correct answers 【发布时间】:2016-04-22 20:32:50 【问题描述】:

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

【问题讨论】:

***.com/a/28953613/2303865 【参考方案1】:

根据我的经验,您从位置管理器获得的第一个值很糟糕。第一个位置读数通常是 GPS 上次“点亮”时的缓存读数。您可以通过检查该位置的时间戳来检测和拒绝过时的读数。如果超过一秒,请丢弃它。

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

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

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

【讨论】:

谢谢。它并没有真正帮助,但仍然有价值的建议。我认为这只是一个模拟器的东西。我已经实施了你的安全防护措施。出于模拟目的,我刚刚抛出了第一个值。似乎工作得很好。 怎么没有帮助?你有没有弄清楚为什么你得到了错误的答案,然后是好的答案?您是在模拟器还是设备上进行测试? 它没有帮助,因为无论我尝试什么,我仍然在模拟器上得到错误的读数。这个问题在实际设备上得到缓解。 模拟器上的每个读数都是错误的。它没有GPS。你到底是什么意思? 我的意思是第一次读数,不正确的“错误”读数,不会发生在实际设备上。

以上是关于CLLocation distanceFromLocation 返回错误答案,然后是正确答案的主要内容,如果未能解决你的问题,请参考以下文章

寻找最近的CLLocation

带有纬度和经度的 CLLocation 对象

无法创建 CLLocation 对象

在 Swift 中将 CLLocation 转换为 MKMapItem

CLLocation 如何实现 Equatable 协议?

CLLocation + Weather(Alamofire) 问题