Try Everything Different In My Life.

「🔨实践」使用GeoHash算法来简化GIS点位查询

2018.10.18

在项目中有一个需求查询最近的事件点信息,事件点位信息非常多,使用传统计算方式非常的耗时,Google之后找打GeoHash算法,非常好,记录一下

起因

园区中有很多网格员来处理园区的中发生的事件,网格员开启定位后就可以查看附近的事件信息然后到现场进行处理,本来的实现方法是遍历事件表,然后将事件表中点位和网格员所在的点位进行计算,查找出附近的事件信息

但是随着上线之后事件信息原来越多,每一次遍历表还要进行点位计算非常的耗时,所以这个方法需要修改

解决方案

GeoHash

GeoHash算法的思想就是讲地图分割成一个个小格子,然后每一个进行编码(唯一),然后对事件点位信息进行hash计算出对应的编码存储,实质上就是将事件和格子进行了绑定,当网格员查询附件事件的时候就直接hash计算出网格员所在格子编码,然后使用这个编码去事件表中查询这个格子中所有事件,这样就避免了计算的步骤

实现

我们使用的地图经度的范围是[-180,180],维度的范围是[-90,90],对整个地图进行第一次等分的时候可以将地图分成四个

对四个格子在进行平分又可以得到4个格子,一个地图就可以分成16小格子,依靠这个规则依次划分下去可以得到无穷无尽的格子,每一格子都有一个编码

如现在对纬度39.21779321进行换算编码,最后得到这个纬度的纬度编码为:10110 11111

那么假设经度是120.63946734,那么他的经度编码为: 11010 10111

奇数位放纬度,偶数位放经度,得到混合编码为: 11011 01100 11101 11111

每五位作为一个二进制数,转换成十进制数为 : 27 12 29 31

使用base32对得到的十进制数进行编码得到 : 3M57