1.什么是GEOHASH
geohash是 将经纬度转换成字符串的方法.(Z阶曲线的应用,是一种分层的数据结构)
GEOHashes提供了任意精度的属性,能从代码末尾删减字符(可以减少精度)地理位置越靠近,前缀越相似.[编码长度为8时,精度为19M左右,编码长度为9时,精度在2M左右.]
GEOHash算法的计算是用二分法.递归调用.
再计算中,属于左区间就记录0,右区间就记录1.随着算法的进行,会产生一个序列1011100…,序列的长度跟给定的区间划分次数有关
把经纬度生成的两个编码组合,形成新串.
使用0-9,b-z(去掉a,o,i,l) 这32个字母进行base32编码.首先转10进制,接着对应编码即可出现对应字符串
(当我们把二进制编码的结构填写到空间中,当将空间划分成四块的时候,编码的顺序分别是左下角00,左上角01,右下角10,右上角11,也就是类似于Z的曲线.当我们递归的各个块分解成更小的子块时,编码的顺序是自相似的[分形],每一个子块也形成Z曲线,这种类型的曲线被称为Peano空间填充曲线[四叉树线性编码方式])
这种类型的空间填充曲线的优点是将二维空间转换成一维曲线(事实上是分形锥),对大部分而言,编码相似的距离也相近.
但Peano空间填充曲线最大的缺点就是
1.突变性:有些编码临近但距离相差很远.
例如:边缘情况:靠近180度经线的两侧,虽然靠近但是没有相似的前缀.再如迟到两侧的点不会有很长的相同前缀,因为不属于同一个半球
2.非线性:geohash是基于经纬度的坐标,所以是反映了两点间经纬度坐标间的距离而不是实际的距离
使用注意点:
1)由于GeoHash是将区域划分为一个个规则矩形并对每个矩形进行编码,这样在查询附近POI信息时会导致:例如有A点和两个点,A点与一个点的编码前缀相似更多但距离更远远(在同一个矩形区域)
解决:除了使用定位点的GeoHash编码进行匹配外,还是用周围8个区域的GeoHash编码,这样来避免
2)现有的GeoHash算法使用的是Peano空间填充曲线,会突变,造成编码虽然相似但距离差距可能很大
解决:首先筛选GeoHash编码相似的POI点,然后进行实际距离的计算