关键代码
存储
//将点位数据存储到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