使用OpenStreetMap/Nominatim时的地理编码问题

10

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

由于谷歌/必应/雅虎太昂贵了,所以我们选择了OpenStreetMap/Nominatim。

不幸的是,虽然在测试期间它表现得还可以,但它无法找到大约50%输入的地址,这是一个很大的问题。

我有三个问题想要知道:

  1. 如果客户确实输入了错误的地址,应该如何处理呢?发送电子邮件并要求他们更正?按地址段使用直到找到正确的地址?

  2. 如果地址正确但我无法在OpenStreetMap上找到,该怎么办?或者我的Nominatim查询有误吗?

  3. 如果OpenStreetMap不能胜任,是否有免费/便宜的替代方案?我知道它是一个开源协作项目,因此不完整,但我认为它覆盖范围相当广泛,并且如果没有准确的位置,它会返回附近的位置 - 可能它确实如此,也可能是我使用方法错误。

以下是一个例子:

182 livington ave,albany,New York,12210,US

谷歌地图可以轻松找到,但 Nominatim 找不到:http://nominatim.openstreetmap.org/search?format=xml&addressdetails=0&q=182%20livington%20ave,albany,New%20York,12210,US

1个回答

17
我认为你需要的是地址验证。Google、Nominatim和其他类似工具只能进行地址近似,在你不确定地址时能够找到地址,但结果仅供参考。
我帮助开发了一个API,根据严格的CASS™要求验证和地理编码地址,名为LiveAddress。我已经使用Google、Nominatim和LiveAddress API运行了你的样本地址,并获得了以下结果:
Google发现了"Livingston"的错别字地址,但无法保证其有效性,称为“地址是近似的”,但对于您尝试的每个地址都会这样说。
由于拼写错误,Nominatim找不到它。也许使用Nominatim的缺点之一是它不会尝试补偿拼写错误,验证地址的准确性或完整性等。修正拼写错误返回了一些信息,但任何人都无法猜测需要修复什么以及查询为什么失败。
由于拼写错误,LiveAddress无法识别输入的地址。由于有名为“Livington”的街道,缺少“Livingston”中的“s”非常明显,使查询存在歧义,并且结果与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. 这要看情况。您的客户是在网站表单上输入地址吗?在他们继续之前,立即告诉他们该地址无效。SmartyStreets有一个jQuery插件,在网站表单上验证地址(只需复制并粘贴)。当输入地址时,它会自动验证。如果地址错误,他们会弹出通知询问用户是否想修复它。有时地址不明确,会返回几个有效结果。(尝试:“100,纽约,NY”) - 他们会显示几个建议,您可以选择其中一个。您修复它后,表单将不提交,直到用户获得有效地址或说“仍使用我的地址;我保证它是正确的。” 或者,如果地址正确,他们会将标准化的结果放入地址字段中,并显示绿色提示:“地址已验证!”

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

  3. 如建议的那样,您可以尝试LiveAddress。尝试使用大量地址来获得更好的了解(仅从一个地址进行比较是一个弱指示) - 但到目前为止,对于您的需求,LiveAddress介于Google Maps和Nominatim之间。


对评论中的问题的回答

评论区已经没有足够的空间了。

问:

这是另一个导致我们问题的地址“7580 E Big Cannon Drive,Anaheim Hills,Anaheim Hills,California,92808,US”,即使“7580 E Big Cannon Drive,California,92808,US”也似乎在您的网站上无法使用。

答:

我在USPS网站和其他一些服务提供商上进行了一些研究,但都没有返回任何有效的结果或建议。但我找出了您提交的地址存在的问题所在:

  • 拼写错误的街道名称。 没关系;LiveAddress已将其更正为Big Canyon。

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

  • 总体规划社区,而不是城市/县。 "Anaheim Hills"是一个总体规划社区的名称。谷歌在其商业列表中找到了它,但这与地址无关。

  • 两次出现"Anaheim Hills"。 它让解析器感到困惑。不幸的是,在额外的不必要信息(特别是在单行地址中)中,几乎不可能确定哪一部分是可疑的。第二个"Anaheim Hills"必须消失,但第一个可以保留,它会很好地工作。

  • 国家信息。 我尝试过的大多数服务都因前面的国家而感到困惑,并将其放在“公司/企业名称”字段中。我们处理美国地址,因此您可以省略该国家信息。这也将减少您的请求大小。

LiveAddress能够验证这些表格中的地址,无论是单行地址还是拆分成组件。
7584 E Big Cannon Drive anaheim hills ca 92808
7584 bg cannon 92808
7584 big cannon ave aneheim hills ca

最重要的帮助是找到一个有效的主要号码。如果没有返回有效地址,您应该警告用户并建议修复主要号码,并确保城市/州(如果给定)与邮政编码对齐(因为如果这两个在互相斗争,也不可能知道你的意思)。

2
谢谢Matt,我正准备给你们的支持邮箱发送邮件,这里有另一个地址引起了我们的问题:“7580 E Big Cannon Drive,Anaheim Hills,Anaheim Hills,California,92808,US”,即使是“7580 E Big Cannon Drive,California,92808,US”也似乎无法在你们的网站上使用。 - Dale K
1
@DaleBurrell 不错的发现。我在这个评论中已经没有足够的空间了,所以我扩展了我的帖子,包括对你的问题的回答。 - Matt
1
再次感谢你,马特。我想象中,在新房产建成时可能存在一个窗口期,在这个期间该房产的地址尚未完全在所有相关机构注册。我会将问题保持开放一段时间,以便看看其他人对如何最好处理这种情况有什么意见。在你提供的所有出色帮助之后,我一定会记住你的产品。 - Dale K
@DaleBurrell 当然可以;希望你能找到适合的解决方案。我很想知道你最终实现了什么。 - Matt
2
好的,就目前而言,我的做法是继续使用Nominatim,尝试对完整地址进行地理编码,如果失败,则尝试对街道地址和邮政编码进行地理编码,如果仍然失败,则尝试仅对邮政编码进行地理编码。如果它们都失败了,它会发邮件给我。这是短期的解决方案,我期望在网站变得足够受欢迎以需要更好的地址有效性水平时,将采用您的一些想法和可能的产品。再次感谢您的帮助,非常感激。 - Dale K
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接