Предотвращение спорадических координат с помощью CoreLocation - PullRequest
1 голос
/ 14 марта 2012

По сути, я делаю приложение, которое должно записывать путь и данные, по которым кто-то путешествует. У меня возникли проблемы с точностью и определением неточных отчетов. Вот изображение пути, который записал мой iPhone. Красная линия - это записанный путь, а розовый - то, как я на самом деле шел (извиняюсь за огромный скриншот):

Path

Мой делегат для записи данных выглядит так:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    if (newLocation.horizontalAccuracy < 0) return;
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    // The "> 50.0f" is to hopefully throw out inaccurate points
    if (locationAge > 5.0 || [newLocation distanceFromLocation:oldLocation] > 50.0f) return;
    [[self locationPoints] addObject:newLocation];
    [self updateView];
}

Несколько советов, которые я видел, это использовать фильтры, чтобы проверить, соответствуют ли данные предполагаемому пути. Это лучший путь?

1 Ответ

1 голос
/ 14 марта 2012

Вы можете добавить проверку для newLocation.horizontalAccuracy:

if ((newLocation.horizontalAccuracy > 0.0) && (newLocation.horizontalAccuracy < 10.0))

Или, для вашего случая:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    if (newLocation.horizontalAccuracy < 0) return;
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    
    if ((locationAge > 5.0)||(newLocation.horizontalAccuracy < 0.0)||(newLocation.horizontalAccuracy > 10.0)) return;
    [[self locationPoints] addObject:newLocation];
    [self updateView];
}

Это (locationAge > 5.0) состояние кажется странным. Вы действительно этого хотите? Если вы сохраните его в своем приложении, оно перестанет обновляться, если устройство потеряет надлежащий сигнал GPS для >5.0s.

Еще одна вещь: вы помните, чтобы настроить locationManager с помощью:

locationManager.desiredAccuracy=kCLLocationAccuracyBest;

Вы также должны знать, что это съедает достаточно батареи, но для тестирования ...

...