欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

相關(guān)文章

  • Java編程實(shí)現(xiàn)非對(duì)稱加密的方法詳解

    Java編程實(shí)現(xiàn)非對(duì)稱加密的方法詳解

    這篇文章主要介紹了Java編程實(shí)現(xiàn)非對(duì)稱加密的方法,簡(jiǎn)單講述了非對(duì)稱加密的概念、原理,并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)DH加密解密、RSA加密解密、ElGamal加密等具體操作技巧,需要的朋友可以參考下
    2017-08-08
  • 區(qū)分Java的方法覆蓋與變量覆蓋

    區(qū)分Java的方法覆蓋與變量覆蓋

    作為初學(xué)者2個(gè)比較容易出錯(cuò)的定義,方法覆蓋和變量覆蓋。下面我們一起來看看作者如何去探討Java的方法覆蓋和變量覆蓋。
    2015-09-09
  • Java 使用Socket正確讀取數(shù)據(jù)姿勢(shì)

    Java 使用Socket正確讀取數(shù)據(jù)姿勢(shì)

    這篇文章主要介紹了Java 使用Socket正確讀取數(shù)據(jù)姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java入門教程--帶包的類如何編譯與運(yùn)行

    Java入門教程--帶包的類如何編譯與運(yùn)行

    我們一般都是通過IDE(如Eclipse、Intellij Idea,STS等)來開發(fā),調(diào)試java項(xiàng)目。在不借助IDE的情況下,如何編譯、運(yùn)行Java程序。打包編譯時(shí),會(huì)自動(dòng)創(chuàng)建包目錄,不需要自己新建包名文件夾。
    2022-12-12
  • java 多線程與并發(fā)之volatile詳解分析

    java 多線程與并發(fā)之volatile詳解分析

    volatile這個(gè)關(guān)鍵字可能很多朋友都聽說過,或許也都用過。在Java 5之前,它是一個(gè)備受爭(zhēng)議的關(guān)鍵字,因?yàn)樵诔绦蛑惺褂盟鶗?huì)導(dǎo)致出人意料的結(jié)果。在Java 5之后,volatile關(guān)鍵字才得以重獲生機(jī)
    2021-11-11
  • 詳解Spring Boot中整合Sharding-JDBC讀寫分離示例

    詳解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)景

    本文主要介紹了淺談Java中@Autowired和@Inject注解的區(qū)別和使用場(chǎng)景,@Autowired注解在依賴查找方式和注入方式上更加靈活,適用于Spring框架中的依賴注入,而@Inject注解在依賴查找方式上更加嚴(yán)格,適用于Java的依賴注入標(biāo)準(zhǔn),感興趣的可以了解一下
    2023-11-11
  • 吊打Java面試官!整理了一周的Spring面試大全(附答案)

    吊打Java面試官!整理了一周的Spring面試大全(附答案)

    這篇文章主要介紹了Spring面試資料(附答案)建議收藏留存,學(xué)Java的小伙伴都知道Spring是面試的必問環(huán)節(jié),看完了一天就可掌握數(shù)據(jù)結(jié)構(gòu)和算法的面試題,快來看看吧
    2021-08-08
  • Java如何提供給第三方使用接口方法詳解

    Java如何提供給第三方使用接口方法詳解

    最近在做一個(gè)項(xiàng)目,因一些機(jī)制問題,需要我用java代碼調(diào)用第三方接口,下面這篇文章主要給大家介紹了關(guān)于Java如何提供給第三方使用接口方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • java如何用遞歸生成樹形結(jié)構(gòu)

    java如何用遞歸生成樹形結(jié)構(gòu)

    作者分享了自己在使用腳本之家資源進(jìn)行編程時(shí)的經(jīng)驗(yàn),包括準(zhǔn)備實(shí)體對(duì)象、測(cè)試數(shù)據(jù)、構(gòu)造樹形結(jié)構(gòu)遞歸函數(shù)、測(cè)試以及輸出結(jié)果等步驟,作者希望這些經(jīng)驗(yàn)?zāi)軐?duì)大家有所幫助,并鼓勵(lì)大家支持腳本之家
    2025-03-03

最新評(píng)論