0

我想执行像 Apple Weather 应用程序这样的位置查找,该应用程序显示每次击键时的潜在位置表。每次在文本字段中发生“编辑更改”事件时,我都会将用户的输入字符串发送到下面的函数。该字符串似乎已正确发送,但我没有得到预期的地标数组。例如“Chestnut”只返回“Chestnut, IL”,但如果我输入“Chestnut Hi”,我会得到四个元素:“Marshfield, MA”、“Wilbraham, MA”、“South Hadley, MA”和“Greenfield, MA” ”。然后键入“Chesnut Hil”会返回“Brookline, MA”,它甚至不在“Chestnut Hi”列表中。代码如下。非常感谢!

func forwardGeocoding(address: String) {
    CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in
        if error != nil {
            print(error!)
            return
        }
        var placeName = ""
        var placeCoordinate = ""
        self.placeNames = [] // empty arrays at the start of each geocode result
        self.placeCoordinates = []

        if (placemarks?.count)! > 0 {

            for placemark in placemarks! {

                if placemark.country != "United States" {
                    let city = placemark.locality ?? ""
                    let country = placemark.country ?? ""
                    placeName = "\(city) \(country)"
                } else {
                    let city = placemark.locality ?? ""
                    placeName = "\(city), \(placemark.administrativeArea!)"
                }

                let coordinate = placemark.location?.coordinate
                placeCoordinate = "\(coordinate!.latitude), \(coordinate!.longitude)"
                self.placeNames.append(placeName)
                self.placeCoordinates.append(placeCoordinate)
            }
        }
        self.tableView.reloadData()
    })
}
4

1 回答 1

3

CLGeocoder文档中的一些值得注意的片段,重点补充说:

地理编码器对象是与基于网络的服务一起使用以查找其指定坐标值的地标信息的单次对象


应用程序应该意识到它们如何使用地理编码。每个应用程序的地理编码请求都有速率限制,因此在短时间内发出过多请求可能会导致某些请求失败。


计算机或设备必须能够访问网络,以便地理编码器对象返回详细的地标信息

所有这些都表明,a)CLGeocoder通常来说,用于返回和优化“键入时”搜索结果可能效果不佳,并且 b) 因此它可能不是 Apple 在 Weather 中使用的。

请记住,Weather 不想将用户输入的字符串映射到地球上的纬度/经度——它正在搜索地名列表。(具体来说,Apple 的天气预报合作伙伴为其提供数据的地点列表。)如果这是您想要搜索的内容,您将需要自己的此类列表。

如果您想要“键入时”搜索结果,最好使用本地数据库,或者至少是针对该用途量身定制的 Web 服务。正如这个旧答案中所指出的,有很多选择——谷歌提供了一些服务,而GeoNames.org是一个免费/开放的选项,它有网络服务和可下载的数据库,你可以嵌入到你的应用程序中。

一旦有了这样的数据库/服务,您还需要考虑如何使用它。例如,您是否希望“chestnut hi”找到宾夕法尼亚州的 Chestnut Hill 或(假设地;没有)夏威夷的 Chestnut?您如何预处理搜索字符串并将它们放入数据库查询将影响您的结果。

于 2016-11-07T22:01:23.177 回答