Отрицательные значения CoreLocation - PullRequest
3 голосов
/ 01 ноября 2011

Я использую структуру CoreLocation, чтобы вычислить среднюю скорость, а расстояние и расстояние.

При первом отправленном обновлении CoreLocation отображаются отрицательные значения скорости и пройденного расстояния.Как я могу это исправить?

Скорость равна locationController.locationManager.location.speed, где locationController содержит мой CoreLocation делегат.Расстояние рассчитывается путем взятия старого местоположения и нового местоположения и расчета расстояния.

//Distance
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
    // make sure the old and new coordinates are different
    if ((oldLocation.coordinate.latitude != newLocation.coordinate.latitude) &&
        (oldLocation.coordinate.longitude != newLocation.coordinate.longitude))
    {         
        mDistance = [newLocation distanceFromLocation:oldLocation];
    }
}

Ответы [ 3 ]

5 голосов
/ 01 ноября 2011

Данные, возвращаемые Базовым местоположением, могут быть недействительными по ряду причин.Прежде чем использовать данные, запустите этот метод, чтобы убедиться, что он действителен.

// From http://troybrant.net/blog/2010/02/detecting-bad-corelocation-data/
- (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;
    }
    // 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;
    }
    // newLocation is good to use
    return YES;
} 
2 голосов
/ 01 ноября 2011

В справочнике по классам CLLocationManager есть примечание :

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

Вы должны проверить, получаете ли вы кэшированное значение и игнорировать его, ожидая первого "реального""обновление.

NSTimeInterval timeSinceLastUpdate = [[newLocation timestamp] timeIntervalSinceNow];

// If the information is older than a minute, or two minutes, or whatever
// you want based on expected average speed and desired accuracy, 
// don't use it.
if( timeSinceLastUpdate < -60 ){
    return;
}
0 голосов
/ 03 ноября 2011

Если вы собираете первую точку, она не имеет ссылки для расчета скорости или расстояния. Я полагаю, что он определен для возврата -1, если он не может получить то, что вам нужно.

Чтобы решить эту проблему, просто проверьте наличие отрицательных значений.

if(location.speed > 0) {
    return;
}
...