获取两个地理点之间的距离
我想制作一个应用程序来检查用户所在的位置。 我可以很容易地得到用户的位置,我有一个经纬度的地方名单。
与当前位置相比,了解列表中最接近的地方的最好方法是什么?
我无法在google API中find任何东西。
我担心我需要求助于我的计算,必须做math计算。
你们有什么感想 ?
欢呼和感谢阅读或回复。
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)
http://developer.android.com/reference/android/location/Location.html
看看distanceTo或distanceBetween。 您可以从经度和纬度创build一个Location对象:
Location location = new Location(""); location.setLatitude(lat); location.setLongitude(lon);
一个近似的解决scheme(基于Equirectangular投影), 更快 (它只需要1个trig和1个平方根)。
如果你的观点不太相近,这个近似是相关的。 与真正的半空间距离相比,它总会被高估 。 例如,如果两点之间的纬度或经度不超过4个十进制度,它将会增加不超过实际距离的0.05382% 。
标准公式(Haversine)是准确的 (也就是说,它对任何地球上的经度/纬度都适用),但要慢得多,因为它需要7个三angular和2个平方根。 如果你的几个点不是太远,绝对精度不是最重要的,你可以使用这个近似的版本(Equirectangular),这个版本比只使用一个三angular和一个平方根快得多。
// 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
有几种方法可以使用,但要确定哪一个是最好的,我们首先需要知道您是否知道用户的高度以及其他点的高度?
根据您所掌握的准确程度,您可以查看Haversine或Vincenty配方。
这些页面详细说明了公式,而且对于math上较less的倾向,还提供了如何在脚本中实现它们的解释!
Haversine公式: http : //www.movable-type.co.uk/scripts/latlong.html
Vincenty公式: http : //www.movable-type.co.uk/scripts/latlong-vincenty.html
如果您在公式中的任何含义有任何问题,只需评论,我会尽我所能来回答他们:)
有两种方法可以在LatLng之间获得距离。
public static void distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results)
看到这个
第二
public float distanceTo (Location dest)
由praveen回答。
只要使用下面的方法,将其传递给经纬度,并以米为单位获得距离:
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; }