10

我有一个网站需要获取客户输入的地址的纬度和经度。

Google/Bing/Yahoo 对我们来说太贵了,所以我们选择了 OpenStreetMap/Nominatim。

不幸的是,虽然它在测试期间运行良好,但它未能找到大约 50% 的输入地址,这是一个大问题。

我有兴趣知道三件事:

  1. 处理客户确实输入了错误地址的情况的最佳方法是什么 - 向他们发送电子邮件并要求他们更正?使用地址段直到找到东西?

  2. 处理地址很好但我无法使用 OpenStreetMap 找到它的情况的最佳方法是什么?还是我对 Nominatim 的查询做错了什么?

  3. 如果 OpenStreetMap 不能胜任这项任务,有谁知道免费/便宜的替代方案?我知道它是一个开源协作,因此不完整,但我认为它确实有很好的覆盖范围,如果它没有确切的位置,它会返回附近的位置 - 也许它确实,也许我正在使用它错误的。

这是一个例子:

182 livington ave,奥尔巴尼,纽约,12210,US

谷歌地图很容易找到。Nominatim 一无所获:http ://nominatim.openstreetmap.org/search?format=xml&addressdetails=0&q=182%20livington%20ave,albany,New%20York,12210,US

4

1 回答 1

17

我认为您正在寻找的是地址验证。Google、Nominatim 和其他公司仅在您不确定地址是什么时才执行地址近似,这有助于查找地址,但结果只是最佳猜测。

我帮助开发了一个 API,它根据称为 LiveAddress 的严格 CASS™ 要求验证和地理编码地址。我通过 Google、Nominatim 和 LiveAddress API 运行了您的示例地址,结果如下:

  • 尽管“利文斯顿”中有错字,但谷歌还是找到了地址,但无法保证其有效性,称“地址是近似的”。- 再一次,它说几乎每个你尝试的地址。

  • Nominatim 因为错字而没有找到它。也许使用 Nominatim 的一个缺点是它不会尝试补偿拼写错误、验证地址的准确性或完整性等。修复拼写错误会返回一些信息,但任何人都可以猜测必须修复什么以及查询失败的原因反正。

  • 由于拼写错误,LiveAddress 无法识别输入的地址。缺少“Livingston”中的“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 精度是(当前)最精确的地理编码级别 - 精确到块(或更接近)级别。

因此,在回答您的问题时:

  1. 那要看。您的客户是否在网站表单上输入地址?在他们继续之前立即告诉他们该地址无效。我们正在开发一个 jQuery 插件,以使每个人都可以轻松地进行剪切和粘贴,但在那之前,您可以在我们的结帐表单中看到我们的概念,它实现了一个漂亮的系统: SmartyStreets 有一个jQuery 插件,可以验证网站上的地址形式(只是复制和粘贴)。输入地址时,会自动验证。如果错误,他们会向上滑动通知,询问用户是否要修复它。有时他们的地址是不明确的,它会返回一些有效的结果。(试试:“100, new york, ny”)——他们给出了一些建议,你可以选择一个。您修复它,直到用户获得有效地址或说“无论如何使用我的;我保证它是正确的”,表单才会提交。或者,如果地址正确,他们将标准化结果放入地址字段并显示绿色通知:“地址已验证!”

  2. 我想我在上面讨论过这个。您的查询很好;这似乎是 Nominatim 的一个缺点。

  3. 如建议的那样,您可以尝试 LiveAddress。尝试使用大量地址以获得更好的主意(我承认,仅与一个地址相比,这是一个微弱的迹象)-但到目前为止,根据您的需要,LiveAddress 似乎介于 Google 地图和提名。


在评论中回答问题

我在评论中用完了空间。

问:

这是另一个导致我们出现问题的地址“7580 E Big Cannon Drive,Anaheim Hills,Anaheim Hills,California,92808,US”甚至“7580 E Big Cannon Drive,California,92808,US”似乎不适用于您的网站。

A:

我也对 USPS 网站和其他一些服务提供商进行了一些研究。没有返回任何有效的结果或建议。但是我发现您提交的地址有什么问题:

  • 拼写错误的街道名称。没什么大不了的;LiveAddress 将其更正为 Big Can y on。

  • 主号码错误。 如果主号码不正确,这里就没有太大希望了。计算机或人类通常无法推断出您的真正意思。在这些情况下,地址将无法验证,用户必须提供有效的内容才能继续。我在 7584 找到了一个有效的主号码。

  • 总体规划的社区,而不是市/县。“阿纳海姆山”是一个总体规划社区的名称。谷歌在其商业列表中找到了它,但这与地址无关。

  • “阿纳海姆山”两次。这使解析器感到困惑。不幸的是,有了额外的不必要信息(尤其是在单行地址中),几乎不可能分辨出其中的哪一部分是可疑的。第二个“阿纳海姆山”必须离开,但第一个可以留下来,一切都会好起来的。

  • 国家信息。我尝试过您的地址的大多数服务都与前面的国家/地区混淆,并将其放在“公司/公司名称”字段中。我们处理美国地址,因此您可以省略国家/地区。它也会减少您的请求的大小。

LiveAddress 实际上能够验证这些表单中的地址,既可以作为单行地址,也可以拆分为组件:

7584 E Big Cannon Drive anaheim hills ca 92808
7584 bg cannon 92808
7584 big cannon ave aneheim hills ca

最重要的帮助是找到一个有效的主号码。在没有返回有效地址的情况下,您应该提醒用户并建议修复主号码并确保城市/州(如果给出)与邮政编码一致(因为如果这两个发生争执,也不可能说出你的意思)。

于 2012-07-10T00:41:39.540 回答