首页>代码>SpringBoot通过Redis的Geo获取当前位置方圆一公里的业务代理点>/src/main/java/com/example/redisgeo/service/impl/GeoServiceImpl.java
package com.example.redisgeo.service.impl;


import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.Circle;
import org.springframework.data.geo.Distance;
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;
import org.springframework.data.redis.connection.RedisGeoCommands.GeoLocation;
import org.springframework.data.redis.connection.RedisGeoCommands.GeoRadiusCommandArgs;
import org.springframework.data.redis.core.GeoOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.example.redisgeo.bean.CityInfo;
import com.example.redisgeo.service.IGeoService;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class GeoServiceImpl implements IGeoService{

	private final String GEO_KEY = "ah-cities";
	
	/** redis 客户端 */
    private final StringRedisTemplate redisTemplate;
    
    @Autowired
    public GeoServiceImpl(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    
	@Override
	public Long saveCityInfoToRedis(Collection<CityInfo> cityInfos) {
		log.info("start to save city info: {}.", JSON.toJSONString(cityInfos));
        GeoOperations<String, String> ops = redisTemplate.opsForGeo();
        Set<RedisGeoCommands.GeoLocation<String>> locations = new HashSet<>();
        cityInfos.forEach(ci -> locations.add(new RedisGeoCommands.GeoLocation<String>(
                ci.getCity(), new Point(ci.getLongitude(), ci.getLatitude())
        )));
        log.info("done to save city info.");
        return ops.add(GEO_KEY, locations);
	}

	@Override
	public List<Point> getCityPos(String[] cities) {
		GeoOperations<String, String> ops = redisTemplate.opsForGeo();
        return ops.position(GEO_KEY, cities);
	}

	@Override
	public Distance getTwoCityDistance(String city1, String city2, Metric metric) {
		GeoOperations<String, String> ops = redisTemplate.opsForGeo();
        return metric == null ? ops.distance(GEO_KEY, city1, city2) : ops.distance(GEO_KEY, city1, city2, metric);
	}

	@Override
	public GeoResults<GeoLocation<String>> getPointRadius(Circle within, GeoRadiusCommandArgs args) {
		GeoOperations<String, String> ops = redisTemplate.opsForGeo();
        return args == null ? ops.radius(GEO_KEY, within) : ops.radius(GEO_KEY, within, args);
	}

	@Override
	public GeoResults<GeoLocation<String>> getMemberRadius(String member, Distance distance,
			GeoRadiusCommandArgs args) {
		GeoOperations<String, String> ops = redisTemplate.opsForGeo();
        return args == null ? ops.radius(GEO_KEY, member, distance) : ops.radius(GEO_KEY, member, distance, args);
	}

	@Override
	public List<String> getCityGeoHash(String[] cities) {
		GeoOperations<String, String> ops = redisTemplate.opsForGeo();
        return ops.hash(GEO_KEY, cities);
	}

}
最近下载更多
是一个鸽子啊  LV17 2023年6月14日
123456dswhdm  LV2 2022年9月1日
笛卡尔积  LV6 2021年12月7日
冷血天涯  LV8 2021年11月14日
chriss  LV27 2020年12月9日
kinglong  LV16 2020年8月9日
岚京者  LV2 2020年7月24日
yinhai  LV4 2020年7月22日
nwj1225  LV11 2020年7月22日
123456nty  LV37 2020年7月19日
最近浏览更多
hellozui  LV11 7月24日
小旭123  LV1 4月28日
ajyang 1月24日
暂无贡献等级
sunlzh888888  LV29 1月22日
内心向阳  LV4 2023年11月8日
include  LV8 2023年6月20日
zx54321  LV12 2023年6月14日
是一个鸽子啊  LV17 2023年6月14日
夜晚的星666  LV7 2023年5月5日
yueeeii 2023年4月21日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友