我试图获取两个位置之间的距离,但是我总是得到错误的值。以下是代码:

var startLoction: CLLocation!
var startLoction: CLLocation!

@IBAction func getCurrLocation(){
    startLoction = currLocation

}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        currLocation = locations.last!

        if currLocation.horizontalAccuracy > 0{

            var distance = CLLocationDistance(DBL_MAX)
            if let location = self.startLoction {
                distance = currLocation.distance(from: location)
                realTimeDistanceLabel.text = String(format: "%.2f", distance)
            }
        }
}


问题:
1.当我静止不动时,距离有时会增加,可能比15米大。它总是从大量开始
2.当我走出10或20米,然后笔直走回时,距离有时会增加,但不会减少。
3.当我绕着一个大圆圈走时,距离相对会变得更准确一些。

我也尝试添加currLocation.horizontalAccuracy > 0 && currLocation.horizontalAccuracy < 100,并且aslo从stackOverflow答案尝试了prevLocation >= (currLocation.horizontalAccuracy * 0.5,但仍然无法获得准确的值。

还有其他想法可以解决吗?

谢谢。

最佳答案

使用时会打开“核心位置”,然后花一段时间对设备位置进行三角测量,以便花一些时间才能安定下来。而且你会发现它可以在某些位置/条件下会失去精度,并会尝试始终以提高准确性。然后,设备将改变其关于“您所在的位置”的想法,如果在您的方法之后执行此操作

@IBAction func getCurrLocation() { ... }


会被调用,自然地,它将看起来好像设备已经移动了。

为了减少这种情况的发生,您不仅可以测试currLocation.horizo​​ntalAccuracy> 0(因此它是一个有效的读数),还可以测试它是否小于给定的正值(尽管这会带来问题,请参阅下文) 。该设备的当前水平位置可能之间加上或减去所报告的horizo​​ntalAccuracy财产不确定性的半径(不确定性的半径始终为正数。如果是负数,所有的赌注都关闭,该装置基本上等于在说“等等,我还不能确定我在哪里”。

实际上,尽管为currLocation.horizo​​ntalAccuracy设置上限将演示该问题,但这可能不是您想要的,因为那样,您的UI将仅在Core Location知道精度大于x的条件下工作。一般来说,你不希望限制这种方式的UI。

10-04 23:45
查看更多