我有CLLocationCoordinate2D
形式的位置坐标。如何使用Google Maps SDK获取其等效的GMSPlace对象?
这似乎应该是一项非常简单的任务,但我无法在Google的文档或Stack Overflow中找到任何内容。
答案 0 :(得分:3)
我正在研究类似的问题,但我还没有找到确切的解决方案,但这些替代方案可能会根据您的情况而有效。如果您可以使用GMSAddress
而不是GMSPlace
,则可以使用GMSGeocoder来调用reverseGeocodeCoordinate
,如下面的选项二所示。
如果您尝试获取用户的当前位置,则有两个选项:
使用Google地图当前位置获取GMSPlace。这非常简单,如果您只是诉诸实际地点就可以解决您的问题。这个问题是我无法弄清楚如何获得所有地址(而不是企业)。您可以看到文档here。
在viewDidLoad中:
let placesClient = GMSPlacesClient()
当你想获得当前的位置时:
placesClient?.currentPlaceWithCallback({ (placeLikelihoods, error) -> Void in
if error != nil {
// Handle error in some way.
}
if let placeLikelihood = placeLikelihoods?.likelihoods.first {
let place = placeLikelihood.place
// Do what you want with the returned GMSPlace.
}
})
使用OneShotLocationManager获取CLLocationCoordinate2D并将其转换为GMSAddress。您必须使用以下代码替换_didComplete
函数才能返回GMSAddress而不是CLLocationCoordinate2D。
private func _didComplete(location: CLLocation?, error: NSError?) {
locationManager?.stopUpdatingLocation()
if let location = location {
GMSGeocoder().reverseGeocodeCoordinate(location.coordinate, completionHandler: {
[unowned self] (response, error) -> Void in
if error != nil || response == nil || response!.firstResult() == nil {
self.didComplete?(location: nil,
error: NSError(domain: self.classForCoder.description(),
code: LocationManagerErrors.InvalidLocation.rawValue,
userInfo: nil))
} else {
self.didComplete?(location: response!.firstResult(), error: error)
}
})
} else {
self.didComplete?(location: nil, error: error)
}
locationManager?.delegate = nil
locationManager = nil
}
有人在here上发布了一个方便的包装器,用于从GMSAddressComponents
中提取您在处理此API时可能会发现有用的字段。这样可以轻松实现,因为当您想要访问城市时,您只需要place.addressComponents?.city
作为示例。
extension CollectionType where Generator.Element == GMSAddressComponent {
var streetAddress: String? {
return "\(valueForKey("street_number")) \(valueForKey(kGMSPlaceTypeRoute))"
}
var city: String? {
return valueForKey(kGMSPlaceTypeLocality)
}
var state: String? {
return valueForKey(kGMSPlaceTypeAdministrativeAreaLevel1)
}
var zipCode: String? {
return valueForKey(kGMSPlaceTypePostalCode)
}
var country: String? {
return valueForKey(kGMSPlaceTypeCountry)
}
func valueForKey(key: String) -> String? {
return filter { $0.type == key }.first?.name
}
}