1. 程式人生 > >Java計算兩個經緯度之間的距離公式,外加百度地圖高德地圖轉換,和保留小數

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

這次分享先就這麼多吧,第一次寫部落格,以後會努力加油寫自己遇到的坑的,嗯,就這樣吧