获取两个地理点之间的距离

Chm*_*nah 107 maps android geolocation

我想制作一个应用程序来检查用户所在的最近的地方.我可以很容易地获得用户的位置,我已经有了纬度和经度的地方列表.

知道列表最近的位置与当前用户位置的最佳方法是什么.

我在谷歌API中找不到任何东西.

小智 156

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);
Run Code Online (Sandbox Code Playgroud)

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

  • 可能比使用Location.DistanceBetween()慢,因为它使用的是Location对象,但对我而言效果很好。 (2认同)

has*_*man 122

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

查看distanceTo或distanceBetween.您可以从纬度和经度创建Location对象:

Location location = new Location("");
location.setLatitude(lat);
location.setLongitude(lon);
Run Code Online (Sandbox Code Playgroud)

  • distanceBetween是一个静态方法,它采用2组lat长点,因此你甚至不需要实例化Location对象=) (36认同)
  • 我确定他的意思是'distanceTo`方法. (4认同)

Lau*_*ire 31

近似解(基于等距矩形投影),更快(它只需要1个trig和1个平方根).

如果你的点不是太远,那么这种近似是相关的.与真实的半径距离相比,它总是高估.例如,如果两点之间的三角洲纬度或经度不超过4个十进制度,它将向实际距离添加不超过0.05382%.

标准公式(Haversine)是精确的公式(也就是说,它适用于地球上任何一个经度/纬度)但速度要慢得多,因为它需要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;
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式进一步优化:

  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


Dwa*_*ley 11

您可以使用几种方法,但要确定哪种方法最好,我们首先需要知道您是否了解用户的高度以及其他点的高度?

根据您所追求的准确程度,您可以查看Haversine或Vincenty公式......

这些页面详细说明了公式,并且对于数学上较少的公式也提供了如何在脚本中实现它们的说明!

Haversine Formula:http://www.movable-type.co.uk/scripts/latlong.html

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

如果你对公式中的任何含义有任何问题,只需评论,我会尽我所能回答它们:)