Java中如何使用Redis GEO測(cè)算經(jīng)緯度距離
一、Redis GEO相關(guān)命令操作
GEO也是Redis中提供的一種數(shù)據(jù)類型,可以將其理解成ZSet有序集合類型
- GEOADD
GEOADD cars -115.17087 36.12306 my-car
向GEO集合cars中添加一個(gè)鍵為my-car,值為-115.17087 36.12306。
第一個(gè)參數(shù)為GEO集合名稱,第二個(gè)參數(shù)為經(jīng)度,第三個(gè)參數(shù)為緯度,第四個(gè)參數(shù)為成員名稱。
GEOADD cars -115.171971 36.120609 robins-car
再向同一個(gè)集合cars中添加一個(gè)robins-car坐標(biāo)。
GEO與ZSET相同,多次添加相同的成員KEY,將會(huì)覆蓋以前的內(nèi)容,即不允許重復(fù)的成員KEY。
GEODIST
GEODIST cars my-car robins-car
測(cè)算兩個(gè)成員坐標(biāo)的距離,即測(cè)算cars集合中,根據(jù)my-car與robins-car的經(jīng)緯度計(jì)算兩者相距的距離。默認(rèn)返回的距離單位為米,比如"90.7082"米。
GEODIST cars my-car robins-car km
測(cè)算兩個(gè)坐標(biāo)的距離,返回值單位為km千米。
GEORADIUS
GEORADIUS cars -115.17258 36.11996 100 m
刷選出集合cars中距離經(jīng)緯度-115.17258 36.11996的100米范圍內(nèi)的成員名稱數(shù)據(jù)。會(huì)返回成員鍵,即robins-car、my-car。
GEORADIUSBYMEMBER
GEORADIUSBYMEMBER cars robins-car 100 m WITHDIST
刷選出集合內(nèi)距離鍵robins-car 100米范圍內(nèi)的成員名稱,并且一起返回距離該指定的鍵多少米。
ZREM
ZREM cars my-car
移除集合中某個(gè)鍵,與ZSET有序集合使用的相同命令。
二:Spring中RedisTemplate操作。
有了Redis GEO相關(guān)命令后,我們便可以輕松地來計(jì)算兩個(gè)經(jīng)緯度之間的距離、篩選出距離某個(gè)經(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 標(biāo)識(shí) * @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); } /** * 兩個(gè)人之間的距離 * @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(); } /** * 查詢距離某個(gè)人指定范圍內(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(); // 與目標(biāo)點(diǎn)相距的距離信息 Distance geoResultDistance = geoResult.getDistance(); // 該點(diǎn)的信息 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("北京西站-南廣場(chǎng)", 116.327766,39.898944); geoUtil.geoAdd("北京西站-南進(jìn)站口", 116.327765,39.899347); geoUtil.geoAdd("中鐵設(shè)計(jì)大廈", 116.328628,39.896485); geoUtil.geoAdd("瑞海大廈", 116.326661,39.903778); // 計(jì)算北京南站與北京西站之間的距離 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米,與計(jì)算出的5898.4001相差無幾。
到此這篇關(guān)于Java-使用Redis GEO測(cè)算經(jīng)緯度距離的文章就介紹到這了,更多相關(guān)redis計(jì)算經(jīng)緯度距離內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis GEO實(shí)現(xiàn)搜索附近用戶的項(xiàng)目實(shí)踐
- Redis GEO地理信息定位功能
- 詳解Redis中地理位置功能Geospatial的應(yīng)用
- Redis特殊數(shù)據(jù)類型Geospatial地理空間
- Redis之GEO存儲(chǔ)地理位置信息的使用
- Redis 的 GeoHash詳解
- Redis中3種特殊的數(shù)據(jù)類型(BitMap、Geo和HyperLogLog)
- 使用redis實(shí)現(xiàn)附近的人功能
- Redis 實(shí)現(xiàn)“附近的人”功能
- Redis用GEO實(shí)現(xiàn)附近的人功能
相關(guān)文章
Java編程實(shí)現(xiàn)非對(duì)稱加密的方法詳解
這篇文章主要介紹了Java編程實(shí)現(xiàn)非對(duì)稱加密的方法,簡(jiǎn)單講述了非對(duì)稱加密的概念、原理,并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)DH加密解密、RSA加密解密、ElGamal加密等具體操作技巧,需要的朋友可以參考下2017-08-08Java 使用Socket正確讀取數(shù)據(jù)姿勢(shì)
這篇文章主要介紹了Java 使用Socket正確讀取數(shù)據(jù)姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10詳解Spring Boot中整合Sharding-JDBC讀寫分離示例
這篇文章主要介紹了詳解Spring Boot中整合Sharding-JDBC讀寫分離示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03淺談Java中@Autowired和@Inject注解的區(qū)別和使用場(chǎng)景
本文主要介紹了淺談Java中@Autowired和@Inject注解的區(qū)別和使用場(chǎng)景,@Autowired注解在依賴查找方式和注入方式上更加靈活,適用于Spring框架中的依賴注入,而@Inject注解在依賴查找方式上更加嚴(yán)格,適用于Java的依賴注入標(biāo)準(zhǔn),感興趣的可以了解一下2023-11-11吊打Java面試官!整理了一周的Spring面試大全(附答案)
這篇文章主要介紹了Spring面試資料(附答案)建議收藏留存,學(xué)Java的小伙伴都知道Spring是面試的必問環(huán)節(jié),看完了一天就可掌握數(shù)據(jù)結(jié)構(gòu)和算法的面試題,快來看看吧2021-08-08