geohash的特点,局限性和思考

来源:互联网 发布:中国的地位知乎 编辑:程序博客网 时间:2024/05/18 00:18

geohash原理

原理参考: http://blog.jobbole.com/80633/,其实就是有限二分法而已

使用场景

一般用于查找周边,具体可以网上百度

为什么不直接使用经纬度

  1. 如果查找周边,使用经纬度,需要用到经度>多少,经度<多少,纬度>多少,纬度<多少,在数据库中就用不到索引
  2. 有的人认为如果确定了多少米的范围,那么直接使用经纬度的某个经度,合在一起,也可以作为一维,例如纬经度分别为22.21315,41.59874 作为一个字段,只需要控制纬度多少位,经度多少位即可。但是这也意味着固定死了某个经纬度,geohash的优势还在于,根据不同的位数,可以得到不同的范围

局限性

个人认为的局限性有以下几点:
1. 不能做排序,真要做排序,而且还用geohash,那只能查出来,然后对查出来的部分做排序
2. 由于用的是经纬度的有限二分,并且使用的是5个bit位做一个base32编码,那么geohash的精度问题就比较固定。官方的经纬度

当然这个精度可以进行改进,只需要控制好经纬度的位数,就可以控制好经纬度的误差,当然就能控制km的误差,参考这篇文章的改进: https://my.oschina.net/shipley/blog/704964
当然,基于这篇文章,还可以根据自己的需求进一步进行改进,比如前几位用5位进行base32编码,后几位可以用三位,或者二位进行base32编码,这需要看自己的精度控制。但是整体说来,精度还是如下:

现在的每一位,可以更精确了。
3. 求的周边并不是一个圆,也不是一个正方形,大多数情况是一个长方形,具体参考上面的两个表

  1. 部分点不准确
    位于格子边界两侧的两点, 虽然十分接近,但编码会完全不同,可以同时搜索当前格子周围的8个格子,即可解决这个问题

有没有其他的办法

栅格法: 其实geohash就类似于一种栅格法:
下面介绍自己曾用过的两种栅格的方法
方法1: 例如对桂林进行栅格化,那么找出桂林左下角纬经度为原点,lat0,lng0, 对整个北京进行栅格的划分,比如10m作为一个栅格,我们可以计算出每10米的纬度为0.00009°,经度大约为0.0001°,那么按照这个经纬度进行划分栅格即可。如果有一个点,需要计算落在哪个经纬度内,那么x=(lat-lat0)/0.00009,y=(lng-lng0)/(0.0001)
方法二:对每一个经纬度*1000000,例如32.1256232,114.2135123 乘以1000000为 321256232,1142135123, 对于纬度,我们圆整900,经度,圆整1000,计算出栅格的左下角经纬度
例如 (321256232/900)*900, (1142135123*1000)/1000,算出的就是左下角的经纬度了,对于一个栅格内的,圆整后,都属于这个左下角的经纬度

代码

原理很简单,代码更简单,直接去github上搜索geohash就行了,各种语言的都有

原创粉丝点击