Геокодирование основного местоположения с адреса Google Адресов не работает для итальянских городов.

Я использую API Google Адресов для поиска названий городов. В моем контроллере представления я соответствую GMSAutocompleteResultsViewControllerDelegate:

func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                       didSelect prediction: GMSAutocompletePrediction) -> Bool {
    let geocoder = CLGeocoder()
    geocoder.geocodeAddressString(prediction.attributedFullText.string) { (placemark, error) in }
    return true
}

Мне нужно CLGeocoder, чтобы извлечь CLLocation из адресной строки, которую я получаю из Google Places API. Это отлично работает для большинства случаев, кроме итальянских городов. Геокодер не может обработать полный адрес (пример из результатов Google Адресов: Рим, столичный город Рим, Италия). Что происходит, вы получаете ошибку CLGeocoder.

Что я пробовал:

Я пробовал извлекать только названия городов и стран. Это работает для итальянских городов, но не работает для городов с тем же названием: New York, NY и New York, IA и т. Д. (Вы получаете неверные результаты).

Другим решением было бы попробовать с prediction.attributedFullText.string, и, если это не сработает, повторите попытку с помощью вышеуказанного обходного пути.

У кого-нибудь была такая же проблема или есть идея, как с ней справиться более изящно? Я знаю, что это своего рода крайний случай, но я считаю, что Google Places должны были подумать о результатах работы с CLGeocoder.


person Vasil Garov    schedule 28.01.2020    source источник
comment
что именно ты хочешь? Хотите преобразовать адрес в координаты местоположения?   -  person iOSArchitect.com    schedule 28.01.2020
comment
Да, мне нужно получить координаты.   -  person Vasil Garov    schedule 28.01.2020


Ответы (1)


вы можете легко получить coordinates и formattedAddress с помощью функции обратного вызова.

func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
    print("Place name: \(String(describing: place.name))")
    print("Place address: \(String(describing: place.formattedAddress))")
    print("Place attributions: \(String(describing: place.attributions))")
    dismiss(animated: true, completion: nil)

    // get the selected coordinates and address like this
    let yourCordniates = place.coordinate
    let yourAddress = place.formattedAddress ?? ""


}
person iOSArchitect.com    schedule 28.01.2020
comment
Теперь это так очевидно. Я даже не тестировал этот метод, потому что думал, что он вызывается каждый раз, когда вы печатаете, а не когда выбираете результат. Спасибо. - person Vasil Garov; 28.01.2020