Java中如何使用Redis GEO測算經(jīng)緯度距離
一、Redis GEO相關(guān)命令操作
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坐標(biāo)。
GEO與ZSET相同,多次添加相同的成員KEY,將會覆蓋以前的內(nèi)容,即不允許重復(fù)的成員KEY。
GEODIST
GEODIST cars my-car robins-car
測算兩個成員坐標(biāo)的距離,即測算cars集合中,根據(jù)my-car與robins-car的經(jīng)緯度計算兩者相距的距離。默認(rèn)返回的距離單位為米,比如"90.7082"米。
GEODIST cars my-car robins-car km
測算兩個坐標(biāo)的距離,返回值單位為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相關(guān)命令后,我們便可以輕松地來計算兩個經(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 標(biāo)識
* @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();
// 與目標(biāo)點相距的距離信息
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("中鐵設(shè)計大廈", 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相差無幾。

到此這篇關(guān)于Java-使用Redis GEO測算經(jīng)緯度距離的文章就介紹到這了,更多相關(guān)redis計算經(jīng)緯度距離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java課設(shè)案例之百行代碼實現(xiàn)簡易計算器
下面這篇文章主要給大家介紹了關(guān)于Java課設(shè)案例之百行代碼實現(xiàn)簡易計算器的相關(guān)資料,這是一個關(guān)于java簡單計算器的完整課程設(shè)計以及源碼,需要的朋友可以參考下2023-06-06
maven多moudle項目在idea里面顯示多個root問題及解決
這篇文章主要介紹了maven多moudle項目在idea里面顯示多個root問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
SpringCloud網(wǎng)關(guān)Gateway功能實現(xiàn)
本文介紹SpringCloud網(wǎng)關(guān)Gateway功能實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-09-09
Java實現(xiàn)飛機大戰(zhàn)游戲?附完整源碼
這篇文章主要介紹了Java實現(xiàn)飛機大戰(zhàn)游戲,本文給大家分享完整源代碼和效果圖展示,對java飛機大戰(zhàn)游戲?qū)崿F(xiàn)代碼感興趣的朋友一起看看吧2022-05-05
Java使用Arthas查看接口方法的執(zhí)行時間的步驟
在日常的開發(fā)和運維工作中,經(jīng)常需要監(jiān)控接口方法的執(zhí)行時間,以便排查性能問題或優(yōu)化代碼,Arthas 是一款強大的 Java 診斷工具,可以幫助我們輕松地查看接口方法的執(zhí)行時間,而無需修改代碼或重啟應(yīng)用,本文將詳細(xì)介紹如何使用 Arthas 來查看接口方法的執(zhí)行時間2025-05-05
Java:DocumentBuilderFactory調(diào)用XML的方法實例
Java:DocumentBuilderFactory調(diào)用XML的方法實例,需要的朋友可以參考一下2013-04-04

