最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中如何使用Redis GEO測算經(jīng)緯度距離

 更新時間:2023年11月21日 11:28:12   作者:www.Rui  
GEO也是Redis中提供的一種數(shù)據(jù)類型,可以將其理解成ZSet有序集合類型,本文給大家介紹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坐標。

GEO與ZSET相同,多次添加相同的成員KEY,將會覆蓋以前的內(nèi)容,即不允許重復(fù)的成員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相關(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 標識
     * @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("中鐵設(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)文章

  • SpringBoot在 POM 中引入本地 JAR 包的方法

    SpringBoot在 POM 中引入本地 JAR 包的方法

    在開發(fā) Spring Boot 應(yīng)用程序時,您可能需要使用本地 JAR 包來添加自定義庫或功能,本文將介紹在 Spring Boot 項目的 POM 文件中如何引入本地 JAR 包,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • java狀態(tài)機方案解決訂單狀態(tài)扭轉(zhuǎn)示例詳解

    java狀態(tài)機方案解決訂單狀態(tài)扭轉(zhuǎn)示例詳解

    這篇文章主要為大家介紹了java狀態(tài)機方案解決訂單狀態(tài)扭轉(zhuǎn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • JavaWeb dbutils執(zhí)行sql命令并遍歷結(jié)果集時不能查到內(nèi)容的原因分析

    JavaWeb dbutils執(zhí)行sql命令并遍歷結(jié)果集時不能查到內(nèi)容的原因分析

    這篇文章主要介紹了JavaWeb dbutils執(zhí)行sql命令并遍歷結(jié)果集時不能查到內(nèi)容的原因分析及簡單處理方法,文中給大家介紹了javaweb中dbutils的使用,需要的朋友可以參考下
    2017-12-12
  • Java中的JVM虛擬機內(nèi)存分配詳解

    Java中的JVM虛擬機內(nèi)存分配詳解

    這篇文章主要介紹了Java中的JVM虛擬機內(nèi)存分配詳解,虛擬機是一種能夠執(zhí)行 Java 字節(jié)碼的虛擬機,它是 Java 語言的核心組成部分,負責將 Java 代碼轉(zhuǎn)換為機器碼并執(zhí)行,JVM 提供了內(nèi)存管理、垃圾回收、線程管理等功能,需要的朋友可以參考下
    2023-10-10
  • Java如何基于反射機制獲取不同的類

    Java如何基于反射機制獲取不同的類

    這篇文章主要介紹了Java如何基于反射機制獲取不同的類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Spring AOP注解案例及基本原理詳解

    Spring AOP注解案例及基本原理詳解

    這篇文章主要介紹了Spring AOP注解案例及基本原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • java操作hdfs的方法示例代碼

    java操作hdfs的方法示例代碼

    這篇文章主要介紹了java操作hdfs的相關(guān)資料,在本地配置Hadoop和Maven的環(huán)境變量,首先需從官網(wǎng)下載與服務(wù)器相同版本的Hadoop安裝包,配置環(huán)境變量后,引入Maven的配置文件,以便管理項目依賴,最后,編寫代碼實現(xiàn)對HDFS的連接和操作,完成數(shù)據(jù)的讀寫,需要的朋友可以參考下
    2022-02-02
  • Java Swing實現(xiàn)餐廳點餐系統(tǒng)源碼(收藏版)

    Java Swing實現(xiàn)餐廳點餐系統(tǒng)源碼(收藏版)

    這篇文章主要介紹了Java Swing實現(xiàn)餐廳點餐系統(tǒng)源碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • myBatis的mapper映射文件之批量處理方式

    myBatis的mapper映射文件之批量處理方式

    這篇文章主要介紹了myBatis的mapper映射文件之批量處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • springboot本地調(diào)試沒問題,打包運行報錯原因及分析

    springboot本地調(diào)試沒問題,打包運行報錯原因及分析

    這篇文章主要介紹了springboot本地調(diào)試沒問題,打包運行報錯原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評論

宁陵县| 隆林| 施甸县| 巴中市| 金堂县| 万载县| 中西区| 舒兰市| 遂平县| 琼中| 新竹县| 盘锦市| 宁阳县| 新兴县| 东莞市| 水富县| 商都县| 扬中市| 宁乡县| 长沙县| 逊克县| 晋江市| 大竹县| 大化| 上思县| 白沙| 汕尾市| 沐川县| 吉首市| 汝阳县| 马鞍山市| 临澧县| 武清区| 堆龙德庆县| 宁津县| 晋江市| 香格里拉县| 右玉县| 新和县| 弥渡县| 中超|