2017-02-08 1 views
3

J'utilise CLLocationManager pour obtenir l'emplacement des utilisateurs.Obtenir une très mauvaise précision de CLLocationManager

Je souhaite obtenir une mise à jour d'emplacement unique.

Mon problème est que je reçois vraiment mauvais horizontalAccuracy

emplacement est% @ < + xx.xxxxxx, + yy.yyyyyyy> +/- 3881.91m

verticalAccuracy: 65,4401861912846, horizontalAccuracy : 3881,90892434957

code:

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

Des suggestions pourquoi cela se passe-t-il? Je suis dans une chambre à côté d'une fenêtre, donc je n'obtiens pas de mauvaise précision mais pas si mal.

Merci


Je suis d'obtenir des résultats ridicules.

J'ai une horizontalité de 15 000 m.

Lorsque je sors des portes, cela fonctionne très bien, mais dans les portes ne devrait pas être aussi mauvais que cela. L'utilisation de la triangulation cellulaire et de la connexion Wi-Fi devrait donner de bien meilleurs résultats.


après 20 minutes j'ai commencé à obtenir de bons résultats de + - 50 m de précision dans les portes.

+0

Où êtes-vous de tester l'application? Près de Window n'est pas une bonne option. – Apurv

+0

@Apurv, pourquoi pas? Je ne m'attends pas à obtenir les meilleurs résultats, mais la précision de 4 km est ridicule. – ilan

Répondre

0

J'ai toujours trouvé que lorsque vous démarrez les mises à jour de localisation, les premières lectures sont plutôt médiocres, et la précision s'améliore à mesure que le GPS s'installe.

Ce que je fais est de vérifier d'abord si l'horodatage de l'emplacement a plus de quelques secondes. Si c'est le cas, je le rejette. (Je ne sais pas si les dernières versions du système d'exploitation envoient encore des relevés GPS «périmés», mais le système utilisé pour vous indiquer l'emplacement depuis la dernière mise sous tension du GPS, parfois plusieurs fois.)

Une fois le courant atteint endroits, je vérifie l'exactitude, et rejette toutes les mises à jour de localisation dont la lecture de précision est trop pauvre. Ce n'est que lorsque j'obtiens une lecture suffisamment bonne que je l'utilise (et j'arrête les mises à jour dans votre cas, puisque vous ne voulez qu'une mise à jour.)

Gardez à l'esprit que cela peut prendre 30 secondes (ou plus) pour le GPS pour s'installer, et dans une zone avec un mauvais signal GPS, vous pouvez ne jamais avoir une lecture assez bonne.

+0

J'ai quitté l'emplacement en cours d'exécution pendant 15 minutes et toujours obtenir les mêmes mauvais résultats – ilan

+0

Vous. Impossible de tester cela à l'intérieur. Vous devez ajouter la journalisation et prendre un téléphone à l'extérieur pour ouvrir le ciel sans bâtiments élevés ou des arbres bloquant le signal GPS. –

+0

je connais son conjoint pour mieux travailler les portes mais les résultats sont ridicules, 4 km de précision. Dans les portes devraient donner de meilleurs résultats en utilisant cellulaire/wifi. – ilan

0

Je vous suggère d'ajouter une condition pour vous assurer que vous utiliserez simplement un emplacement ayant une meilleure précision. Sur mon cas j'utilise 20 comme la précision horizontale désirée sur l'exemple ci-dessous.

Exemple:

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