使用redis实现附近的人功能

目录

  • 前言
  • 工具
  • 百度经纬度拾取器
  • 一、测试数据
  • 二、基本命令
  • 三、javaApi

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


工具
百度经纬度拾取器 【使用redis实现附近的人功能】拾取坐标系统

一、测试数据
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

查看已添加集合
使用redis实现附近的人功能
文章图片

2.geopos
此命令根据输入的位置名称获取位置的信息坐标,语法如下
GEOPOS 集合名称 位置 [name...]geopos address wuyue

查看坐标信息
使用redis实现附近的人功能
文章图片

3.geodist
此命令用于计算两个位置之间的距离,语法如下
geodist 集合名称 位置1 位置2 [unit]//计算杭州到南京之间的距离geodist citys hanghzredis:0>ou nanjing km

使用redis实现附近的人功能
文章图片

可选参数: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

使用redis实现附近的人功能
文章图片

radius:距离
WITHCOORD:返回坐标
由于版本原因可能为空
WITHDIST:同时返回距离
使用redis实现附近的人功能
文章图片

ASC|DESC:排序
使用redis实现附近的人功能
文章图片

count:取多少长度
使用redis实现附近的人功能
文章图片

5. georadiusbymember
georadiusbymember使用存储在位置集合里的某个地点作为中心点
georadiusbymember 地址集合 地点名称 距离 单位//查询距离wuyue五公里之内的地点georadiusbymember address wuyue 5 km

使用redis实现附近的人功能
文章图片


三、javaApi 实体类
package com.jiale.web.controller.pojo; import lombok.Data; import java.io.Serializable; /** * @Author: Hello World * @Date: 2021/9/16 16:12 * @Description: */@Datapublic 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; /** * @Author: Hello World * @Date: 2021/9/15 17:47 * @Description: */@SpringBootTestpublic class JialeTests { @AutowiredRedisTemplate redisTemplate; @Testpublic void test1(){System.out.println(JialeGlobal.getUploadPath()); } /*** 一.向redis中添加位置信息* 1.网店位置信息-geo* 2.网点详细信息*/@Testpublic void geoAdd(){//1.网点位置信息存储120.653208,28.032606Point 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); } /*** 二.获取位置坐标信息*/@Testpublicvoid geoPos(){//传入位置名称查询位置信息List position = redisTemplate.boundGeoOps("outlets").position("南塘五组团"); for (Point point : position) {System.out.println(point); }} /*** 三.计算两个位置信息*/@Testpublic void geoDist(){/**Distance distance = redisTemplate.boundGeoOps("outlets").distance("江心屿", "温州乐园"); //距离double value = https://www.it610.com/article/distance.getValue(); //单位String unit = distance.getUnit(); System.out.println("两点相距:"+value+unit); *///以km展示/**Distance distance = redisTemplate.boundGeoOps("outlets").distance("江心屿", "温州乐园", Metrics.KILOMETERS); //距离double value = https://www.it610.com/article/distance.getValue(); //单位String unit = distance.getUnit(); System.out.println("两点相距:"+value+unit); */ //保留两位小数Distance distance = redisTemplate.boundGeoOps("outlets").distance("江心屿", "温州乐园", Metrics.KILOMETERS); //距离double value = https://www.it610.com/article/distance.getValue(); //单位String unit = distance.getUnit(); System.out.println("两点相距:"+new BigDecimal(value).setScale(2,BigDecimal.ROUND_HALF_UP) +unit); } /*** 四.按照给定的经纬度查找指定范围的位置*/@Testpublicvoid geoRadius(){//指定位置Point point = new Point(120.754274,27.983296); //构建条件-10kmDistance distance = new Distance(10, Metrics.KILOMETERS); Circle circle = new Circle(point,distance); //RedisGeoCommandsRedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs(); //包含位置信息args.includeDistance(); //存放的是查询到的网址位置信息GeoResults outlets = redisTemplate.boundGeoOps("outlets").radius(circle, args); for (GeoResult outlet : outlets) {//获取距离信息Distance outletDistance = outlet.getDistance(); //距离double value = https://www.it610.com/article/outletDistance.getValue(); //单位String unit = outletDistance.getUnit(); System.out.println("当前坐标距离:"+outlet.getContent().getName()+value+unit); }} /*** 五.按照指定元素(必须在集合中存在)查找指定范围位置*/@Testpublic void geoRadiusByMember(){//构建条件Distance distance = new Distance(10, Metrics.KILOMETERS); //构建条件-包含位置信息RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs(); args.includeDistance(); //参数key构建的条件其他条件GeoResults outlets = redisTemplate.boundGeoOps("outlets").radius("江心屿", distance,args); for (GeoResult outlet : outlets) {//获取距离信息Distance outletDistance = outlet.getDistance(); //距离double value = https://www.it610.com/article/outletDistance.getValue(); //单位String unit = outletDistance.getUnit(); System.out.println("江心屿距离:"+outlet.getContent().getName()+value+unit); }}}

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

    推荐阅读