如何获得CLLocationCoordinate2D的GMSPlace?

时间:2016-02-01 21:20:58

标签: ios google-maps

我有CLLocationCoordinate2D形式的位置坐标。如何使用Google Maps SDK获取其等效的GMSPlace对象?

这似乎应该是一项非常简单的任务,但我无法在Google的文档或Stack Overflow中找到任何内容。

1 个答案:

答案 0 :(得分:3)

我正在研究类似的问题,但我还没有找到确切的解决方案,但这些替代方案可能会根据您的情况而有效。如果您可以使用GMSAddress而不是GMSPlace,则可以使用GMSGeocoder来调用reverseGeocodeCoordinate,如下面的选项二所示。

如果您尝试获取用户的当前位置,则有两个选项:

  1. 使用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.
      }
    })
    
  2. 使用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
    }
    
  3. 有人在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
      }
    }