google-maps - Google 地理编码器如何工作?

标签 google-maps geocoding google-geocoder

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

我一直在研究一些开源地理编码器的实现,比如 geocommons' geocoderPostGIS's new Tiger Geocoder .到目前为止,这大致是我所知道的(希望证明我一直在做功课):

我意识到开源地理编码器的核心包含三个主要元素。

1.- 安 地址规范器 接受任意字符串并将其标准化( taking the example from here ):

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 和 sat 之间的 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 street dataset创建此示例。

street interpolation example

在上面的示例中,感兴趣的街道段 (Schaeffer Hills Dr) 具有从 300 开始的 from 节点(因此是 300 Schaeffer Hills Dr)和一个以 400 结束的 to 节点(400 Schaeffer Hills Drv)。如果我匹配到这个 Schaeffer Hills Drv,并且请求是针对 310 号街道,那么算法将只是 interpolate到它(遍历它的 10%)到我的绿色箭头所在的位置。

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

为何如此?

例如,我可以输入 680 Mission st (没有城市,州,县,任何东西)。大多数标准地址规范器会因为找到太多匹配而崩溃。但是因为我在SF,所以我是猜测 google 使用我的 ip 获取一些 geoip-like information , 做 some expanding bounding作为一些模糊搜索的提示,并立即找到最接近的匹配段并告诉我这是我的答案(这是正确的!)。

除了我上面描述的技术之外,我正在寻找可以更深入地了解 Google 地理编码器如何工作的答案。

更新:

OK,到目前为止我们列出了两种提示
  • Geoip 作为提示
  • 兴趣区边界框(见保罗的例子)。
  • 其他的?
  • 最佳答案

    您可以通过戳黑匣子找到的一件事是,Google 地理编码器对 token 的顺序并不完全敏感(没有强制执行的街道/城市/州/国家/地区期望,尽管当您遵循时它会做得更好那)。这对我说,他们可能会将所有内容转储到某种全文搜索中,然后查看返回的内容。或者也许不是。尝试搜索“sault Saint marie adams 200”和“sault Saint marie 200 adams”。

    关于您的任务示例,这是一个很好的示例,因为您可以看到 map 提示直接发挥作用:

    Query with map window over Europe: European results.

    使用欧洲 map 窗口查询:欧洲结果

    Query with map window over North America: American results.

    使用北美 map 窗口查询:美国结果

    关于google-maps - Google 地理编码器如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10991330/

    相关文章:

    javascript - 调用js函数然后post到mysql的提交按钮

    java - 在 Java 中使用 map API 时陷入反向地理编码

    google-geocoder - Google地理编码API-仅在一个国家/地区搜索

    google-maps - 是否可以将 map 中可拖动标记的纬度和经度(使用 javascript)获取到 HTML 表单中?

    google-maps - 如何使用谷歌地图顺利地为标记制作动画?

    android - 无法在 Android 谷歌地图中获取 addMarker 上的 fragment 搜索列表

    javascript - 刷新 Google Maps API V3 图层

    android - 确定点是否在多边形中

    python - 地理编码库

    javascript - Google Maps API Geocoder 不按 placeId 返回位置