使用geohash实现查找附近的人

需求

在许多社交app和外卖app种都有一个功能,就是查找附近的人或者附近的商家。

我们很容易获得用户的经纬度坐标,但是我们如何知道哪些用户在我们的四周?

如果知道两个用户坐标,可以使用几何数学的方法算出两个坐标之间的距离,但是如果要从海量数据库中找出距离本人1公里内的所有用户,难道要把所有用户经纬度数据都查出来然后一个个计算与我的距离吗?显然不可取。

geohash介绍

因此我们需要使用geohash,它的基本原理是将整个地球切割成无数个小块,每一个小块都用字符串表示。然后将经纬度转换成geohash字符串。

如果两个用户在同一个区域内,那么他们的geohash字符串就会有相同部分。

假设A用户坐标(100.001,100.002),B用户坐标(100.004,100.005),他们的geohash分别是 ypzpgxgpypzpgxvr

这两个geohash字符串前面6位是相同的,根据geohash的特性,这两个坐标距离在0.61公里之内。

geohash字符串规律如下:
这里写图片描述

只要根据用户经纬度计算出geohash,就可以参照上图计算出两个坐标之间的大致距离。

找到附近的人

要实现找到附近的人,首先我们要在获得用户经纬度的同时,计算出它的geohash字符串值,然后存入数据库中。

假设要找到A用户( ypzpgxgp)附近600米之内的所有人,只要取出geohash串的前6位( ypzpgx),然后在数据库中进行like 'ypzpgx%' 查询,就能轻易找出所有600米之内的所有人。

这种方式查找出的用户自然也包含了geohash前七位,甚至前8位都相同的人,前七位都相同的坐标距离在76米之内,自然也属于600米之内的范畴。

geohash计算方法

geohash的算法不算难,但也不简单,对于我们普通开发者来说,有现成的库就再好不过了。

这里提供一个php的geohash类的地址:https://github.com/CloudSide/geohash

其他语言的geohash库自行百度。

简单实例:

<?php 

require "GeoHash.php";

$geohash = new GeoHash;

$hash = $geohash->encode(100.004,100.005);

echo $hash;

ps:提供的经纬度坐标越精确(小数点后越多位),计算出的geohash字符串也就越长,计算距离也越准确。具体参照上面的图。

还有其他用法请查看上面提供的github地址。

猜你喜欢

转载自blog.csdn.net/u010837612/article/details/80076811