Redis使用GEO计算两点间的距离

之前在项目中使用了Redis的GEO函数,第一次接触,所以记录下来。

首先看下自己项目中的例子,然后后面会帖一个大佬写的例子。

首先我们需要在pom.xml中引入jar

Redis使用GEO计算两点间的距离_第1张图片

然后需要配置javaBean

Redis使用GEO计算两点间的距离_第2张图片

然后就是应用了

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的原生语法

Redis使用GEO计算两点间的距离_第3张图片

参数介绍:

geoadd: redis 语法,固定关键字

key: 一系列点的集合Key

longitude: 经度

latitude: 纬度

member: 具体的经纬度的点的名字

例子:geoadd points 104.074977 30.560872 世纪城地铁站

 

Redis使用GEO计算两点间的距离_第4张图片

 

 

根据某个点的名字来获取经纬度信息


Redis使用GEO计算两点间的距离_第5张图片
Redis使用GEO计算两点间的距离_第6张图片

 

georadius : 根据某个点,查出其周围半径为radiusm的点

georadiusbymember : 根据某个点的名字找到那个点,然后找其周围半径为radiusm的点

Redis使用GEO计算两点间的距离_第7张图片

 

例子:georadiusbymember points beijing 150km

例子2: georadius points 104.074977 30.560872 2km

 

Redis使用GEO计算两点间的距离_第8张图片

 

四、Redis的Geo与java的结合

当然,上面那么多东西并不是我们Java程序员实际关心的语法,我们关心的更多还是上面的那些语法与Java的一个结合。

下面我们就根据一个demo程序来具体来看geo的用法

 

demo中使用的是springboot程序

首先是pom.xml配置文件

Redis使用GEO计算两点间的距离_第9张图片

 

注:spring-boot-starter-data-redis中包含了Jedis的依赖包

 

然后是Jedis相关Bean的配置

Redis使用GEO计算两点间的距离_第10张图片

 

接下来就是Geo的相关的Jedis工具类

Redis使用GEO计算两点间的距离_第11张图片

Redis使用GEO计算两点间的距离_第12张图片

Redis使用GEO计算两点间的距离_第13张图片

 

最后一个controller来控制
 

Redis使用GEO计算两点间的距离_第14张图片

 

注:该controller只是用于测试geo的功能,写得比较简陋。。。

 

一切搞定后,我们就开始测试该程序是否起作用。

先是向redis中添加坐标



 

 

然后看是否能根据某个点,查找周围的点

当距离为三公里事,可以找到先前添加的两个点


当距离为两公里时,就不能找到"世纪城地铁口"


以下地图中红色圈的位置,是我文章中用到的三个点坐标

 

Redis使用GEO计算两点间的距离_第15张图片

 

到这里,已经可以证明,Redis的周围坐标功能起了作用。

 

五、总结

这个功能在做摇一摇或者周边餐饮、车辆时非常有用

当然,使用百度JSPAPI也可以实现这个功能,不过要引入第三方的依赖。

比较简单的功能,完全可以使用Redis的GEO功能来实现。

你可能感兴趣的:(java,Redis)