2012-05-24 8 views
10

Estoy usando Location Services en algunas de mis aplicaciones. Tengo un método que utilizo en mi método locationManager:didUpdateToLocation:fromLocation: para filtrar ubicaciones malas, inexactas o muy lejanas. Y para minimizar gps "jitter". Esto es lo que uso:iOS Servicios de ubicación Método para filtrar ubicaciones no válidas o incorrectas

/** 
* Check if we have a valid location 
* 
* @version $Revision: 0.1 
*/ 
+ (BOOL)isValidLocation:(CLLocation *)newLocation withOldLocation:(CLLocation *)oldLocation { 

    // Filter out nil locations 
    if (!newLocation) return NO; 

    // Filter out points by invalid accuracy 
    if (newLocation.horizontalAccuracy < 0) return NO; 
    if (newLocation.horizontalAccuracy > 66) return NO; 

    // Filter out points by invalid accuracy 
    #if !TARGET_IPHONE_SIMULATOR 
    if (newLocation.verticalAccuracy < 0) return NO; 
    #endif 

    // Filter out points that are out of order 
    NSTimeInterval secondsSinceLastPoint = [newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp]; 
    if (secondsSinceLastPoint < 0) return NO; 

    // Make sure the update is new not cached 
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; 
    if (locationAge > 5.0) return NO; 

    // Check to see if old and new are the same 
    if ((oldLocation.coordinate.latitude == newLocation.coordinate.latitude) && (oldLocation.coordinate.longitude == newLocation.coordinate.longitude)) 
     return NO; 

    return YES; 

}//end 

¿Alguien tiene alguna mejora en este método para hacerlo más preciso? ¿Es demasiado alto de horizontalAccuracy y recibirá muchas ubicaciones no válidas? ¿Debo bajar esto?

¿Hay alguna manera de obtener el "jitter" que da el gps en el iPhone?

+0

estoy empezando a trabajar en algo similar. Estoy pensando en implementar un filtro de Kalman, pero no estoy seguro si esto será más de matar. Estoy interesado en ver las respuestas de las personas sobre esta pregunta. – scord

+0

Sí, también miré un filtro de Kalman, pero la matemática de eso es una locura. –

Respuesta

6

Además de éstos hay uno más que utilizo:

if(self.lastKnownLocation) 
{ 
    CLLocationDistance dist = [newLocation distanceFromLocation:self.lastKnownLocation]; 

    if(dist > newLocation.horizontalAccuracy) 
    { 
      //..... 
    } 
} 

Dónde self.lastKnownLocation es en realidad la última posición válida tengo y es un:

@property(nonatomic, copy) CLLocation *lastKnownLocation; 
+0

Esto parece una buena adición. ¿Qué usas para una precisión horizontal aceptable? –

+0

0 a 60 .. Estoy implementando el seguimiento de caminar y hasta ahora tengo buenos resultados con este y los que ha publicado. – graver

+0

¿Ha tenido problemas para aceptar ubicaciones que son <60? Recibo informes de los usuarios de que mi aplicación nunca encuentra su ubicación porque su precisión horizontal aparentemente nunca llega a menos de 60. ¿Debo eliminar este cheque por completo? –

5
-(void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
if (!newLocation) 
    { 
     NSLog(@"Filter out points by invalid accuracy"); 
     return; 
    } 

    // Filter out points by invalid accuracy 
    if (newLocation.horizontalAccuracy < 0) 
    { 
     return; 
    } 
    if(oldLocation.coordinate.latitude>90 && oldLocation.coordinate.latitude<-90 && oldLocation.coordinate.longitude>180 && oldLocation.coordinate.longitude<-180) 
    { 
     NSLog(@"old"); 
     return; 
    } 
    if(newLocation.coordinate.latitude>90 || newLocation.coordinate.latitude<-90 || newLocation.coordinate.longitude>180 || newLocation.coordinate.longitude<-180) 
    { 
     NSLog(@"new"); 
     return; 
    } 

    /////// 
    NSDate *eventDate=newLocation.timestamp; 
    NSTimeInterval eventinterval=[eventDate timeIntervalSinceNow]; 


    if (abs(eventinterval)<30.0) 
    {   
     if (newLocation.horizontalAccuracy>=0 && newLocation.horizontalAccuracy<20) 
     { 
      **//finally you are getting right updated value here....** 
     }   
    }   
} 
0

Puedes retirar esta

https://medium.com/@mizutori/make-it-even-better-than-nike-how-to-filter-locations-tracking-highly-accurate-location-in-774be045f8d6

La idea principal es Filer los datos en el método didUpdateLocation:

El método de filtro es igual que esta:

func filterAndAddLocation(_ location: CLLocation) -> Bool{ 
    let age = -location.timestamp.timeIntervalSinceNow 

    if age > 10{ 
     return false 
    } 

    if location.horizontalAccuracy < 0{ 
     return false 
    } 

    if location.horizontalAccuracy > 100{ 
     return false 
    } 

    locationDataArray.append(location) 

    return true 

} 
Cuestiones relacionadas