前段时间用java开发app后台,有涉及到检索附近的功能,使用的geohash算法,记录下遇到的一个问题。
关于geohash原理,参考:http://blog.jobbole.com/80633/
感觉不错的geohash演示:https://cevin.net/geohash/
使用geohash算法首先要考虑的一点就是检索的范围是一个矩形,在矩形内的所有经纬度转化的geohash编码都是一样的,所以会出现,如果站在矩形边的位置,距离较近的矩形外的点检索不到,但是可以检索到,距离较远的矩形内的点,为了解决这个问题,一般都是检索九个矩形,所在矩形加上周围八个方向的矩形像这样:
检索周围九个矩形可以规避上述描述的问题,使用的时候,以所在位置为圆心,取半径(半径最大值应小于等于单个矩形的长&小于等于单个矩形的宽),半径为程序过滤,这样可以检索出自己实际所需的距离范围。
优缺点
优点:可直接根据经纬度转化的geohash编码检索附近,效率高,直接可以select查询。
-
缺点
由于同一个矩形内生产的geohash编码都是相同的,查询时无法进行真分页,只能假分页(查询出全部符合条件的数据,然后前台展示是进行分页展示)。ps:可通过逐步扩大检索范围,一定程度缓解
实际查询时会查询到距离之外的数据,需要程序过滤。