redis-RedisTemplate.opsForGeo 的geo地理位置及实现附近的人的功能

news2024/11/17 3:47:10

redis内部使用的是 zset 数据结构存储,如下

import cn.huawei.VideoApplication;
import cn.huawei.domain.Jingqu;
import cn.huawei.service.JingquService;
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.StringRedisTemplate;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;


@SpringBootTest(classes = VideoApplication.class)
public class Geo_test {

    @Autowired
    private JingquService jingquService;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    public static final String REDIS_KEY="funplace";

    /**
     * 添加一个或多个地理位置到指定的Geo键中
     */
    @Test
    public void test_0() {
        //mybatis-plus 查询出所有的景区数据
        List<Jingqu> list = jingquService.list();

        Stream<RedisGeoCommands.GeoLocation<String>> geoLocationStream = list.stream().map(
                jq -> {
                    return new RedisGeoCommands.GeoLocation<String>(
                            jq.getName(),
                            new Point(Double.valueOf(jq.getLongitude()), Double.valueOf(jq.getLatitude()))
                    );
                });
        List<RedisGeoCommands.GeoLocation<String>> jingquList = geoLocationStream.collect(Collectors.toList());

        Long resultCount = stringRedisTemplate.opsForGeo().add(REDIS_KEY, jingquList);
        System.out.println(resultCount);
    }

    /**
     * 通过经纬度查找附近的景区,附近的5个景区,从近到远
     */
    @Test
    void test_1() {
        Circle circle = new Circle(116.404272, 39.906277, Metrics.KILOMETERS.getMultiplier());
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(5);
        GeoResults<RedisGeoCommands.GeoLocation<String>> byxy = stringRedisTemplate.opsForGeo().radius(REDIS_KEY, circle, args);
        byxy.forEach(geoResult -> {
            System.out.println(geoResult);
            System.out.println();
        });
    }

    /**
     * 通过 某个key,地方 查找附近3km的10个景区
     */
    @Test
    void test_2()
    {
        String k="天趣园";
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(10);
        GeoResults<RedisGeoCommands.GeoLocation<String>> radius = stringRedisTemplate.opsForGeo().radius(REDIS_KEY, k, new Distance(3, Metrics.KILOMETERS), args);
        radius.forEach(geoResult->{
            System.out.println(geoResult);
            System.out.println();
        });
    }

    /**
     * 计算两个成员之间的距离(默认以米为单位),距离单位可以是m、km、ml、ft,分别代表米、千米、英里和尺
     */
    @Test
    void test_3()
    {
        Distance distance = stringRedisTemplate.opsForGeo().distance(REDIS_KEY, "太子林", "五色门", RedisGeoCommands.DistanceUnit.KILOMETERS);
        System.out.println("distance = " + distance.getValue());
    }

    /**
     * 获取指定成员的地理位置 坐标
     */
    @Test
    void test_4()
    {
        //注意:GeoHash对二维经纬度坐标进行一维映射是有损的,通过映射再还原回的经纬度坐标和原始输入的经纬度坐标存在一定的误差。
        List<Point> position = stringRedisTemplate.opsForGeo().position(REDIS_KEY, "太子林", "五色门");
        position.forEach(p->{
            System.out.println(p);
            System.out.println();
        });
    }

    /**
     * 获取元素经纬度坐标经过geohash算法生成的base32编码值
     */
    @Test
    void test_5()
    {
        List<String> hash = stringRedisTemplate.opsForGeo().hash(REDIS_KEY, "太子林", "五色门");
        System.out.println(hash);
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java程序设计】【C00321】基于Springboot的在线租房和招聘平台(有论文)

基于Springboot的在线租房和招聘平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的在线租房和招聘平台&#xff0c;本系统有管理员、用户、房东以及公司四种角色&#xff1b; 管理员&#xff1a;首页、个人中心…

【DDD】学习笔记-领域驱动设计参考过程模型

通过领域驱动设计魔方&#xff0c;我们从业务、技术与管理三个维度引入了有助于领域驱动设计的方法和模式&#xff0c;同时梳理了影响领域驱动战略设计的架构因素&#xff0c;确定以“四个边界”为核心对领域逻辑进行控制&#xff0c;规定了领域驱动设计团队必须遵循的纪律&…

java常用环境docker安装

配置目录 rocketmqredismysql不配置binlog配置binlog Nacoszookeeper 本文为精简安装&#xff0c;部分不带容器卷映射&#xff0c;仅供以学习使用。 rocketmq nameservice docker run -d -p 9876:9876 --name rmqnamesrv rocketmqinc/rocketmq sh mqnamesrvbroker docker r…

小狐狸chat2.7.2免授权修复版可用版

小狐狸chat2.7.2免授权修复版可用版 在网络上面找了好几个版本不能使用&#xff0c;今天发布这个仔细测试正常使用 主要功能&#xff1a;独立版无限多开支持分销会员充值自己APP打包小程序万能创作MJ绘图多个国内接口 国外很火的ChatGPT&#xff0c;这是一种基于人工智能技术…

LNMP架构的源码编译环境下部署Discuz社区论坛与wordpress博客

目录 一、编译安装Nginx 1、关闭防火墙 2、安装依赖包 3、创建运行用户 4、解压软件包并编译安装 5、软链接路径优化 6、添加Nginx系统服务 二、编译安装Mysql服务 1、安装依赖环境以及源 2、创建运行用户 3、编译安装 4、修改配置文件 5、数据库目录进行权限调整…

Qt SQLite的创建和使用

重点&#xff1a; 1.SQLite创建数据库内容方法 链接&#xff1a;SQLite Expert Personal的简单使用-CSDN博客 2.和数据库进行链接方法 QSqlDatabase DB; //数据库连接bool MainWindow::openDatabase(QString aFile) {DBQSqlDatabase::addDatabase("QSQLITE"); /…

通过多进程并发方式(fork)实现服务器

以下内容为视频学习记录。 1、父进程accept后返回的文件描述符为cfd以及用于创建连接的lfd; 调用fork()创建子进程后&#xff0c;子进程继承cfd,lfd&#xff0c;通过该cfd与连接过来的客户端通信,lfd对子进程来说没用&#xff0c;可以直接close(lfd); 对于父进程来说&#x…

火灾安全护航:火灾监测报警摄像机助力建筑安全

火灾是建筑安全中最常见也最具破坏力的灾难之一&#xff0c;为了及时发现火灾、减少火灾造成的损失&#xff0c;火灾监测报警摄像机应运而生&#xff0c;成为建筑防火安全的重要技术装备。 火灾监测报警摄像机采用高清晰度摄像头和智能识别系统&#xff0c;能够全天候监测建筑内…

【Kafka系列 06】Kafka Producer源码解析

温馨提示&#xff1a;本文基于 Kafka 2.3.1 版本。 一、Kafka Producer 原理图 生产者的 API 使用还是比较简单&#xff0c;创建一个 ProducerRecord 对象&#xff08;这个对象包含目标主题和要发送的内容&#xff0c;当然还可以指定键以及分区&#xff09;&#xff0c;然后调…

3G 蜂窝移动通信

4 3G 蜂窝移动通信 第三代 (3G) 蜂窝移动通信系统 -1996 年正式标准名称&#xff1a;IMT-2000。 -工作在 2000 MHz 频段&#xff0c;数据率可达 2000 kbit/s&#xff08;固定站&#xff09;和 384 kbit/s&#xff08;移动站&#xff09;。 -包括中国通信标准化协会 CCSA (C…

云计算与边缘计算:有何不同?

公共云计算平台可以帮助企业充分利用全球服务器来增强其私有数据中心。这使得基础设施能够扩展到任何位置&#xff0c;并有助于计算资源的灵活扩展。混合公共-私有云为企业计算应用程序提供了强大的灵活性、价值和安全性。 然而&#xff0c;随着分布在全球各地的实时人工智能应…

Leetcode 第 385 场周赛题解

Leetcode 第 385 场周赛题解 Leetcode 第 385 场周赛题解题目1&#xff1a;3042. 统计前后缀下标对 I思路代码复杂度分析 题目2&#xff1a;3043. 最长公共前缀的长度思路代码复杂度分析 题目3&#xff1a;3044. 出现频率最高的质数思路代码复杂度分析 题目4&#xff1a;3045. …

【网络那些事】

【云计算】 云计算&#xff1a;把计算资源放在某个地方&#xff0c;并通过互联网暴露出来&#xff0c;让用户可以按需使用计算资源的方式&#xff0c;就是所谓的云计算 云计算的三种服务&#xff1a; 云平台专业名词 日常叫法 亚马逊云叫法 云服务器 ECS &#xff08;Elas…

鸿运(通天星CMSV6车载)主动安全监控云平台敏感信息泄露漏洞

文章目录 前言声明一、系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 鸿运主动安全监控云平台实现对计算资源、存储资源、网络资源、云应用服务进行7*24小时全时区、多地域、全方位、立体式、智能化的IT运维监控&#xff0c;保障IT系统安全、稳定、可靠运行…

Java多线程算法总结

1. 标题三个线程同时运行&#xff0c;依次打印ABC&#xff0c;一共打印10次 算法代码如下&#xff1a; public class ThreadTest {private Object oa new Object();private Object ob new Object();private Object oc new Object();private static final String TAG &quo…

Tomcat架构分析

Tomcat的核心组件 Tomcat将请求器和处理器分离&#xff0c;使用多种请求器支持不同的网络协议&#xff0c;而处理器只有一个。从而网络协议和容器解耦。 Tomcat的容器 Host&#xff1a;Tomcat提供多个域名的服务&#xff0c;其将每个域名都视为一个虚拟的主机&#xff0c;在…

面试笔记系列四之SpringBoot+SpringCloud基础知识点整理及常见面试题

什么是 Spring Boot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用 Spring 的难度&#xff0c;简省了繁重的配置&#xff0c;提供了各种启动器&#xff0c;开发者能快速上手。 Spring Boot 有哪…

Stable-Diffusion ubuntu服务器部署,报错解决方法(小白教程)

Stable Diffusion是一个深度学习模型&#xff0c;专注于生成高质量的图像。它由CompVis团队与Stability AI合作开发&#xff0c;并在2022年公开发布。这个模型使用文本提示&#xff08;text prompts&#xff09;生成详细、逼真的图像&#xff0c;是目前人工智能图像生成领域的一…

浅谈 Linux 网络编程 socket

文章目录 socket 介绍 socket 介绍 socket 被翻译成 网络套接字&#xff0c;这个名字实在是不好理解&#xff0c;我更愿意称为"插槽"。 忽略 socket 的中文名&#xff0c;先无脑记住两个规则&#xff1a; ① 记住&#xff0c;一个文件描述符(fd) 指向一个 socket&…

队列的概念及使用

目录 一. 概念 二. 队列的使用 三. 队列模拟实现 四. 循环队列 五. 面试题 一. 概念 队列 &#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操…