我在這個主題中進行了一些研究,但也有很多意見不能給出清晰的圖像。我的問題是這樣的:我正在開發一個基於gps的Android應用程序,至於我想知道我的當前位置由Androids LocationManager指定的位置和其他位置之間的距離。我嘗試了Haversine公式,一個餘弦定律公式,然後我發現Android SDK給了我一個簡單的函數Location.distanceTo(Location) - 我不確定這個函數運行在什麼方法上。
所以,重點是,如果在大多數情況下這些位置之間的實際距離不會大於aprox,那麼這對我來說是很好用的。 100-200M?也許我應該檢查Vincenty的公式?真的很慢嗎?有人可以解釋我應該選擇什麼?Android:計算兩個位置之間距離的最佳方法
5
A
回答
2
請勿使用distanceTo。使用distanceBetween方法,因爲它聽起來像你已經有了座標,這就是你需要的這個方法:Location.distanceBetween() Javadoc
1
尋找distanceTo(Location)的Android源代碼,你可以看到結果是基於「Inverse式」大地測量:
其是基於使用"Inverse Formula"(第4節)
此外,這兩種方法distanceTo和distanceBetween使用相同的基本方法。他們只有其他形式的輸入/輸出。
爲了完整起見,本計算的完整源代碼包含在下面,但我鼓勵您自己查看android.location中的Location類。 (P.S.我沒有檢查Android計算的正確性,這將是一個很好的練習!)
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;
}
}
}
相關問題
- 1. 計算兩個位置之間的距離Android Studio
- 2. 最快的方法來計算兩個CGPoints之間的距離?
- 3. 計算2個座標之間的距離iphone - 最佳做法
- 4. 計算基於道路的兩個位置之間的距離
- 5. 計算兩個地理位置之間的距離
- 6. 快速計算兩個位置之間的距離
- 7. 計算兩個位置之間的像素距離
- 8. Three.js - 如何計算兩個3D位置之間的距離?
- 9. 我該如何計算兩個位置之間的距離
- 10. 計算兩個緯度座標之間的距離/方位
- 11. android中兩個位置之間的距離和方位
- 12. 計算2個位置之間的距離並計算價格
- 13. 計算Android地圖中兩個位置之間的距離和時間V2
- 14. 算法兩個位置之間的距離計算正在太多
- 15. 兩個GEO位置之間的距離
- 16. 如何計算兩個位置距離?
- 17. Android Maps v2 API ...如何計算兩個位置之間的距離(經緯度)
- 18. 如何計算兩個位置之間的距離,然後顯示方式?
- 19. 用於計算兩個字符串之間距離的算法
- 20. 計算兩次之間的距離
- 21. 計算用戶位置和固定位置之間的距離
- 22. 計算兩個任意形狀之間的最小距離
- 23. 計算兩個給定圓弧之間的最小距離
- 24. 哪一個最好計算兩點之間的距離?
- 25. 計算N維空間中兩點之間歐氏距離的最快方法
- 26. 計算距離位置的距離 - iPhone
- 27. 計算兩條線和兩條弧之間的最小距離
- 28. android-計算兩個公交車站之間的距離
- 29. 如何使用Android MapView計算兩個GeoPoint之間的距離
- 30. 計算Vuejs中DOM元素之間距離的最佳方法是什麼?
distanceTo和distanceBetween之間有什麼區別,因爲我從LocationManager獲取位置? –