2011-11-26 15 views
9

Tengo una aplicación de servicio de ubicación, en la que se proporciona la elevación del usuario. Sin embargo, he descubierto que la precisión de elevación proporcionada por CLLocationManager es extremadamente inexacta. Cuando pruebo los mismos dos puntos dos veces, a veces la diferencia de elevación es de cuarenta pies y, a veces, es de cien. ¿Hay alguna forma de que pueda mejorar la precisión vertical de CLLocation, o hay una forma diferente de adquirir la elevación del usuario (bibliotecas de terceros)? Ya he intentado verificar la propiedad de precisión vertical de la nueva ubicación proporcionada por CLLocationManager y descartarla si no es suficiente, pero incluso cuando es lo suficientemente precisa, a menudo todavía no es precisa. ¡Gracias por tu tiempo!CL Precisión de elevación de la ubicación

En este momento estoy usando:

if([newLocation verticalAccuracy] < 30) { 
    if(isCustomary) 
     altitudeLabel.text = [NSString stringWithFormat:@"%.2f feet", ([newLocation altitude] * 3.2808399)]; 
    else 
     altitudeLabel.text = [NSString stringWithFormat:@"%.2f meters", [newLocation altitude]]; 
} 

Problemas con ese código: a menudo el verticalAccuracy nunca se pone por debajo de 30, y cuando lo hace, que todavía no está ni siquiera cerca de lo suficientemente precisa; He probado el código caminando por mi casa (una historia), y dice que la elevación cambia hasta diecinueve pies, y estoy seguro de que no es cierto.

Respuesta

22

La elevación derivada de los satélites GPS es menos preciso que la solución horizontal del GPS debido a la geometry de los satélites . Debería esperar que la precisión vertical sea entre 1,5 y 3 veces peor que la precisión horizontal. Esa es solo una limitación del GPS y de por qué la aviación requiere corrección WAAS antes de poder usar el GPS para los enfoques por instrumentos.

Cuando la precisión vertical es de 20 o 30 metros, debe esperar que la altitud se desactive hasta 100 pies. Esperar que no varíe en 19 pies mientras caminas por la casa es poco realista.

Lo que podría hacer es mantener un promedio ponderado y ponderado (o un Kalman filter) de las recientes lecturas de altitud "buenas" para ayudar a filtrar los errores de medición.

+0

Sí, esta parece ser la desafortunada verdad. +1 para una buena explicación y un buen enlace. –

2

¿Qué código ha intentado? Este es el mejor código para la elevación, así que no creo que haya nada más allá de esto:

-(void)awakeFromNib { 
    locmanager = [[CLLocationManager alloc] init]; 
    [locmanager setDelegate:self]; 
    [locmanager setDesiredAccuracy:kCLLocationAccuracyBest]; 
    [locmanager startUpdatingLocation]; 
} 

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    heightMesurement.text = [NSString stringWithFormat: @"%.2f m", newLocation.altitude]; 
} 

    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
    heightMesurement.text = @"0.00 m"; 
} 
+0

Ver mi edición, por favor –

+0

Lo que yo recomiendo es solo usar mi código porque esta es la mejor precisión posible con los iDevices. Todavía es un teléfono y la precisión no es tan grande debido a limitaciones físicas. –

Cuestiones relacionadas