ジオハッシュによる逆ジオコーディングで最寄りの街区が検索されない理由

上の画像の例のように,青の位置情報(北緯35.694641 東経139.691221)から,街区レベルの住所を検索したい場合,結果は緑で示した西新宿6丁目9番が得られるべきですが,前回作成した関数では,赤で示した西新宿8丁目11番が得られてしまいます。
このような誤差が出る理由を知るため,順を追ってみていくことにします。

求めたい位置情報のジオハッシュが xn774f00377g で,これと最も近い位置のジオハッシュを変換テーブルから探すことになります。ジオハッシュを昇順で並べた変換テーブルをMATCH関数で探すと,xn774f00377g を越えないジオハッシュ xn774ezvv4nq が見つかります。xn774までは共通ですが,次のf0を越えないものはezです。一方,その次の行は xn774f0cu8jg です。前回考えたアルゴリズムでは,これらのいずれか2点について距離計算し,近い方を採用しているので,xn774f0cu8jg の方が採用されます。(ちなみにxn774ezvv4nqは北新宿4−5とかなり離れていますが,xn774f0cu8jgは西新宿8−11とこちらの方が近くなります。)
error2
しかしながら最も近い街区と思われる西新宿6−9のジオハッシュはxn774cbpとなり,単なるハッシュ文字列として比較した場合はxn774f00とは離れた値となってしまいます。

この図で分かるようにジオハッシュ7桁xn774f0の中を32分割した8桁のジオハッシュのうち,端の方にあるxn774f00の最寄りの街区は,隣の7桁のジオハッシュxn774cbの中で隣接するxn774cbpにありますが,このようなケースで精度を上げるには,以下のようなアルゴリズムを追加する必要があり,大変な手間となりそうです…

  • ある程度の桁数まで同じジオハッシュとなる街区を探す
  • その回りの8グリッドを含めた9グリッドを候補とする
  • それら9グリッドに含まれる街区のジオハッシュをすべて検索する
  • それらを距離計算し,最も近いものを求める街区とする

ジオハッシュのグリッドの位置関係が分かりやすい画像を海外サイトで見つけたのでリンクしておきます。

関連記事