我想製作一個應用程序來檢查用戶所在位置的最近位置。我可以很容易地得到用戶的位置,我有一個經緯度的地方清單。獲取兩個地理點之間的距離
什麼是最好的方法來知道列表的最近的地方對目前的位置。
我在google API中找不到任何東西。
我擔心我需要求助於我的計算,並且必須做數學來計算它。
你們認爲什麼?
歡呼聲並致謝閱讀或回覆。
我想製作一個應用程序來檢查用戶所在位置的最近位置。我可以很容易地得到用戶的位置,我有一個經緯度的地方清單。獲取兩個地理點之間的距離
什麼是最好的方法來知道列表的最近的地方對目前的位置。
我在google API中找不到任何東西。
我擔心我需要求助於我的計算,並且必須做數學來計算它。
你們認爲什麼?
歡呼聲並致謝閱讀或回覆。
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或distanceBetween。您可以從緯度和經度創建Location對象:
Location location = new Location("");
location.setLatitude(lat);
location.setLongitude(lon);
distanceBetween是一個靜態方法,它採用2臺經緯度長點的,所以你甚至不需要實例化一個Location對象=) – 2012-06-16 22:52:41
我確定他的意思是'distanceTo'方法。 – laph 2013-04-08 22:28:20
這非常棒,超級有用,但是constrructor中的字符串提供程序是什麼? – 2013-10-30 19:11:56
有幾個你可以使用的方法,但要確定哪一個是最好的,我們首先需要知道你是否知道用戶的高度,以及其他點的高度?
根據對精度的水平你之後,你可以看看要麼半正弦波或Vincenty公式...
這些頁面詳細的公式,而且,對於不太愛好數學還提供瞭如何解釋在腳本中實現它們!
haversine公式:http://www.movable-type.co.uk/scripts/latlong.html
Vincenty公式:http://www.movable-type.co.uk/scripts/latlong-vincenty.html
如果您有任何的公式的含義任何問題,只是評論,我會盡我所能回答:)
近似解(基於等矩形投影),快得多(它只需要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;
您可以優化這進一步有兩種方法:
欲瞭解更多信息,請參閱:http://www.movable-type.co.uk/scripts/latlong.html
有幾種語言haversine公式的一個很好的參考實現的:http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe
偉人thanx。但是如果我需要在周邊的一個位置附近找到一組位置,我應該使用一個while循環來檢查搜索到的每個位置並僅保留周邊位置? – themis 2012-12-27 16:02:16
你可以,但這是'O(n)'中的一種強力方法。對於「O(1)」解,在計算精確解之前,使用2D空間索引來修剪潛在匹配。我們正在離開這個問題的範圍:) – 2012-12-28 11:50:38
這是一個非常漂亮的可能優化結果.. thx!極其重要的是我在尋找 – 2014-06-03 19:16:28
有兩種方法以獲得LatLng之間的距離。
public static void distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results)
和第二
public float distanceTo (Location dest)
作爲回答普利文。
只需使用下面的方法,通過它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;
}
latlong1和latlong2 – Boy 2017-02-03 13:31:52
是什麼latlong1&latlong2? – 2017-09-22 17:31:40
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];
}
可能比使用Location.DistanceBetween()慢,因爲它使用的是位置對象,但對我的目的非常有效。 – ZoltanF 2014-02-11 03:59:24
@praveen感謝的人其作品.. – 2017-04-19 06:09:56
哪一類,我有進口的位置 '進口android.location.Location;'或沒有定義 – 2017-04-19 07:27:40