OpenStreetMap / Nominatim的GeoCoding问题

时间:2012-07-09 23:35:19

标签: geocoding openstreetmap nominatim

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

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

不幸的是,虽然它在测试过程中运行良好,却无法找到大约50%的地址输入,这是一个大问题。

我有兴趣知道3件事:

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

2)处理地址正常的情况的最佳方法是什么,但我无法通过OpenStreetMap找到它?或者我对Nominatim的查询做错了什么?

3)如果OpenStreeMap无法完成任务,有没有人知道免费/廉价的替代方案?我知道它是一个开源协作,因此不完整,但我认为它确实有很好的覆盖率,并且它会返回附近的位置,如果它没有确切的位置 - 也许它确实,也许我正在使用它错。

以下是一个例子:“182 livington ave,albany,New York,12210,US”

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

1 个答案:

答案 0 :(得分:14)

我认为您正在寻找的是地址验证。谷歌,Nominatim和其他人只执行地址近似,当你不确定它们是什么时,这有利于查找地址,但结果只是最佳猜测。

我帮助开发了一个API,它根据严格的CASS™要求(称为LiveAddress)验证地址并对地址进行地理编码。我通过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精度是最精确的地理编码级别(当前) - 准确阻止(或更接近)级别。

所以,回答你的问题:

  1. 这取决于。您的客户是否在网站表单上输入了地址?在他们继续之前马上告诉他们,地址不是有效的。 我们正在开发一个jQuery插件,让每个人都能轻松完成剪切和粘贴,但在此之前,您可以在我们的结帐表单中看到我们的概念,它实现了一个非常漂亮的系统: SmartyStreets有一个jQuery Plugin which verifies addresses on website forms(只是复制粘贴)。输入地址后,会自动验证。如果错误,他们会向用户上下通知,询问用户是否要修复此问题。有时他们的地址不明确,返回一些有效的结果。 (尝试:" 100,纽约,纽约和#34;) - 他们会提出一些建议,你可以选择一个。您修复它并且表单不会提交,直到用户获得有效地址或说“#34;无论如何使用我的;我保证这是对的。"或者,如果地址正确,他们会将标准化结果放在地址字段中并显示绿色通知:"地址已验证!"

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

  3. 根据建议,您可以尝试LiveAddress。尝试使用大量地址来获得更好的想法(仅从一个地址进行比较,我承认,这是一个微弱的指示) - 但到目前为止,看来,根据您的需要,LiveAddress位于Google之间地图和Nominatim。


  4. 回答评论中的问题

    我在评论中跑出了房间。

    问:

      

    这是另一个导致我们出现问题的地址" 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。

    • 主要号码错误。 There's not much hope here if the primary number is incorrect。计算机或人类通常无法推断出你的真正含义。在这些情况下,地址将无法验证,用户必须提供某些有效的内容才能继续。我在7584找到了有效的主号码。

    • 总体规划的社区,而非城市/县。" Anaheim Hills"是主计划社区的名称。 Google在其商家信息中找到了它,但这与该地址无关。

    • " Anaheim Hills"两次。这让解析器感到困惑。不幸的是,由于有额外的不必要信息(特别是在单行地址中),几乎不可能分辨出它的哪些部分是可疑的。那第二个"阿纳海姆山"必须去,但第一个可以留下,它会没事的。

    • 国家/地区信息。我尝试过您的地址的大部分服务都与前面的国家混淆,并将其放入"公司/公司名称"领域。我们处理美国地址,因此您可以省略该国家/地区。它也会减少您的请求的大小。

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

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

    最重要的帮助是找到有效的主号码。在没有有效地址返回的情况下,您应该提醒用户并建议修复主号码并确保城市/州(如果给定)与邮政编码一致(如果这两个人正在战斗,那么' #39;也不可能说出你的意思。)