2010-07-15 40 views
5

Tôi đã sử dụng thuật toán trên http://www.movable-type.co.uk/scripts/latlong.html để tìm khoảng cách giữa hai điểm.Khoảng cách giữa hai địa điểm không đúng

hai điểm của tôi là

long1 = 51.507467; 
lat1 = -0.08776; 

long2 = 51.508736; 
lat2 = -0.08612; 

Theo Movable Type Script câu trả lời là 0.1812km

Ứng dụng của tôi cho kết quả (d) như 0.230km

thức Kiểm tra Haversine: http://www.movable-type.co.uk/scripts/latlong.html

double R = 6371; // earth’s radius (mean radius = 6,371km) 
    double dLat = Math.toRadians(lat2-lat1); 

    double dLon = Math.toRadians(long2-long1); 
    a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
      Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
      Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    double d = R * c; 

Trả lời

9

Tại sao để phát minh lại máy tính khoảng cách của riêng bạn, có một chiếc được tích hợp vào lớp Location.

Check-out

distanceBetween(double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results) 
Computes the approximate distance in meters between two locations, and optionally the initial and final bearings of the shortest path between them. 
+0

Sẽ dùng thử :) – Ally

+0

Nó đã hoạt động! Cảm ơn – Ally

3

Việc triển khai của bạn là chính xác. Khoảng cách cho những kinh độ và vĩ độ đó sẽ tạo ra khoảng cách 0.230 km. Tuy nhiên, đầu vào bình thường cho tọa độ là (vĩ độ, kinh độ). Đặt chúng ở phía sau (kinh độ, vĩ độ) sẽ tạo ra khoảng cách không chính xác là 0.1812 km.

+1

Oh ... chút xấu hổ. Cảm ơn sự giúp đỡ của bạn :) – Ally

1
public double CalculationByDistance(GeoPoint StartP, GeoPoint EndP) { 
    double lat1 = StartP.getLatitudeE6()/1E6; 
    double lat2 = EndP.getLatitudeE6()/1E6; 
    double lon1 = StartP.getLongitudeE6()/1E6; 
    double lon2 = EndP.getLongitudeE6()/1E6; 
    double dLat = Math.toRadians(lat2-lat1); 
    double dLon = Math.toRadians(lon2-lon1); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 2 * Math.asin(Math.sqrt(a)); 
    return Radius * c; 
} 

Ally ý tưởng của mình là right.May là một chút ít chang trong dòng này double c = 2 * Math.asin(Math.sqrt(a));

Các vấn đề liên quan