Java中如何使用Redis GEO測算經(jīng)緯度距離
一、Redis GEO相關命令操作
GEO也是Redis中提供的一種數(shù)據(jù)類型,可以將其理解成ZSet有序集合類型
- GEOADD
GEOADD cars -115.17087 36.12306 my-car
向GEO集合cars中添加一個鍵為my-car,值為-115.17087 36.12306。
第一個參數(shù)為GEO集合名稱,第二個參數(shù)為經(jīng)度,第三個參數(shù)為緯度,第四個參數(shù)為成員名稱。
GEOADD cars -115.171971 36.120609 robins-car
再向同一個集合cars中添加一個robins-car坐標。
GEO與ZSET相同,多次添加相同的成員KEY,將會覆蓋以前的內(nèi)容,即不允許重復的成員KEY。
GEODIST
GEODIST cars my-car robins-car
測算兩個成員坐標的距離,即測算cars集合中,根據(jù)my-car與robins-car的經(jīng)緯度計算兩者相距的距離。默認返回的距離單位為米,比如"90.7082"米。
GEODIST cars my-car robins-car km
測算兩個坐標的距離,返回值單位為km千米。
GEORADIUS
GEORADIUS cars -115.17258 36.11996 100 m
刷選出集合cars中距離經(jīng)緯度-115.17258 36.11996的100米范圍內(nèi)的成員名稱數(shù)據(jù)。會返回成員鍵,即robins-car、my-car。
GEORADIUSBYMEMBER
GEORADIUSBYMEMBER cars robins-car 100 m WITHDIST
刷選出集合內(nèi)距離鍵robins-car 100米范圍內(nèi)的成員名稱,并且一起返回距離該指定的鍵多少米。
ZREM
ZREM cars my-car
移除集合中某個鍵,與ZSET有序集合使用的相同命令。
二:Spring中RedisTemplate操作。
有了Redis GEO相關命令后,我們便可以輕松地來計算兩個經(jīng)緯度之間的距離、篩選出距離某個經(jīng)緯度100米范圍內(nèi)的數(shù)據(jù)了。
@Component public class GeoUtil { @Autowired private RedisTemplate redisTemplate; private static final String GEO_KEY = "DISTANCE"; /** * 將經(jīng)緯度信息添加到redis中 * @param certId 標識 * @param longitude 經(jīng)度 * @param latitude 緯度 */ public void geoAdd(String certId, double longitude, double latitude) { GeoOperations geoOperations = redisTemplate.opsForGeo(); Point point = new Point(longitude, latitude); RedisGeoCommands.GeoLocation geoLocation = new RedisGeoCommands.GeoLocation(certId, point); geoOperations.add(GEO_KEY, geoLocation); } /** * 兩個人之間的距離 * @param certId1 * @param certId2 * @return */ public double distanceBetween(String certId1, String certId2) { GeoOperations geoOperations = redisTemplate.opsForGeo(); Distance distance = geoOperations.distance(GEO_KEY, certId1, certId2); return distance.getValue(); } /** * 查詢距離某個人指定范圍內(nèi)的人,包括距離多少米 * @param certId * @param distance * @return */ public Map<String, Double> distanceInclude(String certId, double distance) { Map<String, Double> map = new LinkedHashMap<>(); GeoOperations geoOperations = redisTemplate.opsForGeo(); RedisGeoCommands.GeoRadiusCommandArgs geoRadiusCommandArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs(); GeoResults<RedisGeoCommands.GeoLocation<String>> geoResults = geoOperations.radius(GEO_KEY, certId, new Distance(distance), geoRadiusCommandArgs.includeDistance()); if (geoResults != null) { Iterator<GeoResult<RedisGeoCommands.GeoLocation<String>>> iterator = geoResults.iterator(); while (iterator.hasNext()) { GeoResult<RedisGeoCommands.GeoLocation<String>> geoResult = iterator.next(); // 與目標點相距的距離信息 Distance geoResultDistance = geoResult.getDistance(); // 該點的信息 RedisGeoCommands.GeoLocation<String> geoResultContent = geoResult.getContent(); map.put(geoResultContent.getName(), geoResultDistance.getValue()); } } return map; } }
GeoUtil geoUtil = springApplicationContext.getBean(GeoUtil.class); geoUtil.geoAdd("北京西站", 116.328103,39.900835); geoUtil.geoAdd("北京南站", 116.385488,39.87128); geoUtil.geoAdd("北京西站-南廣場", 116.327766,39.898944); geoUtil.geoAdd("北京西站-南進站口", 116.327765,39.899347); geoUtil.geoAdd("中鐵設計大廈", 116.328628,39.896485); geoUtil.geoAdd("瑞海大廈", 116.326661,39.903778); // 計算北京南站與北京西站之間的距離 double distance = geoUtil.distanceBetween("北京西站", "北京南站"); // 5898.4001 System.out.println(distance); // 查詢距離北京西站5000米范圍內(nèi)的地方 Map<String, Double> distanceInclude = geoUtil.distanceInclude("北京西站", 5000); System.out.println(distanceInclude);
從百度地圖看北京西站與北京南站的距離為5.9公里,即5900米,與計算出的5898.4001相差無幾。
到此這篇關于Java-使用Redis GEO測算經(jīng)緯度距離的文章就介紹到這了,更多相關redis計算經(jīng)緯度距離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java 使用Socket正確讀取數(shù)據(jù)姿勢
這篇文章主要介紹了Java 使用Socket正確讀取數(shù)據(jù)姿勢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10詳解Spring Boot中整合Sharding-JDBC讀寫分離示例
這篇文章主要介紹了詳解Spring Boot中整合Sharding-JDBC讀寫分離示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03淺談Java中@Autowired和@Inject注解的區(qū)別和使用場景
本文主要介紹了淺談Java中@Autowired和@Inject注解的區(qū)別和使用場景,@Autowired注解在依賴查找方式和注入方式上更加靈活,適用于Spring框架中的依賴注入,而@Inject注解在依賴查找方式上更加嚴格,適用于Java的依賴注入標準,感興趣的可以了解一下2023-11-11吊打Java面試官!整理了一周的Spring面試大全(附答案)
這篇文章主要介紹了Spring面試資料(附答案)建議收藏留存,學Java的小伙伴都知道Spring是面試的必問環(huán)節(jié),看完了一天就可掌握數(shù)據(jù)結構和算法的面試題,快來看看吧2021-08-08