我想像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()
})
}
答案 0 :(得分:2)
来自CLGeocoder
docs的一些值得注意的摘要,重点是:
地理编码程序对象是与基于网络的服务协同工作的单击对象,用于查找其指定坐标值的地标信息
应用程序应该意识到它们如何使用地理编码。 地理编码请求对每个应用都是速率限制的,因此在短时间内提出过多请求可能会导致某些请求失败。
计算机或设备必须能够访问网络才能使地理编码器对象返回详细的地标信息
所有这些都表明a)使用CLGeocoder
返回并改进“当你输入”搜索结果时,一般情况下可能效果不佳,并且b)因此它可能不是Apple在天气中使用的。
请记住,Weather不希望将用户输入的字符串映射到地球上的纬度/长度 - 它正在搜索地名列表。 (具体来说,Apple的天气预报合作伙伴提供数据的地方列表。)如果您要搜索的是那种类型,那么您需要自己的列表。
如果您希望“在键入”搜索结果时,最好由本地数据库提供服务,或者至少是为该用途量身定制的Web服务。正如this old answer中所述,有很多选项可供选择 - Google提供了一些服务,而GeoNames.org是一个免费/开放选项,同时包含您可以嵌入应用中的网络服务和可下载数据库。
一旦拥有了这样的数据库/服务,您还需要考虑如何使用它。例如,你想要“栗子嗨”找到栗子山,宾夕法尼亚州或(假设没有)板栗,夏威夷?如何预处理搜索字符串并将其转换为数据库查询将影响您的结果。