球面上兩點之間的距離計算

球面上的兩點之間距離計算要先將經緯度座標轉化爲墨卡託投影座標,再用點到直線的距離來進行計算,網上搜的一部分資料整合之後的JAVA代碼,不一對,先留着:

資料來源:http://blog.sina.com.cn/s/blog_8ab3b2cf0100xd69.html

     http://blog.csdn.net/ltfgood/article/details/6889509

 

 

  1 package com.suncreate.spatialquery.web.utils;
  2 
  3 public class LatitudeLontitudeUtil {  
  4 
  5     // http://blog.charlee.li/location-search/  
  6 
  7     /** 地球半徑 */  
  8     private static final double EARTH_RADIUS = 6371393;  
  9 
 10     static double M_PI = Math.PI;
 11 
 12     public LatitudeLontitudeUtil() {  
 13 
 14     }  
 15 
 16     //經緯度轉墨卡託
 17     // 經度(lon),緯度(lat)
 18     public static double[] lonLat2Mercator(double lon,double lat)
 19     {
 20         double[] xy = new double[2];
 21         double x = lon *20037508.342789/180;
 22         double y = Math.log(Math.tan((90+lat)*M_PI/360))/(M_PI/180);
 23         y = y *20037508.34789/180;
 24         xy[0] = x;
 25         xy[1] = y;
 26         return xy;
 27     }
 28 
 29     //---------------------------------------------------
 30     // 點到直線的最短距離的判斷 點(x0,y0) 到由兩點組成的線段(x1,y1) ,( x2,y2 )  
 31     public static double pointToLine(double x1, double y1, double x2, double y2, double x0, double y0) {  
 32         double space = 0;  
 33         double a, b, c;  
 34         a = lineSpace(x1, y1, x2, y2);// 線段的長度  
 35         b = lineSpace(x1, y1, x0, y0);// (x1,y1)到點的距離  
 36         c = lineSpace(x2, y2, x0, y0);// (x2,y2)到點的距離  
 37 
 38         System.out.println("a:"+a+",b:"+b+",c:"+c);
 39 
 40         if (c + b == a) {//點在線段上  
 41             space = 0;  
 42             return space;  
 43         }  
 44         if (a <= 0.000001) {//不是線段,是一個點  
 45             space = b;  
 46             return space;  
 47         }  
 48 
 49         if (c * c >= a * a + b * b) { //組成直角三角形或鈍角三角形,(x1,y1)爲直角或鈍角  
 50             space = b;  
 51             return space;  
 52         }  
 53         if (b * b >= a * a + c * c) {//組成直角三角形或鈍角三角形,(x2,y2)爲直角或鈍角  
 54             space = c;  
 55             return space;  
 56         }  
 57         //組成銳角三角形,則求三角形的高  
 58         double p = (a + b + c) / 2;// 半周長  
 59         double s = Math.sqrt(p * (p - a) * (p - b) * (p - c));// 海倫公式求面積  
 60         space = 2 * s / a;// 返回點到線的距離(利用三角形面積公式求高)  
 61         return space ;  
 62 
 63     }  
 64 
 65     // 計算兩點之間的距離  
 66     public static double lineSpace(double x1, double y1, double x2, double y2) {  
 67         double lineLength = 0;  
 68         lineLength = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));  
 69         return lineLength;  
 70     }  
 71     //------------------------------------------------------------ 
 72 
 73 
 74 
 75 
 76     public static void main(String[] args) {  
 77         //測試用例
 78 
 79         //點到直線的距離算法測試
 80 
 81         //算法一
 82         double x1 = 31.821018461732;  
 83         double y1 = 117.18765906006398;  
 84 
 85         double x2 = 31.821018461732;  
 86         double y2 = 117.18980211911884;  
 87 
 88         double x0 = 31.8226736;
 89         double y0 = 117.1888475;
 90 
 91         double[] xytemp = new double[2];
 92 
 93         xytemp = LatitudeLontitudeUtil.lonLat2Mercator(y1, x1);
 94         double x1m = xytemp[1];
 95         double y1m = xytemp[0];
 96 
 97         xytemp = LatitudeLontitudeUtil.lonLat2Mercator(y2, x2);
 98         double x2m = xytemp[1];
 99         double y2m = xytemp[0];
100 
101         xytemp = LatitudeLontitudeUtil.lonLat2Mercator(y0, x0);
102         double x0m = xytemp[1];
103         double y0m = xytemp[0];
104 
105         System.out.println("x1m:"+x1m+",y1m:"+y1m);
106         System.out.println("x2m:"+x2m+",y2m:"+y2m);
107         System.out.println("x0m:"+x0m+",y0m:"+y0m);
108 
109         double d = LatitudeLontitudeUtil.pointToLine(x1m, y1m, x2m, y2m, x0m, y0m);  
110 
111         System.out.println(d);  
112 
113 
114     }  
115 }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章