目录

  • 一、简介
  • 二、常用方法
    • 2.1、GEOADD、GEOPOS
    • 2.2、GEODIST
    • 2.3、GEORADIUS
    • 2.4、GEORADIUSBYMEMBER
    • 2.5、GEOHASH

一、简介

  本文今天主要是地理坐标(GEO)的方法的使用,以及redis对应的Java实现该怎么用。因为篇幅问题,我这里写了一个测试类,引入 RedisTemplate对象,后面例子里就不一一引入了。大家理解就行,如果大家还不知道如何通过Spring Boot 整合redis则可以查看我之前的文章:SpringBoot整合redis(redis支持单节点和集群)。

package com.alian.datastruct;import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;
import java.util.concurrent.TimeUnit;@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class RedisGeoTest {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;
}

二、常用方法

2.1、GEOADD、GEOPOS

  • GEOADD 用于存储指定的地理空间位置的经度和纬度
  • GEOPOS 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度)

语法

ZADD KEY_NAME SCORE1 MEMBER1... SCOREn MEMBERn
GEOADD KEY_NAME longitude latitude member

命令操作

127.0.0.1:6379> geoadd geo1 113.883078 22.553291 shenzhen
(integer) 1
127.0.0.1:6379> geoadd geo1 113.273241 23.157921 guangzhou
(integer) 1
127.0.0.1:6379> geopos geo1 shenzhen guangzhou
1) 1) "113.88307839632034302"2) "22.55329111565713873"
2) 1) "113.27324062585830688"2) "23.1579209662846921"

Java操作

    @Testpublic void geoAddAndGeoPos() {String redisKey = "geo1";redisTemplate.delete(redisKey);// 设置深圳的坐标redisTemplate.opsForGeo().add(redisKey,new Point(113.883078,22.553291),"shenzhen");// 设置广州的坐标redisTemplate.opsForGeo().add(redisKey,new Point(113.273241,23.157921),"guangzhou");// 获取深圳的坐标List<Point> list = redisTemplate.opsForGeo().position(redisKey, "shenzhen","guangzhou");log.info("获取深圳的坐标:{}", list.get(0));log.info("获取广州的坐标:{}", list.get(1));}
获取深圳的坐标:Point [x=113.883078, y=22.553291]
获取广州的坐标:Point [x=113.273241, y=23.157921]

2.2、GEODIST

  • GEODIST 用于返回两个给定位置之间的直线距离

语法

GEODIST KEY_NAME member1 member2

命令操作

127.0.0.1:6379> geoadd geo2 113.883078 22.553291 shenzhen
(integer) 1
127.0.0.1:6379> geoadd geo2 113.273241 23.157921 guangzhou
(integer) 1
127.0.0.1:6379> geodist geo2 shenzhen guangzhou km
"91.8118"

Java操作

    @Testpublic void geoDist() {String redisKey = "geo2";redisTemplate.delete(redisKey);// 设置深圳的坐标redisTemplate.opsForGeo().add(redisKey,new Point(113.883078,22.553291),"shenzhen");// 设置广州的坐标redisTemplate.opsForGeo().add(redisKey,new Point(113.273241,23.157921),"guangzhou");// 获取两个城市之间的距离Distance distance = redisTemplate.opsForGeo().distance(redisKey, "shenzhen", "guangzhou", RedisGeoCommands.DistanceUnit.KILOMETERS);log.info("获取两个城市之间的距离:{} 千米", distance.getValue());}
获取两个城市之间的距离:91.8118 千米

2.3、GEORADIUS

  • GEORADIUS 根据给定的经纬度,返回半径不超过指定距离的元素

语法

GEORADIUS KEY_NAME longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

命令操作

127.0.0.1:6379> geoadd geo3 113.883078 22.553291 shenzhen
(integer) 1
127.0.0.1:6379> geoadd geo3 113.273241 23.157921 guangzhou
(integer) 1
127.0.0.1:6379> geoadd geo3 113.751791 23.020672 dongguan
(integer) 1
127.0.0.1:6379> geoadd geo3 113.392616 22.515951 zhongshan
(integer) 1
127.0.0.1:6379> georadius geo3 113.273241 23.157921 80 km
1) "guangzhou"
2) "dongguan"
3) "zhongshan"
127.0.0.1:6379> georadius geo3 113.273241 23.157921 80 km withdist
1) 1) "guangzhou"2) "0.0000"
2) 1) "dongguan"2) "51.2880"
3) 1) "zhongshan"2) "72.4447"

Java操作

    @Testpublic void geoRadius() {String redisKey = "geo3";redisTemplate.delete(redisKey);// 设置深圳的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.883078, 22.553291), "shenzhen");// 设置广州的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.273241, 23.157921), "guangzhou");// 设置东莞的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.751791, 23.020672), "dongguan");// 设置中山的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.392616, 22.515951), "zhongshan");// 以经纬度为中心,获取半径不超过最大距离的所有元素Point point = new Point(113.273241, 23.157921);// 半径为80kmDistance distance = new Distance(80, RedisGeoCommands.DistanceUnit.KILOMETERS);Circle circle = new Circle(point, distance);GeoResults<RedisGeoCommands.GeoLocation<Object>> radius = redisTemplate.opsForGeo().radius(redisKey, circle);List<GeoResult<RedisGeoCommands.GeoLocation<Object>>> content= radius.getContent();for (GeoResult<RedisGeoCommands.GeoLocation<Object>> geoResult:content){RedisGeoCommands.GeoLocation<Object> geoResultContent = geoResult.getContent();log.info("获取半径不超过最大距离的所有元素:{}", geoResultContent.getName());}}
获取半径不超过最大距离的所有元素:guangzhou
获取半径不超过最大距离的所有元素:dongguan
获取半径不超过最大距离的所有元素:zhongshan

2.4、GEORADIUSBYMEMBER

  • GEORADIUSBYMEMBER 根据给定元素的经纬度,返回半径不超过指定距离的元素

语法

GEORADIUSBYMEMBER KEY_NAME member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

命令操作

127.0.0.1:6379> geoadd geo4 113.883078 22.553291 shenzhen
(integer) 1
127.0.0.1:6379> geoadd geo4 113.273241 23.157921 guangzhou
(integer) 1
127.0.0.1:6379> geoadd geo4 113.751791 23.020672 dongguan
(integer) 1
127.0.0.1:6379> geoadd geo4 113.392616 22.515951 zhongshan
(integer) 1
127.0.0.1:6379> georadiusbymember geo4 guangzhou 100 km withdist
1) 1) "guangzhou"2) "0.0000"
2) 1) "dongguan"2) "51.2880"
3) 1) "zhongshan"2) "72.4447"
4) 1) "shenzhen"2) "91.8118"

Java操作

    @Testpublic void geoRadiusByMember() {String redisKey = "geo4";redisTemplate.delete(redisKey);// 设置深圳的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.883078, 22.553291), "shenzhen");// 设置广州的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.273241, 23.157921), "guangzhou");// 设置东莞的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.751791, 23.020672), "dongguan");// 设置中山的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.392616, 22.515951), "zhongshan");// 定义距离Distance distance = new Distance(100, RedisGeoCommands.DistanceUnit.KILOMETERS);// 广州为中心点半径100km的元素GeoResults<RedisGeoCommands.GeoLocation<Object>> geoResults = redisTemplate.opsForGeo().radius(redisKey, "guangzhou", distance);List<GeoResult<RedisGeoCommands.GeoLocation<Object>>> content = geoResults.getContent();for (GeoResult<RedisGeoCommands.GeoLocation<Object>> geoResult : content) {RedisGeoCommands.GeoLocation<Object> geoResultContent = geoResult.getContent();log.info("广州为中心点半径100km的元素:{}", geoResultContent.getName());}}
广州为中心点半径100km的元素:guangzhou
广州为中心点半径100km的元素:dongguan
广州为中心点半径100km的元素:zhongshan
广州为中心点半径100km的元素:shenzhen

2.5、GEOHASH

  • GEOHASH 用于获取一个或多个位置元素的 geohash 值

语法

GEOHASH KEY_NAME member [member ...]

命令操作

127.0.0.1:6379> geoadd geo5 113.883078 22.553291 shenzhen
(integer) 1
127.0.0.1:6379> geoadd geo5 113.273241 23.157921 guangzhou
(integer) 1
127.0.0.1:6379> geoadd geo5 113.751791 23.020672 dongguan
(integer) 1
127.0.0.1:6379> geoadd geo5 113.392616 22.515951 zhongshan
(integer) 1
127.0.0.1:6379> geohash geo5 shenzhen guangzhou dongguan zhongshan
1) "ws0br3xnkn0"
2) "ws0e9xg09v0"
3) "ws0fuqz90u0"
4) "ws08h6cuzm0"

Java操作

    @Testpublic void geoHash() {String redisKey = "geo5";redisTemplate.delete(redisKey);// 设置深圳的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.883078, 22.553291), "shenzhen");// 设置广州的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.273241, 23.157921), "guangzhou");// 设置东莞的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.751791, 23.020672), "dongguan");// 设置中山的坐标redisTemplate.opsForGeo().add(redisKey, new Point(113.392616, 22.515951), "zhongshan");// 定义距离Distance distance = new Distance(100, RedisGeoCommands.DistanceUnit.KILOMETERS);// 获取各个城市的hashList<String> hashList = redisTemplate.opsForGeo().hash(redisKey, "shenzhen", "guangzhou", "dongguan", "zhongshan");log.info("获取各个城市的hash:{}", hashList);}
取各个城市的hash:[ws0br3xnkn0, ws0e9xg09v0, ws0fuqz90u0, ws08h6cuzm0]

Redis 地理坐标(GEO)方法使用详解相关推荐

  1. Redis系列教程(二):详解Redis的存储类型、集群架构、以及应用场景

    高并发架构系列 高并发架构系列:数据库主从同步的3种一致性方案实现,及优劣比较 高并发架构系列:Spring Cloud的核心成员.以及架构实现详细介绍 高并发架构系列:服务注册与发现的实现原理.及实 ...

  2. 【Redis之ZSet类型的详解ZSet类型中常用命令的实践】

    Redis之ZSet类型的详解&ZSet类型中常用命令的实践 知识回顾: 通过对Redis中的String的命令做了充分的讲解以及实践学习 通过对Redis中String类型之Bit命令的详解 ...

  3. Redis实战和核心原理详解(4)Redis存储Key的一种设计实现方式:模式匹配

    注意:此方案仅为演示Redis 的使用,正式生产环境切勿使用! 相关文章: Redis实战和核心原理详解(1)Centos7.0下安装Redis 5.0详细过程和使用常见问题 Redis实战和核心原理 ...

  4. Redis环境搭建以及常见问题详解

    Redis环境搭建以及常见问题详解 环境的搭建 Redis是什么??? Redis起源 Redis 简介 Redis优势 Redis与其他key-value存储数据库的区别 Redis 下载和安装 R ...

  5. golang导入git包_使用go module导入本地包的方法教程详解

    go module 是Go1.11版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始, go module 将是Go语言默认的依赖管理工具.到今天 Go1.14 版本推出之后 Go mod ...

  6. java condition详解_Java使用Condition控制线程通信的方法实例详解

    Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...

  7. php使用redis分布式锁,php基于redis的分布式锁实例详解

    在使用分布式锁进行互斥资源访问时候,我们很多方案是采用redis的实现. 固然,redis的单节点锁在极端情况也是有问题的,假设你的业务允许偶尔的失效,使用单节点的redis锁方案就足够了,简单而且效 ...

  8. python怎么画条形图-python绘制条形图方法代码详解

    1.首先要绘制一个简单的条形图 import numpy as np import matplotlib.pyplot as plt from matplotlib import mlab from ...

  9. python装饰器函数-Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...

  10. batchnorm2d参数 torch_pytorch方法测试详解——归一化(BatchNorm2d)

    测试代码: import torch import torch.nn as nn m = nn.BatchNorm2d(2,affine=True) #权重w和偏重将被使用 input = torch ...

最新文章

  1. 精品软件 推荐 瑞星 杀毒软件 安全软件
  2. PHP中单引号和双引号的区别
  3. Spring 详解(四):Spring MVC
  4. Python面向对象---类的基本使用
  5. 搜狗高速浏览器提示您 怎么关闭_那些浏览器中的快捷键们
  6. c语言 常量字符串数组,C语言常量以及字符串数组
  7. 你的输入法都暴露了些啥?
  8. web文件怎么传到服务器,web文件传到服务器
  9. XSS攻击(出现的原因、预防措施......)
  10. oracle的redo与undio
  11. Linux下命令详解(-)
  12. LeeCode-------Letter Combinations of a Phone Number 解法
  13. zabbix监控操纵系统日志
  14. python量化回测框架_股票量化交易回测框架pyalgotrade源码阅读(一)
  15. 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
  16. AI为移动医疗APP加码,智能提醒你:该吃药了!
  17. intel和amd处理器发展历史
  18. 16进制颜色代码转RGB代码
  19. 企业微信开发(1)——整体说明
  20. xp系统steam无法连接到更新服务器,xp系统打不开steam提示“无法链接至steam网络”的处理办法...

热门文章

  1. Python字符串格式化的3种方法
  2. 名字竞技场 V3.0
  3. 炒股经常用到的几个工具网站
  4. RESTful客户端库:RestClient
  5. python来判断三角形的性质
  6. 力扣13 罗马数字转整数逻辑详解
  7. Solaris培训第二章:OpenBoot PROM(转)
  8. Git extensions配置
  9. 阿里云操作云服务器ECS,linux系统远程连接
  10. python实现青蛙跳台阶算法