【发布时间】:2016-03-30 04:16:40
【问题描述】:
我有一个CLLocationCoordinate2D 形式的位置坐标。如何使用 Google Maps SDK 获取其等效的 GMSPlace 对象?
这似乎应该是一项非常简单的任务,但我在 Google 的文档或 Stack Overflow 上找不到任何内容。
【问题讨论】:
-
你是怎么解决你的问题的?
标签: ios google-maps
我有一个CLLocationCoordinate2D 形式的位置坐标。如何使用 Google Maps SDK 获取其等效的 GMSPlace 对象?
这似乎应该是一项非常简单的任务,但我在 Google 的文档或 Stack Overflow 上找不到任何内容。
【问题讨论】:
标签: ios google-maps
我正在处理类似的问题,但我还没有找到确切的解决方案,但这些替代方案可能会根据您的情况起作用。如果您可以使用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。 p>
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
}
}
【讨论】: