【问题标题】:How to get GMSPlace for a CLLocationCoordinate2D?如何为 CLLocationCoordinate2D 获取 GMSPlace?
【发布时间】:2016-03-30 04:16:40
【问题描述】:

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

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

【问题讨论】:

  • 你是怎么解决你的问题的?

标签: ios google-maps


【解决方案1】:

我正在处理类似的问题,但我还没有找到确切的解决方案,但这些替代方案可能会根据您的情况起作用。如果您可以使用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。 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
  }
}

【讨论】:

  • 我也遇到了同样的问题。似乎 GMSPlaces(Google Places)和 GMSAddress(Google Maps)是来自不同 API 的对象,因此不容易兼容。考虑到他们都基本上处理谷歌地图,有点奇怪。一个烦人的(替代)解决方案是创建您自己的自定义“放置对象”并将其属性设置为您希望从 GMSAddress 对象和 GMSPlace 对象中获得的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多