1. 程式人生 > >Redis使用GEO計算兩點間的距離

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功能來實現。