2011-11-08 336 views
49

請一些線索這種情況計算距離

現在我有有附近地點的緯度和經度×2個陣列,也有用戶位置latiude和longiude現在我想計算之間的距離用戶位置和附近的地方,並希望在列表視圖中顯示它們。

我知道,有計算距離

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

的方法就是現在的問題是如何通過這兩個陣列,具有在此方法中附近的緯度和longitue並獲得距離的陣列。

+0

退房此鏈接: http://stackoverflow.com/questions/5739734 /如何計算兩點之間的距離在android應用程序/ 5739789#5739789 何這將幫助你。 –

+0

感謝您的回覆,但我想用上述方法計算距離。 –

+0

請澄清,從技術上講,您只給了我們一個方法簽名,這是沒有足夠的信息知道方法文檔可以找到的地方。嘗試添加有關包含類的信息 – Marmoy

回答

140

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

查找到distanceTo或distanceBetween。您可以從緯度和經度創建Location對象:

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); 

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

這是否通過公路給兩地之間的距離? –

+1

不,它返回位移(兩點之間的最短距離) –

+1

'float pk =(float)(180/3.14169);' - 小拼寫錯誤,這不是Pi ...它應該是3.141 ** 5 ** 9或使用'Math.PI'(也''Math'類而不贊成'FloatMath')。 57 upvotes和沒有人注意到? :D – snachmsm

3

只有一個用戶位置,所以你可以迭代附近的地方列表可以調用distanceTo()函數來獲得距離,如果你喜歡,你可以存儲在一個數組中。

據我所知,distanceBetween()是爲了很遠的地方,它的輸出是一個WGS84橢球體。

+0

可以請你建議哪一個可以提供精確的距離? –

0

distanceTo會給你兩個給定位置EJ target.distanceTo(目標)之間米的距離。

distanceBetween也給你的距離,但它會存儲在一個float(結果[0])數組中的距離。該文檔說,如果結果長度大於或等於2,則初始方位將存儲在結果[1]中。如果結果有長度爲3或更大,最終的軸承被存儲在結果[2]

希望這有助於

我用distanceTo獲得從A點到B的距離,我認爲是這樣的去。

10

試試此代碼。這裏我們有兩個經度和緯度值,而selected_location.distanceTo(near_locations)函數以米爲單位返回這些地點之間的距離。

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); 

這裏的 「距離」 是locationA & locationB之間的距離(米)

+4

偉大的提及度量.. !!! –

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; 

    }