Как ждать, пока местоположение полностью не будет найдено? (Основное местоположение) - PullRequest
9 голосов
/ 27 декабря 2010

У меня проблема с моим приложением. Я пытаюсь найти местоположение пользователя с максимальной точностью, чтобы определить его почтовый индекс. В настоящее время у меня есть кнопка, которая при нажатии запускает метод с именем locateMe.

-(IBAction)locateMe; {
self.locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];

Тогда я реализовал didUpdateToLocation:

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

       NSLog(@"Found location! %f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
 }

Раньше я делал гораздо более сложные вещи в didUpdateToLocation, но когда я проверил некоторые вещи, я понял, что первое найденное им местоположение не было точным. Итак, я поместил туда вызов NSLog, и он дал мне вывод, похожий на приведенный ниже ...

Found location! 39.594093,-98.614834
Found location! 39.601372,-98.592171
Found location! 39.601372,-98.592171
Found location! 39.611444,-98.538196
Found location! 39.611444,-98.538196

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

Итак, вот мой вопрос. Могу ли я подождать, пока менеджер местоположения не найдет наиболее точное местоположение?

Заранее спасибо!

РЕДАКТИРОВАТЬ: Я хочу что-то вроде этого:

if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) {
}

Но его никогда не вызывают!

Ответы [ 5 ]

9 голосов
/ 03 января 2011

Я не понимаю, как вы ожидаете, что это будет работать. Там нет никакой гарантии, что вы когда-либо получите местоположение с определенным уровнем точности. Вы предполагаете, что в конечном итоге вы получите местоположение с такой точностью, о которой вы мечтали, и это не обязательно произойдет. LocationManager отправит вам последовательность обновлений местоположения, которые, как правило, но не всегда, становятся все более точными. К сожалению, вы не можете требовать, чтобы устройство получало достаточно сильный сигнал, чтобы дать вам позицию произвольной точности, и нет никакого способа, которым устройство может предсказать будущее, чтобы сказать «это самая точная позиция, которую я собираюсь получить» .

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

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

5 голосов
/ 27 декабря 2010

Базовое местоположение часто вызывает didUpdateToLocation с местоположением, обнаруженным во время предыдущего сеанса.Таким образом, вы можете просто пропустить первое местоположение, которое оно вам отправит.И если вы рассчитываете скорость пользователя на основе этих данных, вы должны знать об этом.Пешеходы на 100 миль в час обычны в этом случае.:)

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

2 голосов
/ 27 декабря 2010

Так что вы действительно можете увидеть, что происходит, попробуйте NSLog'ом присвоить свойство horizontalAccuracy вашего объекта newLocation.Вы увидите, что оно сужается к местоположению с каждым попаданием.

Это означает, что вы можете затем ТЕСТИРОВАТЬ на горизонтальную точность, когда ваш менеджер местоположений дает вам обновление, и отбрасывать те, которые слишком неточны для вашего использования..

1 голос
/ 28 декабря 2010

Сохраните время запуска (или пробуждения) вашего приложения и отмените все результаты из менеджера расположений, которые были старше, чем время запуска вашего приложения.У CLLocation есть штамп с датой.

1 голос
/ 27 декабря 2010

NSLog () свойство oldLocation, я думаю, оно должно (или не должно?) Быть нулевым. и вы можете скрыть userLocation, если что-то не получилось:

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    mapView.showsUserLocation = NO;
}

// РЕДАКТИРОВАТЬ: требуемая точность говорит о том, что didUpdateToLocation вызывается, только если вы переместитесь так далеко от старой позиции. Если вы установите для параметра «Точная точность» значение 100 м, он будет вызываться только тогда, когда пользователь отходит на 100 м от своего прежнего положения.

...