在我的一个应用程序中,我需要添加一项功能,以按名称查找城市。我正在使用它CLGeocoder
来实现,并且我希望它具有与iOS天气应用程序相同的行为。
下面是我的代码:
CLGeocoder().geocodeAddressString(searchBar.text!, completionHandler:{ (placemarks, error) -> Void in
guard let nonNilMarks = placemarks else {return}
for placemark in nonNilMarks {
print("locality: \(placemark.locality)")
print("name: \(placemark.name)")
print("country: \(placemark.country)")
print("formatted address: \(placemark.addressDictionary)")
}
})
在大多数情况下,它工作得很好。但是,最近我发现某些情况下失败了。以下是一些示例的输出:
locality: Optional("Milan")
name: Optional("Milan")
country: Optional("Italy")
formatted address: Optional([SubAdministrativeArea: Milan, State: Lombardy, CountryCode: IT, Country: Italy, Name: Milan, FormattedAddressLines: (
Milan,
Italy
), City: Milan])
这是正确的输出
得克萨斯州有一个小镇叫意大利。如果输入“意大利,TX”,则输出为:
locality: Optional("Italy")
name: Optional("Italy")
country: Optional("United States")
formatted address: Optional([SubAdministrativeArea: Ellis, State: TX, CountryCode: US, Country: United States, Name: Italy, FormattedAddressLines: (
"Italy, TX",
"United States"
), City: Italy])
当我只输入“意大利”时,我只会得到该国家的地标:
locality: nil
name: Optional("Italy")
country: Optional("Italy")
formatted address: Optional([CountryCode: IT, Name: Italy, FormattedAddressLines: (
Italy
), Country: Italy])
这与“意大利德克萨斯州”的情况类似:
locality: Optional("Singapore")
name: Optional("Singapore")
country: Optional("Singapore")
formatted address: Optional([City: Singapore, CountryCode: SG, Name: Singapore, State: Singapore, FormattedAddressLines: (
Singapore,
Singapore
), Country: Singapore])
再次,似乎类似于“意大利”的情况。它只会找到一个国家:
locality: nil
name: Optional("Singapore")
country: Optional("Singapore")
formatted address: Optional([CountryCode: SG, Name: Singapore, FormattedAddressLines: (
Singapore
), Country: Singapore])
在这个阶段,我可能会geocodeAddressString:
停止搜索是否找到名称等于搜索参数的国家/地区,因此我尝试将代码更改为:
let addrDict = [kABPersonAddressCityKey as NSString: searchBar.text!]
CLGeocoder().geocodeAddressDictionary(addrDict, completionHandler:{ (placemarks, error) -> Void in
print(placemarks)
})
我认为通过将搜索词限制为城市名称,我会得到正确的结果。不幸的是,我的行为完全相同!
而 THEN 我意识到,我不仅案件的问题时,城市的名字等于国家名称。
locality: nil
name: Optional("Tokyo")
country: Optional("Japan")
formatted address: Optional([CountryCode: JP, Name: Tokyo, State: Tokyo, FormattedAddressLines: (
Tokyo,
Japan
), Country: Japan])
不仅可以CLGeocoder
忽略结果(例如在“意大利”的情况下),而且还可以告诉我,某个地方locality
实际上没有时间(我相信上一次我查看地图时东京仍然是一座城市!
)。
有谁知道我如何解决这些问题?
Weather应用程序以某种方式做到了-在那里搜索“新加坡”或“意大利”会给出正确的结果。我将不胜感激!
PS:尽管我使用的是Swift,但我添加了Objective-C作为标记,因为我认为这个问题并非特定于Swift。
您所显示的用法是完全正确的,我认为您无法采取其他措施来改善结果。仍然只是一些复杂的算法,试图根据一组规则和一些假设对结果进行排序。
很难过,我完全理解您的无奈,因为我去过那里并且做到了。问题在于,地理编码数据库显然不完整,苹果不是领导该领域的公司-
Google是。在这里,您可以看到从引入Geocoder时获得的技术注释,其中说仍然存在不支持或仅部分支持的国家/地区。
因此,我对您的建议是,如果您想获得最佳结果(尽管仍然不能保证失败),请切换到Google
Geolocation。对于相当数量的请求,它是免费的,此后则花费很少的钱。根据我的经验,所有基本搜索的成功率都在99%左右,只有您提供更多信息,它才会变得更好。API选项也相当广泛。
希望它至少可以有所帮助。
编辑:我写完这篇文章后,我做了一些研究,似乎我不是唯一提出此声明的人(还包括相同的不受支持的链接)。
我是Android开发的新手,下面是我的关于使用Geocoder获取当前位置的城市名称的代码,它返回空: private void updateCurrentLocation(Location Location){double lat=0.0,lng=0.0; 有谁能帮忙吗?谢谢你!顺便说一句,有没有更好的办法来接收一个城市名字?谢谢你!
我正在为我的单选按钮使用ItemListener。我看到了很多ItemListener函数,但我的似乎工作方式不同。 它返回的值是“javax.swing.JRadioButton[User,445453,49x18,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth”。SynthBorder@1f2f60d,flags=288,
问题内容: 我已经找到了针对Objective-C的答案,但是林先生很难迅速做到这一点。 我用它来获取当前位置的国家代码: 但是,如何将该国家/地区代码转换为国家/地区名称,例如在此示例中,将“ US”转换为“ United States”? 问题答案: 迅捷3
问题内容: 我正在Swift3中开发应用程序,但遇到字母问题,我找不到答案。 我怎么知道基于纬度和经度的城市名称和国家简称? 问题答案: 我建议将Google Maps API 与您的项目集成。如果您这样做,则可以使用Google提供的反向地理编码来完成您的任务。 此外,谷歌还有用于IOS开发的Google Maps SDK ,这也是值得考虑的。 UPD: 您可以在不将地图集成到项目中的情况下做到
问题内容: 我正在尝试从STATION查询不以元音开头且不以元音结尾的CITY名称列表。结果不能包含重复项。 一开始我尝试了这个: 但是我没有得到正确的答案,因此没有进行搜索并编写以下代码,但该代码也没有给出正确的答案: 我希望只显示那些以元音开头和结尾的城市名称,但在第一个查询中将显示所有城市名称,而在第二个查询中,将不显示以元音开头的所有城市名称。 问题答案: 更容易阅读的是: 请注意第二个子
问题内容: 如何使用MapKit从坐标获取地址? 当在地图上长按时,我得到了以下代码: 我想用完整的地址(街道,城市,邮政编码,国家)打印。 问题答案: SWIFT 4.2:编辑 框架确实提供了一种从坐标获取地址详细信息的方法。 您需要使用地图套件的 反向地理编码 。类用于从地址获取位置,并从位置(坐标)获取地址。该方法将从坐标返回地址详细信息。 此方法接受作为参数并返回,其中包含地址字典。 所以