gpt4 book ai didi

ios - 当城市名称等于某个国家的名称时,CLGeocoder 返回错误的结果(不仅如此)

转载 作者:IT王子 更新时间:2023-10-29 05:17:28 24 4
gpt4 key购买 nike

在我的一个应用程序中,我需要添加通过名称查找城市的功能。我正在使用 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])

这是正确的输出

正在搜索“意大利,德克萨斯州”- 作品

德克萨斯州有一个小镇叫意大利。如果我输入“Italy, 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)
})

我认为通过将搜索词限制为城市名称,我会得到正确的结果。不幸的是,我得到了完全相同的行为!

然后然后我意识到我不仅在城市名称等于国家名称的情况下遇到问题。

搜索“东京”- EPIC FAIL

locality: nil
name: Optional("Tokyo")
country: Optional("Japan")
formatted address: Optional([CountryCode: JP, Name: Tokyo, State: Tokyo, FormattedAddressLines: (
Tokyo,
Japan
), Country: Japan])

结论

CLGeocoder 不仅可以省略结果(就像“意大利”的情况),而且它还可以告诉我一个地方没有 locality,当,在事实上,确实如此(我相信上次我查看 map 时东京还是一座城市!)。

有谁知道我该如何解决这些问题?

天气应用程序以某种方式执行此操作 - 在那里搜索“新加坡”或“意大利”会给出正确的结果。如果有任何帮助,我将不胜感激!

附言虽然我使用的是 Swift,但我将 Objective-C 添加为标签,因为我认为这个问题不是 Swift 特有的。

最佳答案

使用您展示的内容是完全正确的,我认为您无法做任何其他事情来改善结果。它仍然只是一些复杂的算法,试图根据一组规则和一些假设对结果进行排序。

虽然很伤心,但我完全理解您的沮丧,因为我经历过并做到了。问题是地理编码数据库显然不完整,苹果公司不是这个领域的领导者——谷歌才是。在这里,您可以看到介绍 Geocoder 时的技术说明 there are still countries that are not supported ,或只是部分支持。

所以我给你的建议是,如果你想获得最好的结果(尽管仍然不是万无一失的),请切换到 Google Geolocation。对于相当多的请求,它是免费的,之后它会花费一些非常小的费用。根据我的经验,所有基本搜索的成功率都在 99% 左右,如果您提供更多信息,它只会变得更好。 API 选项也非常广泛。

以下是地理编码和反向地理编码的开发者文档链接: https://developers.google.com/maps/documentation/geocoding/intro https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse

希望它至少有所帮助。

编辑:写完这篇文章后,我做了一些研究,看来我不是唯一一个 make this claim 的人。 (还包括相同的不受支持的链接)。

关于ios - 当城市名称等于某个国家的名称时,CLGeocoder 返回错误的结果(不仅如此),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31331093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com