2009-07-20 9 views
6

que tienen un programa con un gerente de locación establecido así:CoreLocation Precisión aflicciones

self.locationManager = [[CLLocationManager alloc] init]; 
[locationManager startUpdatingLocation]; 
locationManager.delegate = self; 
locationManager.distanceFilter = kCLDistanceFilterNone; 
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; 

necesito la exactitud de un plazo de diez metros, sin embargo, se tarda un par de llamadas del método didUpdateToLocation delegado para encontrar el ubicación con esa precisión. ¿Cómo voy a retrasar la llamada de este método o simplemente indicar cuándo se logra la precisión deseada para continuar con el programa?

En este momento se trata procede con la primera ubicación devueltos. Incluso la segunda actualización de ubicación no es tan precisa como se esperaba.

¡Gracias de antemano!

Respuesta

7

Dado que cada llamada delegado incluye una cifra de la precisión, sólo tiene que volver a partir del método hasta que su precisión deseada se alcanza (advertencia: que no puede suceder).

No se le puede pasar a un resultado diez por meter - hay una razón por qué se llama "deseada" precisión y exactitud no obligatoria. Tienes que darle tiempo para calcular posiciones más exactas.

+0

Por alguna razón, cuando compruebo para esta propiedad ([newLocation horizontalAccuracy]), el LocationManager sólo actualiza dos veces y el newLocation es el mismo en ambas ocasiones. ¿Conoces alguna razón para esto? –

+0

Ese es el mejor resultado que pudo encontrar entonces. No siempre obtendrás resultados en un radio de diez metros, incluso cuando tengas un GPS en el iPhone, a veces debe recurrir a la triangulación de la torre celular. –

2

Una estrategia consiste en iniciar un temporizador para un período de tiempo suficiente para obtener una solución (que también será aceptable para el usuario)

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats 

iniciar el gestor de ubicación entrega de actualizaciones. Cuando el temporizador caduque (u obtenga una precisión aceptable) detenga las actualizaciones y use esa ubicación.

Es probablemente el mejor que vas a conseguir. Es posible que desee darle al usuario la opción de volver a intentar una ubicación si todavía no es lo suficientemente precisa.

4

He abordado recientemente este problema y descubrí, por leer hábilmente la documentación por fin, que CoreLocation se ejecuta en un hilo separado, por lo que puede iniciarlo y luego recuperar los eventos a medida que se actualiza. Está en la documentación bajo la rúbrica "Getting the User's Location". Así que aquí es donde se inicia la actualización:

- (void)startStandardUpdates 
{ 
    if (nil == locationManager) 
     locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = none; 
    [locationManager startUpdatingLocation]; 
} 

Si realiza el delegado "auto", enviará eventos a la misma clase, donde se define el método de inicio, por lo que a continuación, sólo tiene que añadir el siguiente para recuperar el eventos:

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation 
{ 
    if (newLocation.horizontalAccuracy < 30.0) 
    { 
     NSLog(@"latitude %+.6f, longitude %+.6f\n", 
       newLocation.coordinate.latitude, 
       newLocation.coordinate.longitude); 
     [manager stopUpdatingLocation]; 
    } 
} 

De esta manera seguirá recibiendo eventos y luego apague el receptor de GPS para ahorrar energía. Por supuesto, necesita un tiempo de espera y una forma de almacenar y aceptar la ubicación con la mejor precisión horizontal si se agota el tiempo, pero aún no he resuelto cómo hacerlo.