RedisGeoController.java 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package com.ylx.web.controller.massage;
  2. import com.ylx.common.core.domain.R;
  3. import com.ylx.massage.domain.Location;
  4. import com.ylx.massage.domain.TWxUser;
  5. import com.ylx.massage.utils.LocationUtil;
  6. import io.swagger.annotations.Api;
  7. import io.swagger.annotations.ApiOperation;
  8. import lombok.AllArgsConstructor;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.data.geo.*;
  11. import org.springframework.data.redis.connection.RedisGeoCommands;
  12. import org.springframework.data.redis.core.BoundGeoOperations;
  13. import org.springframework.data.redis.core.RedisTemplate;
  14. import org.springframework.web.bind.annotation.*;
  15. import javax.annotation.Resource;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;
  19. @Slf4j
  20. @RestController
  21. @Api(tags = "redis", description = "redis控制")
  22. @RequestMapping("/geo")
  23. @AllArgsConstructor
  24. public class RedisGeoController {
  25. private static final String GEO_STAGE = "cities";
  26. private final RedisTemplate<String, String> redisTemplate;
  27. @Resource
  28. private LocationUtil locationUtil;
  29. /**
  30. * 初始化数据可以将职位id和经纬度存入redis,
  31. * 添加职业时增加位置数据
  32. * 当用户点击附近是,传入经纬度。返回id获得职位信息推送给用户
  33. */
  34. @GetMapping("/init")
  35. @ApiOperation("初始化")
  36. public void init() {
  37. // 清理缓存
  38. redisTemplate.delete(GEO_STAGE);
  39. Map<String, Point> points = new HashMap<>();
  40. points.put("shijiazhuang", new Point(114.48, 38.03));
  41. points.put("xingtang", new Point(114.54, 38.42));
  42. points.put("guangcheng", new Point(114.84, 38.03));
  43. points.put("gaoyi", new Point(114.58, 37.62));
  44. points.put("zhaoxian", new Point(114.78, 37.76));
  45. points.put("jinxing", new Point(114.13, 38.03));
  46. points.put("luquan", new Point(114.03, 38.08));
  47. points.put("xinle", new Point(114.67, 38.33));
  48. points.put("zhengding", new Point(114.56, 38.13));
  49. // 添加地理信息
  50. redisTemplate.boundGeoOps(GEO_STAGE).add(points);
  51. }
  52. @PostMapping("/city")
  53. @ApiOperation("获得附近技师")
  54. public R<GeoResults<RedisGeoCommands.GeoLocation<String>>> dis(@RequestBody Location locationBo) {
  55. //设置当前位置
  56. Point point = new Point(locationBo.getLongitude(), locationBo.getLatitude());
  57. //设置半径范围
  58. Metric metric = RedisGeoCommands.DistanceUnit.METERS;
  59. Distance distance = new Distance(locationBo.getRadius(), metric);
  60. Circle circle = new Circle(point, distance);
  61. //设置参数 包括距离、坐标、条数
  62. RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands
  63. .GeoRadiusCommandArgs
  64. .newGeoRadiusArgs()
  65. .includeDistance()
  66. .includeCoordinates()
  67. .sortAscending()
  68. .limit(locationBo.getLimit());
  69. BoundGeoOperations<String, String> stringStringBoundGeoOperations = redisTemplate.boundGeoOps(GEO_STAGE);
  70. GeoResults<RedisGeoCommands.GeoLocation<String>> radius = stringStringBoundGeoOperations.radius(circle, args);
  71. return R.ok(radius);
  72. }
  73. @ApiOperation("测试")
  74. @RequestMapping(value = "test", method = RequestMethod.GET)
  75. public List<TWxUser> test() {
  76. locationUtil.geoAdd(LocationUtil.GEO_KEY_USER,"o-HEJ6VP2YNi0HPeLaIHCQsQD69s", 112.521465, 37.857166);
  77. locationUtil.geoAdd(LocationUtil.GEO_KEY_USER,"o-HEJ6RAjBDjFvuZcAdHRX8mIZXw", 116.396151, 39.939414);
  78. Map<String, Double> shijiazhuang1 = locationUtil.distanceInclude("shijiazhuang1", 30000);
  79. locationUtil.getDistance("o-HEJ6VP2YNi0HPeLaIHCQsQD69s","o-HEJ6RAjBDjFvuZcAdHRX8mIZXw");
  80. log.error(shijiazhuang1.toString());
  81. return null;
  82. }
  83. }