php 根据经纬度查找附近的人_使用geohash实现查找附近的人

需求

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

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

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

geohash介绍

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

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

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

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

geohash字符串规律如下:

d2411b03a2be41139c0f0ce99dfee56c

只要根据用户经纬度计算出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地址。

其他实现方式

其实geohash的方式已经有点过时了,redis原生就提供了地理位置的功能,有想了解的朋友可以在评论区留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值