Posted filed under Ruby.

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つの文字列にまとめることができ、緯度経度以外の座標系にも応用できるんじゃないかと思います。

Trackbacks/Pingbacks

  1.  2010/01/17に気になったこと | debeso