Google ジオコーダーがどのように機能するのか興味があります。
私は、 geocommons の geocoderやPostGIS の新しい Tiger Geocoderなどのオープン ソース ジオコーダの実装について研究しています。これは私がこれまでに知っているおおよそのことです (うまくいけば、私が宿題をしていることを証明するためです):
オープンソースのジオコーダーの中核には、3 つの主要な要素があることを認識しています。
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.-コアアルゴリズムがレーベンシュタイン距離である名前の魔法のファジーマッチングを行うジオコーダー。
良い例は、ウィキペディアの記事からのもので、kitten と siting という単語の間のレーベンシュタイン距離を計算します (距離は 3 です。これは、1 つの文字列を別の文字列に変更するのに必要な編集回数であるためです)。
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 データセットのチャンクをダウンロードしました。
上記の例では、対象のストリート セグメント (Schaeffer Hills Dr) には、 300 で始まるfrom ノード(300 Schaeffer Hills Dr) と400 (400 Schaeffer Hills Drv) で終了するto ノードがあります。この Schaeffer Hills Drv に一致し、要求が 310 番街に対するものだった場合、アルゴリズムはそれを (その 10% をトラバースして) 私の緑色の矢印がある場所に補間します。
これは、オープン ソースのジオコーダー ツールが行うことです。それにもかかわらず、Google は明らかにそれよりも賢く、あらゆる種類の非伝統的なヒントを使用しています。
どうして?
たとえば、680 Mission st (都市、州、郡などは一切入力しない) と入力できます。標準的なアドレス ノーマライザーのほとんどは、あまりにも多くの一致を検出するため、機能しなくなります。しかし、私は SF にいるので、Google は私の IP を使用して geoip のような情報を取得し、あいまい検索でヒントとして境界を拡張し、一致する最も近いセグメントをすぐに見つけて、それが私の答えだと教えてくれると推測しています (どちらが正しい!)。
上記で説明した手法に加えて、Google ジオコーダーがどのように機能するかをさらに明らかにできる回答を探しています。
アップデート:
OK、これまでのところ、2 種類のヒントがリストされています
- ヒントとしての Geoip
- 関心領域境界ボックス (ポールの例を参照)。
- その他?