前段时间用java开发app后台,有涉及到检索附近的功能,使用的geohash算法,记录下遇到的一个问题。

  • 关于geohash原理,参考:http://blog.jobbole.com/80633/

  • 感觉不错的geohash演示:https://cevin.net/geohash/

  • 使用geohash算法首先要考虑的一点就是检索的范围是一个矩形,在矩形内的所有经纬度转化的geohash编码都是一样的,所以会出现,如果站在矩形边的位置,距离较近的矩形外的点检索不到,但是可以检索到,距离较远的矩形内的点,为了解决这个问题,一般都是检索九个矩形,所在矩形加上周围八个方向的矩形像这样:GaoHash算法根据经纬度检索附近

  • 检索周围九个矩形可以规避上述描述的问题,使用的时候,以所在位置为圆心,取半径(半径最大值应小于等于单个矩形的长&小于等于单个矩形的宽),半径为程序过滤,这样可以检索出自己实际所需的距离范围。

优缺点

  • 优点:可直接根据经纬度转化的geohash编码检索附近,效率高,直接可以select查询。

  • 缺点

    • 由于同一个矩形内生产的geohash编码都是相同的,查询时无法进行真分页,只能假分页(查询出全部符合条件的数据,然后前台展示是进行分页展示)。ps:可通过逐步扩大检索范围,一定程度缓解

    • 实际查询时会查询到距离之外的数据,需要程序过滤。

相关文章: