用Redis来实现附近更加的简单(API的展示)
1.添加到redis
/**
* 加入到redis
*
* @param
* @return void
* @Author 叶秋
* @Date 2019/12/31 17:47
**/
@Test
public void one() {
// x 代表经度, y 代表纬度 “经度最大是180° 最小是0°纬度最大是 90° 最小是0°”
redisTemplate.opsForGeo().geoAdd("广东软件科学园", new Point(113.435899, 23.163488), "公司");
redisTemplate.opsForGeo().geoAdd("广东软件科学园", new Point(113.436595, 23.164119), "食堂");
redisTemplate.opsForGeo().geoAdd("沐陂小学", new Point(113.397756, 23.153669), "家");
System.out.println("结束");
}
如图: 这个score 就是坐标的意思了。
2.从redis 中获取 已经加入进去的坐标
/**
* 从redis 中获取 已经加入进去的坐标
*
* @param
* @return void
* @Author 叶秋
* @Date 2019/12/31 17:47
**/
@Test
public void two() {
List<Point> points = redisTemplate.opsForGeo().geoPos("沐陂小学", "家");
System.out.println(points);
}
结果如下图
3.两点之间距离
/**
* 两点之间距离
*
* @param
* @return void
* @Author 叶秋
* @Date 2019/12/31 17:48
**/
@Test
public void three() {
// 默认以米 为单位
Distance distance = redisTemplate.opsForGeo().geoDist("广东软件科学园", "公司", "食堂");
System.out.println(distance);
// 千米
Distance distance1 = redisTemplate.opsForGeo().geoDist("广东软件科学园", "公司", "食堂", RedisGeoCommands.DistanceUnit.KILOMETERS);
System.out.println(distance1);
}
结果还是很满意的,我觉得精确度可以。
4.定一个点, 查找半径内的 点,并列出距离
/**
* 定一个点, 查找半径内的 点,并列出距离
* @Author 叶秋
* @Date 2019/12/31 18:06
* @param
* @return void
**/
@Test
public void four(){
// 定一个点,并定好单位(默认米)
Circle circle = new Circle(113.435710,23.163335, Metrics.MILES.getMultiplier());
// 调用API
RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().
includeDistance().includeCoordinates().sortAscending().limit(5);
GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo().geoRadius("广东软件科学园",
circle,args);
System.out.println(results);
}
我就定在了公司附近,距离公司25米左右,距离食堂125米左右。结果满意