Местоположение ядра Первая точка недействительна - PullRequest
1 голос
/ 07 ноября 2011

Мое первое местоположение с использованием Core Location почти всегда недопустимо.

Мой код выглядит следующим образом:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{ 
    //for saving the data ACCURATELY for calculations
    // make sure the coordinates are valid
    if ([self isValidLocation:newLocation withOldLocation:oldLocation])
    {         
        mDistance = [newLocation distanceFromLocation:oldLocation];

        [[NSNotificationCenter defaultCenter]postNotificationName:@"locationUpdated" object:nil];
    }
}

Как вы можете видеть, он проверяет, является ли это действительное местоположениес isValidLocation.Этот код здесь:

- (BOOL)isValidLocation:(CLLocation *)newLocation
        withOldLocation:(CLLocation *)oldLocation
{    
    // Throw away first point
    if (isFirstPoint)
    {
        NSLog(@"First point thrown away.");
        isFirstPoint = NO; //subsequent updates will NOT be the first point
        return NO;
    }
    // Filter out nil locations
    if (!newLocation){
        NSLog(@"New location invalid");
        return NO;
    }
    if (!oldLocation)
    {
        NSLog(@"Old location invalid");
        return NO;
    }
    // Filter out points by invalid accuracy
    if (newLocation.horizontalAccuracy < 0)
    {
        return NO;
    }
    // Filter out points that are out of order
    NSTimeInterval secondsSinceLastPoint = [newLocation.timestamp 
                                            timeIntervalSinceDate:oldLocation.timestamp];
    if (secondsSinceLastPoint < 0){
        return NO;
    }
    // Filter out points created before the manager was initialized
    NSTimeInterval secondsSinceManagerStarted = [newLocation.timestamp 
                                                    timeIntervalSinceDate:locationManagerStartDate];
    if (secondsSinceManagerStarted < 0){
        return NO;
    }
    // If the distance is negative
    if ([newLocation distanceFromLocation:oldLocation] < 0)
    {
        return NO;
    }
    if(newLocation.speed < 0) 
    {
        return NO;
    }
    // GIANT ELSE: The newLocation is good to use
    return YES;
} 

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

Вот что происходит, когда я получаю неверную первую точку: enter image description here

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

Ваш тест неверен.В документации locationManager:didUpdateToLocation:fromLocation: четко указано, что для первого обновления oldLocation равен нулю.Но вы не проверяете это: вы только смотрите на newLocation и затем получаете доступ к oldLocation.Это может привести к неправильным значениям или сбоям.

1 голос
/ 07 ноября 2011

Это действительно зависит от вашего варианта использования.Базовое расположение часто возвращает последнюю известную позицию устройства, чтобы дать вам результат как можно быстрее.Это местоположение передается вам до того, как устройство завершит приобретение нового местоположения.Последняя известная позиция может находиться в нескольких километрах от вашей текущей позиции.

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

Вам важно решить, как справиться с этим поведением.Всегда выбрасывать первое сообщаемое местоположение не может быть лучшей стратегией.Возможно, вы захотите сохранить время, когда вы звоните startUpdatingLocation, и выбрасывать первое сообщенное местоположение только в том случае, если система передает его вам в течение очень короткого периода времени (скажем, 1/10 секунды), что делает его вероятнымбыть в кэшеКроме того, свойство местоположения timestamp может быть полезно при оценке того, насколько точным может быть указанное местоположение.

...