Геокодирование основного местоположения с адреса Google Мест на карте не работает для итальянских городов - PullRequest
1 голос
/ 28 января 2020

Я использую Google Places API для поиска названий городов. В моем контроллере представления я соответствую 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.

То, что я пытался :

Я пытался только извлечь названия городов + стран. Это работает для итальянских городов, но не работает для городов с одинаковыми названиями: Нью-Йорк, Нью-Йорк и Нью-Йорк, IA et c (вы получите неправильные результаты).

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

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

1 Ответ

1 голос
/ 28 января 2020

Вы можете легко получить 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 ?? ""


}
...