Java整合Redis实现坐标附近查询功能

 更新时间:2023年11月15日 10:56:49   作者:于京京9909  
这篇文章主要介绍了Java整合Redis实现坐标附近查询,我们可以在redis服务器使用命令 help xxx 查看指令的具体用法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧

一、GEO用法引入

  • GEO,全称Geolocation,代表地理坐标。可以在其中存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有:
  • GEOADD:添加一个或多个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)
  • GEODIST:计算指定的两个点之间的距离并返回
  • GEOHASH:将指定member的坐标转为hash字符串形式并返回
  • GEOPOS:返回指定member的坐标
  • GEORADIUS:指定圆心、半径,找到该圆内包含的所有member,并按照与圆心之间的距离排序后返回。(6.2以后已废弃)
  • GEOSEARCH:在指定范围内搜索member,并按照与指定点之间的距离排序后返回。范围可以是圆形或矩形。(6.2以后新命令)
  • GEOSEARCHSTORE:与GEOSEARCH功能一致,不过可以把结果存储到一个指定的key。(6.2以后新命令)

我们可以在redis服务器使用命令 help xxx 查看指令的具体用法~

二、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

三、实体类

1.返回实体

@Data
public class Geo<T> {
    private T object;
    private double distance;
}

2.添加的商户信息 

 
@Data
@ApiModel("商户信息DO")
public class CommercialDO implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(type = IdType.AUTO)
    /**
     * id
     */
    private Integer id;
    /**
     * 商户名称
     */
    private String name;
    /**
     * 商户类型
     */
    private String commercialType;
    /**
     * 门店名称
     */
    private String storeName;
    /**
     * 商户地址
     */
    private String address;
    /**
     * 项目code
     */
    private String itemCode;
    /**
     * 经度
     */
    private String longitude;
    /**
     * 纬度
     */
    private String latitude;
}

四、添加位置信息

    @ApiOperation("geo测试添加位置信息")
    @GetMapping("/geo/add")
    public String geoAdd(String key, double longitude, double latitude, CommercialDO commercialDO) throws Exception {
        redisUtils.geoAdd(key, longitude, latitude, commercialDO);
        return "添加成功";
    }
    public void geoAdd(String key, double longitude, double latitude, Object object) {
        redisTemplate.boundGeoOps(key).add(new Point(longitude, latitude),object);
    }

五、查询位置信息

    /**
     * 根据经纬度获取指定距离范围内的地理位置信息
     *
     * @param key           Redis中Geo操作的key
     * @param longitude     经度
     * @param latitude      纬度
     * @param distance      距离范围(单位:米)
     * @param limit         限制返回结果的数量
     * @param searchName    地点名称(可选)
     * @return              返回地理位置信息的列表
     */
    public List<Geo<T>> getNearbyByGeo(String key, double longitude, double latitude, int distance, int limit, String searchName) {
        List<Geo<T>> geos = new ArrayList<>();
        BoundGeoOperations boundGeoOperations = redisTemplate.boundGeoOps(key);
        Point point = new Point(longitude, latitude);
        Circle within = new Circle(point, distance);
        RedisGeoCommands.GeoRadiusCommandArgs geoRadiusArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
        geoRadiusArgs = geoRadiusArgs.includeDistance();
        geoRadiusArgs.limit(limit);
        geoRadiusArgs.sortAscending();
        GeoResults<RedisGeoCommands.GeoLocation<Object>> geoResults = boundGeoOperations.radius(within, geoRadiusArgs);
        List<GeoResult<RedisGeoCommands.GeoLocation<Object>>> geoResultList = geoResults.getContent();
        if (StringUtils.isNotBlank(searchName)) {
            geoResultList = geoResults.getContent()
                    .stream()
                    .filter(result -> result.getContent().getName().toString().contains(searchName))
                    .collect(Collectors.toList());
        }
        Geo geo;
        for (GeoResult<RedisGeoCommands.GeoLocation<Object>> geoResult : geoResultList) {
            geo = new Geo();
            geo.setObject(geoResult.getContent());
            geo.setDistance(geoResult.getDistance().getValue());
            geos.add(geo);
        }
        return geos;
    }

 结果:会根据距离自动排序,传递名称则模糊查询

到此这篇关于Java整合Redis实现坐标附近查询的文章就介绍到这了,更多相关Java整合Redis坐标附近查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文秒懂IDEA中每天都在用的Project Structure知识

    一文秒懂IDEA中每天都在用的Project Structure知识

    这篇文章主要介绍了一文秒懂IDEA中每天都在用的Project Structure知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 在springboot中如何使用线程池

    在springboot中如何使用线程池

    在SpringBoot中,可以通过定义ThreadPoolTaskExecutor的Bean并使用@Autowired注入来使用线程池,具体步骤包括创建ThreadPoolTaskExecutor的Bean配置,本文给大家介绍springboot使用线程池的例子,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • 详细讲述Java中的对象转型

    详细讲述Java中的对象转型

    在本篇文章里我们给大家详细分享了关于Java中的对象转型的知识点内容,有兴趣的朋友们学习下。
    2018-10-10
  • SpringBoot拦截器实现对404和500等错误的拦截

    SpringBoot拦截器实现对404和500等错误的拦截

    本篇文章主要介绍了SpringBoot拦截器实现对404和500等错误的拦截,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • 浅谈一下Java的双亲委派模式

    浅谈一下Java的双亲委派模式

    这篇文章主要介绍了一下Java的双亲委派模式,双亲委派指得是,JVM在加载类时,会委派给ExtClassLoader和BootstrapClassLoader进⾏加载,如果没加载到才由⾃⼰进⾏加载,需要的朋友可以参考下
    2023-04-04
  • java内存分布实现代码

    java内存分布实现代码

    这篇文章主要介绍了浅谈Java内存区域划分和内存分配策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • SpringBoot整合GRPC微服务远程通信的实现示例

    SpringBoot整合GRPC微服务远程通信的实现示例

    本文主要介绍了SpringBoot整合GRPC微服务远程通信的实现示例,包含gRPC的工作原理,以及如何在Spring Boot应用中集成gRPC,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • MyBatis实现万能Map和模糊查询

    MyBatis实现万能Map和模糊查询

    本文主要介绍了MyBatis实现万能Map和模糊查询,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • elasticsearch启动警告无法锁定JVM内存

    elasticsearch启动警告无法锁定JVM内存

    今天小编就为大家分享一篇关于elasticsearch启动警告无法锁定JVM内存,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • springboot配置开发和测试环境并添加启动路径方式

    springboot配置开发和测试环境并添加启动路径方式

    这篇文章主要介绍了springboot配置开发和测试环境并添加启动路径方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论