iOS: locationManager: didUpdateToLocation: fromLocation: сообщает о скорости, когда не движется - PullRequest
2 голосов
/ 27 сентября 2011

Я использую locationManager: didUpdateToLocation: fromLocation: для получения обновлений местоположения. Почти все работает хорошо, но когда я проверяю правильность newLocation.speed, стоя на месте, я почти всегда получаю значение скорости больше 0. Даже когда я начинаю получать обновления местоположения в первый раз и даже НИКОГДА не перемещаюсь, я получу положительные значения после того, как несколько обновлений.

Просто сделайте простую проверку больше 0, затем установите UILablel, если это:

if (newLocation.speed > 0) {
     self.speed.text = [NSString stringWithFormat:@"%.2f",[self speed:newLocation.speed]];
}

Больше кода из этого метода:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

    // Check first if we are getting the accuracy we want
    if (newLocation.horizontalAccuracy < 0) return;

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

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

    // Make sure our new location is not super far away from old
    CLLocationDistance dist = [newLocation distanceFromLocation:oldLocation];
    NSLog(@"Distance: %f", dist);
    if (dist > 40) return;

    // Make sure we have a new location
    if (!newLocation) return;

    // Check to see if we are stopped
    if (newLocation.speed == 0) {
        self.inMotion = NO;
    } else if (newLocation.speed > 0) {
        self.inMotion = YES;
    } else {
        // Probably an invalid negative value
        self.inMotion = NO;
    }//end

    // Speed
    // Should always be updated even when not recording!
    if (newLocation.speed > 0 && inMotion) {
        self.speed.text = [NSString stringWithFormat:@"%.2f",[self speed:newLocation.speed]];
        NSLog(@"Speed: %f", newLocation.speed);
    }

    // Tons more code below that I removed for this post

}//end

Это нормально?

1 Ответ

2 голосов
/ 27 сентября 2011

Насколько больше нуля? И как долго? Все ли сравниваемые местоположения имеют одинаковую точность?

В приемнике GPS скорость обычно определяется изменением местоположения между последовательными определениями местоположения (оно также может быть вычислено путем измерения доплеровского сдвига). Исправления местоположения будут немного отличаться из-за ошибок измерения или по мере того, как они станут более точными. Изменения в расположении могут привести к тому, что устройство переместилось.

Например, предположим, что ваше первое исправление имеет точность 1000 м по горизонтали, а ваше второе исправление имеет точность 300 м по горизонтали, первая позиция могла быть на расстоянии 1000 м от реального местоположения, а вторая - на расстоянии 700 м от этого первого исправления. хотя устройство не двигалось. Это приводит к изменению местоположения с течением времени, которое является «скоростью».

...