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中添加一個(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,將會覆蓋以前的內(nèi)容,即不允許重復(fù)的成員KEY。
GEODIST
GEODIST cars my-car robins-car
測算兩個(gè)成員坐標(biāo)的距離,即測算cars集合中,根據(jù)my-car與robins-car的經(jīng)緯度計(jì)算兩者相距的距離。默認(rèn)返回的距離單位為米,比如"90.7082"米。
GEODIST cars my-car robins-car km
測算兩個(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ù)。會返回成員鍵,即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)識
* @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("北京西站-南廣場", 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測算經(jīng)緯度距離的文章就介紹到這了,更多相關(guān)redis計(jì)算經(jīng)緯度距離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot在 POM 中引入本地 JAR 包的方法
在開發(fā) Spring Boot 應(yīng)用程序時(shí),您可能需要使用本地 JAR 包來添加自定義庫或功能,本文將介紹在 Spring Boot 項(xiàng)目的 POM 文件中如何引入本地 JAR 包,感興趣的朋友跟隨小編一起看看吧2023-08-08
java狀態(tài)機(jī)方案解決訂單狀態(tài)扭轉(zhuǎn)示例詳解
這篇文章主要為大家介紹了java狀態(tài)機(jī)方案解決訂單狀態(tài)扭轉(zhuǎn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
JavaWeb dbutils執(zhí)行sql命令并遍歷結(jié)果集時(shí)不能查到內(nèi)容的原因分析
這篇文章主要介紹了JavaWeb dbutils執(zhí)行sql命令并遍歷結(jié)果集時(shí)不能查到內(nèi)容的原因分析及簡單處理方法,文中給大家介紹了javaweb中dbutils的使用,需要的朋友可以參考下2017-12-12
Java Swing實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)源碼(收藏版)
這篇文章主要介紹了Java Swing實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)源碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
springboot本地調(diào)試沒問題,打包運(yùn)行報(bào)錯(cuò)原因及分析
這篇文章主要介紹了springboot本地調(diào)試沒問題,打包運(yùn)行報(bào)錯(cuò)原因及分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05

