背景:我们在淘宝购物时,选择了某个地址,有时会提示可以选择放到附近的快递柜子,这种是如何实现的呢?用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"; //省略。。。。。 }