当前位置: 首页 > news >正文

【Redis】之Geo

概述

Geo就是Geolocation的简写形式,代表地理坐标。在Redis中,构造了能够存储地址坐标信息的一种数据结构,帮助我们根据经纬度来检索数据。

命令行操作方法

GEOADD

可以用来添加一个或者多个地理坐标。

GEODIST

返回一个key中两个成员之间的距离。

GEOHASH

将指定member的坐标转为哈希字符串形式返回。

GEOPOS

返回指定member的坐标。

 GEORADIUS

指定圆心、半径,找到该圆内包含的member。

 GEOSEARCH

在指定范围内搜索member。最新的一个命令,可以指定中心点的经纬度,也可以使用member;并且还可以指定搜索范围是圆形还是正方形。

 StringRedisTemplate操作方法

add

用于添加地理坐标。

    @Resourceprivate StringRedisTemplate stringRedisTemplate;@Testpublic void test(){Point point = new Point(112.653652,37.809874);Long add = this.stringRedisTemplate.opsForGeo().add("ShanXi", point, "SXU");System.out.println(add);}

 radius

用来查找坐标

    @Resourceprivate StringRedisTemplate stringRedisTemplate;@Test void test() {// 中心点Point point = new Point(112.617734,37.797128);// 半径Distance radius = new Distance(100, RedisGeoCommands.DistanceUnit.KILOMETERS);// 由中心点和半径组成的圆圈Circle circle = new Circle(point, radius);// 获取值之后要带回来的参数RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance() // 包含距离.includeCoordinates() // 包含坐标.sortAscending(); // 升序// 进行查询GeoResults<RedisGeoCommands.GeoLocation<String>> search =this.stringRedisTemplate.opsForGeo().radius("ShanXi", circle, args);List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = search.getContent();if(content == null || content.isEmpty()) {System.out.println("没有数据");}for (GeoResult<RedisGeoCommands.GeoLocation<String>> geoLocationGeoResult : content) {// 输出距离System.out.println("距离:" + geoLocationGeoResult.getDistance());RedisGeoCommands.GeoLocation<String> locationGeoResultContent = geoLocationGeoResult.getContent();// 输出名称System.out.println("member:" + locationGeoResultContent.getName());// 输出坐标System.out.println("坐标" + locationGeoResultContent.getPoint());}}

search

和radius方法类似,只不过search还可以查找矩形范围之内的坐标。

remove

删除操作

    @Resourceprivate StringRedisTemplate stringRedisTemplate;@Test void test() {Long remove = this.stringRedisTemplate.opsForGeo().remove("ShanXi", "TaiYuanXueYuan");System.out.println(remove);}

 distance

查看两个地理位置之间的直线距离

    @Resourceprivate StringRedisTemplate stringRedisTemplate;@Test void test() {Distance distance = this.stringRedisTemplate.opsForGeo().distance("ShanXi", "SXU", "ZonBei");System.out.println(distance);}

代码示例

需求:山西所有高校建立之后,都会把自己的位置上传到某信息平台,并且还会查询距离自己学校30公里之内的其他学校。当学校换位置之后,就会删除当前信息。

基础配置

@RestController
@RequestMapping("/school")
public class SchoolController {@Resourceprivate SchoolService schoolService;}
@Service
public class SchoolService extends ServiceImpl<SchoolMapper, School> {@Resourceprivate StringRedisTemplate stringRedisTemplate;}
public interface SchoolMapper extends BaseMapper<School> {
}
@Data
public class School {// 学校idprivate Integer id;// 学校名private String name;// 经度private BigDecimal longitude;// 纬度private BigDecimal latitude;}

上传位置信息

    public String add(School school) {// TODO 更新信息到数据库boolean save = this.save(school);// TODO 判断是否更新成功if(save) {// TODO 封装位置信息Point point = new Point(school.getLongitude().doubleValue(), school.getLatitude().doubleValue());// TODO 存入数据库this.stringRedisTemplate.opsForGeo().add("GEO:SCHOOL", point, school.getName());}return "成功";}

查询附近学校

public void queryMessage() {// 距离Distance distance = new Distance(30, RedisGeoCommands.DistanceUnit.KILOMETERS);// 参数RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance() // 包含距离.includeCoordinates() // 包含坐标.sortDescending(); // 降序// 开始查找GeoResults<RedisGeoCommands.GeoLocation<String>> results = this.stringRedisTemplate.opsForGeo().radius("GEO:SCHOOL", "SXU", distance, args);List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = results.getContent();// 输出结果for (GeoResult<RedisGeoCommands.GeoLocation<String>> geoLocationGeoResult : content) {System.out.println("距离山西大学30公里之内大学的名称:" + geoLocationGeoResult.getContent().getName());System.out.println("距离山西大学30公里之内大学的坐标:" + geoLocationGeoResult.getContent().getPoint());System.out.println("距离山西大学30公里之内大学的距离:" + geoLocationGeoResult.getDistance());}}

删除位置信息

    public boolean remove(String name) {LambdaQueryWrapper<School> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.eq(School::getName, name);boolean subtract = this.remove(lambdaQueryWrapper);if(!subtract) {return false;}Long remove = this.stringRedisTemplate.opsForGeo().remove("GEO:SCHOOL", name);return remove != null && remove == 1;}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【机器学习】——线性回归(自我监督学习)
  • 秒变 Vim 高手:必学的编辑技巧与隐藏功能大揭秘
  • 【设计模式】UML类图
  • Streamlit:使用 Python 快速开发 Web 应用
  • <<编码>> 第 16 章 存储器组织(4)--内存 示例电路
  • C++ ——日期类的实现和注释浅解
  • mysql性能优化-SQL 查询优化
  • 12年计算机408考研-计算机网络
  • 解密.bixi、.baxia勒索病毒:如何安全恢复被加密数据
  • 利用AI增强现实开发:基于CoreML的深度学习图像场景识别实战教程
  • 【深度学习】(1)--神经网络
  • 将成功请求的数据 放入apipost接口测试工具,发送给后端后,部分符号丢失
  • Arthas thread(查看当前JVM的线程堆栈信息)
  • Mastering Qt 番外 —— 添加源码调试
  • pg入门18—如何使用pg gis
  • [译]CSS 居中(Center)方法大合集
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【面试系列】之二:关于js原型
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • oschina
  • vue学习系列(二)vue-cli
  • Webpack 4 学习01(基础配置)
  • 深度学习中的信息论知识详解
  • 消息队列系列二(IOT中消息队列的应用)
  • 小程序开发中的那些坑
  • ​queue --- 一个同步的队列类​
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • ######## golang各章节终篇索引 ########
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #define用法
  • #include到底该写在哪
  • #Linux(权限管理)
  • #宝哥教你#查看jquery绑定的事件函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (二)windows配置JDK环境
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (算法)Game
  • (转)关于pipe()的详细解析
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 回调、接口回调、 委托
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET 设计模式初探
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET6 命令行启动及发布单个Exe文件
  • .NetCore 如何动态路由
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • /dev下添加设备节点的方法步骤(通过device_create)
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @SpringBootConfiguration重复加载报错
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [20160902]rm -rf的惨案.txt