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


地图应用已经被广泛使用,例如高德地图。除了这些专用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());
        }
    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值