我浏览了 Apple 的文档,但找不到 Apple 地图(即 MapKit)是否提供类似于 Google 通过 Places SDK 提供的唯一 ID - https://developers.google.com/places/ios-sdk /地点 ID
我已经查看了所有 MapKit 文档,但找不到任何内容。
我为什么要问这个?我正在构建一个应用程序,允许用户保存/为“地点”添加书签。我需要一种能够使用唯一 ID 检索该地点的详细信息的方法,以便我可以再次检索其信息。目前,我最好的选择似乎是使用 Google Places SDK,因为这将允许我搜索和查找地点,将地点 ID 保存在我的数据库中,然后使用相同的地点 ID 稍后再次查找。
您可以使用名称、地址或电话号码在 Places SDK 中启动地点搜索来检索地点 ID,然后您可以按计划使用该 ID。这允许您存储名称或地址并将其用于查找。您的另一个选择是原生并使用 CLPlacemark,它可以使用 CLLocation 进行初始化并存储/检索。这是一篇关于 本机地理编码
的有用文章现在是 2024 年了,我已经经历了同样的事情几天了。经过一番挖掘,我在 Apple 地图上找不到任何可访问的唯一地点 ID,只是 Apple 决定将其保密。
因此,我需要为每个地点生成一个唯一的 id,将其发送到我的数据库,并确保当用户再次选择同一地点时,将生成相同的 id。
底线:关键在于如何生成 id,同时保持上述标准
我的解决方案是使用 Apple 内置的 CLGeocoder 根据地名和该地点的地理编码地址生成 id:
private func generatePlaceIdentifierBasedOnLocationAndName(_ location: CLLocation, _ name: String, completion: @escaping (_ id: String?) -> Void) {
let geoCoder = CLGeocoder()
geoCoder.reverseGeocodeLocation(location, completionHandler: { placemarks, error in
guard error == nil, let placemark = placemarks?.first else {
completion(nil)
return
}
var id: String = name
if let countryCode = placemark.isoCountryCode {
id += "-\(countryCode)"
}
if let state = placemark.administrativeArea {
id += "-\(state)"
}
if let city = placemark.locality {
id += "-\(city)"
}
if let street = placemark.thoroughfare {
id += "-\(street)"
}
if let additionalStreetInfo = placemark.subThoroughfare {
id += "-\(additionalStreetInfo)"
}
completion(id)
})
}
请注意,如果Apple更改了Apple Maps上的地名/位置,甚至更改了地理编码的地址信息,例如,可能会出现一些问题。街道名称已更改,但这不太可能,所以编码愉快!