Apple MapKit 是否有像 Google Places 那样的唯一标识符?

问题描述 投票:0回答:2

我浏览了 Apple 的文档,但找不到 Apple 地图(即 MapKit)是否提供类似于 Google 通过 Places SDK 提供的唯一 ID - https://developers.google.com/places/ios-sdk /地点 ID

我已经查看了所有 MapKit 文档,但找不到任何内容。

我为什么要问这个?我正在构建一个应用程序,允许用户保存/为“地点”添加书签。我需要一种能够使用唯一 ID 检索该地点的详细信息的方法,以便我可以再次检索其信息。目前,我最好的选择似乎是使用 Google Places SDK,因为这将允许我搜索和查找地点,将地点 ID 保存在我的数据库中,然后使用相同的地点 ID 稍后再次查找。

ios mapkit google-places-api apple-maps
2个回答
3
投票

您可以使用名称、地址或电话号码在 Places SDK 中启动地点搜索来检索地点 ID,然后您可以按计划使用该 ID。这允许您存储名称或地址并将其用于查找。您的另一个选择是原生并使用 CLPlacemark,它可以使用 CLLocation 进行初始化并存储/检索。这是一篇关于 本机地理编码

的有用文章

0
投票

现在是 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上的地名/位置,甚至更改了地理编码的地址信息,例如,可能会出现一些问题。街道名称已更改,但这不太可能,所以编码愉快!

© www.soinside.com 2019 - 2024. All rights reserved.