GeoHash 地图算法

之前接手了学长的一个地图项目,学长说可以把地图的经纬度用Geohash算法换成字符串,下来了解了一下

 

Geohash算法是将二维的经纬度转换为了一维的字符串,这样相近的点字符串相似的前缀就越多,这样充分利用了数据库的B树索引,速度大大提高

 

GeoHash的算法

字符串位数越长代表精度越高,8位误差约为19M

字符串的由来:

1、根据经纬度计算出GeoHash的二进制编码

将纬度 分成 [ - 90 , 0)  和 (0 , 90] ,如果位于左区间则取 0 ,右区间取 1 ,分的次数越多,代表的精度越高

经度 则 分成 [ - 180 , 0) 和 (0 , 180 ] 同上。

2、我们将计算出的经纬度二进制编码进行 组码 ,偶数位放经度,奇数位放纬度。

然后每 5 位一组,转为 十进制 ,对照 base32编码,得出字符串。

GeoHash 的缺点:

我们将二维经纬度转为一维字符串,根据经纬度二分 左 0 右 1 的原则绘制如下图N型曲线,这种曲线被称为Peano空间填充曲线

 

这种曲线的缺点就是有突变性,0111与 1000编码相邻,但是实际距离却相差甚远,因此我们需要根据GeoHash字符串先选出临近的点,然后进行实际距离的计算。