ジオハッシュ

**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 からの復号
まず、以下のような変換表を用いて文字列を十進数、二進数に変換する。

結果、**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
* Perl module to interact with geohash.org
* Java classes for encoding and decoding Geohashes without interacting with geohash.org
* https://sourceforge.net/projects/jgeohash/files/1.3.8/ 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