两个多月前写了上一篇计算周围8个格子编码的文章,实际用时发现效率不高,因为每次计算都需要先解码成二进制串算完再进行编码。后来在github上发现一个js项目,用打表的方法来求周围8个格子,效率提高了不少。这里写一点自己的理解。
拿”wx4g”这个geohash来看,解码成二进制串就是 11100 11101 00100 01111 。单独看’w’,也就是 11100,按照编码的顺序,就是 “右 上 右 下 左”,这样就确定了一个坐标的大概范围,然后第二位’x’在第一次确定的范围内按照”上 右 上 左 上”的顺序确定一个更小的范围。如此进行下去直到编码结束就能把一个坐标确定在一个很小的范围内。因此,geohash实际上就是将大方格划分成32个小方格,再将每一个个小方格划分成更小的32个小方格的过程。
我们发现,对于geohash中奇数位的字符(’w’,’4’),它们的编码是按照”经 纬 经 纬 经”的顺序,而偶数为字符(’x’,’g’)则是按照”纬 经 纬 经 纬”的顺序。
所以,我们很容易确定base32编码时每一个字符对应的方格的位置。
对于奇数位字符:
b c f g u v y z
8 9 d e s t w x
2 3 6 7 k m q r
0 1 4 5 h j n p
对于偶数位字符:
p r x z
n q w y
j m t v
h k s u
5 7 e g
4 6 d f
1 3 9 c