之前在项目中使用了Redis的GEO函数,第一次接触,所以记录下来。
首先看下自己项目中的例子,然后后面会帖一个大佬写的例子。
首先我们需要在pom.xml中引入jar
然后需要配置javaBean
然后就是应用了
try(Jedis jedis = jedisPool.getResource()){
//往redis中存入一个点,名称为car,坐标为lng,lat,key为check:geo:car:rentSite
jedis.geoadd("check:geo:car:rentSite", lng, lat, "car");
List list = rentSiteMapper.selectList(null);//获取所有站点
if(list.size()!=0 || !list.isEmpty()){
for (RentSiteVo rentSiteVo : list) {
double lng2 = rentSiteVo.getGpsLng();//站点经度
double lat2 = rentSiteVo.getGpsLat();//纬度
Double scope = rentSiteVo.getScope();//站点范围
//往redis中存入一个点,名字为site,坐标为lng2,lat2 这个点的key为
//check:geo:car:rentSite
jedis.geoadd("check:geo:car:rentSite", lng2, lat2, "site");
//得到car和site点的距离,GeoUnit.M参数表示,返回值以米为单位
Double geodist = jedis.geodist("check:geo:car:rentSite", "car",
"site",GeoUnit.M);
//删除点site
jedis.del("site");
//比较两点的距离和站点范围大小
if(scope>geodist){
return true;
}
}
}else{
throw new DefineException("站点获取失败!");
}
}
下面看下大佬的例子,原文地址https://blog.csdn.net/shixiaoguo90/article/details/80538180
先来说说Redis的原生语法
参数介绍:
geoadd: redis 语法,固定关键字
key: 一系列点的集合Key
longitude: 经度
latitude: 纬度
member: 具体的经纬度的点的名字
例子:geoadd points 104.074977 30.560872 世纪城地铁站
根据某个点的名字来获取经纬度信息
georadius : 根据某个点,查出其周围半径为radiusm的点
georadiusbymember : 根据某个点的名字找到那个点,然后找其周围半径为radiusm的点
例子:georadiusbymember points beijing 150km
例子2: georadius points 104.074977 30.560872 2km
四、Redis的Geo与java的结合
当然,上面那么多东西并不是我们Java程序员实际关心的语法,我们关心的更多还是上面的那些语法与Java的一个结合。
下面我们就根据一个demo程序来具体来看geo的用法
demo中使用的是springboot程序
首先是pom.xml配置文件
注:spring-boot-starter-data-redis中包含了Jedis的依赖包
然后是Jedis相关Bean的配置
接下来就是Geo的相关的Jedis工具类
最后一个controller来控制
注:该controller只是用于测试geo的功能,写得比较简陋。。。
一切搞定后,我们就开始测试该程序是否起作用。
然后看是否能根据某个点,查找周围的点
当距离为三公里事,可以找到先前添加的两个点
当距离为两公里时,就不能找到"世纪城地铁口"
以下地图中红色圈的位置,是我文章中用到的三个点坐标
到这里,已经可以证明,Redis的周围坐标功能起了作用。
五、总结
这个功能在做摇一摇或者周边餐饮、车辆时非常有用
当然,使用百度JSPAPI也可以实现这个功能,不过要引入第三方的依赖。
比较简单的功能,完全可以使用Redis的GEO功能来实现。