我正在设计一个网络应用程序(使用谷歌地图),允许用户在我的数据库中搜索住宅邮政地址。
也就是说,用户会提供地址,我会存储它们;之后,其他用户将输入一个地址,以查看该地址是否在我的数据库中。
但众所周知,地址难以正常化;我无法弄清楚如何最好地存储/查询它们。 (特别是因为Google的Geocoder不允许我存储地理编码器的结果。)
最好的方法是什么?
答案 0 :(得分:1)
这是我考虑过的:
1)在输入上对地址进行地理编码,存储lat / long。当用户进行搜索时,对地址进行地理编码并比较纬度/经度以查看我的数据库中是否具有该确切的纬度/经度。
但是这有问题。
2)在输入上对地址进行地址编码,但不存储lat / long;存储地址组件,并进行比较。
这似乎更好,但仍有问题:
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可能值得一看,看看它是如何运作的。