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

被折叠的 条评论
为什么被折叠?



