2010-09-15 51 views
22

tôi đã sử dụng mã này, nhưng nó không làm việc:Làm thế nào tôi có thể tính toán khoảng cách giữa hai điểm gps trong Java?

Cần khoảng cách giữa hai gps phối như 41,1212, 11,2323 bằng km (Java)

double d2r = (180/Math.PI); 
double distance = 0; 

try{ 
    double dlong = (endpoint.getLon() - startpoint.getLon()) * d2r; 
    double dlat = (endpoint.getLat() - startpoint.getLat()) * d2r; 
    double a = 
     Math.pow(Math.sin(dlat/2.0), 2) 
      + Math.cos(startpoint.getLat() * d2r) 
      * Math.cos(endpoint.getLat() * d2r) 
      * Math.pow(Math.sin(dlong/2.0), 2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    double d = 6367 * c; 

    return d; 

} catch(Exception e){ 
    e.printStackTrace(); 
} 
+3

Cách tiếp cận lượng giác của bạn sẽ hoạt động thực sự tốt nếu Trái đất là một hình cầu hoàn hảo. Tuy nhiên, nó thực sự là một ellipsoid, vì vậy bán kính từ bề mặt đến lõi của Trái đất là biến tùy thuộc vào vị trí của bạn trên trái đất. Để có được phép đo khoảng cách chính xác, bạn cần có một thư viện hệ thống tọa độ có thể giải thích cho điều này. Giả sử một quả cầu có thể đủ gần với bất cứ điều gì bạn đang làm, nhưng nếu bạn cần nó là rất chính xác, bạn sẽ cần phải tìm một thư viện tốt. –

+0

trùng lắp từ: [http://stackoverflow.com/questions/3694380/calculating-distance-between-two-points-using-latitude-longitude-what-am-i-doi][1] [1]: http://stackoverflow.com/questions/3694380/calculating-distance-between-two-points-using-latitude-longitude-what-am-i-doi – gonella

Trả lời

20

Kinh độ và vĩ độ được đưa ra trong độ (0-360) . Nếu bạn muốn chuyển đổi độ thành radian (0-2 π), bạn cần chia cho 360 và nhân với 2 π, (hoặc tương đương, nhân với π/180). Tuy nhiên, trong mã của bạn, bạn nhân với 180/π.

Đó là, thay đổi

double d2r = (180/Math.PI); 

vào

double d2r = Math.PI/180; 
8

Giải pháp từ http://www.androidsnippets.com/distance-between-two-gps-coordinates-in-meter.

Chỉ hoạt động nếu các điểm đủ gần để bạn có thể bỏ qua trái đất đó không phải là hình dạng thông thường.

 

private double gps2m(float lat_a, float lng_a, float lat_b, float lng_b) { 
    float pk = (float) (180/3.14169); 

    float a1 = lat_a/pk; 
    float a2 = lng_a/pk; 
    float b1 = lat_b/pk; 
    float b2 = lng_b/pk; 

    float t1 = FloatMath.cos(a1)*FloatMath.cos(a2)*FloatMath.cos(b1)*FloatMath.cos(b2); 
    float t2 = FloatMath.cos(a1)*FloatMath.sin(a2)*FloatMath.cos(b1)*FloatMath.sin(b2); 
    float t3 = FloatMath.sin(a1)*FloatMath.sin(b1); 
    double tt = Math.acos(t1 + t2 + t3); 

    return 6366000*tt; 
} 
// 

xem Distance between two GPS coordinates in meter.

8

đã xem một cách Geocalc

Coordinate lat = new GPSCoordinate(41, .1212); 
Coordinate lng = new GPSCoordinate(11, .2323); 
Point point = new Point(lat, lng); 

lat = new DegreeCoordinate(51.4613418); 
lng = new DegreeCoordinate(-0.3035466); 
Point point2 = new Point(lat, lng); 
System.out.println("Distance is " + EarthCalc.getDistance(point2, point)/1000 + " km"); 

là 1448,7325760822912 km

Tôi đã viết thư viện đó cho một dự án của tôi.

+0

cảm ơn nó đã giúp ích rất nhiều :) đánh giá cao. .. –

0

Khoảng cách có thể được tính bằng thư viện Hình học Esri: geodesicDistanceOnWGS84.

Tôi cho rằng JTS cũng có phương pháp tính khoảng cách.