我试图获取两个位置之间的距离,但是我总是得到错误的值。以下是代码:
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.horizontalAccuracy> 0(因此它是一个有效的读数),还可以测试它是否小于给定的正值(尽管这会带来问题,请参阅下文) 。该设备的当前水平位置可能之间加上或减去所报告的horizontalAccuracy财产不确定性的半径(不确定性的半径始终为正数。如果是负数,所有的赌注都关闭,该装置基本上等于在说“等等,我还不能确定我在哪里”。
实际上,尽管为currLocation.horizontalAccuracy设置上限将演示该问题,但这可能不是您想要的,因为那样,您的UI将仅在Core Location知道精度大于x的条件下工作。一般来说,你不希望限制这种方式的UI。