1、geohash及其性质
一种空间索引技术。
(1)将二维的经纬度位置数据转换为一维的字符串(基本上hash族的算法都是这样);
其优点在于hash编码后的字符串,可以方便查找和索引,从而减少相似计算的计算量(不需要再去两两计算距离,而是缩小了比较的范围,减少了计算量、提高了效率);
(2)字符串越长,表示的范围越小越精确;字符串长度越小,表示的范围越大越宽泛;
(3)字符串越相似表示距离越相近;
这样可以利用字符串的前缀匹配来查询附近的POI信息;
2、应用
将POI位置信息进行GeoHash编码之后,根据字符串前缀匹配来获得附近距离;
3、GeoHash编码算法
(1)算法步骤:
主要是用的二分查找的方法,先根据纬度编码,得到一个二进制序列;然后根据经度编码,又得到一个二进制序列;
然后组码,偶位数放经度,奇位数放纬度,把两串编码组合成新串;最后使用0-9,b-z(去掉a,i,l,o)这32个字母进行base32编码。
同理,将编码转换为经纬度的解码算法与之相反。
(2)算法原理:(就是解释为什么这样的编码能够使得越相近的位置有越相似的编码结果)
空间填充曲线:
Peano
Hilbert
4、注意点
(1)geohash将区域划分为矩形,那么在边界附近的点可能会出现定位点与同一个geohash编码区域内的点的距离大于临近区域内的点距离的情况;
解决办法:查询时,除了匹配定位点本身所在区域的geohash之外,还使用周围8个区域的geohash编码来匹配;
(2)peano空间填充曲线会产生突变,即编码相似但距离可能相差很大,也就是说使得用编码相似性来衡量距离接近成为了充分不必要条件;
解决办法:在使用geohash过滤筛选可能的附近poi 之后,再进一步计算两点之间的实际距离;
此外,
geohash只是空间索引的一种方式,特别适合点数据,而对线、面数据采用R树索引更有优势。