2011-11-08 43 views
49

xin làm sáng tỏ về tình trạng nàyTính khoảng cách giữa hai vị trí địa lý

Ngay bây giờ tôi có hai mảng có vĩ độ và kinh độ của nơi gần đó và cũng có vị trí người sử dụng latiude và longiude bây giờ tôi muốn để tính toán khoảng cách giữa vị trí người dùng và các địa điểm lân cận và muốn hiển thị chúng trong chế độ xem danh sách.

Tôi biết rằng có một phương pháp để tính toán khoảng cách như

public static void distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results); 

Bây giờ những gì là vấn đề là làm thế nào để vượt qua hai mảng có lân cận vĩ độ và longitue trong phương pháp này và nhận được hàng loạt các khoảng cách.

+0

kiểm tra liên kết này: http://stackoverflow.com/questions/5739734/how-to-calculate-the-distance-between-two-points-in-android-app/5739789 # 5739789 Ho pe này sẽ giúp bạn. –

+0

cảm ơn bạn đã trả lời nhưng tôi muốn tính khoảng cách bằng phương pháp trên. –

+0

xin vui lòng làm rõ, về mặt kỹ thuật bạn đã chỉ cho chúng tôi một chữ ký phương pháp, đó là không đủ thông tin để biết nơi tài liệu phương pháp có thể được tìm thấy.Hãy thử thêm thông tin về lớp chứa – Marmoy

Trả lời

140

http://developer.android.com/reference/android/location/Location.html

Nhìn vào khoảng cáchĐến khoảng cách giữa. Bạn có thể tạo một đối tượng vị trí từ vĩ độ và kinh độ:

Location locationA = new Location("point A"); 

locationA.setLatitude(latA); 
locationA.setLongitude(lngA); 

Location locationB = new Location("point B"); 

locationB.setLatitude(latB); 
locationB.setLongitude(lngB); 

float distance = locationA.distanceTo(locationB); 

hoặc

private double meterDistanceBetweenPoints(float lat_a, float lng_a, float lat_b, float lng_b) { 
    float pk = (float) (180.f/Math.PI); 

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

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

    return 6366000 * tt; 
} 
+0

Điều này có cho khoảng cách giữa hai địa điểm bằng đường không? –

+1

không trả về Displacement (Khoảng cách ngắn nhất giữa hai điểm) –

+1

'float pk = (float) (180/3.14169);' - lỗi chính tả nhỏ, đây không phải là Pi ... nó phải là 3.141 ** 5 ** 9 hoặc 'Math.PI' được sử dụng (cũng là lớp' Math' thay vì không dùng 'FloatMath'). 57 upvotes và không ai nhận thấy? : D – snachmsm

3

Chỉ có một vị trí người dùng, vì vậy bạn có thể lặp Danh sách các địa điểm lân cận có thể gọi hàm distanceTo() để nhận khoảng cách, bạn có thể lưu trữ trong một mảng nếu bạn muốn.

Từ những gì tôi hiểu, distanceBetween() là dành cho những nơi xa xôi, đầu ra của nó là một hình elip WGS84.

+0

bạn có thể vui lòng đề xuất cái nào cung cấp khoảng cách chính xác hay không ? –

0

distanceTo sẽ cung cấp cho bạn khoảng cách tính bằng mét giữa hai cho vị trí ej target.distanceTo (đích).

distanceBetween cung cấp cho bạn khoảng cách cũng nhưng nó sẽ lưu khoảng cách trong một mảng float (kết quả [0]). tài liệu nói Nếu kết quả có độ dài 2 hoặc lớn hơn, vòng bi ban đầu được lưu trong kết quả [1]. Nếu kết quả có chiều dài 3 hoặc cao hơn, mang thức được lưu trữ trong các kết quả [2]

hy vọng rằng điều này sẽ giúp

tôi đã sử dụng distanceTo để có được khoảng cách từ điểm A đến B tôi nghĩ rằng đó là con đường đi.

10

Hãy thử mã này. ở đây chúng ta có hai giá trị kinh độ và vĩ độ và hàm selected_location.distanceTo (near_locations) trả về khoảng cách giữa các vị trí đó theo mét.

Location selected_location=new Location("locationA"); 
      selected_location.setLatitude(17.372102); 
      selected_location.setLongitude(78.484196); 
Location near_locations=new Location("locationB"); 
      near_locations.setLatitude(17.375775); 
      near_locations.setLongitude(78.469218); 
double distance=selected_location.distanceTo(near_locations); 

here "khoảng cách" là khoảng cách giữa locationA & locationB (tính bằng mét)

+4

tuyệt vời để đề cập đến số liệu .. !!! –

3
private static Double _MilesToKilometers = 1.609344; 
    private static Double _MilesToNautical = 0.8684; 


    /// <summary> 
    /// Calculates the distance between two points of latitude and longitude. 
    /// Great Link - http://www.movable-type.co.uk/scripts/latlong.html 
    /// </summary> 
    /// <param name="coordinate1">First coordinate.</param> 
    /// <param name="coordinate2">Second coordinate.</param> 
    /// <param name="unitsOfLength">Sets the return value unit of length.</param> 
    public static Double Distance(Coordinate coordinate1, Coordinate coordinate2, UnitsOfLength unitsOfLength) 
    { 

     double theta = coordinate1.getLongitude() - coordinate2.getLongitude(); 
     double distance = Math.sin(ToRadian(coordinate1.getLatitude())) * Math.sin(ToRadian(coordinate2.getLatitude())) + 
         Math.cos(ToRadian(coordinate1.getLatitude())) * Math.cos(ToRadian(coordinate2.getLatitude())) * 
         Math.cos(ToRadian(theta)); 

     distance = Math.acos(distance); 
     distance = ToDegree(distance); 
     distance = distance * 60 * 1.1515; 

     if (unitsOfLength == UnitsOfLength.Kilometer) 
      distance = distance * _MilesToKilometers; 
     else if (unitsOfLength == UnitsOfLength.NauticalMiles) 
      distance = distance * _MilesToNautical; 

     return (distance); 

    } 
0
public double distance(Double latitude, Double longitude, double e, double f) { 
     double d2r = Math.PI/180; 

     double dlong = (longitude - f) * d2r; 
     double dlat = (latitude - e) * d2r; 
     double a = Math.pow(Math.sin(dlat/2.0), 2) + Math.cos(e * d2r) 
       * Math.cos(latitude * 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; 

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