자바 에 서 는 RedisTemplate 에서 geohash 지리 적 위 치 를 사용 하여 가 까 운 사람 을 실현 합 니 다.

저자: 시 자 양 마이크로 신호: sszzyy123aabbcc
자바 에 서 는 RedisTemplate 에서 geohash 지리 적 위 치 를 사용 하여 가 까 운 사람 을 실현 합 니 다.
1. 프로젝트 에 redis 의 pom 가방 을 도입 해 야 합 니 다.
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 항목 에 클래스 설정 을 넣 고 RedisTemplate 에 저 장 된 key 난 장 판 문 제 를 해결 합 니 다.
package com.demo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfigurtion {
     

    @Autowired
    private RedisTemplate redisTemplate;

    @Bean
    public RedisTemplate<String, Object> stringSerializerRedisTemplate() {
     
        RedisSerializer<String> stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
        return redisTemplate;
    }

}

3. 다음은 geohash 방법 을 사용 한 소개 와 포장 방법 입 니 다.
package com.demo.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.*;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
public class GeoHashUtil {
     

    @Autowired
    private RedisTemplate redisTemplate;

    /***
     *           (  、  、  )      key 。
     * @param key redis key
     * @param precision     
     * @param dimension     
     * @param name    
     * @return
     */
    public Long redisGeoAdd(String key, double precision, double dimension, String name) {
     
//        Long addedNum = redisTemplate.opsForGeo().add("city", new Point(116.405285, 39.904989), "  ");
//        Long addedNum = redisTemplate.opsForGeo().add("city", new Point(121.47, 31.23), "  ");
//        Long addedNum = redisTemplate.opsForGeo().add("city", new Point(113.27, 23.13), "  ");
        Long addedNum = redisTemplate.opsForGeo().add(key, new Point(precision, dimension), name);//params: key, Point(  ,   ),     
        return addedNum;
    }

    /***
     *  key              (     )。
     * @param key redis key
     * @param nameList       
     */
    public List<Point> redisGeoGet(String key, List<String> nameList) {
     
        List<Point> points = redisTemplate.opsForGeo().position(key, nameList);//params: key,     ...
        return points;
    }


    /***
     *              。
     * @param key redis key
     * @param name1     1
     * @param name2     2
     * @return
     */
    public Distance geoDist(String key, String name1, String name2) {
     
        Distance distance = redisTemplate.opsForGeo()
                .distance(key, name1, name2, RedisGeoCommands.DistanceUnit.KILOMETERS);//params: key,     1,     2,     
        return distance;
    }


    /***
     *           ,             ,                       ,                 。
     * @param key redis key
     * @param precision   
     * @param dimension   
     * @param distance   
     * @param count   
     * @return
     */
    public GeoResults<RedisGeoCommands.GeoLocation<String>> redisNearByXY(String key, double precision, double dimension, Integer distance, Integer count) {
     
        Circle circle = new Circle(new Point(precision, dimension), new Distance(distance, Metrics.KILOMETERS));//Point(  ,   ) Distance(   ,     )
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(count);
        GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo()
                .radius(key, circle, args);//params: key, Circle, GeoRadiusCommandArgs
        return results;
    }

    /***
     *          ,             ,                       ,                 。
     * @param key redis key
     * @param name   
     * @param distance   
     * @param count   
     * @return
     */
    public GeoResults<RedisGeoCommands.GeoLocation<String>> geoNearByPlace(String key, String name, Integer distance, Integer count) {
     
        Distance distances = new Distance(distance, Metrics.KILOMETERS);//params:    ,     
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(count);
        GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo()
                .radius(key, name, distances, args);//params: key,     , Circle, GeoRadiusCommandArgs
        return results;
    }


    /***
     *              Geohash   
     * @param key redis key
     * @param nameList       
     */
    public List<String> geoHash(String key, List<String> nameList) {
     
        List<String> results = redisTemplate.opsForGeo().hash(key, nameList);//params: key,     ...
        return results;
    }


}

좋은 웹페이지 즐겨찾기