关键代码

存储

//将点位数据存储到redis
List<GeoEntry> entries = new ArrayList<>();
for (Accident accident : accidents) {
    entries.add(new GeoEntry(accident.getLongitude(), accident.getLatitude(),accident.getId()));
}
//存的是id和geohash(geohash将二维经纬度转化为一维字符串)
RGeo<String> geo = redissonClient.getGeo(LOCATION_KEY);
geo.add(entries.stream().toArray(GeoEntry[]::new));

筛选

RGeo<String> geo = redissonClient.getGeo(LOCATION_KEY);
//利用redisson api获取三公里内的数据
//1.获取数据id
List<String> positions = geo.search(GeoSearchArgs.from(longitude, latitude)
            .radius(3, GeoUnit.KILOMETERS)
            .order(GeoOrder.ASC));
//2.获取数据id和距离
Map<String,Double> positionMap = geo.searchWithDistance(GeoSearchArgs.from(longitude, latitude)
            .radius(3, GeoUnit.KILOMETERS)
            .order(GeoOrder.ASC));
for (String id:positionMap.keySet()){
    System.out.println("id:"+id+",距离中心"+positionMap.get(id)+"千米");
}

其他代码

添加或更新点位信息

RGeo<String> geo = redissonClient.getGeo(LOCATION_KEY);
GeoEntry geoEntry = new GeoEntry(longitude, latitude, id);
geo.add(geoEntry);

删除点位信息

RGeo<String> geo = redissonClient.getGeo(LOCATION_KEY);
geo.remove(id);

删除所有位置数据

redissonClient.getBucket(LOCATION_KEY).delete()

标题:使用RedisGeo存储地理位置数据,并筛选某个范围内的所有数据
作者:xingzhegu
地址:https://www.fxg.life/articles/2023/06/26/1687745714828.html