我有一个网站,该网站需要获取客户输入地址的纬度和经度。
Google / Bing / Yahoo对我们来说太贵了,所以我们选择了OpenStreetMap / Nominatim。
不幸的是,尽管它在测试期间可以正常工作,但是却找不到输入的地址的50%,这是一个大问题。
我感兴趣的三件事是:
1)处理客户确实输入错误地址的情况的最佳方法是什么-向他们发送电子邮件并要求他们更正?使用地址的各个部分,直到找到东西为止?
2)处理地址可以但我无法通过OpenStreetMap找到它的最佳方法是什么?还是我对Nominatim的查询做错了什么?
3)如果OpenStreetMap无法胜任这项任务,有人知道免费/便宜的选择吗?我知道它是开放源代码的合作,因此尚不完善,但是我认为它的覆盖范围非常好,如果没有确切的位置,它将返回附近的位置-也许有,也许我正在使用它错误。
例如:“ 182 Livington ave,albany,New York,12210,US”
Google地图发现这很容易。
命题什么都没找到:http://nominatim.openstreetmap.org/search?format=xml&addressdetails=0&q=182%20livington%20ave,albany,New%20York,12210,US
最佳答案
我认为您正在寻找的是地址验证。 Google,Nominatim和其他公司仅执行地址近似,当您不确定地址是什么时,这对查找地址很有用,但结果只是最佳猜测。
我帮助开发了一个API,该API根据称为LiveAddress的严格CASS™要求对地址进行验证和地理编码。我通过Google,Nominatim和LiveAddress API运行了您的示例地址,结果如下:
尽管在“利文斯顿”中有错字,但Google仍找到了该地址,但不能保证其有效性,而是说“地址为近似值”。 -再说一遍,它表示您尝试输入的几乎每个地址。
由于拼写错误,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插件,以使每个人都可以轻松地进行剪切和粘贴,但是在此之前,您可以在我们的结帐表单中看到我们的概念,该表单实现了一个漂亮的系统:SmartyStreets具有jQuery Plugin which verifies addresses on website forms(只需复制-和粘贴)。输入地址后,将自动对其进行验证。如果有误,他们会向上滑动通知,询问用户是否要修复它。有时,他们的地址不明确,会返回一些有效结果。 (尝试:“ 100,纽约,纽约”)-他们显示了一些建议,您可以选择一个。您对其进行了修复,直到用户获得有效地址或说“无论如何都使用我的;我保证是正确的”,该表单才提交。或者,如果地址正确,则将标准化结果放在地址字段中并显示绿色通知:“地址已验证!”
我想我在上面讨论了这一点。您的查询很好;在Nominatim中似乎是一个缺点。
根据建议,您可以尝试使用LiveAddress。尝试使用大量地址来获得更好的主意(我承认,仅从一个地址开始比较,这是一个较弱的表示),但到目前为止,就您的需求而言,LiveAddress似乎介于Google Maps和名义上。
在评论中回答问题
我的评论用完了。
问:
这是导致我们出现问题的另一个地址,“ 7580 E大炮驱动器,加利福尼亚州,阿纳海姆山,92808,美国”甚至“ 7580 E大炮驱动器,加利福尼亚州,92808,美国”似乎与您的网站不兼容。
A:
我在USPS网站和其他一些服务提供商上进行了一些研究。没有人返回任何有效的结果或建议。但是我发现您提交地址时出了什么问题:
街道名称拼写错误。没什么大不了的; LiveAddress将其更正为Big Canyon。
主号码错误。 There's not much hope here if the primary number is incorrect。通常,计算机或人无法推断出您的真实意思。在这种情况下,地址将无法通过验证,用户必须提供有效的内容才能继续。我在7584找到了一个有效的主号码。
总体规划的社区,而不是城市/县。 “阿纳海姆山庄”是总体规划社区的名称。 Google在其业务列表中找到了它,但这与地址无关。
“阿纳海姆山庄”两次。这使解析器感到困惑。不幸的是,有了多余的信息(尤其是在单行地址中),几乎无法分辨出其中哪一部分是可疑的。第二个“阿纳海姆山丘”必须走,但第一个可以留下来,那就很好。
国家信息。我尝试使用您的地址的大多数服务都与前面的国家/地区混淆,并将其放在“公司/公司名称”字段中。我们处理美国地址,因此您可以忽略该国家。它也会减少您的请求的大小。
LiveAddress实际上能够以以下形式验证地址,既可以作为单行地址,也可以分为以下部分:
7584 E Big Cannon Drive anaheim hills ca 92808
7584 bg cannon 92808
7584 big cannon ave aneheim hills ca
最重要的帮助是找到一个有效的主号码。如果没有有效的地址返回,您应该提醒用户并建议固定主号码,并确保城市/州(如果提供)与邮政编码对齐(“因为这两个在吵架,所以也无法说出你的意思)。
关于geocoding - OpenStreetMap/Nominatim的地理编码问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11404735/