《Redis应用实例》Java实现(25):地理位置

13 阅读1分钟

地图应用已经被广泛使用,例如高德地图。除了这些专用app需要使用地理位置外,很多互联网应用也需要用到地理位置,例如微信的摇一摇。 redis也内置了对地理位置的存储,计算等相关功能。 本例演示了redis中地理位置的使用。

package com.foxbill.redisinaction;

import redis.clients.jedis.GeoCoordinate;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.args.GeoUnit;
import redis.clients.jedis.resps.GeoRadiusResponse;
import java.util.List;

/**
 * 地理位置
 */
public class Chapter25 {
    static private String KEY_GEO = "Chapter25:geo";

    static public void start(Jedis jedis) {
        cleanData(jedis);
        initData(jedis);

        String address1 = "北京王府井咖啡店";
        String address2 = "北京东单咖啡店";
        Double distance = distance(jedis, address1, address2);
        System.out.printf("%s与%s的距离%f公里\n", address1, address2,distance);

        search(jedis,address1,10);
    }

    //清除数据
    private static void cleanData(Jedis jedis) {
        jedis.del(KEY_GEO);
    }

    //初始化数据
    private static void initData(Jedis jedis) {
        jedis.geoadd(KEY_GEO, 116.404, 39.915, "北京天安门");
        jedis.geoadd(KEY_GEO, 116.414, 39.914, "北京王府井咖啡店");
        jedis.geoadd(KEY_GEO, 116.424, 39.913, "北京东单咖啡店");
        jedis.geoadd(KEY_GEO, 116.394, 39.925, "北京西单咖啡店");
        jedis.geoadd(KEY_GEO, 121.4737, 31.2304, "上海外滩咖啡店"); // 这个离北京很远

        System.out.println("\n地理空间索引已初始化,当前地点数量: " + jedis.zcard(KEY_GEO));
    }

    private static GeoCoordinate pos(Jedis jedis,String address) {
        List<GeoCoordinate> geopos = jedis.geopos(KEY_GEO, address);
        return geopos.get(0);
    }

    private static Double distance(Jedis jedis,String address1, String address2) {
        Double geodist = jedis.geodist(KEY_GEO, address1, address2,GeoUnit.KM);
        return geodist;
    }

    private static void search(Jedis jedis,String address,double distance) {
        List<GeoRadiusResponse> results1 = jedis.geosearch(KEY_GEO, address, distance, GeoUnit.KM);
        for (GeoRadiusResponse response : results1) {
            System.out.printf("  - 名称: %s, 距离: %.2f km, 坐标: (%f, %f)\n",
                    response.getMemberByString(),
                    response.getDistance(),
                    response.getCoordinate().getLongitude(),
                    response.getCoordinate().getLatitude());
        }
    }

}