Java计算两个经纬度之间的距离公式,外加百度地图高德地图转换,和保留小数

在网上看到了很多两个坐标之间的距离公式,也都亲自测试了,有很多都不可以用,后来找到一个比较好的距离算法,分享给大家
经纬度两点之间的距离公式

public class MapUtils {
	private static double rad(double d) {
		return d * Math.PI / 180.00; // 角度转换成弧度
	}

	/*
	 * 根据经纬度计算两点之间的距离(单位米)
	 */
	public static double algorithm(double longitude1, double latitude1, double longitude2, double latitude2) {

		double Lat1 = rad(latitude1); // 纬度

		double Lat2 = rad(latitude2);

		double a = Lat1 - Lat2;// 两点纬度之差

		double b = rad(longitude1) - rad(longitude2); // 经度之差

		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 * 6378137.0;// 弧长乘地球半径(半径为米)

		s = Math.round(s * 10000d) / 10000d;// 精确距离的数值
		// 四舍五入 保留一位小数
		//DecimalFormat df = new DecimalFormat("#.0");

		return s;

	}
}

当然,我做的那个项目,刚开始是百度地图,但是很多API不好用,高德比较新,然后前台转高德了,所以数据库中的坐标也跟着要转换,后来在网上看到很多转换的五花八门,测试之后也找到好用的一个,但是我还是建议不要转换,因为转换就会有误差,坐标这种东西误差很吓人的,所以尽量在存储时候和取出来的时候用相同的坐标,废话不多说,直接上代码

百度高德相互转换

private double[] gaoDeToBaidu(double gd_lon, double gd_lat) {
    double[] bd_lat_lon = new double[2];
    double PI = 3.14159265358979324 * 3000.0 / 180.0;
    double x = gd_lon, y = gd_lat;
    double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * PI);
    double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * PI);
    bd_lat_lon[0] = z * Math.cos(theta) + 0.0065;
    bd_lat_lon[1] = z * Math.sin(theta) + 0.006;
    return bd_lat_lon;
}

private double[] bdToGaoDe(double bd_lat, double bd_lon) {
    double[] gd_lat_lon = new double[2];
    double PI = 3.14159265358979324 * 3000.0 / 180.0;
    double x = bd_lon - 0.0065, y = bd_lat - 0.006;
    double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * PI);
    double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * PI);
    gd_lat_lon[0] = z * Math.cos(theta);
    gd_lat_lon[1] = z * Math.sin(theta);
    return gd_lat_lon;
 }

两个方法,拿去粘贴就可以用,后来发现小数点位数不对,几番周折,有保留的几个小数点
保留小数

double a = 1.34566777;
DecimalFormat df1 = new DecimalFormat("0.000000");//不够6位补零输出
DecimalFormat df2 = new DecimalFormat("0.######");//不够6位以实际位数输出 你要哪个?   
System.out.println(df2.format(a)); //输出 1.345668

这次分享先就这么多吧,第一次写博客,以后会努力加油写自己遇到的坑的,嗯,就这样吧

猜你喜欢

转载自blog.csdn.net/Jaeger_Java/article/details/83817512