Nominatimのように、住所を入力として受け取り、緯度と経度、または複数の一致の場合は緯度と経度を吐き出す Python スクリプトを作成しようとしています。
したがって、可能な入力と出力は次のようになります。
- In:米国ニューヨーク=> Out:ニューヨーク (lat:x1 lon:y1)
- In:ニューヨーク=> Out:ニューヨーク (lat:x1 lon:y1)
- In:米国ニューヨーク州パール ストリート=> Out:パール ストリート (lat:x2 lon:y2)
- In:パール ストリート、アメリカ=> Out:パール ストリート (lat:x2 lon:y2)、パール ストリート (lat:x3 lon:y3)
- イン:パール ストリート=> アウト:パール ストリート (lat:x2 lon:y2)、パール ストリート (lat:x3 lon:y3)
- In: 103 Alkazam, New York, USA => Out:ニューヨーク (lat:x1 lon:y1)
上記の 6 では、 address の場所が見つからなかったため New York が返されまし103 Alkazam, New York, USA
たが、少なくとも は見つかりNew York, USA
ました。
最初は、兄弟がアルファベット順にソートされる階層関係を表すツリーを構築することを考えました。それは次のようだったかもしれません:-
GLOBAL
|
---------------------------------------------
| | ...
USA
---------------
| | ...
CALIFORNIA NEW YORK
| |
----------- -------------
| |.. | |....
PEARL STREET PEARL STREET
しかし問題は、ユーザーが 2、4、5 のように不完全な住所を提供できることでした。
そこで、次に検索ツリーを使用して、各ノードに完全修飾アドレスを格納することを考えました。しかし、これもかなり悪いです:-
- これにより、各ノードに冗長性の高いデータが保存されます。これは非常に大きなデータになるため、スペースの節約が重要です。
- ユーザーが検索スペースを絞り込んだという事実を活用することはできません。
追加の要件が 1 つあります。スペルミスを検出する必要があります。これは別の問題として扱う必要があり、各ノードを一般的な文字列として扱うことができると思います。
更新 1
少し詳しく説明します。入力はリストで、低いインデックスの項目は高いインデックスの項目の親です。もちろん、それらは直接の親または子である場合もあれば、そうでない場合もあります。したがって、クエリ 1 の場合、入力は になります["USA", "NEW YORK"]
。したがって、USA, New York
結果が返されなくてもまったく問題ありません。
ユーザーが住所を知っていて、私たちのデータが非常に詳細であれば、ユーザーは建物を見つけることができるはずです。
更新 2 (省略ケース)
ユーザーが をクエリPearl Street, USA
した場合、アルゴPearl Street
はNew York
を親として認識しておりUSA
、その親であるため、アドレスを特定できるはずです。
更新 3 (サープラス ケース)
ユーザーが を照会するとします101 C, Alley A, Pearl Street, New York
。また、データが を知っているが101 C
、 については知らないとしAlley A
ます。それによると101 C
、 の直接の子ですPearl Street
。この場合でも、アドレスを特定できるはずです。