2011-10-08 51 views
4

我想要以米/公里爲單位獲取兩緯度之間的距離。所以我使用下面的函數。它給了我不同的結果比谷歌地圖。使用谷歌地圖和用戶自定義函數獲取不同距離

你能幫我解決我的問題嗎?我不明白什麼是問題?

代碼

float[] results = {0}; 

    android.location.Location.distanceBetween(lat1, lon1, lat2, lon2, results); 

當前緯度=23.012281666666663 當前經度=72.51798333333333

目的地緯度=23.1120487 目的地緯度=72.5766759

它給出了這樣的結果= 12579.679在計,而在谷歌地圖它給出這樣的結果=17.9公里

我不明白爲什麼這兩給出了不同的結果。

+0

你是怎麼得到這個「結果= 12579.679米」?我有與上面相同的代碼,它顯示** 1.3348807E7 **。爲什麼我的答案不同? – Jeongbebs

回答

4

此圖解釋了爲什麼你得到12.5和17.6公里


enter image description here


要計算行駛距離(17.6公里),您需要使用directions API

+0

感謝您的快速響應,我當時也想到了這一點,但對此沒有任何線索。並試圖尋找像Google一樣獲得距離的方法。 – MKJParekh

1

您可以使用此2功能找到距離

* 注: *如果你不能正確地獲得距離,然後嘗試設置於我而言萬VAR爲1,因爲我成倍的增加LAT與1E6長的值,因此必須與它分開。

public double calcdist() { 
      int MILLION = 1000000; 
      int EARTH_RADIUS_KM = 6371; 

      double lat1 = la1/MILLION; 
      double lon1 = lo1/MILLION; 
      double lat2 = la2/MILLION; 
      double lon2 = lo2/MILLION; 

      double lat1Rad = Math.toRadians(lat1); 
      double lat2Rad = Math.toRadians(lat2); 
      double deltaLonRad = Math.toRadians(lon2 - lon1); 

      double dist = Math 
        .acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) 
          * Math.cos(lat2Rad) * Math.cos(deltaLonRad)) 
        * EARTH_RADIUS_KM; 
      return dist; 

     } 

private float round(float dist, int i) { 
     float p1 = (float) Math.pow(10, i); 
     dist = dist * p1; 
     float tmp = Math.round(dist); 
     return (float) tmp/p1; 
    } 

然後用它們作爲

float tempdist = (float) calcdist(); 
dist = round(tempdist, 2); 
+0

嘿..在發佈這個答案後,我已經使用您的輸入測試過它,但它給了我dist 12.7所以對此感到抱歉..我認爲我們正在計算距離,如「直線從一個點到另一個」和谷歌地圖給「距離按照路線建議「..所以它給幾公里/米differece .. – MKJParekh

0

嘿,我在這裏找到一個源代碼,以防萬一人表示,將通過陸路返回正確的距離移動。我沒有嘗試過,但你可以嘗試告訴我它是否真的有效。 GPSSample.java

我不知道你是如何傳遞的緯度 - 龍Values..Please試試這個全樣本代碼一次。

和代碼編寫在android.location.Location.java爲此如下..如果您希望可以直接在您的應用程序中使用它。

private static void computeDistanceAndBearing(double lat1, 
        double lon1, double lat2, double lon2, float[] results) { 
       // Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf 
       // using the "Inverse Formula" (section 4) 

       int MAXITERS = 20; 
       // Convert lat/long to radians 
       lat1 *= Math.PI/180.0; 
       lat2 *= Math.PI/180.0; 
       lon1 *= Math.PI/180.0; 
       lon2 *= Math.PI/180.0; 

       double a = 6378137.0; // WGS84 major axis 
       double b = 6356752.3142; // WGS84 semi-major axis 
       double f = (a - b)/a; 
       double aSqMinusBSqOverBSq = (a * a - b * b)/(b * b); 

       double L = lon2 - lon1; 
       double A = 0.0; 
       double U1 = Math.atan((1.0 - f) * Math.tan(lat1)); 
       double U2 = Math.atan((1.0 - f) * Math.tan(lat2)); 

       double cosU1 = Math.cos(U1); 
       double cosU2 = Math.cos(U2); 
       double sinU1 = Math.sin(U1); 
       double sinU2 = Math.sin(U2); 
       double cosU1cosU2 = cosU1 * cosU2; 
       double sinU1sinU2 = sinU1 * sinU2; 

       double sigma = 0.0; 
       double deltaSigma = 0.0; 
       double cosSqAlpha = 0.0; 
       double cos2SM = 0.0; 
       double cosSigma = 0.0; 
       double sinSigma = 0.0; 
       double cosLambda = 0.0; 
       double sinLambda = 0.0; 

       double lambda = L; // initial guess 
       for (int iter = 0; iter < MAXITERS; iter++) { 
        double lambdaOrig = lambda; 
        cosLambda = Math.cos(lambda); 
        sinLambda = Math.sin(lambda); 
        double t1 = cosU2 * sinLambda; 
        double t2 = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda; 
        double sinSqSigma = t1 * t1 + t2 * t2; // (14) 
        sinSigma = Math.sqrt(sinSqSigma); 
        cosSigma = sinU1sinU2 + cosU1cosU2 * cosLambda; // (15) 
        sigma = Math.atan2(sinSigma, cosSigma); // (16) 
        double sinAlpha = (sinSigma == 0) ? 0.0 : cosU1cosU2 
          * sinLambda/sinSigma; // (17) 
        cosSqAlpha = 1.0 - sinAlpha * sinAlpha; 
        cos2SM = (cosSqAlpha == 0) ? 0.0 : cosSigma - 2.0 
          * sinU1sinU2/cosSqAlpha; // (18) 

        double uSquared = cosSqAlpha * aSqMinusBSqOverBSq; // defn 
        A = 1 
          + (uSquared/16384.0) 
          * // (3) 
          (4096.0 + uSquared 
            * (-768 + uSquared 
              * (320.0 - 175.0 * uSquared))); 
        double B = (uSquared/1024.0) * // (4) 
          (256.0 + uSquared 
            * (-128.0 + uSquared 
              * (74.0 - 47.0 * uSquared))); 
        double C = (f/16.0) * cosSqAlpha 
          * (4.0 + f * (4.0 - 3.0 * cosSqAlpha)); // (10) 
        double cos2SMSq = cos2SM * cos2SM; 
        deltaSigma = B 
          * sinSigma 
          * // (6) 
          (cos2SM + (B/4.0) 
            * (cosSigma * (-1.0 + 2.0 * cos2SMSq) - (B/6.0) 
              * cos2SM 
              * (-3.0 + 4.0 * sinSigma * sinSigma) 
              * (-3.0 + 4.0 * cos2SMSq))); 

        lambda = L 
          + (1.0 - C) 
          * f 
          * sinAlpha 
          * (sigma + C 
            * sinSigma 
            * (cos2SM + C * cosSigma 
              * (-1.0 + 2.0 * cos2SM * cos2SM))); // (11) 

        double delta = (lambda - lambdaOrig)/lambda; 
        if (Math.abs(delta) < 1.0e-12) { 
         break; 
        } 
       } 

       float distance = (float) (b * A * (sigma - deltaSigma)); 
      results[0] = distance; 
      if (results.length > 1) { 
       float initialBearing = (float) Math.atan2(
         cosU2 * sinLambda, cosU1 * sinU2 - sinU1 * cosU2 
           * cosLambda); 
       initialBearing *= 180.0/Math.PI; 
       results[1] = initialBearing; 
       if (results.length > 2) { 
        float finalBearing = (float) Math.atan2(cosU1 
          * sinLambda, -sinU1 * cosU2 + cosU1 * sinU2 
          * cosLambda); 
        finalBearing *= 180.0/Math.PI; 
        results[2] = finalBearing; 
       } 
      } 
     } 
+0

謝謝你的答案。 –