查询指定距离内的快递柜或者店铺

背景:我们在淘宝购物时,选择了某个地址,有时会提示可以选择放到附近的快递柜子,这种是如何实现的呢?用redis geo api可以简单的实现该功能

思路:1. 我们先将所有的快递柜子存到redis中,这些快递柜信息要包含经纬度

           

/**
     * 
     * @param longitude 经度
     * @param latitude 维度 
     * @param content 地址信息
     */

    public void add(double longitude,double latitude,String content){
        GeoOperations<String, String> geoOperations = redisTemplate.opsForGeo();
        geoOperations.add(key, new Point(longitude, latitude), content);
    }

           2.根据用户的收货地址获取对应的经纬度

    //这个可以根据百度api获取,这里省略了

         3.通过redis查询用户收货地址经纬度为圆点,指定距离作为半径的圆内的快递柜子

         

/**
     * 
     *  查询指定经纬度范围xxKm内的信息
     * @param longitude 经度
     * @param latitude 维度
     * @param distant 距离 单位km
     * @param limit  返回多少条数据
     * @return
     */

    public String getGeoradius(double longitude,double latitude,double distant,int limit){
        GeoOperations<String, String> geoOperations = redisTemplate.opsForGeo();
        Circle circle = new Circle(new Point(longitude,latitude), new Distance(distant, Metrics.KILOMETERS));
        RedisGeoCommands.GeoRadiusCommandArgs commandArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().sortAscending().limit(limit);
        GeoResults<RedisGeoCommands.GeoLocation<String>> radius = geoOperations.radius(key, circle,commandArgs);
        for (GeoResult<RedisGeoCommands.GeoLocation<String>> geoResult : radius) {
            RedisGeoCommands.GeoLocation<String> geoResultContent = geoResult.getContent();
            String name = geoResultContent.getName();
            return name;
        }
        return null;
    }

 附加信息:

public class RedisGeoSerivce {
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
    private  final String key="location:box";
//省略。。。。。
}
原文地址:https://www.cnblogs.com/yangxiaohui227/p/15124912.html