一. 前言

前段时间,小熙赶项目比较忙。趁此机会记录下遇到的后端距离计算实现,app端会有实时的经纬度回传到Redis中,PC端和H5需要实时查看位置和距离,所以想下Redis是否支持此类计算。

二. Redis的geo介绍

  1. 版本支持:

        redis在3.2版本中开始支持geo功能
    
  2. 命令介绍:
    (1) geoadd 添加地址

     sms-center:5>geoadd cityLocationGeo 116.405285 39.904989 北京1sms-center:5>geoadd cityLocationGeo 121.472644 31.231706 上海1
    

    (2)geodist 计算距离(默认是米,可以指定单位千米)

      sms-center:5>geodist cityLocationGeo 北京 上海1067597.9668sms-center:5>geodist cityLocationGeo 北京 上海 km1067.5980
    

    (3)geohash 获取地址的hash值(可用于判断是否存在)

       sms-center:5>geohash cityLocationGeo 上海 北京wtw3sjt9vg0wx4g0b7xrt0
    

    (4)geopos 获取地理位置(经纬度)

        sms-center:5>geopos cityLocationGeo 北京1) "116.40528291463851929"2) "39.9049884229125027"
    

    (5)zrem 删除某个地址(redis中没有geodel命令)

         sms-center:5>zrem cityLocationGeo 北京1
    

其他更多详细命令请查询文档

三. redisTemplate 使用 geo

这里的storeKey和memberKey是两个地理位置的keyName,可任意替换。

  1. 添加geo

       /*** 向redis中添加geo计算数据** @param prefixName* @param caseDetail* @param latitude* @param longitude* @param name* @return*/private String addGeoData(String prefixName, CaseDetail caseDetail, String latitude, String longitude, String name) {String geoKey = prefixName + "_" + caseDetail.getStoreNo() + "_" + caseDetail.getCaseNo() + "_LatitudeAndLongitude";Point point = new Point(Double.valueOf(longitude), Double.valueOf(latitude));redisTemplate.opsForGeo().add(geoKey, point, name);redisTemplate.expire(geoKey, 30, TimeUnit.SECONDS);return geoKey;}
    
  2. 计算距离

         // 计算距离Distance distance = redisTemplate.boundGeoOps(geoKey).distance(storeKey, memberKey, RedisGeoCommands.DistanceUnit.KILOMETERS);double value = distance.getValue();
    
  3. 获取hash地址

          List hash = redisTemplate.boundGeoOps(geoKey).hash(storeKey);
    
  4. 获取地理位置(经纬度)

          List<Point> position = (List<Point>) redisTemplate.boundGeoOps(geoKey).position(memberKey).stream().filter(Objects::nonNull).collect(Collectors.toList());
    
  5. 删除某个地理位置

          Long remove = redisTemplate.boundGeoOps(geoKey).remove(storeKey);
    

四. 后语

基本开发以上的可以了,如果想了解更多,可以查看文档。

Redsi通过geo计算距离相关推荐

  1. Redis geo计算距离

    首先redis版本必须在3.2版本,在地球上适用 有效的纬度从-85.05112878度到85.05112878度. 有效的经度从-180度到180度.首先redis版本必须在3.2版本. 主要命令: ...

  2. 地理坐标定位和计算距离

    地理坐标定位和计算距离 场景介绍 在SNS应用中通常会有"附近的人".或者地图应用中搜寻目的地距离当前路程等场 景.此时我们就需要根据两点地理位置的经度和纬度计算出距离. 备注:通 ...

  3. 百度高德批量爬取经纬度并计算距离

    声明:代码仅作学习交流用途,代码分享者与创作者不承担任何由他人恶意运行而导致的责任,勿擅自修改限制频率的参数,勿恶意攻击网页,请学习浏览者遵守社会公德与法律秩序,爬虫导致的网页崩溃等损失由计算机操作者 ...

  4. R语言distRhumb函数计算距离实战(两个地理点之间的Rhumb距离)

    R语言distRhumb函数计算距离实战(两个地理点之间的Rhumb距离) 目录 R语言distRhumb函数计算距离实战(两个地理点之间的Rhumb距离) #导入geosphere包

  5. K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解?

    K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解? K近邻(KNN)是最简单的算法之一,它计算预测样本与训练数据集中每个数据点之间的距离,并找到 ...

  6. 计算距离torch.nn.PairwiseDistance

    通常,我们计算欧式距离,例如[0,0]到[1,1]的距离为2\sqrt22​. pdist = nn.PairwiseDistance(p=2)#p=2就是计算欧氏距离,p=1就是曼哈顿距离,例如上面 ...

  7. 根据两点间的经纬度计算距离

    /** * @desc 根据两点间的经纬度计算距离 * @param float $lat 纬度值 * @param float $lng 经度值 */ function getDistance($l ...

  8. ITK:从二进制图像中的对象计算距离图

    ITK:从二进制图像中的对象计算距离图 内容提要 C++实现代码 内容提要 从二进制图像中的对象计算距离图 C++实现代码 #include "itkImage.h" #inclu ...

  9. php 经纬度 距离排序,php mysql 根据经纬度计算距离和排序

    #1.两点距离(1.4142135623730951) select st_distance(point(0,0),point(1,1)); select st_distance(point (120 ...

最新文章

  1. 安全 - MySQL 出现严重的密码安全漏洞,许多系统存在风险
  2. Jmeter实现压力测试(多并发测试)
  3. 联想 android 5.1 root权限,联想A520手机ROOT权限图文教程(附联想A520root工具)
  4. leetcode 73 矩阵置零 C++ 两种解法
  5. Java中的装箱和拆箱剖析
  6. jdk下载--操作系统
  7. 10分钟学习简略五子棋 源码+注释教学
  8. HTML PS 环境搭建,快捷键及简单图片处理(图片测量及抠取)
  9. Unable to load class 'org.gradle.api.internal.component.Usage
  10. 元素的 “包含块” 如何确定?Containing Block
  11. JAVA制作简单的查询身份证号信息小程序
  12. Busybox下tftp命令使用详解
  13. 主题: 逆向英语学习方法
  14. AMD提出的补丁使退出延迟降低21%左右
  15. docker commit镜像以及数据卷技术
  16. 安卓APP——网页访问(WebView)
  17. openwrt 显示系统运行时间和空闲时间
  18. 物联网设备的网络连接---上篇
  19. spark-sql 指定metastore地址、读取mysql
  20. vue3 composition(组合式)API 是什么?我为什么要使用它?

热门文章

  1. ISO21434车辆网络安全解读-2.组织网络安全管理
  2. 一分钟解决上网速度慢的问题
  3. 零售行业数据分析之员工绩效考核·技巧整理
  4. CSDN回帖得分大全(近两年)
  5. 联通SGIP1.2短信接口 Java版实现 总结 2013-10-23测试通过
  6. 预装linux的笔记本好处,联想将更认真对待预装Linux笔记本
  7. 《Apollo 智能驾驶进阶课程》三、无人车自定位技术
  8. 专访 | Aeternity创始人谈公链之争:你觉得PHP是Java竞争
  9. Windows Visual Studio 2019 编译 bochs
  10. 你对P300事件相关电位知道多少?