Расстояние до местоположения во время движения пользователя
Я нахожусь в процессе написания приложения, которое показывает расстояние пользователя от фиксированной точки по мере приближения пользователя (т.е. метка, показывающая расстояние от пользователя до точки, обновляется каждый раз, когда пользователь перемещается). Я использую 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
...
}