Расстояние до места, пока пользователь находится в движении

Я нахожусь в процессе написания приложения, которое показывает расстояние пользователя от фиксированной точки, когда пользователь ходит (т. Е. Метка, показывающая расстояние от пользователя до точки, обновляется каждый раз, когда пользователь перемещается). Я использую CLLocationManager с кодом, показанным ниже:

- (void)viewDidLoad
{
    locationManager=[[CLLocationManager alloc]init]; 
    locationManager.distanceFilter = kCLDistanceFilterNone;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [locationManager startUpdatingLocation];      
}

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation      *)newLocation fromLocation:(CLLocation *)oldLocation 
{   
    CLLocationDistance meters = [newLocation distanceFromLocation:fixedPoint];
    self.distanceLabel.text = [[NSString alloc] initWithFormat:@"Distance: %.1f feet", meters*3.2808399];
}

Метка, которая должна показывать расстояние от пользователя до точки, не обновляется постоянно, и когда она обновляется, она обычно не показывает правильное расстояние от пользователя до фиксированной точки. Мне было интересно, если есть лучший способ для меня, чтобы попытаться сделать это, или сделать фундаментальные ограничения базовой структуры местоположения сделать это невозможным. Любая помощь будет оценена.

1 ответ

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

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

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

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

    NSTimeInterval age = -[newLocation.timestamp timeIntervalSinceNow]; 

    if (age > 120) return;    // ignore old (cached) updates

    if (newLocation.horizontalAccuracy < 0) return;   // ignore invalid udpates

    ...
}
Другие вопросы по тегам