目录

  • Geo原理简单介绍
  • Geo常用方法讲解:
    • add方法:添加地理位置坐标
    • pos方法:给定的 key 里返回所有指定名称(member)的位置(经度和纬度)
    • radius方法:根据给定的位置名称来获取指定范围内的地理位置集合。
    • radius方法:根据给定的经纬度坐标来获取指定范围内的地理位置集合。
    • hash方法:获取位置的hash值
  • 完整的demo

Geo原理简单介绍

GeoHash 算法将 二维的经纬度 数据映射到 一维 的整数,这样所有的元素都将在挂载到一条线上,距离靠近的二维坐标映射到一维后的点之间距离也会很接近。当我们想要计算 「附近的人时」,首先将目标位置映射到这条线上,然后在这个一维的线上获取附近的点就行了。

它的核心思想就是把整个地球看成是一个 二维的平面,然后把这个平面不断地等分成一个一个小的方格,每一个 坐标元素都位于其中的 唯一一个方格 中,等分之后的 方格越小,那么坐标也就 越精确

RedisGeo 数据结构,它们将 全部放在一个 zset 集合中。在 Redis 的集群环境中,集合可能会从一个节点迁移到另一个节点,如果单个 key 的数据过大,会对集群的迁移工作造成较大的影响,在集群环境中单个 key 对应的数据量不宜超过 1M,否则会导致集群迁移出现卡顿现象,影响线上服务的正常运行。

所以,这里建议 Geo 的数据使用 单独的 Redis 实例部署,不使用集群环境,如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,按国家拆分、按省拆分,按市拆分。

Geo常用方法讲解:

这里使用的是spring boot项目。了解如何在spring boot中使用Redis.

add方法:添加地理位置坐标

Point point = new Point(112.24292267773436, 30.337854070185536);//使用point定位经纬度
GeoLocation<String> geo = new GeoLocation<String>("荆州", point);
opsForGeo.add(key, geo);point = new Point(111.28711213085936, 30.688053698037617);
opsForGeo.add(key, point, "宜昌");Map<String,Point> memberCoordinateMap = new HashMap<String, Point>();
memberCoordinateMap.put("武汉", new Point(114.29736603710936, 30.59352961254808));
memberCoordinateMap.put("襄阳", new Point(112.12207306835936, 32.00160906017225));
memberCoordinateMap.put("荆门", new Point(112.216009,31.027841));
opsForGeo.add(key, memberCoordinateMap);

pos方法:给定的 key 里返回所有指定名称(member)的位置(经度和纬度)

List<Point> position = opsForGeo.position(key, "荆州","宜昌");
position.forEach(System.out::println);//dist方法:计算两个位置之间的距离。
Distance distance = opsForGeo.distance(key, "荆州", "宜昌",RedisGeoCommands.DistanceUnit.KILOMETERS);
System.out.println("荆州与宜昌的距离:"+distance.getValue()+"KM");

radius方法:根据给定的位置名称来获取指定范围内的地理位置集合。

GeoRadiusCommandArgs geoRadiusCommandArgs = GeoRadiusCommandArgs.newGeoRadiusArgs().sortAscending()// 排序.limit(3)// 输出元素的个数.includeCoordinates()// 输出经纬度.includeDistance();// 距离
// 封装距离参数
distance = new Distance(100d, RedisGeoCommands.DistanceUnit.KILOMETERS);
GeoResults<GeoLocation<String>> radius = opsForGeo.radius(key, "荆州", distance, geoRadiusCommandArgs);
radius.getContent().forEach(s -> System.out.println("名称:" + s.getContent().getName() + "  经纬度:" + s.getContent().getPoint() + "  距离:" + s.getDistance()));

radius方法:根据给定的经纬度坐标来获取指定范围内的地理位置集合。

point = new Point(111.28711213085936, 30.688053698037617);
Circle circle = new Circle(new Point(112.24292267773436, 30.337854070185536), distance);
GeoResults<GeoLocation<String>> radius2 = opsForGeo.radius(key, circle,geoRadiusCommandArgs);
radius2.getContent().forEach(s -> System.out.println("名称:" + s.getContent().getName() + "  经纬度:" + s.getContent().getPoint() + "  距离:" + s.getDistance()));

hash方法:获取位置的hash值

List<String> hash = opsForGeo.hash(key, "荆州","宜昌");
hash.forEach(System.out::println);

完整的demo

/*** GeoHash 算法将 二维的经纬度 数据映射到 一维 的整数,这样所有的元素都将在挂载到一条线上,距离靠近的二维坐标映射到一维后的点之间距离也会很接近。* 当我们想要计算 「附近的人时」,首先将目标位置映射到这条线上,然后在这个一维的线上获取附近的点就行了。* 参考:https://www.it610.com/article/1288713480500748288.htm* @描述:* @作者:严磊* @时间:2020年11月25日 下午11:11:15*/public void GeoHash(){String key = "湖北";GeoOperations<String, String> opsForGeo = redisTemplate.opsForGeo();//add方法:添加地理位置坐标Point point = new Point(112.24292267773436, 30.337854070185536);//使用point定位经纬度GeoLocation<String> geo = new GeoLocation<String>("荆州", point);opsForGeo.add(key, geo);point = new Point(111.28711213085936, 30.688053698037617);opsForGeo.add(key, point, "宜昌");Map<String,Point> memberCoordinateMap = new HashMap<String, Point>();memberCoordinateMap.put("武汉", new Point(114.29736603710936, 30.59352961254808));memberCoordinateMap.put("襄阳", new Point(112.12207306835936, 32.00160906017225));memberCoordinateMap.put("荆门", new Point(112.216009,31.027841));opsForGeo.add(key, memberCoordinateMap);//pos方法:给定的 key 里返回所有指定名称(member)的位置(经度和纬度)List<Point> position = opsForGeo.position(key, "荆州","宜昌");position.forEach(System.out::println);//dist方法:计算两个位置之间的距离。Distance distance = opsForGeo.distance(key, "荆州", "宜昌",RedisGeoCommands.DistanceUnit.KILOMETERS);System.out.println("荆州与宜昌的距离:"+distance.getValue()+"KM");//radius方法:根据给定的位置名称来获取指定范围内的地理位置集合。GeoRadiusCommandArgs geoRadiusCommandArgs = GeoRadiusCommandArgs.newGeoRadiusArgs().sortAscending()// 排序.limit(3)// 输出元素的个数.includeCoordinates()// 输出经纬度.includeDistance();// 距离// 封装距离参数distance = new Distance(100d, RedisGeoCommands.DistanceUnit.KILOMETERS);GeoResults<GeoLocation<String>> radius = opsForGeo.radius(key, "荆州", distance, geoRadiusCommandArgs);radius.getContent().forEach(s -> System.out.println("名称:" + s.getContent().getName() + "  经纬度:" + s.getContent().getPoint() + "  距离:" + s.getDistance()));//radius方法:根据给定的经纬度坐标来获取指定范围内的地理位置集合。point = new Point(111.28711213085936, 30.688053698037617);Circle circle = new Circle(new Point(112.24292267773436, 30.337854070185536), distance);GeoResults<GeoLocation<String>> radius2 = opsForGeo.radius(key, circle,geoRadiusCommandArgs);radius2.getContent().forEach(s -> System.out.println("名称:" + s.getContent().getName() + "  经纬度:" + s.getContent().getPoint() + "  距离:" + s.getDistance()));//hash方法:获取位置的hash值List<String> hash = opsForGeo.hash(key, "荆州","宜昌");hash.forEach(System.out::println);}

参考: https://www.it610.com/article/1288713480500748288.html.

Redis使用Geo存储经纬度相关推荐

  1. Redis之GEO存储地理位置信息

    在外卖软件中的附近的美食店铺.外卖小哥的距离,打车软件附近的车辆,交友软件中附近的小姐姐.我们都可以利用redis的GEO地理位置计算得出. 1.Redis 的 Geo 是在 3.2 版本才有的 2. ...

  2. Java - 使用 Redis GEO 测算经纬度距离

    Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增. Redis GEO 操作方法有: geoadd:添加地理位置的坐标. geopos:获取 ...

  3. php使用redis的GEO地理信息类型

    redis3.2中增中了对GEO类型的支持,该类型存储经纬度,提供了经纬设置,查询,范围查询,距离查询,经纬度hash等操作. <?php$redis = new Redis(); $redis ...

  4. 【案例实战】SpringBoot整合Redis的GEO实现查找附近门店功能

    像我们平常美团点外卖的时候,都会看到一个商家距离我们多少米.还有类似QQ附近的人,我们能看到附近的人距离我们有多少米. 那么这些业务是怎么做的呢?是如何实现 基于位置的附近服务系统呢. 在去了解基于位 ...

  5. Geohash的原理介绍、Redis的Geo命令总结、Python使用Redis的Geo模块

    Geohash 一.GeoHash编码介绍 参考: https://hogwartsrico.github.io/2015/01/22/About-GeoHash/ Geohash原理 - 简书 (j ...

  6. 对于如何删除redis中geo存入的坐标

    redis中geo 就是将坐标存在reids 中可以进行判断坐标之间的距离,判断坐标及公里内的坐标. 但是由于geo大部分博客都是添加geo 进行判断,但是没有教大家怎么删除,对于坐标点比较多的话会 ...

  7. Spring Boot 2 实战:利用Redis的Geo功能实现查找附近的位置

    1. 前言 老板突然要上线一个需求,获取当前位置方圆一公里的业务代理点.明天上线!当接到这个需求的时候我差点吐血,这时间也太紧张了.赶紧去查相关的技术选型.经过一番折腾,终于在晚上十点完成了这个需求. ...

  8. mysql redis geo_利用Redis的Geo功能实现查找附近的位置

    1. 前言 老板突然要上线一个需求,获取当前位置方圆一公里的业务代理点.明天上线!当接到这个需求的时候我差点吐血,这时间也太紧张了.赶紧去查相关的技术选型.经过一番折腾,终于在晚上十点完成了这个需求. ...

  9. 利用Redis的Geo功能实现查找附近的位置!

    1. 前言 老板突然要上线一个需求,获取当前位置方圆一公里的业务代理点.明天上线!当接到这个需求的时候我差点吐血,这时间也太紧张了.赶紧去查相关的技术选型.经过一番折腾,终于在晚上十点完成了这个需求. ...

最新文章

  1. 基于Docker + Consul + Nginx + Consul-template的服务负载均衡实现
  2. object detection
  3. Linux下的零拷贝
  4. mysql内部_使用mysql中的内部加入
  5. CSS做个Switch开关
  6. Netty源码注释翻译-Channel类
  7. leetcode 1143. 最长公共子序列(dp)
  8. MonkeyDevice Class
  9. TwinCAT 3 file记录日志txt文件程序
  10. 爱奇艺推出“帧绮映画MAX”标准打造高品质视听 多款电视机型获认证
  11. 【移动端】企业微信移动app测试实战(2)、(3)
  12. STC12C5A60S2 红外遥控 LCD显示
  13. siggraph_SIGGRAPH的Unity
  14. 前端导出excel 表格数据1w条数据以上-批量导出
  15. 用python爬取阳光电影的链接
  16. redo synch writes在什么情况下发生
  17. 光流传感器 定位精度_光流定位原理是什么??
  18. nexus3仓库搭建
  19. aix查看lv_谈谈AIX lv 4k偏移量
  20. 牢骚:各种奇奇怪怪的问题。。。

热门文章

  1. CVPR2022 | 重新审视池化:你的感受野不是最理想的
  2. 【Linux】一步一步学Linux——VMware Workstation 15 Pro安装图解教程(06)
  3. python批量请求url_python批量请求注册接口爬虫相关问题记录
  4. stunserver 的几个公网地址及其问题
  5. 因特网中的域名服务器系统负责全网IP,因特网中的域名服务器系统负责全网IP地址的解析工作,它的好处是()...
  6. 我是这样来做破解qq,做QQ外挂的 【-】
  7. Glide,AndroidX包兼容问题
  8. Mobilenet_v2的参数alpha和depth_multiplier
  9. 很自由的PDF在线转换器
  10. 计算机access分数比例,[access查询]关于分数段统计问题