Java整合Redis实现坐标附近查询

目录

一、GEO用法引入

二、引入依赖

三、实体类

四、添加位置信息

五、查询位置信息


一、GEO用法引入

  1. GEO,全称Geolocation,代表地理坐标。可以在其中存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有:
  2. GEOADD:添加一个或多个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)
  3. GEODIST:计算指定的两个点之间的距离并返回
  4. GEOHASH:将指定member的坐标转为hash字符串形式并返回
  5. GEOPOS:返回指定member的坐标
  6. GEORADIUS:指定圆心、半径,找到该圆内包含的所有member,并按照与圆心之间的距离排序后返回。(6.2以后已废弃)
  7. GEOSEARCH:在指定范围内搜索member,并按照与指定点之间的距离排序后返回。范围可以是圆形或矩形。(6.2以后新命令)
  8. 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;
    }

 结果:会根据距离自动排序,传递名称则模糊查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/141516.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数列计算

题目描述 有一列数是 : 请找出这个数列的规律&#xff0c;编写程序计算并输出这个数列的第项&#xff0c;要求是分数形式&#xff0c;并计算这个数列的前项和 ( 结果四舍五入保留两位小数 ) 输入格式 第一行仅有一个正整数 &#xff08;) 。 输出格式 共有 行&#xff0c;第一…

5+干湿结合的佳作,可另外添加分析升级

今天给同学们分享一篇生信文章“PCTAIRE Protein Kinase 1 (PCTK1) Suppresses Proliferation, Stemness,and Chemoresistance in Colorectal Cancer through the BMPR1B-Smad1/5/8 Signaling Pathway”&#xff0c;这篇文章发表在Int J Mol Sci期刊上&#xff0c;影响因子为5.…

Web APIs——综合案例学生就业统计表

1、学生就业统计表 2、渲染业务 根据持久化数据渲染页面 步骤&#xff1a; ①&#xff1a;读取localstorage本地数据 如果有数据则转换为对象放到变量里面一会使用它渲染页面如果没有则用默认空数组[]为了测试效果&#xff0c;可以先把initData存入本地存储看效果 ②&…

Monarch Mixer: A Simple Sub-Quadratic GEMM-Based Architecture

Monarch Mixer: A Simple Sub-Quadratic GEMM-Based Architecture 发于 2023年AI顶会 NeurIPS。 sub-quadratic primitive(次二次原语) GEMMs&#xff08;General Matrix Multiply algorithms&#xff09;是指在许多核心系统上执行的通用矩阵乘法操作的模型。 “causal model…

idea2023启动springboot项目如何指定配置文件

方法一&#xff1a; 方法二&#xff1a; 举例&#xff1a;

blockly编程简介

blockly编程简介 blockly是google发布的可视化编程工具&#xff0c;基于web技术构建。 在功能/设计上和MIT的儿童编程语言Scratch类似&#xff0c;采用可视化搭积木编程方式。 可以将基于block程序转化为基于普通文本的常规代码&#xff08;如JavaScript、Python等&#xff…

基于flask+bootstrap4实现的注重创作的轻博客系统项目源码

一个注重创作的轻博客系统 作为一名技术人员一定要有自己的博客&#xff0c;用来记录平时技术上遇到的问题&#xff0c;把技术分享出去就像滚雪球一样会越來越大&#xff0c;于是我在何三博客的基础上开发了[l4blog]&#xff0c;一个使用python开发的轻量博客系统&#xff0c;…

echarts饼图label显示不全原因?

echarts饼图label显示不全原因&#xff1f; 标签数量过多&#xff1a;当饼图的扇形数量较多时&#xff0c;为了保证图形的清晰性&#xff0c;ECharts 可能不会显示所有的标签&#xff0c;而是选择显示部分标签或者不显示标签。标签过长&#xff1a;如果标签的文字过长&#xf…

问卷调查表单、表设计

一、DWSurvey实现&#xff1a; 参考文档&#xff1a;快速入门 | 调问开源问卷系统 管理员通过拖拽题型生成表单&#xff0c; 点击保存&#xff0c;预览&#xff0c;发布问卷。用户根据预览的地址&#xff0c;填写问卷提交。管理员可以在我的问卷里看到答卷情况。 关于数据存…

如何使用iPhone邮件客户端管理QQ邮箱?

如何使用iPhone邮件客户端管理QQ邮箱&#xff1f; 解决方案 之前按照QQ邮箱的提示&#xff0c;一直配置失败 解决方案 需要POP3/IMAP/SMTP/Exchange/CardDAV 授权码 然后登陆密码就是授权码 参考文章&#xff1a;参考

三国杀中的概率学问题3——王荣

前言 本文是三国杀中的概率学问题系列文章中的一篇&#xff0c;将详细讨论王荣吉占的期望摸牌数问题。并加上连续情形作为拓展。 值得说明的是&#xff0c;本文的思路受到了一篇文章的启发&#xff0c;在此特别鸣谢&#xff0c;这是文章的链接。 王荣吉占的期望摸牌数 王荣的…

Node.js 框架 star 星数量排名——NestJs跃居第二

文章目录 什么是NodeJs?什么是NodeJs框架?图表数据框架排名 什么是NodeJs? Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;它使得我们可以在服务器端使用JavaScript开发高效、可扩展的应用程序。作为一个快速、轻量级的平台&#xff0c;Node.js在Web开发领…

贪吃蛇和俄罗斯方块

贪吃蛇 一、创建新项目 创建一个新的项目&#xff0c;并命名。 创建一个名为images的文件夹用来存放游戏相关图片。 然后再在项目的src文件下创建一个com.xxx.view的包用来存放所有的图形界面类&#xff0c; 创建一个com.xxx.controller的包用来存放启动的入口类(控制类) …

Clickhouse学习笔记(14)—— Clickhouse监控

ClickHouse 运行时会将一些个自身的运行状态记录到众多系统表中&#xff0c;如下所示&#xff1a; 为了直观方便地监控ck的运行情况&#xff0c;使用Prometheus Grafana 的组合来进行监控 Prometheus 负责收集各类系统的运行指标&#xff1b;Grafana 负责可视化 Prometheus&a…

ASD光谱仪使用

ASD光谱仪使用 光谱仪机器和电脑用来实时查看光谱曲线&#xff0c;以及控制光谱仪采集的时间、条数等各项参数。 在采集时&#xff0c;需要面向太阳&#xff0c;将待测的对象完全暴露于阳光下&#xff08;下图站位是错误的挡住光线了&#xff09;。探头放置于对象正上方50cm处…

Android launchWhenXXX 和 repeatOnLifecycle

文章目录 Android launchWhenXXX 和 repeatOnLifecyclelifecycleScope和viewModelScopelaunchWhenXXXrepeatOnLifecycleflowWithLifecycle总结 Android launchWhenXXX 和 repeatOnLifecycle lifecycleScope和viewModelScope LiveData优点&#xff1a; 避免内存泄露风险&…

小程序中如何设置多门店/多人/多商品价格库存等复杂场景设置

有些商家希望打造小程序平台&#xff0c;在这个平台上有多个商家入驻&#xff0c;他们分别售卖自己的商品。而有些商家有多个连锁店&#xff0c;连锁店的商品都是一样的&#xff0c;但不同的连锁店有不同的库存和价格。这些业务在采云小程序中是怎么支持的呢&#xff1f;下面具…

2023数字科技生态展,移远通信解锁新成就

11月10日&#xff0c;以“数字科技&#xff0c;焕新启航”为主题的中国电信2023数字科技生态大会暨2023数字科技生态展在广州盛大启幕。作为物联网行业的龙头标杆&#xff0c;同时更与中国电信连续多年维持稳定友好的合作关系&#xff0c;移远通信受邀参加本次展会。 在本次展会…

CSRF和XSS漏洞结合实战案例

文章目录 CSRF和XSS漏洞结合实战案例实验原理实验步骤信息收集构造CSRF和XSS代码xss注入 CSRF和XSS漏洞结合实战案例 实验环境为csm 实验原理 攻击者利用JavaScript可以构造请求的功能在留言面板构造一个存储型xss注入&#xff0c;里面的内容为js请求。请求新添加用户&…

行业寒冬下,给软件测试工程师or功能测试的一些建议

​行业寒冬下&#xff0c;给软件测试工程师的一些建议 【文章末尾给大家留下了大量的福利】 国内的互联网行业发展较快&#xff0c;所以造成了技术研发类员工工作强度比较大&#xff0c;同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高&#xff0c;超过…