基于redis的位置信息计算(经纬度)

本文详细介绍了如何使用Redis进行地理空间数据的操作,包括经纬度信息的写入、查询指定位置的经纬度、计算两点间距离及查找指定半径内的元素等关键功能。通过具体示例展示了georadius、georadiusbymember、geoadd、geopos和geodist等命令的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[redis版本 >= 3.2]

写入经纬度信息

geoadd key longitude latitude member [longitude latitude member ...]

示例

将l1的位置信息写入location中
geoadd location 120.0742 30.2904 l1

将l2的位置信息写入location中
geoadd location 121.0742 31.2904 l2

查询指定key的经纬度

geopos key member [member ...]

示例

获取location中l1的位置
geopos location l1

输出

1) 1) "120.07420152425765991"
   2) "30.29040071848131532"

计算两个位置之间的举例

geodist key member1 member2 [unit]

返回两个地方的距离,可以指定单位,比如米m(默认),千米km,英里mi,英尺ft

示例

计算l1 l2之间的距离
geodist location l1 l2

输出

"146629.3499"

计算l1 l2之间的距离 km
geodist location l1 l2 km

输出

"146.6293"

中心点指定半径内的元素

指定中心置为坐标
georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

给定的位置元素
georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

参数

  • WITHDIST 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致
  • WITHCOORD 将位置元素的经度和维度也一并返回
  • WITHHASH 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大
  • COUNT 需要返回的元素数量
  • ASC 根据中心的位置, 按照从近到远的方式返回位置元素
  • DESC 根据中心的位置, 按照从远到近的方式返回位置元素

示例

获取location中以 120.0012 30.2321 为中心半径200km内的元素 返回距离和位置信息 按距离升序 取5条
georadius location 120.0012 30.2321 200 km WITHDIST WITHCOORD ASC COUNT 5

输出

1) 1) "l1"
   2) "9.5517"
   3) 1) "120.07420152425765991"
      2) "30.29040071848131532"
2) 1) "l2"
   2) "156.1170"
   3) 1) "121.07419878244400024"
      2) "31.29039891026372544"

georadiusbymember location l1 200 km WITHDIST WITHCOORD ASC COUNT 5

输出

1) 1) "l1"
   2) "0.0000"
   3) 1) "120.07420152425765991"
      2) "30.29040071848131532"
2) 1) "l2"
   2) "146.6293"
   3) 1) "121.07419878244400024"
      2) "31.29039891026372544"

删除location中的指定袁术

zrem key member [member ...]

示例
删除location中的l3元素
zrem location l3

### 使用 QueryWrapper 计算经纬度 在 MyBatis-Plus 中,`QueryWrapper` 是用于构建查询条件的一个工具类。虽然它本身并不直接支持复杂的地理空间计算(如基于经纬度的距离计算),但可以通过 SQL 的方式实现这一功能。 以下是通过 `QueryWrapper` 实现经纬度距离计算的具体方法: #### 背景说明 为了计算两个地点之间的距离,可以使用 Haversine 公式[^3] 或其他类似的地理空间算法。Haversine 公式是一种常用的球面三角学公式,能够根据两点的经纬度计算它们之间的大圆距离。 假设数据库表结构如下: | 字段名 | 类型 | 描述 | |-------------|--------------|------------| | id | INT | 主键 | | name | VARCHAR(255)| 商户名称 | | longitude | DOUBLE | 经度 | | latitude | DOUBLE | 纬度 | 目标是从数据库中筛选出离指定坐标最近的记录。 --- #### 示例代码 以下是一个完整的示例代码片段,展示如何利用 `QueryWrapper` 和自定义 SQL 来完成经纬度距离计算: ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import java.util.List; public List<Shop> findNearbyShops(double userLongitude, double userLatitude, double maxDistanceKm) { // 地球半径 (单位: 千米) final double EARTH_RADIUS_KM = 6371.0; // 创建 QueryWrapper 对象 QueryWrapper<Shop> queryWrapper = new QueryWrapper<>(); // 构建 SQL 查询语句,嵌入 Haversine 公式 queryWrapper.apply( " acos(sin(radians({0})) * sin(radians(latitude)) + cos(radians({0})) * cos(radians(latitude)) * cos(radians(longitude) - radians({1}))) * {2} <= {3}", userLatitude, userLongitude, EARTH_RADIUS_KM, maxDistanceKm); // 执行查询并返回结果 return shopMapper.selectList(queryWrapper); } ``` --- #### 参数解释 1. **userLongitude**: 用户当前所在的经度。 2. **userLatitude**: 用户当前所在的纬度。 3. **maxDistanceKm**: 可接受的最大距离范围(单位:千米)。 4. **EARTH_RADIUS_KM**: 地球平均半径,默认为 6371 千米。 --- #### 关键点分析 - 上述代码中的 `apply()` 方法允许我们向 `QueryWrapper` 添加原生 SQL 片段。 - Haversine 公式的具体形式被嵌套到了 SQL 查询中,从而实现了动态计算。 - 数据库字段 `longitude` 和 `latitude` 需要与实际表结构调整一致。 --- #### 注意事项 1. 如果数据库不支持复杂函数运算,则可能需要先提取数据再进行本地处理。 2. 性能优化建议:对于大规模数据集,考虑使用 Redis Geo 命令或其他专用的空间索引技术来加速查询[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值