使用Google Places Autocomplete SDK获取选中地点经纬度返回-180的问题
解决Google Places Autocomplete经纬度返回-180的问题
我之前也踩过一模一样的坑!你遇到的经纬度返回-180的情况,大概率是因为没有主动请求坐标字段权限导致的。Google Places SDK默认不会返回所有地点信息,像经纬度这类数据,需要你明确告诉SDK要获取它。
问题原因
当你初始化GMSAutocompleteViewController时,默认的请求字段里并不包含坐标信息,所以SDK返回的GMSPlace对象会用-180作为坐标的默认占位值——这就是为什么你能拿到地点名称,却拿不到正确经纬度的核心原因。
解决步骤
你只需要在初始化自动完成控制器时,指定需要请求的字段,把坐标字段加进去就行:
- 创建
GMSAutocompleteFilter(可选,用来过滤地点类型) - 设置
placeFields属性,必须包含.coordinate字段 - 将配置好的参数绑定到控制器
修改后的完整代码示例
首先是初始化控制器的部分:
// 创建自动完成控制器 let autocompleteController = GMSAutocompleteViewController() autocompleteController.delegate = self // 1. 创建过滤器(按需设置地点类型,这里用noFilter表示不限制) let filter = GMSAutocompleteFilter() filter.type = .noFilter // 2. 指定需要获取的地点字段,一定要加.coordinate! let requiredFields: GMSPlaceField = [.name, .placeID, .coordinate, .attributions] autocompleteController.placeFields = requiredFields // 3. 绑定过滤器 autocompleteController.autocompleteFilter = filter // 弹出控制器 present(autocompleteController, animated: true, completion: nil)
你的回调方法不需要修改,保持原来的逻辑即可:
func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) { print("Place name: \(String(describing: place.name))") print("Place ID: \(String(describing: place.placeID))") print("Place attributions: \(String(describing: place.attributions))") print("Selected Lat \(place.coordinate.latitude)") print("Selected Lng \(place.coordinate.longitude)") dismiss(animated: true, completion: nil) }
额外排查点
如果修改后还是有问题,可以检查这几点:
- 确认Google Cloud控制台已经启用了Places API,且你的API密钥拥有正确的调用权限
- 检查Info.plist里是否配置了正确的
GMSApiKey - 查看Xcode控制台有没有网络请求报错(比如API密钥无效、权限不足等)
内容的提问来源于stack exchange,提问作者Shahbaz Ali
相关产品推荐
相关产品推荐

