上一篇:https://blog.csdn.net/fengxianaa/article/details/124390653
存储地理位置信息,并对存储的信息进行操作,可以用来查找附近的商铺,人员等。
1. 主要命令
- geoadd:添加地理坐标,返回添加成功的元素个数
-
- geopos:获取指定地点的经纬度
- 下图,返回 北京 上海的经纬度,因为没有南京的经纬度,所以返回 nil
-
- 下图,返回 北京 上海的经纬度,因为没有南京的经纬度,所以返回 nil
- geodist:计算两个地点之间的距离,返回两点之间的距离,单位:米
-
- 下图,以km为单位返回
-
-
- georadius:给定的经纬度为中心点,获取指定范围内的地点集合
- 这个命令在 redis 6.2 之后的版本已经废弃,使用geosearch代替
- 天津的经纬度是:117.2,39.13,下图:查询天津周围200Km内的城市
-
- 在返回地点时, 与中心之间的距离也一并返回
-
- 将地点的经纬度也一并返回
-
- 从近到远的方式返回
-
- 也可以从远到近
-
-
- georadiusbymember:根据集合中的某个地点,获取指定范围内的地理位置集合
- 查询天津周围200Km内的城市
-
- 查询天津周围200Km内的城市
- geosearch:在指定范围内搜索地点,范围可以是圆形或者矩形
- 查询天津周围200Km内的城市
- 根据经纬度
-
- 根据集合中的元素
-
-
- 根据经纬度
- 查询天津周围200Km内的城市
2. java
更新maven依赖
<!-- 一个较高的版本才能用到新的API -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
</parent>
<!-- 去除老版本的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<artifactId>lettuce-core</artifactId>
<groupId>io.lettuce</groupId>
</exclusion>
<exclusion>
<artifactId>spring-data-redis</artifactId>
<groupId>org.springframework.data</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 使用新版本 -->
<dependency>
<artifactId>spring-data-redis</artifactId>
<groupId>org.springframework.data</groupId>
<version>2.6.2</version>
</dependency>
<dependency>
<artifactId>lettuce-core</artifactId>
<groupId>io.lettuce</groupId>
<version>6.1.6.RELEASE</version>
</dependency>
@Test
public void testGeo(){
// 查询天津2000km范围内的城市
GeoResults<RedisGeoCommands.GeoLocation<String>> city =
stringRedisTemplate.opsForGeo().search("city",
GeoReference.fromCoordinate(117.2, 39.13),//经纬度
new Distance(200, Metrics.KILOMETERS),// 范围
RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance());//返回距离
List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = city.getContent();
for(GeoResult<RedisGeoCommands.GeoLocation<String>> geo : content){
System.out.println(geo.getContent().getName());
System.out.println(geo.getDistance().toString());
}
}
常用方法
@Test
public void testGeo(){
//1. 添加元素:郑州
stringRedisTemplate.opsForGeo().add("city", new Point(112.43, 34.16), "zhengzhou");
// RedisGeoCommands.GeoLocation location =
// new RedisGeoCommands.GeoLocation("zhengzhou", new Point(112.43, 34.16));
// stringRedisTemplate.opsForGeo().add("city", location);
//2. 获取两点距离
Distance distance = stringRedisTemplate.opsForGeo()
.distance("city", "tianjin", "shanghai", Metrics.KILOMETERS);
System.out.println(distance.getNormalizedValue());
//3. 查询
GeoResults<RedisGeoCommands.GeoLocation<String>> result =
stringRedisTemplate.opsForGeo().radius("city", "tianjin",
new Distance(20000, Metrics.KILOMETERS),
RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance());
for(GeoResult<RedisGeoCommands.GeoLocation<String>> geo : result){
System.out.println(geo.getContent().getName());
System.out.println(geo.getDistance().toString());
}
}