Прямое геокодирование с CLGeocoder в iOS, возвращающее ноль для местоположения определенных местоположений

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

Самое странное, что я попытался запустить Ванкувер через образец кода Apple для геокодера, и он работает просто отлично. Населенный пункт не подходит к нулю.

Кроме того, я тестировал его, и он вдруг начал работать, а затем я снова проверил, и он перестал работать. Что дает?

Вот мой код Сомневаюсь, что это сильно поможет.

-(BOOL) textFieldShouldReturn:(UITextField *)textField {
     CLGeocoder *geocoder = [[CLGeocoder alloc] init];

     [geocoder geocodeAddressString:textField.text completionHandler:^(NSArray *placemarks, NSError *error) {
    self.placemark = [[MKPlacemark alloc] initWithPlacemark:[placemarks objectAtIndex:0]];
    if (error) {
        NSLog(@"Geocode error %@",error.debugDescription);
        [self alertForFailedGeocode];
        return;
    }
    if (self.placemark.locality == nil || self.placemark.country == nil) {
        //eg if you search "Canada" you'll get a nil locality, and the coordinate is in the middle of nowhere.

        if (self.placemark.location) {
            [geocoder reverseGeocodeLocation:self.placemark.location completionHandler:^(NSArray *placemarks, NSError *error) {
                if (error) {
                    [self alertForFailedGeocode];
                    return;
                }

                self.placemark = [placemarks objectAtIndex:0];
                [self alertForConfirmGeocode:[self locationStringForPlacemark:self.placemark]];
                self.location = self.placemark.location;
                self.isUsingCurrentLocation = FALSE;
                return;
            }];
            return;
        }
        else {
            NSLog(@"Geocode failed BECAUSE nil locality or country or both");
            [self alertForFailedGeocode];
            return;
        }
    }

    NSLog(@"%d places found",placemarks.count);
    [self alertForConfirmGeocode:[self locationStringForPlacemark:self.placemark]];
    self.location = self.placemark.location;
    self.isUsingCurrentLocation = FALSE;
}];
return YES;

}

1 ответ

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

Плюсы:

  1. Сохраните ресурсы устройства, так как конвертация происходит в облаке.
  2. Apple может обновлять свои API-интерфейсы в облаке по мере совершенствования технологий, что может повысить производительность наших приложений, даже не внося никаких изменений в код.

Минусы:

Вам потребуется надежное интернет-соединение для доступа к API геокодирования.

Что касается вашего состояния, я думаю, что это связано с подключением к Интернету, вы не можете использовать API геокодирования полностью. Может быть, поэтому вы не получаете местность.

Вопрос в том, как вы получаете страну, провинцию и координаты?

Хорошо, что это происходит, прямой геокодер может получить информацию высокого уровня, такую ​​как страна, регион и т. Д., На основе информации о локальном устройстве, но для получения дополнительной информации, такой как местность и т. Д., Требуется подключение к Интернету.

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