潍坊市论坛

首页 » 分类 » 问答 » Redis实战篇通过Geo类型实现
TUhjnbcbe - 2021/8/18 18:56:00
治疗白癜风与爱同行 http://m.39.net/news/a_9083246.html

产品经理说他有一个idea,为广大少男少女提供一个连接彼此的机会。

让处于这最美的年龄的少男少女能在每一个十二时辰里能邂逅到那个Ta。

所以就想开发一款App,用户登陆后能发现附近的那个Ta,连接彼此。

我该如何实现发现附近的人?我也希望通过这个App邂逅女神……

记忆中,一个下班的夜晚,她从人群中轻盈的移动着,那高挑苗条的身材像漂浮在空间中的一个飘逸的音符。她的眼睛充满清澈的阳光和活力,她的双眸中印着银河系的星光。

开篇寄语“

多锻炼自己的表达能力,特别是在工作中。很多人说「干活的不如那些做PPT的」,实际上老板都不傻,为何他们会更认可那些做PPT的?

因为他们从老板的角度考虑问题,对他而言,需要的是一个「解决方案」。多从一个创造者的视角去考虑问题,而不是局限在用程序员的视角考虑问题;

多想一下这个东西到底给人提供什么价值,而不是「我要怎么实现它」。当然,怎么实现是必须的,但通常不是最重要的。

”什么是面向LBS应用

经纬度是经度与纬度的合称组成一个坐标系统。又称为地理坐标系统,它是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置(小数点后7位,精度可以到1厘米)。

经度的范围在(-,],纬度的范围在(-90,90],纬度正负以赤道为界,北正南负,经度正负以本初子午线(英国格林尼治天文台)为界,东正西负。

附近的人也就是常说的LBS(LocationBasedServices,基于位置服务),它围绕用户当前地理位置数据而展开的服务,为用户提供精准的邂逅服务。

附近的人核心思想如下:

以“我”为中心,搜索附近的Ta;以“我”当前的地理位置为准,计算出别人和“我”之间的距离;按“我”与别人距离的远近排序,筛选出离我最近的用户。MySQL实现“

计算「附近的人」,通过一个坐标计算这个坐标附近的其他数据,按照距离排序,如何下手呢?

以用户为中心,给定一个米作为半径画圆,那么圆形区域内的用户就是我们想要邂逅的「附近的人」。

将经纬度存储到MySQL:

可是总不能遍历所有的「女神」经纬度与自己的经纬度数据计算在根据距离排序,这个计算量也太大了。

我们可以通过区域来过滤出有限「女神」坐标数据,再对矩形区域内的数据进行全量距离计算再排序,这样计算量明显降低。

如何划分矩形区域呢?

在圆形外套上一个正方形,根据用户经、纬度的最大最小值(经、纬度+距离),作为筛选条件过滤数据,就很容易将正方形内的「女神」信息搜索出来。

多出来的一些区域咋办?

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

为了满足高性能的矩形区域算法,数据表需要在经纬度坐标加上复合索引(longitude,latitude),这样可以最大优化查询性能。

实战

根据经纬度和距离获取外接矩形最大、最小经纬度以及根据经纬度计算距离使用了一个第三方类库:

dependencygroupId

1
查看完整版本: Redis实战篇通过Geo类型实现