Home > ruby > Geohashのアルゴリズム

Geohashのアルゴリズム

Photo by Ludovico Cera

 前回、最後にGeohashのエンコード・デコード方法を解説、とか書いたのですが、私が書く前にyuroyoroさんがブログで解説していました。しっかり解説されているので、ぜひ、そちらをご覧ください。

 Geohashのミソは、座標を2進数にして、それを交互に並べる所にあります。そしてそれをBASE32でエンコードすることで、座標を文字列にして表現しています。
 BASE32は、5ビットで1文字なので、Geohashの長さが奇数の場合は、経度の方がビットが短くなります。 (例: 5文字の場合 全25ビット 緯度が13ビット、経度が12ビット)
 そのため、グリッドの大きさが、Geohashが奇数の場合は縦長、偶数の場合は横長になります。

 ビット列から文字列へのエンコード方法に、BASE32を使っているのは大文字小文字を区別しないためだと思いますが、これを16進数で表したら、もっと細かいグリッドで表現できるのではないかと思い、試してみました。

文字数 BASE32 16進数
緯度 経度 緯度 経度
6 609.08m (15bit) 988.77m (15bit) 4872.66m (12bit) 7910.16m (12bit)
7 152.27m (17bit) 123.60m (18bit) 1218.16m (14bit) 1977.54m (14bit)
8 19.03m (20bit) 30.90m (20bit) 304.54m (16bit) 494.38m (16bit)
9 4.76m (22bit) 3.86m (23bit) 76.14m (18bit) 123.60m (18bit)
10 0.59m (25bit) 0.97m (25bit) 19.03m (20bit) 30.90m (20bit)
11 0.15m (27bit) 0.12m (28bit) 4.76m (22bit) 7.72m (22bit)
12 0.02m (30bit) 0.03m (30bit) 1.19m (24bit) 1.93m (24bit)

 そうしたところ、BASE32では6〜8文字で、600m、150m、19mとなるところ、16進数では7〜9文字で、1200m、305m、76mとなります。この感じだと、グリッドの大きさ的にも、BASE32の方が使いやすいように見えます。

 このアルゴリズムは、2次元の座標を1つの文字列にまとめることができ、緯度経度以外の座標系にも応用できるんじゃないかと思います。

Related posts

masuidrive(増井 雄一郎)
PukiWikiなどのオープンソース活動を経て、2005年からRuby on Railsに的を絞り、WEB2.0社 PingKingやニフティ アバウトミーの開発に関わる。これまでのフリー活動から転身し、2007年は1年だけ会社員として働いた後、起業のため渡米。2008年4月にBig Canvas Inc.設立。現在、米ベルビュー在住。

Comments:0

Comment Form
Remember personal info

Trackbacks:1

Trackback URL for this entry
http://blog.masuidrive.jp/index.php/2010/01/15/geohash-algorithm/trackback/
Listed below are links to weblogs that reference
Geohashのアルゴリズム from @masuidrive blog
pingback from 2010/01/17に気になったこと | debeso 10-01-17 (Sun) 8:05

[...] masuidrive on rails – Geohashのアルゴリズム Geohashのアルゴリズム 説明がわかりやすかった参考にさせてもらう [...]

Home > ruby > Geohashのアルゴリズム

Search
Feeds
Meta

Return to page top