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

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相關命令操作

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)容,即不允許重復的成員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相關命令后,我們便可以輕松地來計算兩個經(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("中鐵設計大廈", 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相差無幾。

到此這篇關于Java-使用Redis GEO測算經(jīng)緯度距離的文章就介紹到這了,更多相關redis計算經(jīng)緯度距離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

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

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

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

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

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

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

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

    Java入門教程--帶包的類如何編譯與運行

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

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

    volatile這個關鍵字可能很多朋友都聽說過,或許也都用過。在Java 5之前,它是一個備受爭議的關鍵字,因為在程序中使用它往往會導致出人意料的結果。在Java 5之后,volatile關鍵字才得以重獲生機
    2021-11-11
  • 詳解Spring Boot中整合Sharding-JDBC讀寫分離示例

    詳解Spring Boot中整合Sharding-JDBC讀寫分離示例

    這篇文章主要介紹了詳解Spring Boot中整合Sharding-JDBC讀寫分離示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • 淺談Java中@Autowired和@Inject注解的區(qū)別和使用場景

    淺談Java中@Autowired和@Inject注解的區(qū)別和使用場景

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

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

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

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

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

    java如何用遞歸生成樹形結構

    作者分享了自己在使用腳本之家資源進行編程時的經(jīng)驗,包括準備實體對象、測試數(shù)據(jù)、構造樹形結構遞歸函數(shù)、測試以及輸出結果等步驟,作者希望這些經(jīng)驗能對大家有所幫助,并鼓勵大家支持腳本之家
    2025-03-03

最新評論