这样我们就得到了纬度的二进制表示 , 同样我们也可以对经度进行二进制表示 。 然后 , 我们把经度放到偶数位 , 纬度放到奇数位 , 把两个二进制串合并到一起 , 最后将得到的二进制串编码每5位进行base32编码 , 最终就得到了我们想要的 , 对于每个小方格进行表示的Geohash字符串序列 。
但是这样做了之后 , 很多人会发现一个问题 , 那就是每个Geohash字符串事实上都是代表一个小方格的 , 那么就会产生边界跨越的问题 。 就像下图中的红点 , 和上面的绿点并不在一个方格里 , 因此如果我们光查询红点所在的格子的话 , 就会查询不到明明离它很近的上面的绿点 , 反而可以查询到更远一点的下面的绿点 。
那么怎么解决这个问题呢?其实也很简单 , 就是在查询的时候 , 把周围的8个格子也考虑进来一起查询就行了 。 那么具体是怎么做的呢?我们可以看到 , 周围的8个格子 , 本质上就是经度纬度的格子二进制数与中间的格子差1 , 所以我们只需要对红点的经纬度二进制数 , 进行加减1的操作就可以获取到附近格子的字符串了 。 而这样做本质上就是损失了一个格子的精度 。 而在经纬度位数足够的情况下 , 这个误差是可以忽略不计的 。 通过计数我们可以得出:
在纬度相等的情况下 , 经度每隔0.00001度 , 距离相差约1米;在经度相等的情况下 , 纬度每隔0.00001度 , 距离相差约1.1米;而在geohash的位数是9位数的时候 , 大概为附近2米;8位的话 , 大约为附近19米 。 对于大部分人来讲 , 可以说是一个可以接受的误差了哦 。
喜欢本文的话 , 欢迎关注活在信息时代哦:)
【想开发一个附近的人功能?你不得不知的Geohash算法】
推荐阅读
- 地球的自转能力究竟有多强?
- 4.6亿年前生物多样性为何盛极而衰
- 处在怎样的一个维度,可以把时间、空间自由掌控着
- 散射辐射变送器的功能与安装
- 直径超200万光年!中国天眼最新发现的宇宙结构,在2.9亿光年外
- 百科全书-地理篇-气候类型 简介
- 历史探秘:5亿年前的“皮鞋”印之谜,外星人的足迹?
- 地球各个角度受到的太阳辐射电磁波不同
- 金字塔究竟是做什么的?