Java計算兩個經緯度之間的距離公式,外加百度地圖高德地圖轉換,和保留小數
阿新 • • 發佈:2018-12-20
在網上看到了很多兩個座標之間的距離公式,也都親自測試了,有很多都不可以用,後來找到一個比較好的距離演算法,分享給大家
經緯度兩點之間的距離公式
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
這次分享先就這麼多吧,第一次寫部落格,以後會努力加油寫自己遇到的坑的,嗯,就這樣吧