2010-04-29 105 views
94

我想製作一個應用程序來檢查用戶所在位置的最近位置。我可以很容易地得到用戶的位置,我有一個經緯度的地方清單。獲取兩個地理點之間的距離

什麼是最好的方法來知道列表的最近的地方對目前的位置。

我在google API中找不到任何東西。

我擔心我需要求助於我的計算,並且必須做數學來計算它。

你們認爲什麼?

歡呼聲並致謝閱讀或回覆。

回答

108
Location loc1 = new Location(""); 
loc1.setLatitude(lat1); 
loc1.setLongitude(lon1); 

Location loc2 = new Location(""); 
loc2.setLatitude(lat2); 
loc2.setLongitude(lon2); 

float distanceInMeters = loc1.distanceTo(loc2); 

參考:http://developer.android.com/reference/android/location/Location.html#distanceTo(android.location.Location)

+1

可能比使用Location.DistanceBetween()慢,因爲它使用的是位置對象,但對我的目的非常有效。 – ZoltanF 2014-02-11 03:59:24

+0

@praveen感謝的人其作品.. – 2017-04-19 06:09:56

+0

哪一類,我有進口的位置 '進口android.location.Location;'或沒有定義 – 2017-04-19 07:27:40

117

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

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

Location location = new Location(""); 
location.setLatitude(lat); 
location.setLongitude(lon); 
+32

distanceBetween是一個靜態方法,它採用2臺經緯度長點的,所以你甚至不需要實例化一個Location對象=) – 2012-06-16 22:52:41

+4

我確定他的意思是'distanceTo'方法。 – laph 2013-04-08 22:28:20

+0

這非常棒,超級有用,但是constrructor中的字符串提供程序是什麼? – 2013-10-30 19:11:56

10

有幾個你可以使用的方法,但要確定哪一個是最好的,我們首先需要知道你是否知道用戶的高度,以及其他點的高度?

根據對精度的水平你之後,你可以看看要麼半正弦波或Vincenty公式...

這些頁面詳細的公式,而且,對於不太愛好數學還提供瞭如何解釋在腳本中實現它們!

haversine公式:http://www.movable-type.co.uk/scripts/latlong.html

Vincenty公式:http://www.movable-type.co.uk/scripts/latlong-vincenty.html

如果您有任何的公式的含義任何問題,只是評論,我會盡我所能回答:)

29

近似解(基於等矩形投影),快得多(它只需要1個trig和1個平方根)。

如果你的觀點不太相近,這個近似值是相關的。它將總是高估相比,真正的正弦波距離。例如,如果您的兩個點之間的delta緯度或經度不超過4個十進制度,則它將添加不超過0.05382%到實際距離。

標準式(半正矢)是確切一個(即,它適用於在地球上任何一對經度/緯度),但是慢得多因爲它需要7三角函數和2米的平方根。如果你的幾個點相距不太遠,並且絕對精度不是最重要的,那麼你可以使用這個近似的版本(Equirectangular),它比只使用一個三角和一個平方根快得多。

// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2) 
int R = 6371; // km 
double x = (lon2 - lon1) * Math.cos((lat1 + lat2)/2); 
double y = (lat2 - lat1); 
double distance = Math.sqrt(x * x + y * y) * R; 

您可以優化這進一步有兩種方法:

  1. 刪除平方根如果單純比較不同的距離(在這種情況下比較這兩個平方距離);
  2. 因式分解餘弦如果您計算從一個主點到其他許多點的距離(在這種情況下,您執行以主點爲中心的等軸投影,因此可以爲所有比較計算一次餘弦)。

欲瞭解更多信息,請參閱:http://www.movable-type.co.uk/scripts/latlong.html

有幾種語言haversine公式的一個很好的參考實現的:http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe

+0

偉人thanx。但是如果我需要在周邊的一個位置附近找到一組位置,我應該使用一個while循環來檢查搜索到的每個位置並僅保留周邊位置? – themis 2012-12-27 16:02:16

+0

你可以,但這是'O(n)'中的一種強力方法。對於「O(1)」解,在計算精確解之前,使用2D空間索引來修剪潛在匹配。我們正在離開這個問題的範圍:) – 2012-12-28 11:50:38

+0

這是一個非常漂亮的可能優化結果.. thx!極其重要的是我在尋找 – 2014-06-03 19:16:28

3

有兩種方法以獲得LatLng之間的距離。

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

See this

和第二

public float distanceTo (Location dest)作爲回答普利文。

0

只需使用下面的方法,通過它lat和長,米獲得距離:

private static double distance_in_meter(final double lat1, final double lon1, final double lat2, final double lon2) { 
    double R = 6371000f; // Radius of the earth in m 
    double dLat = (lat1 - lat2) * Math.PI/180f; 
    double dLon = (lon1 - lon2) * Math.PI/180f; 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
      Math.cos(latlong1.latitude * Math.PI/180f) * Math.cos(latlong2.latitude * Math.PI/180f) * 
        Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 2f * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    double d = R * c; 
    return d; 
} 
+1

latlong1和latlong2 – Boy 2017-02-03 13:31:52

+0

是什麼latlong1&latlong2? – 2017-09-22 17:31:40

0
private float getDistance(double lat1, double lon1, double lat2, double lon2) { 
     float[] distance = new float[2]; 
     Location.distanceBetween(lat1, lon1, lat2, lon2, distance); 
     return distance[0]; 
    } 
相關問題