Java --- redis7之GEO实现地图地址推送

news/2024/11/20 21:16:57/

目录

一、大数据统计之GEO

1.1、面试题 

1.2、获得地址的经纬度 

 1.3、GEO相关指令

 1.4、需求分析

1.5、架构设计 

 1.6、代码实现

一、大数据统计之GEO

1.1、面试题 

移动互联网时代LBS应用越来越多,交友软件中附近的妹子,外卖软件中附近的美食店铺,打车软件中附近的车辆,这些软件中是如何实现的?

 出现的问题:

1、查询性能问题,当在并发高,数据量访问大的情况下查询会搞垮MySQL数据库。

2、一般MySQL查询的是一个平面矩形访问,而叫车服务要以自己为中心N公里半径的圆形覆盖。

3、矩形计算在长距离计算时会有很大误差,MySQL不合适。

1.2、获得地址的经纬度 

 经纬度查询定位 拾取坐标系统 经纬度查询地图

 1.3、GEO相关指令

 GEOADD添加经纬度坐标

注意:

有中文乱码需要在进时redis-cli -a xxxxxx -raw

GEOPOS返回经纬度

GEOHASH返回坐标的geohash表示

GEODIST两个位置之间的距离

GEORADIUS

GEORADIUSBYMEMBER

 1.4、需求分析

某app上搜索附近的酒店距离自己多远

相亲app上小姐姐的距离

某地图软件上附近的人,景区、酒店等

1.5、架构设计 

redis的GEO类型实现 

 1.6、代码实现

@Service
@Slf4j
public class GEOService {public static  final  String  CITY = "city";@Autowiredprivate RedisTemplate redisTemplate;public String geoAdd() {HashMap<String,Point> map = new HashMap<>();//将地标名与经纬度存入map中map.put("交子公园",new Point(104.08044 , 30.59152 ));map.put("金融麦田",new Point(104.07260 , 30.58909 ));map.put("华商金融中心",new Point(104.07146 , 30.58722 ));//存入redisredisTemplate.opsForGeo().add(CITY,map);return map.toString();}public Point position(String member) {//获取经纬度坐标List<Point> list = redisTemplate.opsForGeo().position(CITY, member);//返回查询的值即第一个return list.get(0);}public String hash(String member) {//geohash算法生成的base32编码值List<String> list = redisTemplate.opsForGeo().hash(CITY, member);return list.get(0);}public Distance distance(String member1, String member2) {//获取两个给定位置之间的距离Distance distance = redisTemplate.opsForGeo().distance(CITY, member1, member2,RedisGeoCommands.DistanceUnit.KILOMETERS);return distance;}public GeoResults radiusByxy() {//通过经度纬度查找xxx附近Circle circle = new Circle(104.07260, 30.58909, Metrics.KILOMETERS.getMultiplier());//返回多少条记录RedisGeoCommands.GeoRadiusCommandArgs limit = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortDescending().limit(50);GeoResults<RedisGeoCommands.GeoLocation<String>> radius = redisTemplate.opsForGeo().radius(CITY, circle, limit);return radius;}public GeoResults radiusByMember() {//通过地名查找Distance distance = new Distance(50, Metrics.KILOMETERS);//返回多少条记录RedisGeoCommands.GeoRadiusCommandArgs limit = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortDescending().limit(50);GeoResults<RedisGeoCommands.GeoLocation<String>> radius = redisTemplate.opsForGeo().radius(CITY,"交子公园",distance,limit);return radius;}
}
@RestController
@Slf4j
@Api(tags = "酒店推送")
public class GEOController {@Autowiredprivate GEOService geoService;@ApiOperation("添加坐标geoAdd")@RequestMapping(value = "/geoAdd",method = RequestMethod.GET)public String geoAdd(){return geoService.geoAdd();}@ApiOperation("获取经纬度坐标position")@RequestMapping(value = "/position",method = RequestMethod.GET)public Point position(String member){return geoService.position(member);}@ApiOperation("获取经纬度生成的base32编码值hash")@RequestMapping(value = "/hash",method = RequestMethod.GET)public String hash(String member){return geoService.hash(member);}@ApiOperation("获取两个给定位置间的距离")@RequestMapping(value = "/distance",method = RequestMethod.GET)public Distance distance(String member1,String member2){return geoService.distance(member1,member2);}@ApiOperation("通过经度纬度查找xxx附近")@RequestMapping(value = "/radiusByxy",method = RequestMethod.GET)public GeoResults radiusByxy(){return geoService.radiusByxy();}@ApiOperation("通过地方查找附近")@RequestMapping(value = "/radiusByMember",method = RequestMethod.GET)public GeoResults radiusByMember(){return geoService.radiusByMember();}
}

 


http://www.ppmy.cn/news/66750.html

相关文章

11. 深入理解并发编程-AQS与JMM

AQS (AbstractQueuedSynchronizer) 他的实现类诸如: CountDownLatch、ThreadLocalPool和ReentrantLock 在这些类中,AQS都是以内部类的形式存在的 AQS使用了模板方法设计模式 例子: 做蛋糕分为3个步骤,定一个抽象类,重写3个方法,做模型、烘焙和涂抹原料,然后在另外1个方法做蛋糕…

Android 13 有线网变更(用到的可以收藏)

Android 13 有线网变更 文章目录 Android 13 有线网变更一、从接触的Android13 &#xff08;Tv版&#xff09;源码和测试结果看&#xff0c;有线网有如下变更&#xff1a;二、有线网具体变更介绍1、限制了设置有线网参数设置接口方法2、新增有线网开启关闭接口方法3、新增了 up…

怎样恢复删除的视频?这5个方法才是正确答案!

案例&#xff1a;怎样恢复删除的视频&#xff1f; 【我是个视频爱好者&#xff0c;平常会在电脑中存很多视频&#xff0c;但也经常会将很多视频误删&#xff0c;怎样恢复删除的视频呢&#xff1f;希望大家给我一些建议&#xff01;】 在摄影摄像技术较发达的今天&#xff0c;…

Python中__repr__和__str__方法的区别|留学生CS辅导帖

Python中__repr__和__str__方法的区别 你好&#xff0c;我是悦创。 问题 __repr__和__str__有什么区别&#xff1f; 解答 __repr__和__str__方法在Python中都用于为对象提供字符串表示形式&#xff0c;但它们之间存在一些区别&#xff0c;主要体现在用途和实现上&#xff…

队列、栈专题

队列、栈专题 LeetCode 20. 有效的括号解题思路代码实现 LeetCode 921. 使括号有效的最少添加解题思路代码实现 LeetCode 1541. 平衡括号字符串的最少插入次数解题思路代码实现 单调栈LeetCode 496. 下一个更大元素 I解题思路代码实现 LeetCode 739. 每日温度解题思路代码实现 …

一个网站引发的程序猿的牢骚,哈哈哈

2013年大学毕业后&#xff0c;参加工作做的第一个前端项目&#xff0c;北京服装学院&#xff0c;今天调研一个关于iframe的需求&#xff0c;突然想试试&#xff0c;以前那些做IE6兼容的项目是否还在使用&#xff0c;就默默的点开了。十年了&#xff0c;他们没有换网站&#xff…

【Pandas与SQL系列】Pandas实现分布函数percent_rank、cume_dist

目录 1&#xff0c;分布函数,1.1&#xff0c;percent_rank()1.2&#xff0c;cume_dist()1.3 SQL例子 2&#xff0c;Pandas 实现3&#xff0c;补充Pandas实现排序 1&#xff0c;分布函数, 应用场景&#xff1a;快速查看某个记录所归属的组内的比例 分布函数分类及基础语法&…

JAVA-代码块和内部类

文章目录 目录 文章目录 前言 1.代码块 1.1什么是代码块? 1.2代码块的分类及作用: 1.静态代码块 2.成员代码块(又叫做构造代码块) 3.局部代码块 2.内部类 2.1 什么是内部类? 2.2 内部类的分类 1.成员内部类 2.静态内部类 3.匿名内部类 4.局部内部类 总结 前言 作者简介:我是最…