OpenStreetMap / Nominatim的GeoCoding问题
我有一个网站需要获取客户输入的地址的纬度和经度。
Google / Bing / Yahoo对我们来说太贵了,所以我们使用了OpenStreetMap / Nominatim。
不幸的是,虽然在测试过程中它可以正常工作,但未能找到大约50%的地址,这是一个大问题。
有三件事我很想知道:
1)处理客户确实输入了错误地址的情况的最佳方式是什么?向他们发送电子邮件并要求他们纠正? 使用地址段直到找到东西?
2)什么是最好的方式来处理地址是好的情况,但我不能找到它与OpenStreetMap? 或者我对Nominatim的查询做错了什么?
3)有没有人知道免费/廉价的选择,如果OpenStreeMap不能胜任? 我知道它是一个开源协作,因此并不完整,但我认为它的覆盖范围非常好,如果它没有确切的位置,它会返回附近的位置 - 也许它确实可以,也许我正在使用它错误。
这里是一个例子:“纽约阿尔巴尼182号住宅,12210,美国”
谷歌地图很容易找到。 Nominatim找不到任何东西:http://nominatim.openstreetmap.org/search?format=xml&addressdetails=0&q=182%20livington%20ave,albany,New%20York12210,US
干杯,
戴尔
我认为你要找的是地址验证。 谷歌,Nominatim和其他人,只执行地址近似,当你不确定它们是什么时,这对寻找地址很有帮助,但结果只是一个最好的猜测。
我帮助开发了一个API,它根据称为LiveAddress的严格CASS™要求验证和地理编码地址。 我通过Google,Nominatim和LiveAddress API运行了您的示例地址,结果如下:
Google尽管在“Livingston”中输入了错字,但找到了该地址,但无法保证其有效性,并说“地址是近似值”。 - 然后再说一遍,它表示几乎每个地址都是你尝试的。
Nominatim不会因为输入错误而找到它。 使用Nominatim的一个缺点是它不会尝试补偿拼写错误,验证地址的准确性或完整性等。修正错字返回了一些信息,但是任何人都会猜测必须修复哪些内容以及为什么查询失败无论如何。
由于输入错误,LiveAddress无法识别输入的地址。 在“利文斯顿”中缺少“s”是非常戏剧性的,因为有些街道名为“Livington”,这使得查询模糊不清,而且根据CASS™规范,结果太多不符合要求。 然而,用不同的拼写错误来改变姓名,“Livingstn”却产生了一个有效的结果,Nominatim错别字也不接受:
...出于某种原因,我必须打破我的要点才能正确呈现代码:
[
{
"input_index": 0,
"candidate_index": 0,
"delivery_line_1": "182 Livingston Ave",
"last_line": "Albany NY 12210-2512",
"delivery_point_barcode": "122102512824",
"components": {
"primary_number": "182",
"street_name": "Livingston",
"street_suffix": "Ave",
"city_name": "Albany",
"state_abbreviation": "NY",
"zipcode": "12210",
"plus4_code": "2512",
"delivery_point": "82",
"delivery_point_check_digit": "4"
},
"metadata": {
"record_type": "S",
"county_fips": "36001",
"county_name": "Albany",
"carrier_route": "C011",
"congressional_district": "21",
"rdi": "Residential",
"latitude": 42.66033,
"longitude": -73.75285,
"precision": "Zip9"
},
"analysis": {
"dpv_match_code": "Y",
"dpv_footnotes": "AABB",
"dpv_cmra": "N",
"dpv_vacant": "N",
"active": "Y",
"ews_match": false,
"footnotes": "M#"
}
}
]
分析脚注“M#”表示通过修复街道名称的拼写来实现匹配。 由此产生的DPV脚注“AABB”表示整个地址与国家ZIP + 4文件中的街道+城市/州相匹配。 另请注意,Zip9精度是地理编码最精确的级别(当前) - 精确到块级(或更接近)级别。
所以,在回答你的问题时:
那要看。 您的客户是否在网站表单上输入地址? 在他们继续之前马上告诉他们,地址是无效的。 我们正在研究一个jQuery插件,以便所有人都可以轻松地进行剪切和粘贴,但在此之前,您可以在我们的checkout表单中看到我们的概念,该表单实现了一个非常漂亮的系统:SmartyStreets有一个jQuery插件,用于验证网站上的地址表格(只是复制和粘贴)。 当输入地址时,它会自动验证。 如果它错了,他们会通知用户是否想修复它。 有时候他们的地址是不明确的,它会返回一些有效的结果。 (试试:“100,纽约,纽约”) - 他们会提出一些建议,你可以选择一个。 你修复它,表单不会提交,直到用户得到一个有效的地址,或者说“无论如何使用我的;我保证它是正确的。” 或者,如果地址正确,他们会将标准化结果放在地址栏中,并显示一个绿色通知:“已验证地址!”
我想我在上面讨论过。 你的查询很好; 这在Nominatim中似乎是一个缺点。
如所建议的,您可以尝试使用LiveAddress。 尝试使用大量的地址来获得更好的想法(仅从一个地址进行比较,我承认,这是一个弱点) - 但到目前为止,为了满足您的需求,LiveAddress介于Google地图和Nominatim。
在评论中回答问题
我在评论中跑出了空间。
问:
这里是另一个导致我们问题的地址“美国加利福尼亚州阿纳海姆山92808 E大炮大道,美国加利福尼亚92808”,甚至“加利福尼亚州92808美国加州大通道大道7580号”似乎不适用于您的网站。
A:
我也对USPS网站和其他一些服务提供商进行了一些研究。 没有返回任何有效的结果或建议。 但是我发现你提交的地址有什么问题:
拼错的街道名称。 没什么大不了的; LiveAddress将此更正为Big Canyon。
主要号码不好。 如果主号码不正确,这里没有多少希望。 计算机或人通常没有办法推断你的真正含义。 在这些情况下,地址将无法通过验证,用户必须提供有效的信息才能继续。 我在7584找到了一个有效的主号码。
总体规划的社区,而不是城市/县。 “阿纳海姆山”是一个主计划社区的名称。 谷歌在其商业列表中发现了它,但这与该地址无关。
“阿纳海姆山”两次。 这令解析器感到困惑。 不幸的是,由于额外的不必要的信息(特别是单行地址),几乎不可能知道它的哪一部分是可疑的。 那第二个“阿纳海姆山”必须去,但第一个可以留下来,它会没事的。
国家信息。 我尝试过您的地址的大多数服务都与前面的国家相混淆,并将其置于“公司/公司名称”字段中。 我们处理美国的地址,所以你可以省略国家。 它也会减少你的请求的大小。
LiveAddress实际上能够验证这些表单中的地址,既可以作为单行地址,也可以分成组件:
7584 E Big Cannon Drive anaheim hills ca 92808
7584 bg cannon 92808
7584 big cannon ave aneheim hills ca
最重要的帮助是找到有效的主号码。 在没有有效地址回来的情况下,你应该提醒用户,并建议修复主号码并确保城市/州(如果有的话)与邮政编码一致(因为如果这两个人打架,这也是不可能的告诉你的意思)。
链接地址: http://www.djcxy.com/p/63615.html上一篇: GeoCoding Issues with OpenStreetMap/Nominatim
下一篇: Get latitude / longitude / Reverse Geocoding without displaying maps