使用 CLLocation 和/或 Mapkit 从坐标中查找企业名称信息
Posted
技术标签:
【中文标题】使用 CLLocation 和/或 Mapkit 从坐标中查找企业名称信息【英文标题】:Looking for business name information from coordinates using CLLocation and/or Mapkit 【发布时间】:2016-02-22 23:59:17 【问题描述】:我正在尝试使用使用 CLLocationManager 返回的坐标来查看它们是否与任何本地企业非常匹配 - 例如,如果我碰巧站在星巴克,我希望我的应用程序根据我的坐标提出建议我站在星巴克。如果我在 Starbucks 外 20 米处,但这是离我所站最近的地址,我希望它建议“Starbucks”。
我可以返回 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,那么至少我知道,并且可以继续使用它 - 但如果有办法,如果知道它是什么,我将不胜感激......
提前致谢!
【问题讨论】:
【参考方案1】:进一步了解弗朗西斯科的非常有用的答案,这是我必须对 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)")
)
【讨论】:
更新了我的答案以在语法中包含此更改【参考方案2】:我在使用 MapKit 时遇到过类似的问题,一段时间后发现 Google Places API 更适合此类任务检查此link 以查找有关如何使用 Google Places 获取当前位置的示例代码
基本上你需要
-Install Google places 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%,并且 35% 的可能性是地方 B,可能性数组有两个 成员:地点 A 的可能性为 0.55,地点 B 的可能性为 0.35 的可能性。
您还有机会使用 GMSPlacePicker,如果您希望您的用户有机会选择他们当前的位置,这会很有帮助。
【讨论】:
嘿弗朗西斯科 - 非常感谢您的帮助;这是我正在寻找的解决方案。我正在运行 Xcode 7.2,我发现我必须稍微更改语法才能让它工作 感谢我更新了语法以使用 swift 2.0 和 Xcode 7.2以上是关于使用 CLLocation 和/或 Mapkit 从坐标中查找企业名称信息的主要内容,如果未能解决你的问题,请参考以下文章
使用 Alamofire 和 Mapkit Swift 3 请求
是否可以从 CLLocation(或 CLLocationCoordinates2D)获取 NSTimeZone 实例?