你知道【查找附近的人】是怎么实现的吗

我们在App上,经常能看到【查找附近的人】这么个功能,但是你知道它是怎么实现的吗?

Redis的GEO功能

Redis的3.2版本提供了GEO功能,能够方便地进行地理位置信息的存储与查找

存储经纬度信息

#命令格式:GEOADD key 经度 维度 member
GEOADD USER:LOCATION 114.18612410 22.29358599 HongKongAlice

获取成员的地理位置信息

#命令格式:GEOPOS key member
geopos USER:LOCATION HongKongAlice

计算两个坐标之间的距离

unit表示单位有以下四个值:

- m (meter) 代表米

- km (kilometer)代表千米

- mi (miles)代表英里

- ft (ft)代表尺

#命令格式:geodist key member1 member2 [unit]
geodist USER:LOCATION HangZhouTom HongKongAlice km

获取指定位置范围内的所有地理位置

以下命令可以实现附近的人功能

#命令格式:georadius key 经度 维度 距离 [unit]
georadius USER:LOCATION 114.18612509965897 22.293586120392426 2000 km
#命令格式:georadiusbymember key member 距离 [unit]
georadiusbymember USER:LOCATION HongKongAlice 2000 km

删除地理位置信息

GEO没有提供删除的命令,但是因为本身是由zset实现的,可以使用zrem对地理位置进行删除

zrem key member
zrem USER:LOCATION HongKongAlice

查找附近的人功能实现三步骤

1.获取定位信息

2.经纬度信息存储

3.经纬度信息查询

第一步:获取定位信息

获取定位信息的3种方式

1.基于你连接的Wifi热点

wifi热点的位置是固定,你只要连了wifi,就能将你的位置锁定在一个范围内

2.基于移动基站定位

你的手机信号是移动基站提供的,当你的手机连接多个基站的信号,不同基站信号衰减不同,根据衰减情况与基站位置,大致确定你当前所在范围。

3.通过卫星定位

通过接收GPS、北斗等卫星的信号来计算出当前位置,该方法是最精准的。

如果通过编程获取定位信息

1.通过android、iOS提供的API来获取定位信息

2.通过第三方API来获取定位信息,如高德地图API百度地图API

第二步:经纬度信息的存储

    public void addGeoInfos(){
        String key="USER:LOCATION";
        //添加地理位置与人
        redisTemplate.opsForGeo().add(key,new Point(114.18612509965897,22.293586120392426),"liSa");
        redisTemplate.opsForGeo().add(key,new Point(120.21551180,30.25308298),"Alice");

    }

第三步:查找附近所有的人

    public void findNearByMembers() {
        //key值
        String key="USER:LOCATION";
        //member
        String member="Alice";
        //距离
        Distance distance=new Distance(2000, RedisGeoCommands.DistanceUnit.KILOMETERS);
        //查找数据
        GeoResults<RedisGeoCommands.GeoLocation<Object>> results= redisTemplate.opsForGeo().radius(key,member,distance);
        //打印结果
        List<GeoResult<RedisGeoCommands.GeoLocation<Object>>> list= results.getContent();
        for (GeoResult<RedisGeoCommands.GeoLocation<Object>> location:list){
            System.out.println(location.getContent().getName());
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值