Java整合Redis實現坐標附近查詢功能
更新時間:2023年11月15日 10:56:49 作者:于京京9909
這篇文章主要介紹了Java整合Redis實現坐標附近查詢,我們可以在redis服務器使用命令 help xxx 查看指令的具體用法,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
一、GEO用法引入
- GEO,全稱Geolocation,代表地理坐標。可以在其中存儲地理坐標信息,幫助我們根據經緯度來檢索數據。常見的命令有:
- GEOADD:添加一個或多個地理空間信息,包含:經度(longitude)、緯度(latitude)、值(member)
- GEODIST:計算指定的兩個點之間的距離并返回
- GEOHASH:將指定member的坐標轉為hash字符串形式并返回
- GEOPOS:返回指定member的坐標
- GEORADIUS:指定圓心、半徑,找到該圓內包含的所有member,并按照與圓心之間的距離排序后返回。(6.2以后已廢棄)
- GEOSEARCH:在指定范圍內搜索member,并按照與指定點之間的距離排序后返回。范圍可以是圓形或矩形。(6.2以后新命令)
- GEOSEARCHSTORE:與GEOSEARCH功能一致,不過可以把結果存儲到一個指定的key。(6.2以后新命令)
我們可以在redis服務器使用命令 help xxx 查看指令的具體用法~
二、引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>三、實體類
1.返回實體
@Data
public class Geo<T> {
private T object;
private double distance;
}2.添加的商戶信息
@Data
@ApiModel("商戶信息DO")
public class CommercialDO implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
/**
* id
*/
private Integer id;
/**
* 商戶名稱
*/
private String name;
/**
* 商戶類型
*/
private String commercialType;
/**
* 門店名稱
*/
private String storeName;
/**
* 商戶地址
*/
private String address;
/**
* 項目code
*/
private String itemCode;
/**
* 經度
*/
private String longitude;
/**
* 緯度
*/
private String latitude;
}四、添加位置信息
@ApiOperation("geo測試添加位置信息")
@GetMapping("/geo/add")
public String geoAdd(String key, double longitude, double latitude, CommercialDO commercialDO) throws Exception {
redisUtils.geoAdd(key, longitude, latitude, commercialDO);
return "添加成功";
} public void geoAdd(String key, double longitude, double latitude, Object object) {
redisTemplate.boundGeoOps(key).add(new Point(longitude, latitude),object);
}五、查詢位置信息
/**
* 根據經緯度獲取指定距離范圍內的地理位置信息
*
* @param key Redis中Geo操作的key
* @param longitude 經度
* @param latitude 緯度
* @param distance 距離范圍(單位:米)
* @param limit 限制返回結果的數量
* @param searchName 地點名稱(可選)
* @return 返回地理位置信息的列表
*/
public List<Geo<T>> getNearbyByGeo(String key, double longitude, double latitude, int distance, int limit, String searchName) {
List<Geo<T>> geos = new ArrayList<>();
BoundGeoOperations boundGeoOperations = redisTemplate.boundGeoOps(key);
Point point = new Point(longitude, latitude);
Circle within = new Circle(point, distance);
RedisGeoCommands.GeoRadiusCommandArgs geoRadiusArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
geoRadiusArgs = geoRadiusArgs.includeDistance();
geoRadiusArgs.limit(limit);
geoRadiusArgs.sortAscending();
GeoResults<RedisGeoCommands.GeoLocation<Object>> geoResults = boundGeoOperations.radius(within, geoRadiusArgs);
List<GeoResult<RedisGeoCommands.GeoLocation<Object>>> geoResultList = geoResults.getContent();
if (StringUtils.isNotBlank(searchName)) {
geoResultList = geoResults.getContent()
.stream()
.filter(result -> result.getContent().getName().toString().contains(searchName))
.collect(Collectors.toList());
}
Geo geo;
for (GeoResult<RedisGeoCommands.GeoLocation<Object>> geoResult : geoResultList) {
geo = new Geo();
geo.setObject(geoResult.getContent());
geo.setDistance(geoResult.getDistance().getValue());
geos.add(geo);
}
return geos;
}結果:會根據距離自動排序,傳遞名稱則模糊查詢

到此這篇關于Java整合Redis實現坐標附近查詢的文章就介紹到這了,更多相關Java整合Redis坐標附近查詢內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
相關文章
Java數據結構及算法實例:快速計算二進制數中1的個數(Fast Bit Counting)
這篇文章主要介紹了Java數據結構及算法實例:快速計算二進制數中1的個數(Fast Bit Counting),本文直接給出實現代碼,代碼中包含詳細注釋,需要的朋友可以參考下2015-06-06
SpringBoot中TransactionTemplate事務管理的實現
Spring Boot提供了多種方式來管理事務,其中之一是使用TransactionTemplate,本文主要介紹了SpringBoot中TransactionTemplate事務管理的實現,具有一定的參考價值,感興趣的可以了解一下2024-04-04
SpringBoot MainApplication類文件的位置詳解
這篇文章主要介紹了SpringBoot MainApplication類文件的位置詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
利用Spring?boot+LogBack+MDC實現鏈路追蹤
這篇文章主要介紹了利用Spring?boot+LogBack+MDC實現鏈路追蹤,MDC?可以看成是一個與當前線程綁定的哈希表,可以往其中添加鍵值對,下文詳細介紹需要的小伙伴可以參考一下2022-04-04

