需求:实现查找附近 200、 500、 1000米范围的好友
关于 geohash 介绍 http://blog.youkuaiyun.com/pi9nc/article/details/11401679
×× 这里忽略球面的误差,因为像千米之内的数据可以看作是二维平面
扩展:将经度线和纬度线切割
切割规则:按轮来解释吧
第一轮 (-180, 0) 0 (0, 180)1
第二轮 (-180, -90) 0 (-90, 0) 1 (0, 90) 0 (90, 180) 1
.......
规律:
每一轮切分得到的块数都是上一轮的两倍
上一轮的任何节点都切分到下一轮的两个节点
推论1:在某一轮,任何一个节点,从根节点到该节点的二进制编码都是唯一的
推论2:同一轮节点的编码,可以由相邻节点的二进制编码加或者减1得到
综上扩展思考得:方可把经度和纬度各自看做一颗满二叉树,每一轮进行组合,那么则可以把世界切分满二叉树的块,
假设一个玩家在一个块中,那么可以通过经度和纬度进行二进制的加减,再组合得到附近八个块的二进制编码,
所以每一个玩家附近的人所在的块都得到了独有二进制码
再度分析:如果把二进制码压缩成整数,那么由中心位置O(X, Y),由 O 中心,将X,Y 进行左右移动便可获取附近8个位置
代码:
-module(radar_misc