GMSPlace 返回无效坐标(-180、-180),但名称和地点 ID 正确

Posted

技术标签:

【中文标题】GMSPlace 返回无效坐标(-180、-180),但名称和地点 ID 正确【英文标题】:GMSPlace returns invalid coordinate (-180, -180), but name and place ID are correct 【发布时间】:2019-09-22 12:25:45 【问题描述】:

我正在尝试在 Google 地图上实现自动完成搜索,该搜索将使用标记显示用户在地图上选择的位置。

搜索工作正常。问题如下。当我从搜索结果中选择一个位置时,我得到一个 GMSPlace 对象,该对象具有正确的名称作为所选值、正确的地点 ID(使用此 link 确认),但坐标不正确(-180.0,-180.0kCLLocationCoordinate2DInvalid持续的)。我在多个地点进行了测试。

大部分代码是从 documentation 借用的 Places 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】:

我遇到了同样的问题,并阅读了 Place SDK 文档,该文档清楚地表明我们应该事先定义 GMSPlaceField 我们需要哪些详细信息,如果您完全按照文档进行操作,则只会导致正在填充的 name 和 placeId。 因此,在实例化您的 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**

【讨论】:

愚蠢的我忽略了这一点......非常感谢。

以上是关于GMSPlace 返回无效坐标(-180、-180),但名称和地点 ID 正确的主要内容,如果未能解决你的问题,请参考以下文章

-[UIPickerView setFrame:]:无效的高度值 200.0 固定到 180.0

MKMapRect 并显示跨越 180 条子午线的地图叠加层

Google Vision OCR,将文字坐标从 90、180、270 个文档中旋转到 0 度

[深度学习][转载]如何旋转图片180度重新获取坐标位置

cesium-坐标转换

Scratch-动作模块X坐标Y坐标方向