在网上看到了很多两个坐标之间的距离公式,也都亲自测试了,有很多都不可以用,后来找到一个比较好的距离算法,分享给大家
经纬度两点之间的距离公式
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
这次分享先就这么多吧,第一次写博客,以后会努力加油写自己遇到的坑的,嗯,就这样吧