Redis GEO工具类

package com.paiye.common.core.support.redis;


import java.util.ArrayList;
import java.util.List;


import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.geo.Circle;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.GeoResult;
import org.springframework.data.geo.GeoResults;
import org.springframework.data.geo.Metric;
import org.springframework.data.geo.Point;
import org.springframework.data.redis.connection.RedisGeoCommands.GeoLocation;
import org.springframework.data.redis.connection.RedisGeoCommands.GeoRadiusCommandArgs;
import org.springframework.data.redis.core.StringRedisTemplate;


/**
 * @ClassName: RediGeoUtil.java
 * @Description: TODO(Redis GEO工具类:http://blog.csdn.net/zhu_tianwei/article/details/49149699#)
 * @author lx
 * @date 2017年4月14日 上午11:23:39
 * @version V1.0
*/
public class RedisGeoUtil {


private static StringRedisTemplate stringRedisTemplate;


public void setStringRedisTemplate(StringRedisTemplate redisTemp) {
stringRedisTemplate = redisTemp;
}

/**
* @Title: geoAdd
* @Description: TODO(添加geo)
* @param key key
* @param point 经纬度
* @param member 成员
* @return Long 返回影响的行
*/
public static Long geoAdd(String key, Point point, String member) {
return stringRedisTemplate.opsForGeo().geoAdd(key, point, member);
}

/**
* @Title: geoRemove
* @Description: TODO(删除成员)
* @param key 
* @param members 成员
* @return Long 返回影响的行
*/
public static Long geoRemove(String key, String... members) {
return stringRedisTemplate.opsForGeo().geoRemove(key, members);
}

/**
* @Title: geoPos
* @Description: TODO(查询地址的经纬度)
* @param key key
* @param members 成员
* @return List<Point>
*/
public static List<Point> geoPos(String key, String... members) {
return stringRedisTemplate.opsForGeo().geoPos(key, members);
}

/**
* @Title: geoHash
* @Description: TODO(查询位置的geohash)
* @param key
* @param members
* @return List<String>
*/
public static List<String> geoHash(String key, String... members) {
return stringRedisTemplate.opsForGeo().geoHash(key, members);
}

/**
* @Title: geoDist
* @Description: TODO(查询2位置距离)
* @param key key
* @param member1 成员1
* @param member2 成员2
* @param metric 单位
* @return Double 距离
*/
public static Double geoDist(String key, String member1, String member2, Metric metric) {
return stringRedisTemplate.opsForGeo().geoDist(key, member1, member2, metric).getValue();
}

/**
* @Title: geoRadius
* @Description: TODO(查询附近坐标地址)
* @param key key
* @param center 中心坐标
* @param radius 半径
* @param metric 半径单位
* @param direction 排序
* @return List<String>
* @throws
*/
public static List<GeoRadiusDto> geoRadius(String key, Point center, Double radius, Metric metric, Direction direction) {
List<GeoRadiusDto> radiusDtos = new ArrayList<GeoRadiusDto>();
Distance distance = new Distance(radius, metric);
Circle within = new Circle(center, distance);
GeoRadiusCommandArgs args = null;
if(direction.isAscending()){
args = GeoRadiusCommandArgs.newGeoRadiusArgs().sortAscending().includeCoordinates();
}
if(direction.isDescending()){
args = GeoRadiusCommandArgs.newGeoRadiusArgs().sortDescending().includeCoordinates();
}
GeoResults<GeoLocation<String>> geoResults = stringRedisTemplate.opsForGeo().geoRadius(key, within, args);
List<GeoResult<GeoLocation<String>>> geoResultList = geoResults.getContent();
for(GeoResult<GeoLocation<String>> geoResult:geoResultList){
String name = geoResult.getContent().getName();
Point point = geoResult.getContent().getPoint();
GeoRadiusDto radiusDto = new GeoRadiusDto();
radiusDto.setKey(key);
radiusDto.setMember(name);
radiusDto.setX(point.getX());
radiusDto.setY(point.getY());
radiusDtos.add(radiusDto);
}
return radiusDtos;
}

/**
* @Title: geoRadiusByMember
* @Description: TODO(根据成员查询附近点)
* @param key
* @param member 成员
* @param radius 半径
* @param metric 半径单位
* @param direction 排序
* @return List<GeoRadiusDto>
*/
public static List<GeoRadiusDto> geoRadiusByMember(String key, String member, Double radius, Metric metric, Direction direction) {
List<GeoRadiusDto> radiusDtos = new ArrayList<GeoRadiusDto>();
Distance distance = new Distance(radius, metric);
GeoRadiusCommandArgs args = null;
if(direction.isAscending()){
args = GeoRadiusCommandArgs.newGeoRadiusArgs().sortAscending().includeCoordinates();;
}
if(direction.isDescending()){
args = GeoRadiusCommandArgs.newGeoRadiusArgs().sortDescending().includeCoordinates();;
}
GeoResults<GeoLocation<String>> geoResults = stringRedisTemplate.opsForGeo().geoRadiusByMember(key, member, distance, args);
List<GeoResult<GeoLocation<String>>> geoResultList = geoResults.getContent();
for(GeoResult<GeoLocation<String>> geoResult:geoResultList){
String name = geoResult.getContent().getName();
Point point = geoResult.getContent().getPoint();
GeoRadiusDto radiusDto = new GeoRadiusDto();
radiusDto.setKey(key);
radiusDto.setMember(name);
radiusDto.setX(point.getX());
radiusDto.setY(point.getY());
radiusDtos.add(radiusDto);
}
return radiusDtos;
}


/**
* @Title: geoIntersect
* @Description: TODO(交集)
* @return List<GeoRadiusDto>
*/
public static List<GeoRadiusDto> geoIntersect(List<GeoRadiusDto> list1,List<GeoRadiusDto> list2){
return list1.retainAll(list2) == true ? list1 : null;
}
}

猜你喜欢

转载自blog.csdn.net/lx1309244704/article/details/75240800