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