从CLLocationManager

时间:2017-02-08 12:04:56

标签: ios swift core-location cllocationmanager

我正在使用CLLocationManager来获取用户位置。

我希望获得一次位置更新。

我的问题是我变得非常糟糕horizontalAccuracy

  

位置是%@< + xx.xxxxxx,+ yy.yyyyyyy> +/- 3881.91m

     

verticalAccuracy:65.4401861912846,horizo​​ntalAccuracy:3881.90892434957

代码:

fileprivate lazy var locationManager: CLLocationManager = {
    let manager = CLLocationManager()
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.delegate = self
    manager.requestAlwaysAuthorization()
    manager.pausesLocationUpdatesAutomatically = false
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.distanceFilter = kCLDistanceFilterNone
    return manager
}()

override init() {
    super.init()
    locationManager.startUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let mostRecentLocation = locations.last else {
        return
    }

    let verticalAccuracy =  mostRecentLocation.verticalAccuracy
    let horizontalAccuracy = mostRecentLocation.horizontalAccuracy

    print("location is %@", mostRecentLocation)
    print("verticalAccuracy: \(verticalAccuracy), horizontalAccuracy:\(horizontalAccuracy)")
}

有什么建议为什么会发生这种情况? 我在一个窗户旁边的房间,所以我除了精确度差但不是那么糟糕。

由于

我得到了荒谬的结果。

我的水平精度为15,000米。

当我出门时,它的效果很好,但在门上不应该像这样糟糕。

使用细胞三角测量和wifi可以提供更好的效果。

20分钟后,我开始在门上获得+ - 50米精度的良好效果。

2 个答案:

答案 0 :(得分:0)

我总是发现,当您第一次开始位置更新时,前几个读数非常差,然后随着GPS稳定下来,准确度会提高。

我所做的是首先检查该位置的时间戳是否超过几秒钟。如果是,我丢弃它。 (不确定最近的操作系统版本是否仍然发送"陈旧" GPS读数,但系统用于为您提供上次启动GPS时的位置,有时几个小时 。)

获得当前位置后,我会检查准确性,并丢弃任何位置更新,其准确性读数太差。只有当我得到一个足够好的阅读时我才能使用它(并在你的情况下停止位置更新,因为你只需要1次更新。)

请记住,GPS可能需要30秒(或更长时间)才能稳定下来,而在GPS信号较差的区域,您可能永远无法获得足够好的读数。

答案 1 :(得分:0)

我建议您添加一个条件,以确保您只使用具有更高准确度的位置。在我的情况下,我在下面的例子中使用20作为所需的水平精度。

示例:

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

         locationManager.stopUpdatingLocation()

         if locations.last!.horizontalAccuracy < 20 {
            //Only use location that enters here
         }
         else {
            //If the accuracy is not met then start updating location again and if possible increase more the accuracy (use kCLLocationAccuracyBestForNavigation if you really need it). Make sure that you use the desired accuracy and filter properly to avoid draining battery.
            locationManager.startUpdatingLocation()
         }
    }