redis-RedisTemplate.opsForGeo 的geo地理位置相关的方法演示

主要方法
add : 添加一个地理位置
distance: 计算两个元素之间的距离
hash: 获取元素经纬度坐标经过geohash算法生成的base32编码值
position: 获取集合中任意元素的经纬度坐标,可以一次获取多个
radius:查询某个坐标或某个成员,附近范围的成员

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.*;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class Controller_redis_geo_1 {

    @Autowired
    private RedisTemplate redisTemplate;

    private final String KEY_GEO = "home";

    @RequestMapping("/testGeo")
    public void testGeo() {
        // geoadd : 添加一个地理位置
        // geoadd : (纬度、经度、名称)三元组
        redisTemplate.opsForGeo().add(KEY_GEO, new Point(116.48105, 39.996794), "张三");
        redisTemplate.opsForGeo().add(KEY_GEO, new Point(116.514203, 39.905409), "李四");
        redisTemplate.opsForGeo().add(KEY_GEO, new Point(116.489033, 40.007669), "王五");

        System.out.println();

        // geodist : 计算两个元素之间的距离
        // 计算张三李四之间的距离 其中,距离单位可以是m、km、ml、ft,分别代表米、千米、英里和尺
        Distance distance = redisTemplate.opsForGeo().distance(KEY_GEO, "张三", "李四");
        Distance distance2 = redisTemplate.opsForGeo().distance(KEY_GEO, "张三", "李四", RedisGeoCommands.DistanceUnit.KILOMETERS);
        System.out.println(distance);
        System.out.println(distance2.getValue());

        System.out.println();

        // geohash : 获取元素经纬度坐标经过geohash算法生成的base32编码值
        // 注意:GeoHash对二维经纬度坐标进行一维映射是有损的,通过映射再还原回的经纬度坐标和原始输入的经纬度坐标存在一定的误差。
        List<String> hash = redisTemplate.opsForGeo().hash(KEY_GEO, "张三");
        List<String> hashs = redisTemplate.opsForGeo().hash(KEY_GEO, "张三", "李四");
        System.out.println(hash);
        System.out.println(hashs);

        System.out.println();

        // geopos : 获取集合中任意元素的经纬度坐标,可以一次获取多个
        List<Point> position = redisTemplate.opsForGeo().position(KEY_GEO, "张三");
        System.out.println(position);
        List<Point> positions = redisTemplate.opsForGeo().position(KEY_GEO, "张三", "李四");
        System.out.println(positions);

        System.out.println();

        // GEORADIUS以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
        // 通过经度,纬度查找附近的人
        Circle circle = new Circle(116.48105, 39.996794, Metrics.KILOMETERS.getMultiplier());
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs()
                                     .includeDistance() //包含距离
                                     .includeCoordinates() //包含坐标
                                     .sortAscending() //升序
                                     .limit(50);
        GeoResults<RedisGeoCommands.GeoLocation<Object>> byxy = redisTemplate.opsForGeo().radius(KEY_GEO, circle, args);
        System.out.println("通过经纬度附近的人:");
        byxy.forEach(r -> System.out.println(r));

        System.out.println();

        // 通过地方查找附近5km的2个人
        RedisGeoCommands.GeoRadiusCommandArgs args2 = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs()
                                     .includeDistance()
                                     .includeCoordinates()
                                     .sortAscending()
                                     .limit(2);
        GeoResults<RedisGeoCommands.GeoLocation<Object>> radius = redisTemplate.opsForGeo().radius(KEY_GEO, "张三", new Distance(5, Metrics.KILOMETERS), args2);
        System.out.println("通过名字附近的人:");
        radius.forEach(r -> System.out.println(r));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值