【Redis】利用redis轻松处理经纬度坐标点数据

Redis 3.2 之后,支持地理坐标数据的管理。将给定的坐标元素(纬度、经度、名字)添加到指定的键里面。 这些数据就会以有序集合的形式被储, 可以通过GEORADIUS 计算两个坐标点的距离,或者使用GEORADIUS GEORADIUSBYMEMBER查询某个坐标半径内的数据。下面对其中常用的命令进行一个简单的介绍。

1. GEOADD

将坐标信息添加到指定的键里面。

 GEOADD key longitude latitude member [longitude latitude member ...]

longitude:坐标点经度,有效值[ -180,180 ]

latitude:坐标点纬度,有效值[ -85.05112878, 85.05112878 ]

示例:

127.0.0.1:6379> geoadd parks 116.300892 40.009462 yuanmingyuan
(integer) 1
127.0.0.1:6379>  geoadd parks 116.188797 39.990132 xiangshan 116.255916 40.030233 baiwangshan
(integer) 2

127.0.0.1:6379> GEOADD parks 110 89.9 nanji
(error) ERR invalid longitude,latitude pa
### 使用 Java 和 Redis 进行经纬度距离计算 在 Java 应用程序中使用 Redis 计算两个地理坐标的距离可以通过 `Jedis` 或者 Spring Data Redis 提供的 API 来完成。下面是一个具体的例子,展示如何通过 Redis 的 GEO 命令集来执行这项操作。 #### 添加依赖项 为了能够连接并操作 Redis 数据库,在项目里需要引入相应的 Maven 依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` #### 配置 Redis 模板 配置好用于访问 Redis 的模板对象以便后续调用其提供的各种方法: ```java @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){ RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } ``` #### 执行距离计算 定义一个服务类的方法来进行实际的距离测量工作。该函数接收三个参数——键名(代表存储位置信息的数据集合)、起始点名称以及终点名称,并返回两者间的直线距离(单位为公里)。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.geo.Distance; import org.springframework.data.redis.connection.RedisGeoCommands; import org.springframework.stereotype.Service; @Service public class DistanceCalculationService { @Autowired private RedisTemplate<String, String> redisTemplate; public Double calculateDistance(String key, String member1, String member2) { Distance distance = this.redisTemplate.opsForGeo().dist(key, member1, member2, RedisGeoCommands.DistanceUnit.KILOMETERS); if (distance != null) { return distance.getValue(); // 返回两地点间距离,单位:千米 } return -1d; // 如果无法获得有效结果,则返回负数表示错误 } } ``` 上述代码片段展示了如何利用 Spring Data Redis 封装好的接口轻松地实现了两地之间距离的查询[^4]。 #### 测试案例 假设已经向名为 `"locations"` 的 ZSET 中添加了一些带有经度纬度的位置成员,现在想要知道 "bjx"(北京西站) 到 "bjn"(北京南站) 大约有多远,就可以这样写测试逻辑: ```java @Test void testCalculateDistance(){ double distanceKm = service.calculateDistance("g1", "bjx", "bjn"); System.out.println("The distance between Beijing West and Beijing South is approximately "+distanceKm+" kilometers."); } ``` 这段简单的单元测试将会打印出从北京西至北京南的大致路程长度[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值