文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用redis实现附近的人功能

2024-04-02 19:55

关注

前言

Redis自3.2版本开始提供了GEO(geograph)功能,支持地理位置相关操作,以实现诸如附近的人这类依赖于地理位置信息的功能。

工具

百度经纬度拾取器

拾取坐标系统

一、测试数据

120.70012 28.00135 温州
120.207686 30.253359 杭州
121.482537 31.238034 上海
118.793117 32.068407 南京

二、基本命令

1. geoadd

为了进行地理位置相关操作,我们首先需要将具体的地理位置记录起来,可以通过执行geoadd 命令来完成 命令格式如下


GEOADD 集合名称 经度 纬度 名称 [longitude latitude name...]
//添加集合
geoadd citys 120.70012 28.00135 wenzhou 120.207686 30.253359 hanghzou

查看已添加集合

2.geopos

此命令根据输入的位置名称获取位置的信息坐标,语法如下


GEOPOS 集合名称 位置 [name...]
geopos address wuyue

查看坐标信息

3.geodist

此命令用于计算两个位置之间的距离,语法如下


geodist 集合名称 位置1 位置2 [unit]
//计算杭州到南京之间的距离
geodist citys hanghzredis:0>ou nanjing km

可选参数:unit用于指定计算距离时的单位,他的值可以是以下单位的其中一个

m :表示米

km:表示千米

mi:表示英里

ft:表示英尺。

4.georadius

georadius使用用户给定的经纬度作为计算范围时的中心点,


georadius 集合名称 精度 纬度 radius m|km|ft|mi| [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]
//查询据我100km之内的城市
georadius citys 120.754274 27.983296 100 km

radius:距离

WITHCOORD:返回坐标

由于版本原因可能为空

WITHDIST:同时返回距离

ASC|DESC:排序

count:取多少长度

5. georadiusbymember

georadiusbymember使用存储在位置集合里的某个地点作为中心点


georadiusbymember 地址集合 地点名称 距离 单位
//查询距离wuyue五公里之内的地点
georadiusbymember address wuyue 5 km

三、javaApi

实体类


package com.jiale.web.controller.pojo;
 
import lombok.Data;
 
import java.io.Serializable;
 

@Data
public class AddressInfo implements Serializable {
 
    
    private String title;
    
    private String address;
    
    private String phone;
    
    private double x;
    
    private double y;
}

package com.jiale;
 
import com.jiale.common.config.JialeGlobal;
import com.jiale.web.controller.pojo.AddressInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.geo.*;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
 
import java.math.BigDecimal;
import java.util.List;
 
 

@SpringBootTest
public class JialeTests {
 
    @Autowired
    RedisTemplate redisTemplate;
 
   @Test
    public void test1(){
        System.out.println(JialeGlobal.getUploadPath());
    }
 
    
    @Test
    public void geoAdd(){
        //1.网点位置信息存储120.653208,28.032606
        Point point = new Point(120.653208, 28.032606);
        redisTemplate.boundGeoOps("outlets").add(point,"江心屿");
        //2.网点详细信息
        AddressInfo addressInfo = new AddressInfo();
        addressInfo.setTitle("江心屿");
        addressInfo.setAddress("浙江省温州市鹿城区江心屿景区内");
        addressInfo.setPhone("(0577)88201281");
        addressInfo.setX(120.653208);
        addressInfo.setY(28.032606);
        redisTemplate.boundHashOps("outletsInfo").put("江心屿",addressInfo);
    }
 
    
    @Test
    public  void geoPos(){
        //传入位置名称查询位置信息
        List<Point> position = redisTemplate.boundGeoOps("outlets").position("南塘五组团");
        for (Point point : position) {
            System.out.println(point);
        }
    }
 
    
    @Test
    public void geoDist(){
        
        //以km展示
        
 
        //保留两位小数
        Distance distance = redisTemplate.boundGeoOps("outlets").distance("江心屿", "温州乐园", Metrics.KILOMETERS);
        //距离
        double value = distance.getValue();
        //单位
        String unit = distance.getUnit();
        System.out.println("两点相距:"+new BigDecimal(value).setScale(2,BigDecimal.ROUND_HALF_UP) +unit);
    }
 
    
    @Test
    public  void geoRadius(){
        //指定位置
        Point point = new Point(120.754274,  27.983296);
        //构建条件-10km
        Distance distance = new Distance(10, Metrics.KILOMETERS);
        Circle circle = new Circle(point,distance);
        //RedisGeoCommands
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
         //包含位置信息
        args.includeDistance();
 
        //存放的是查询到的网址位置信息
        GeoResults<RedisGeoCommands.GeoLocation<String>> outlets = redisTemplate.boundGeoOps("outlets").radius(circle, args);
        for (GeoResult<RedisGeoCommands.GeoLocation<String>> outlet : outlets) {
            //获取距离信息
            Distance outletDistance = outlet.getDistance();
            //距离
            double value = outletDistance.getValue();
            //单位
            String unit = outletDistance.getUnit();
            System.out.println("当前坐标距离:"+outlet.getContent().getName()+value+unit);
        }
    }
 
    
    @Test
    public void geoRadiusByMember(){
        //构建条件
        Distance distance = new Distance(10, Metrics.KILOMETERS);
        //构建条件-包含位置信息
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
        args.includeDistance();
        //参数  key   构建的条件  其他条件
        GeoResults<RedisGeoCommands.GeoLocation<String>> outlets = redisTemplate.boundGeoOps("outlets").radius("江心屿", distance,args);
        for (GeoResult<RedisGeoCommands.GeoLocation<String>> outlet : outlets) {
            //获取距离信息
            Distance outletDistance = outlet.getDistance();
            //距离
            double value = outletDistance.getValue();
            //单位
            String unit = outletDistance.getUnit();
            System.out.println("江心屿距离:"+outlet.getContent().getName()+value+unit);
        }
    }
}

到此这篇关于使用redis实现附近的人的文章就介绍到这了,更多相关redis实现附近的人内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯