知道两个点的经纬度,计算两个点的直线距离,导航距离请使用高德api。
直接用数学方式计算
public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {
// 纬度
double lat1 = Math.toRadians(latitude1);
double lat2 = Math.toRadians(latitude2);
// 经度
double lng1 = Math.toRadians(longitude1);
double lng2 = Math.toRadians(longitude2);
// 纬度之差
double a = lat1 - lat2;
// 经度之差
double b = lng1 - lng2;
// 计算两点距离的公式
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));
// 弧长乘地球半径, 返回单位: 米
s = s * 6378.137 * 1000;
return s;
}
第二种是Redis,Redis在3.2之后推出GEO特性
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test() throws Exception{
GeoOperations geoOperations = redisTemplate.opsForGeo();
// 构建地图坐标参数
Map<String,Object> map = new HashMap<>();
// 假如客户端的传的是北京西站的经纬度,指定地点是北京南站
map.put("北京西站", new Point(116.321275,39.895096));
map.put("北京南站", new Point(116.378438,39.864666));
// 将这些地址数据保存到redis中
geoOperations.geoAdd("GET_DISTANCE",map);
// 调用方法,计算北京西站与北京南站之间的距离;
double value = geoOperations.distance("GET_DISTANCE", "北京西站", "北京南站", RedisGeoCommands.DistanceUnit.METERS).getValue();
System.out.println("北京西站到南站的距离是"+value+"米");
System.out.println("与高德地图的误差是:"+(5927-value)+"米");
double distance = getDistance(116.321275, 39.895096, 116.378438, 39.864666);
System.out.println(distance);
System.out.println("与高德地图的误差是:"+(5927-distance)+"米");
}
北京西站到南站的距离是5938.0836米
与高德地图的误差是:-11.083599999999933米
5943.084767514207
与高德地图的误差是:-16.08476751420676米