將地球看作一個標準球體,計算點到線段的距離。java
計算兩點間的球面距離函數
/** * * a點經度,a點緯度,b點經度,b點緯度 * */ public static double calcP2P(double alon, double alat, double blon, double blat) { double R = 6378.137;// 地球半徑(公里) // 判斷點是在北半球仍是南半球,本程序中輸入的數據若爲負則表示在南邊球 double distance = 0.0D; double _alat = (alat) * (Math.PI / 180); // 弧度 double _alon = (alon) * (Math.PI / 180); double _blat = (blat) * (Math.PI / 180); double _blon = (blon) * (Math.PI / 180); double c = Math.sin(_alat) * Math.sin(_blat) + Math.cos(_alat) * Math.cos(_blat) * Math.cos(_alon - _blon); // Java中三角函數角度以弧度製表示 if (c > 1) { c = 1; } distance = Math.acos(c) * R; // 弧長公式:弧長 = 弧度 * 半徑 if (distance <= 0.01) { // GPS偏差 distance = 0.0D; } return distance; }
計算點到線段的距離code
/** * * x,y--點的經度和緯度 * x1,y1--線段某個端點的經度和緯度 * x2,y2--線段另一個端點的經度和緯度 * */ public static double calcP2L(double x, double y, double x1, double y1, double x2, double y2) { double d1 = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1); if (d1 < 0) { return calcP2P(x, y, x1, y1); } double d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); if (d1 >= d2) { return calcP2P(x, y, x2, y2); } double r = d1 / d2; double px = x1 + (x2 - x1) * r; double py = y1 + (y2 - y1) * r; return calcP2P(x, y, px, py); }