ジオハッシュ

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

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

そのため、近隣の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日にパブリックドメインとされた。geohash.org announcement post in groundspeak.com forum

類似するアルゴリズムは特許化されCompact text encoding of latitude/longitude coordinates - Patent 20050023524、著作権で保護されているがDoes Microsoft Infringe the Natural Area Coding System?The Natural Area Coding System - Legal and Licensing、ジオハッシュは完全に異なるアルゴリズムとアプローチによるものである。

 出典 

 外部リンク 
 geohash.org
 Perl module to interact with geohash.org
 Java classes for encoding and decoding Geohashes without interacting with geohash.org
  Java library for encoding and decoding Geohashes without interacting with geohash.org and find the adjacent
 Another implementation of Geohash in Java containing quite some more features
 Javascript module for encoding and decoding geohashes without interacting with geohash.org and Demo
 MySQL Function for encoding and decoding geohash
PostGIS function that returns a geohash representation of a geometry
 Ruby gem for encoding and decoding geohashes without interacting with geohash.org
 Perl module for encoding and decoding geohashes without interacting with geohash.org
 PHP class for encoding and decoding geohashes without interacting with geohash.org
 Python module for encoding and decoding geohashes without interacting with geohash.org
 Haskell library for encoding and decoding geohashes without interacting with geohash.org
 C library for encoding and decoding geohashes without interacting with geohash.org
 Go package for encoding / decoding geohashes to UTM or lat / long
 Objective-C library for encoding and decoding geohashes without interacting with geohash.org
 Ocaml module for encoding and decoding geohashes without interacting with geohash.org
 Proposal for a similar encoding and associated 'geo' URL scheme
 http://loc.is - a geohash designed for analytics.
 kml file for Google Earth displaying geohash grid
 ngeohash, nodejs module for encoding and decoding geohash
 geoplace.it: a free service to reference positions using an approach different than geohash.org and with a more accurate service
 A geohash implementation in pure ruby (~50 sloc)
 Area Check Tool

Category:ジオコード
Category:地理技術
Category:GIS
Category:デジタル技術