1、 代码块
package com.ilogie.tms.util;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.MessageFormat;
public class LocationUtils {
// 以下为 获得 两点之间最短距离
private static final BigDecimal EARTH_RADIUS = MathUtil.toBigDecimal(6378.137);//定义 地球半径
private static final BigDecimal MATH_PI = MathUtil.toBigDecimal(Math.PI);//定义Math.PI
/**计算弧长**/
private static BigDecimal getRed(BigDecimal big){
return big.multiply(MATH_PI).divide(MathUtil.toBigDecimal(180.0), BigDecimal.ROUND_DOWN);
}
/**
* 计算 两点 之间 的 最短距离
* 返回 数据 为 两点之间的 公里数
*/
public static BigDecimal getShortestDistance(BigDecimal lat1,BigDecimal lng1,
BigDecimal lat2,BigDecimal lng2 ){
logger.debug("lat1: " +lat1+", lng1:" + lng1);
logger.debug("lat2: " +lat2+", lng2:" + lng2);
BigDecimal radLat1 = getRed(lat1);
BigDecimal radLat2 = getRed(lat2);
BigDecimal a = radLat1.subtract(radLat2);
BigDecimal b = getRed(lng1).subtract(getRed(lng2));
Double sinA = Math.sin(a.doubleValue()/2);
Double sinB = Math.sin(b.doubleValue()/2);
Double cosA = radLat1.doubleValue();
Double cosB = radLat2.doubleValue();
Object obj = 2 * Math.asin(Math.sqrt(Math.pow(sinA,2) + Math.cos(cosA)*Math.cos(cosB)*Math.pow(sinB, 2)));
BigDecimal s = new BigDecimal(obj);
s = s.multiply(EARTH_RADIUS);
return format(s, 3);
}
public static BigDecimal format(BigDecimal big, int scale) {
scale = 0 > scale ? 0 : scale;
big = big.setScale(scale, BigDecimal.ROUND_HALF_UP);
return big;
}
public static void main(String[] args) {
// latlng 31.2147094,121.5193688 上海浦东新区社区服务中心
// latlng 31.226327,121.4969213 上海普陀区星云招商办事处、
// 地图上 2.57 测试 2.58
// latlg 28.1939842 113.0108862 长沙火车站
// latlg 22.636828 113.814606 深圳宝安国际机场
BigDecimal lat1 = MathUtil.toBigDecimal(28.1939842);
BigDecimal lng1 = MathUtil.toBigDecimal(113.0108862);
BigDecimal lat2 = MathUtil.toBigDecimal(22.636828);
BigDecimal lng2 = MathUtil.toBigDecimal(113.814606);
System.out.println("最短距离:"+getShortestDistance(lat1, lng1, lat2, lng2));
}
}
2、测试结果