我很好奇 Google 地理编码器的工作原理。
我一直在研究一些开源地理编码器的实现,比如geocommons 的 geocoder或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 |
和:
2.- 一个地理编码器,它对核心算法是Levenshtein Distance的名称进行一些神奇的模糊匹配。
一个很好的例子是维基百科文章中的一个,它计算了单词 kitten 和 sit 之间的 Levenshtein 距离(距离为 3,因为这是将一个字符串更改为另一个字符串所需的编辑次数):
kitten → sitten (substitution of 's' for 'k')
sitten → sittin (substitution of 'i' for 'e')
sittin → sitting (insertion of 'g' at the end).
3.- 在最后对街道段进行一些插值,以猜测房子在哪里。我下载了一大块免费的Census Tiger 街道数据集来创建这个示例。
在上面的示例中,感兴趣的街道段 (Schaeffer Hills Dr) 有一个从 300 开始的from 节点(所以 300 Schaeffer Hills Dr)和一个在 400 结束的to 节点(400 Schaeffer Hills Drv)。如果我匹配到这个 Schaeffer Hills Drv,并且请求是针对 310 号街道,那么算法只会将其插入(遍历其中的 10%)到我的绿色箭头所在的位置。
这就是开源地理编码器工具的作用。尽管如此,谷歌显然比这更聪明,并使用各种非传统的提示。
怎么会这样?
例如,我可以输入680 Mission st(没有城市、州、县,什么都没有)。大多数标准地址规范器会因为找到太多匹配项而崩溃。但是因为我在旧金山,我猜谷歌使用我的 ip 来获取一些类似 geoip 的信息,通过一些模糊搜索做一些扩展边界作为提示,然后立即找到匹配的最接近的段并告诉我这是我的答案(哪个是对的!)。
除了我上面描述的技术之外,我正在寻找可以更清楚地了解 Google 地理编码器如何工作的答案。
更新:
好的,到目前为止,我们列出了两种提示
- Geoip 作为提示
- 感兴趣区域边界框(参见 Paul 的示例)。
- 其他的?