mysql lbs 附近的人_4种 LBS “附近的人” 实现方案,人人都能看的懂

昨天一位公众号粉丝和我讨论了一道面试题,个人觉得比较有意义,这里整理了一下分享给大家,愿小伙伴们面试路上少踩坑。面试题目比较简单:“让你实现一个附近的人功能,你有什么方案?”,这道题其实主要还是考察大家对于技术的广度,本文介绍几种方案,给大家一点思路,避免在面试过程中语塞而影响面试结果,如有不严谨之处,还望亲人们温柔指正!

“附近的人” 功能生活中是比较常用的,像外卖app附近的餐厅,共享单车app里附近的车辆。既然常用面试被问的概率就很大,所以下边依次来分析基于mysql数据库、Redis、 MongoDB实现的 “附近的人” 功能。

767946d80c7fcff6d1eede3a90d3e174.png

科普:世界上标识一个位置,通用的做法就使用经、纬度。经度的范围在 (-180, 180],纬度的范围 在(-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。比如:望京摩托罗拉大厦的经、纬度(116.49141,40.01229)全是正数,就是因为我国位于东北半球。

一、“附近的人”原理

“附近的人” 也就是常说的 LBS (Location Based Services,基于位置服务),它围绕用户当前地理位置数据而展开的服务,为用户提供精准的增值服务。

“附近的人” 核心思想如下:

以 “我” 为中心,搜索附近的用户

以 “我” 当前的地理位置为准,计算出别人和 “我” 之间的距离

按 “我” 与别人距离的远近排序,筛选出离我最近的用户或者商店等

3e79fd523f7863c1796d2a149122d207.png

二、什么是GeoHash算法?

在说 “附近的人” 功能的具体实现之前,先来认识一下GeoHash 算法,因为后边会一直和它打交道。定位一个位置最好的办法就是用经、纬度标识,但经、纬度它是二维的,在进行位置计算的时候还是很麻烦,如果能通过某种方法将二维的经、纬度数据转换成一维的数据,那么比较起来就要容易的多,因此GeoHash算法应运而生。

GeoHash算法将二维的经、纬度转换成一个字符串,例如:下图中9个GeoHash字符串代表了9个区域,每一个字符串代表了一矩形区域。而这个矩形区域内其他的点(经、纬度)都用同一个GeoHash字符串表示。

5c0e579f3a73edcd4a9d10b7e390da87.png

比如:WX4ER区域内的用户搜索附近的餐厅数据,由于这区域内用户的GeoHash字符串都是WX4ER,故可以把WX4ER当作key,餐厅信息作为value进行缓存;而如果不使用GeoHash算法,区域内的用户请求餐厅数据,用户传来的经、纬度都是不同的,这样缓存不仅麻烦且数据量巨大。

GeoHash字符串越长,表示的位置越精确,字符串长度越长代表在距离上的误差越小。下图geohash码精度表:

geohash码长度 | 宽度 | 高度

-------- | ----- | ----- |

1 | 5,009.4km | 4,992.6km

2 |1,252.3km |624.1km

3 |156.5km |156km

4 |39.1km |19.5km

5 |4.9km |4.9km

6 |1.2km |609.4m

7 |152.9m |152.4m

8 |38.2m| 19m

9 |4.8m |4.8m

10 |1.2m |59.5cm

11 |14.9cm |14.9cm

12 |3.7cm |1.9cm

而且字符串越相似表示距离越相近,字符串前缀匹配越多的距离越近。比如:下边的经、纬度就代表了三家距离相近的餐厅。

商户 | 经纬度 | Geohash字符串

-------- | ----- | ----- |

串串香 | 116.402843,39.999375 | wx4er9v

火锅| 116.3967,39.99932 | wx4ertk

烤肉 | 116.40382,39.918118 | wx4erfe

让大家简单了解什么是GeoHash算法,方便后边内容展开,GeoHash算法内容比较高深,感兴趣的小伙伴自行深耕一下,这里不占用过多篇幅(其实是我懂得太肤浅,哭唧唧~)。

三、基于Mysql

此种方式是纯基于mysql实现的,未使用GeoHash算法。

1、设计思路

以用户为中心,假设给定一个500米的距离作为半径画一个圆,这个圆型区域内的所有用户就是符合用户要求的 “附近的人”。但有一个问题是圆形有弧度啊,直接搜索圆形区域难度太大,根本无法用经、纬度直接搜索。

但如果在圆形外套上一个正方形,通过获取用户经、纬度的最大最小值(经、纬度 + 距离),再根据最大最小值作为筛选条件,就很容易将正方形内的用户信息搜索出来。

那么问题又来了,多出来一些面积肿么办?

我们来分析一下,多出来的这部分区域内的用户,到圆点的距离一定比圆的半径要大,那么我们就计算用户中心点与正方形内所有用户的距离,筛选出所有距离小于等于半径的用户,圆形区域内的所用户即符合要求的“附近的人”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值