匹配数据库的邮件地址

时间:2013-12-19 00:13:10

标签: google-maps google-geocoder

我正在设计一个网络应用程序(使用谷歌地图),允许用户在我的数据库中搜索住宅邮政地址。

也就是说,用户会提供地址,我会存储它们;之后,其他用户将输入一个地址,以查看该地址是否在我的数据库中。

但众所周知,地址难以正常化;我无法弄清楚如何最好地存储/查询它们。 (特别是因为Google的Geocoder不允许我存储地理编码器的结果。)

最好的方法是什么?

3 个答案:

答案 0 :(得分:1)

这是我考虑过的:

1)在输入上对地址进行地理编码,存储lat / long。当用户进行搜索时,对地址进行地理编码并比较纬度/经度以查看我的数据库中是否具有该确切的纬度/经度。

但是这有问题。

  • 存储Google Geocoder的结果违反了他们的使用条款。
  • 这是有充分理由的;谷歌不断更新他们的地理编码,因此给定地址的纬度/经度可能随时间而变化。
  • 我将对浮点数进行精确比较,这可能不准确。
  • 楼内的多间公寓怎么样?它们都具有相同的纬度/长度,但它们的地址不同。

2)在输入上对地址进行地址编码,但不存储lat / long;存储地址组件,并进行比较。

这似乎更好,但仍有问题:

  • 仍违反Geocoder的使用条款?
  • ...因为Google可能会改变其结果。也许地址组件不太可能发生变化,但是当人们向Google报告数据错误时,它们仍然可能会发生变化。 (当然至少邮政编码可以改变。)

3)对地址进行地理编码,存储纬度/经度,但不要精确搜索纬度/经度。在结果点周围的小半径内搜索,寻找可能的匹配。通过地址组件比较那些可能的匹配。

这可能是最好的答案,但它仍然违反了Google的Geocoder使用条款。

4)在输入上对地址进行地理编码,获取地址组件,但只是使用它们在数据库中存储已解析的规范化邮政地址。

添加一些手动代码,将规范化地址拆分为更小的字段(街道名称,街道类型,前缀,后缀......)当用户运行搜索时,运行相同的规范化代码,然后按字段搜索。

我想这可行,但滚动我自己的地址解析器似乎是一个痛苦的秘诀。似乎它不可能是正确的。 (我不能成为第一个需要解决这个问题的人,可以吗?)

答案 1 :(得分:1)

这是一个可以通过lat-long解决的问题(对于快速的2-D最近邻居使用R-trees!在MongoDB中作为标准配置,但在其他人中也可以使用其他的)

还有文本匹配,如下所述:SO:  What are ways to match street addresses in SQL Server?

似乎还有第三方产品可用:SO:I need an address matching algorithm

如果你想要结合这两种方法,那就找一下“数据融合”一词,这是一个完全不同的方法集合,它们基本上对更确定的答案给予更高的权重,并将最终答案建立在聚合的确定性上

一些Harward Design GIS项目研究的描述也可能会引起关注:http://www.gsd.harvard.edu/gis/manual/geocoding/

世界上所有城市的列表都有相应的坐标:http://www.maxmind.com/en/worldcities

答案 2 :(得分:0)

您可以使用geocoder.us来补充或替换您对Google地理编码器的使用。它解析出地址组件做得很好;这可能有助于规范化。还有一个newer version可能值得一看,看看它是如何运作的。