GMSPlace возвращает неверную координату (-180, -180), но имя и идентификатор места указаны верно - PullRequest
2 голосов
/ 04 мая 2019

Я пытаюсь реализовать поиск по автозаполнению в Картах Google, который покажет местоположение, выбранное пользователем на карте с маркером.

Поиск работает нормально. Проблема заключается в следующем. Когда я выбираю местоположение из результатов поиска, я получаю объект GMSPlace, который имеет правильное имя в качестве выбранного значения, правильный идентификатор места (подтверждено с помощью этой ссылки ), но неправильные координаты (-180.0,-180.0 или константа kCLLocationCoordinate2DInvalid). Я проверил это в нескольких местах.

Большая часть этого кода была заимствована из документации для API Адресов.

import UIKit
import GoogleMaps
import GooglePlaces

class ViewController: UIViewController, UISearchBarDelegate {

    @IBOutlet weak var mapContainer: UIView!
    var mapView: GMSMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.mapView = GMSMapView(frame: self.mapContainer.frame)
        self.view.addSubview(self.mapView)
    }

    // Code from https://developers.google.com/places/ios-sdk/autocomplete#add_an_autocomplete_ui_control
    @IBAction func searchByAddress(_ sender: Any) {
        // Present the Autocomplete view controller when the button is pressed.
        let autocompleteController = GMSAutocompleteViewController()
        autocompleteController.delegate = self

        // Specify the place data types to return.
        let fields: GMSPlaceField = GMSPlaceField(rawValue: UInt(GMSPlaceField.name.rawValue) |
            UInt(GMSPlaceField.placeID.rawValue))!
        autocompleteController.placeFields = fields

        // Display the autocomplete view controller.
        present(autocompleteController, animated: true, completion: nil)
    }
}

extension ViewController: GMSAutocompleteViewControllerDelegate {

    // Handle the user's selection.
    func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
        let position: CLLocationCoordinate2D = place.coordinate

        let camera = GMSCameraPosition.camera(withLatitude: position.latitude, longitude: position.longitude, zoom: 10)
        let newMapView = GMSMapView.map(withFrame: self.mapContainer.frame, camera: camera)
        self.mapView = newMapView
        self.view.addSubview(newMapView)

        let marker = GMSMarker()
        marker.position = position
        marker.title = place.name
        marker.map = self.mapView

        viewController.dismiss(animated: true, completion: nil)
    }

    func viewController(_ viewController: GMSAutocompleteViewController, didFailAutocompleteWithError error: Error) {
        // TODO: handle the error.
        print("Error: ", error.localizedDescription)
    }

    // User canceled the operation.
    func wasCancelled(_ viewController: GMSAutocompleteViewController) {
        viewController.dismiss(animated: true, completion: nil)
    }

    // Turn the network activity indicator on and off again.
    func didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
    }

    func didUpdateAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
        UIApplication.shared.isNetworkActivityIndicatorVisible = false
    }

}

Любая помощь будет оценена!

1 Ответ

2 голосов
/ 11 мая 2019

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

**let fields: GMSPlaceField = GMSPlaceField(rawValue:UInt(GMSPlaceField.name.rawValue) |
            UInt(GMSPlaceField.placeID.rawValue) |
            UInt(GMSPlaceField.coordinate.rawValue) |
            GMSPlaceField.addressComponents.rawValue |
            GMSPlaceField.formattedAddress.rawValue)!
autocompleteController.placeFields = fields**
...