ジオハッシュ

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

Geohash(ジオハッシュ)は、Gustavo Niemeyerがgeohash.orgというWebサービスを作成中に発明した経緯度に基づくジオコーディング方法の一つである。パブリックドメインになっている。階層的な空間データ構造であり、空間を分割していくことによって表現する。

ジオハッシュは、任意の精度で表現できる、文字列の末尾を削っていくと徐々に精度が落ちる、といった特徴がある。

そのため、近隣の2地点を表すコードは、似たような文字列から構成されることが多い。同時に、より多くの文字列が一致すれば、当該2点がより近いことを表す。

サービス[編集]

2008年2月にスタートしたgeohash.orgサービスの目的は、地上の地点を特定するための短いURLを提供することにあった。電子メールウェブサイトウェブサイトへの書き込みの際に便利になるからである。

例えば、緯度及び経度の組 57.64911,10.40744 からは u4pruydqqvj というハッシュが導き出され、http://geohash.org/u4pruydqqvj というURLで表現される。

利用例[編集]

ジオハッシュの主な利用目的は、以下のとおりである。

ジオタグへの適用も提案されている。

[編集]

ezs42 というジオハッシュを例にとり、これがどのように経緯度へ復号されるかを説明する。

base32 からの復号[編集]

まず、以下のような変換表を用いて文字列を十進数二進数に変換する。

Base 32 0 1 2 3 4 5 6 7 8 9 b c d e f g
十進数 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
二進数 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 01011 01100 01101 01110 01111
 
Base 32 h j k m n p q r s t u v w x y z
十進数 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
二進数 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111

結果、ezs42は、二進数にて 01101 11111 11000 00100 00010 と表現される。 一番左の 0 から数え始め、かつその0が偶数ビットだとすると、経度は偶数ビット(0111110000000)、緯度は奇数ビット(101111001001)として表現される。

二進数からの復号[編集]

二進数は1ビットずつ、左のビットから順に評価される。 緯度については、 -90 から +90 が2つの区間に分割され、 -90 ~ 0 と 1 ~ +90 となる。1bit目は1なので、より値の高い区間である 1 ~ +90 が該当する。最後のビットについては、区間の中央値が適用される。 経度も同じ考え方である。ただ、最初の区間が -180 ~ +180 の分割から始まることを念頭に置かなくてはならない。

このような処理を経ることによって、概ね緯度は 42.6、経度は -5.6 と求めることができる。

制限[編集]

ジオハッシュのアルゴリズムでは、互いに近傍な点については同じ文字列を共有する性質を利用しようとする際に制限が発生する。赤道または子午線を挟んだ近傍点では共通する文字列は発生しない。これは特異な例であるため、共通する文字列を利用することを妨げるものではない。

ライセンスと特許[編集]

ジオハッシュはその考案者によって2008年2月26日にパブリックドメインとされた。[1]

類似するアルゴリズムは特許化され[2]、著作権で保護されているが[3][4]、ジオハッシュは完全に異なるアルゴリズムとアプローチによるものである。

出典[編集]

  1. ^ geohash.org announcement post in groundspeak.com forum
  2. ^ Compact text encoding of latitude/longitude coordinates - Patent 20050023524
  3. ^ Does Microsoft Infringe the Natural Area Coding System?
  4. ^ The Natural Area Coding System - Legal and Licensing

外部リンク[編集]