2010-06-22 2 views
4

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

Примечание: расстояние является статическим var. здесь

- (void)viewDidLoad { 
    [super viewDidLoad]; 
//bestEffortAtLocation = nil; 
oldLocat = [[CLLocation alloc]init]; 
newLocat = [[CLLocation alloc]init]; 
locationManager =[[CLLocationManager alloc]init]; 
locationManager.delegate = self; 
locationManager.distanceFilter = kCLDistanceFilterNone; 
locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
[locationManager startUpdatingLocation]; 

    } 

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




// test that the horizontal accuracy does not indicate an invalid measurement 
if (newLocation.horizontalAccuracy < 0) return; 


NSLog(@"accuracy %d",newLocation.horizontalAccuracy); 

// test the age of the location measurement to determine if the measurement is cached 
// in most cases you will not want to rely on cached measurements 
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; 
//NSLog(@"time %d",locationAge); 

if (locationAge > 5.0) return; 



self.oldLocat = oldLocation; 
self.newLocat = newLocation; 


double latDegrees = newLocation.coordinate.latitude; 
NSString *lat = [NSString stringWithFormat:@"%1.5f°",latDegrees]; 
latLabel.text = lat; 
double longDegrees = newLocation.coordinate.longitude; 
NSString *longt = [NSString stringWithFormat:@"%1.5f°",longDegrees]; 
longLabel.text = longt; 
[self computeDistanceFrom:oldLocat tO:newLocat]; 

    } 

    -(void)computeDistanceFrom:(CLLocation *)oldL tO:(CLLocation *)newL 
{ 
NSLog(@"oldd %@",oldL); 
NSLog(@"new %@",newL); 


distance = distance + [oldL getDistanceFrom:newL]; 
NSLog(@"distance %f",distance); 

} 

Консоль отображает следующие данные .......

точности 0 oldd (нуль) новый < +28,62114850, +77.37001021> +/- 80.00m (скорость -1.00/MPS Конечно -1,00) @ 2010-06-22 19:21:59 +0530 расстояние 0,000000

точность 0 oldd < +28,62114850, +77.37001021> +/- 80.00m (скорость -1.00 /MPS курс -1.00) @ 2010-06-22 19:21:59 +0530 новый < +28,61670485, +77,37068155> +/- 80.00m (скорость -1.00/MPS Конечно -1,00) @ 2010-06-22 19:22:00 +0530 расстояние 498,211345

точность 0 oldd < +28,61670485, +77.37068155> +/- 80.00m (скорость -1.00 mps/курс -1.00) @ 2010-06-22 19:22:00 +0530 < +28.62112748, +77.36998540> +/- 80.00m (скорость -1.00 м/с/курс -1.00) @ 2010-06-22 19:23:02 +0530 Расстояние 994.432508

ответ

7

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

Вы неправильно печатаете точность, используйте% f не% d, тип double не int.

Местоположение может быстро измениться, когда GPS начнет сначала, потому что у вас есть место с низкой точностью от триангуляции ячеек, а затем, когда вы получаете GPS-прием, вы получаете более точное местоположение. Они могут быть далеко друг от друга (1000 м), и кажется, что вы продвинулись далеко за несколько секунд, но изменилась только точность.

Не используйте два местоположения с очень различной точностью для вычисления пройденного расстояния.

EDIT Добавлен образец кода, как игнорировать старые данные о местоположении. Вы сами решаете, сколько лет игнорировать, я использовал 60 секунд здесь:

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

    NSTimeInterval ageInSeconds = -[newLocation.timestamp timeIntervalSinceNow]; 
    if (ageInSeconds > 60.0) return; // data is too long ago, don't use it 

    // process newLocation 
    ... 
} 
+0

спасибо progrmr, но может у меня точно узнать, как удалить кешированные данные с помощью временных меток ........ и если вышеприведенный подход к вычислению расстояния неправильный, то как мне следует продолжить ...... есть любой другой способ вычислить расстояние ..... coz Я видел много приложений в магазине приложений, которые выполняют ту же работу, что и вычисление расстояния, скорость и т. д. дают мне ваши ценные предложения. – Siddharth

+1

Я добавил образец кода, чтобы показать, как удалить старые кэшированные данные, но вы уже делаете это в своем коде. – progrmr

2

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

if (locationAge > 5.0) return; 

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

Например, вы могли бы иметь что-то вроде этого:

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

    // Ignore location updates that are less than 10m accuracy, or where the horizontalAccuracy < 0 
    // which indicates an invalid measurement. 
    NSLog(@"New location accuracy %.0fm", newLocation.horizontalAccuracy); 
    if ((newLocation.horizontalAccuracy < 0) || (newLocation.horizontalAccuracy > 10)) return; 

    // Ignore location updates that are more than five seconds old, to avoid responding to 
    // cached measurements. 
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; 
    if (locationAge > 5) return; 

    if (self.oldLocat == NULL) 
    {  
     // For the first acceptable measurement, simply set oldLocat and exit. 
     self.oldLocat = newLocation; 
     return; 
    } 

    // A second location has been identified. Calculate distance travelled. 
    // Do not set self.oldLocat from the oldLocation provided in this update, as we wish to 
    // use the last place we calculated distance from, not merely the last place that was 
    // provided in a location update. 
    CLLocationDistance distance = [newLocation distanceFromLocation:self.oldLocat]; 
    NSLog(@"Distance: %.0fm", distance); 

    // This new location is now our old location. 
    self.oldLocat = newLocation; 
} 

Примечание с кодом выше не требуется метод computeDistanceFrom: пО :, а также self.newLocat свойство на самом деле не требуется, в наименее в этом разделе кода.

Смежные вопросы