0

我正在尝试使用使用 CLLocationManager 返回的坐标来查看它们是否与任何本地企业非常匹配 - 例如,如果我碰巧站在星巴克,我希望我的应用程序根据我的坐标建议我站着在星巴克。如果我在星巴克外 20 米处,但它是离我所站最近的地址,我希望它建议“星巴克”。

我可以返回 CLPlacemarks 没问题,但它们包含的信息不包含任何地方的公司名称。我在英国,例如,位于伦敦格洛斯特路的 Nando's 的地址是“170 Gloucester Road, London, SW7 4ST”。我可以在 CLPlacemark 信息中返回 170 Gloucester Road, London, SW7 4ST 没问题,但它没有提到 Nando's。

我在各种帖子中读到信息可能在名称属性、感兴趣的区域甚至格式化的地址属性中,但我在伦敦市中心的广泛测试表明,无论如何在英国并非如此。即使在美国,“Apple Inc”也仅在 1 Infinite Loop 之前的地址格式化地址属性中提及。

我尝试通过使用 CLLocation 获取用户的坐标然后将它们用作程序化 MapKit 搜索的基础来完成此操作 - 这只是再次返回地址,而不是公司名称。

还对 Apple Maps 应用程序进行了一些最终用户测试,否则我是该应用程序的忠实粉丝,如果通常在本地搜索例如“酒吧”、“餐厅”,它似乎返回相当不完整的结果。包括一些当地的地方,其他地方不包括在内,有时结果包含相当远的地方,即使我知道附近还有更多的餐馆。

我很快得出结论,实现我想要的唯一方法是使用 Google Places API,出于多种原因,我希望避免这种情况,尤其是我在 iOS 编程方面相当缺乏经验(顺便说一句,在 Swift 中......)

如果有人可以明确建议在 Mapkit 中无法本地执行此操作并且我需要使用 Google Places API,那么至少我知道,并且可以继续使用它 - 但如果有办法,我会最感谢知道它是什么...

提前致谢!

4

2 回答 2

0

除了弗朗西斯科的非常有用的答案,这是我必须对 currentPlaceWithCallback 进行的调整 - 我删除了:GMSPlaceLikelihoodList!它给出了以下错误:无法将 GMSPlaceLikelihoodList 类型的值转换为预期的参数类型....

这是更正后的代码:

    placesClient!.currentPlaceWithCallback({ (placeLikelihoods, error) -> Void in
        if error != nil {
            print("Current Place error: \(error!.localizedDescription)")
            return
        }

        for likelihood in placeLikelihoods!.likelihoods {
            if let likelihood = likelihood as? GMSPlaceLikelihood {
                let place = likelihood.place
                print("Current Place name \(place.name) at likelihood \(likelihood.likelihood)")
                print("Current Place address \(place.formattedAddress)")
                print("Current Place attributions \(place.attributions)")
                print("Current PlaceID \(place.placeID)")


            }
        }

})

于 2016-02-27T13:18:48.030 回答
0

我在 MapKit 上遇到过类似的问题,一段时间后发现 Google Places API 更适合此类任务检查此链接以查找有关如何使用 Google Places 获取当前位置的示例代码

基本上你需要

-安装 Google 地方 SDK

- 将 Google 地图导入您的班级

import GoogleMaps

- 在课堂上添加一个地方客户

var placesClient: GMSPlacesClient?

- 可能在您的 viewDidLoad() 上初始化您的场所客户端

placesClient = GMSPlacesClient()

- 并在需要它的地方添加此代码以搜索当前位置

placesClient!.currentPlaceWithCallback({ (placeLikelihoods, error) -> Void in
  if error != nil {
    print("Current Place error: \(error.localizedDescription)")
    return
  }

  for likelihood in placeLikelihoods.likelihoods {
    if let likelihood = likelihood as? GMSPlaceLikelihood {
      let place = likelihood.place
      print("Current Place name \(place.name) at likelihood \(likelihood.likelihood)")
      print("Current Place address \(place.formattedAddress)")
      print("Current Place attributions \(place.attributions)")
      print("Current PlaceID \(place.placeID)")
    }
  }
})

关于似然值的注释:

该可能性提供了该地点在单个请求的返回地点列表中成为最佳匹配的相对概率。您无法比较不同请求的可能性。可能性的值将在 0 和 1.0 之间。返回的 GMSPlaceLikelihood 对象数组中的可能性总和始终小于或等于 1.0。请注意,总和不一定是 1.0。例如,要表示正确地点是地点 A 的 55% 可能性和地点 B 的 35% 可能性,可能性数组有两个成员:地点 A 的可能性为 0.55,地点 B 的可能性为 0.35。

您还有机会使用 GMSPlacePicker,如果您希望您的用户有机会选择他们当前的位置,它会很有帮助。

于 2016-02-23T02:15:59.380 回答