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

之前在项目中使用了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<RentSiteVo> 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中添加坐标



 

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

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


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


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

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

五、总结

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

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

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

猜你喜欢

转载自blog.csdn.net/jiushancunMonkeyKing/article/details/82760242
今日推荐