Google地理编码器如何工作?

rbu*_*hum 15 google-maps geocoding google-geocoder

我很好奇Google地理编码器的工作原理.

我一直在研究开源地理编码器的一些实现,例如geocommons的地理编码器PostGIS的新Tiger Geocoder.这大致是我目前所知的(希望证明我一直在做我的作业):

我意识到,在开源地理编码器的核心,有三个主要元素.

1.-一个地址规范化器,它接受一个任意字符串并对其进行规范化(以此为例):

normalize_address('address string');

e.g.: SELECT naddy.* FROM normalize_address('29645 7th Street SW Federal Way 98023') AS naddy;

 address | predirabbrev |      streetname       | streettypeabbrev | postdirabbrev | internal | location | stateabbrev |  zip  | parsed
 ---------+-------------+-----------------------+------------------+---------------+----------+----------+-------------+-------+--------
 29645 |               | 7th Street SW Federal  | Way              |               |          |          |             | 98023 | 
Run Code Online (Sandbox Code Playgroud)

和:

2.-一个地理编码器,对核心算法为Levenshtein距离的名称进行一些神奇的模糊匹配.

一个很好的例子是维基百科文章中的一个,它计算单词kitten和sitting之间的Levenshtein距离(距离是3,因为这是将一个字符串更改为另一个字符串所需的编辑数):

kitten ? sitten (substitution of 's' for 'k')
sitten ? sittin (substitution of 'i' for 'e')
sittin ? sitting (insertion of 'g' at the end).
Run Code Online (Sandbox Code Playgroud)

3.-在末端对街道段进行一些插值以猜测房屋的位置.我下载了一大堆免费的Census Tiger street数据集来创建这个例子.

街道插值示例

在上面的例子中,感兴趣的街道段(Schaeffer Hills Dr)有一个 300开始的节点(因此300 Schaeffer Hills Dr)和一个结束于400(400 Schaeffer Hills Drv)的节点.如果我匹配这个Schaeffer Hills Drv,并且请求是针对310街道的话,那么算法就会插入它(遍历10%)到我的绿色箭头所在的位置.

这就是开源地理编码器工具的功能.尽管如此,谷歌显然比这更聪明,并使用各种非传统的提示.

怎么会这样?

例如,我可以输入680 Mission st(没有城市,州,县,任何东西).大多数标准地址规范化器会爆炸,因为它们会发现太多匹配.但由于我在SF,我谷歌使用我的IP获取一些类似地理信息的信息,做一些扩展边界作为一些模糊搜索的提示,并立即找到最匹配的段匹配并告诉我这是我的答案(哪个是对的!).

我正在寻找能够更好地了解Google地理编码器如何工作的答案,除了上面介绍的技术.

更新:

好的,到目前为止我们列出了两种提示

  • Geoip作为提示
  • 感兴趣区域边界框(见保罗的例子).
  • 其他?

小智 6

你可以通过在黑匣子上找到的东西之一就是谷歌地理编码器对令牌的顺序并不完全敏感(没有强制执行的街道/城市/州/国家的期望,尽管当你关注时它会做得更好那).对我说,他们可能会把所有东西都倾倒到某种全文搜索中,然后看看会有什么回来.或许不是.尝试搜索"sault saint marie adams 200"和"sault saint marie 200 adams".

关于你的Mission示例,这是一个很棒的例子,因为你可以看到地图提示直接发挥作用:

查询欧洲地图窗口:欧洲结果.

查询欧洲地图窗口:欧洲结果

查询北美地图窗口:美国结果.

查询北美地图窗口:美国结果