2017-02-08 21 views
3

Я использую CLLocationManager для определения местоположения пользователей.Получение очень плохой точности от CLLocationManager

Я хочу получить одно обновление местоположения.

Моя проблема заключается в том, что я получаю очень плохо horizontalAccuracy

расположение в% @ < + xx.xxxxxx + yy.yyyyyyy> +/- 3881.91m

verticalAccuracy: 65.4401861912846, horizontalAccuracy : 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 м.

Когда я выхожу из дверей, он отлично работает, но в дверях не должно быть так плохо.

Использование сотовой триангуляции и Wi-Fi должно дать намного лучшие результаты.


Через 20 минут я начал получать хорошие результаты + - точность в 50 м в дверях.

+0

Где вы тестируете приложение? Рядом с окном это не очень хорошо. – Apurv

+0

@ Апурв, почему бы и нет? я не ожидаю получить лучшие результаты, но точность в 4 км нелепо. – ilan

ответ

0

Я всегда обнаружил, что при первом запуске обновлений местоположения первые несколько чтений довольно плохи, а затем точность улучшается по мере приближения GPS.

Что я делаю, это сначала проверить, является ли временная метка местоположения более чем несколькими секундами. Если это так, я отбрасываю его. (Не уверен, что последние версии ОС по-прежнему отправляют «устаревшие» GPS-показания, но система использовала, чтобы дать вам местоположение с момента последнего включения GPS, иногда несколько часов.)

Как только я получаю текущий местоположениях, я проверяю точность и отбрасываю любые обновления местоположения, точность чтения которых слишком бедна. Только когда я получу чтение, которое достаточно хорошо, я его использую (и останавливаю обновления местоположения в вашем случае, так как вам нужно только 1 обновление.)

Имейте в виду, что для GPS может потребоваться 30 секунд (или больше) чтобы успокоиться, и в области с плохим сигналом GPS вы никогда не сможете получить достаточно хорошее чтение.

+0

Я покинул место, работающее в течение 15 минут, и все еще получаю одинаковые плохие результаты. – ilan

+0

Вы. Не могу проверить это в помещении. Вы должны добавить журнал и вывести телефон на улицу, чтобы открыть небо, без высоких зданий или деревьев, блокирующих сигнал GPS. –

+0

Я знаю, что его супруг работает лучше, но результаты - высмеивание, точность 4 км. В дверях следует давать намного лучшие результаты, используя сотовые/Wi-Fi. – ilan

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() 
     } 
    }