像我们平常美团点外卖的时候,都会看到一个商家距离我们多少米。还有类似QQ附近的人,我们能看到附近的人距离我们有多少米。
那么这些业务是怎么做的呢?是如何实现 基于位置的附近服务系统呢。
在去了解基于位置的附近服务之前,我们先来看一下什么是GIS技术。
GIS代表地理信息系统,是一种用于收集、存储、分析、管理和显示地理空间数据的技术。GIS利用计算机软件和硬件来创建、管理、分析和可视化地理信息,使用户能够更好地了解和解决地理空间问题。
简言之地图上的每一个位置都会一个经纬度坐标。根据这个坐标我们查出来附近的人,或者附近的门店之类的。
下面是基于百度的地图经纬度定位系统,大家可以自己体验下,你给它一个经纬度,他能给你定位到地图的某一个点。也就是当前经纬度的位置。
网址:http://jingweidu.757dy.com/
我们既然了解了经纬度这个概念,那么Redis 3.2版本之后新增的一个数据类型,是一种用于处理地理位置信息的数据结构。
GEO(地理位置):存储和查询地理位置数据,并快速地计算距离和位置集合的交集。
应用场景
- 位置服务:可以使用GEO结构存储用户或商家的位置信息,并计算用户或商家之间的距离。
- 商业分析:可以使用GEO结构在地图上可视化商家的分布状况,以进行市场分析和营销策略的制定。
- 推荐系统:可以使用GEO结构计算用户与商家之间的距离,以实现根据附近商家推荐和推荐商家位置排名等功能。或者用于实现拼团和卡券等代表性做法,诸如可以实现商家对距离自己较近的用户进行自动优惠券发放等。
Redis的GEO数据结构常见的命令
- geoadd:增加某个地理位置的坐标
- 语法
GEOADD key longitude latitude member
- 语法
- geopos:获取某个地理位置的坐标
- 语法
GEOPOS key [member [member ...]]
- 语法
- geodist:获取两个地理位置的距离
- 语法
GEODIST key member1 member2 [M | KM | FT | MI]
- 范围单位:m | km | ft | mi --> 米 | 千米 | 英尺 | 英里
- 语法
- georadius:根据给定地理位置坐标获取指定范围内的地理位置集合
- 语法
GEORADIUS key longitude latitude radius <M | KM | FT | MI>
- 语法
- georadiusbymember:根据给定地理位置获取指定范围内的地理位置集合。
- 语法
GEORADIUSBYMEMBER key member radius <M | KM | FT | MI>
- 语法
- geohash:获取某个地理位置的geohash值
- 语法
GEOHASH key [member [member ...]]
- 语法
SpringBoot整合案例实战
需求背景:一个用户想要找他的附近美食,使用Redis的GEO结构。
SpringBoot项目整合RedisTemplate这里就不过多介绍啦。
<!-- 创建SpringBoot项目加入redis的starter依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
首先我们要先准备一些商家信息,我们先定义一个商家的实体类。
/**
* 定义商家店铺实体类
* @author lixiang
* @date 2023/6/21 09:31
*/
@Data
public class Shop {