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