如何在地图中找到两个地理位置之间的正确距离?

时间:2012-07-02 13:00:01

标签: android android-location

我需要开发应用程序,用户必须找到他停放的汽车,并显示他和停车之间的距离。我使用GPS和定位服务。

对于距离,我使用了 hasrsine 公式,但距离始终显示为0米。

我在谷歌中尝试了很多搜索解决方案但是dint得到了正确的解决方案。

有人可以提出建议吗?

6 个答案:

答案 0 :(得分:12)

Google文档有两种方法

enter image description here

如果你从GeoPoint获得lat / lon,那么他们是微观的。你必须乘以1e6。

但我更喜欢使用以下方法。 (基于Haversine公式)

http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe

double dist = GeoUtils.distanceKm(mylat, mylon, lat, lon);

 /**
 * Computes the distance in kilometers between two points on Earth.
 * 
 * @param lat1 Latitude of the first point
 * @param lon1 Longitude of the first point
 * @param lat2 Latitude of the second point
 * @param lon2 Longitude of the second point
 * @return Distance between the two points in kilometers.
 */

public static double distanceKm(double lat1, double lon1, double lat2, double lon2) {
    int EARTH_RADIUS_KM = 6371;
    double lat1Rad = Math.toRadians(lat1);
    double lat2Rad = Math.toRadians(lat2);
    double deltaLonRad = Math.toRadians(lon2 - lon1);

    return Math.acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad)) * EARTH_RADIUS_KM;
}

最后,我想分享奖金信息。

如果您正在寻找行车路线,请在两个地点之间路线,然后前往

http://code.google.com/p/j2memaprouteprovider/

答案 1 :(得分:3)

尝试在 android.location API

中使用此方法

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

此方法计算两个位置之间的近似距离,以及它们之间最短路径的初始和最终方位

NB:如果你从GeoPoint获得lat / lon,那么他们是微观的。你必须乘以1E6

如果您想通过 Haversine公式计算2 Geopoint之间的距离

public class DistanceCalculator {
   // earth’s radius = 6,371km
   private static final double EARTH_RADIUS = 6371 ;
   public static double distanceCalcByHaversine(GeoPoint startP, GeoPoint endP) {
      double lat1 = startP.getLatitudeE6()/1E6;
      double lat2 = endP.getLatitudeE6()/1E6;
      double lon1 = startP.getLongitudeE6()/1E6;
      double lon2 = endP.getLongitudeE6()/1E6;
      double dLat = Math.toRadians(lat2-lat1);
      double dLon = Math.toRadians(lon2-lon1);
      double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
      Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
      Math.sin(dLon/2) * Math.sin(dLon/2);
      double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
      return EARTH_RADIUS * c;
   }
}

答案 2 :(得分:3)

distanceBetween()方法会给你两点之间的直线距离。得到两点之间的路线距离看到我的ansewer Here

答案 3 :(得分:1)

android.location.Location.distanceBetween(double startLatitude,double startLongitude,double endLatitude,double endLongitude,float [] results)

Geopoints有getLongitudeE6()和getLatitudeE6()来帮助。请记住,那些是E6所以你需要除以1E6。

答案 4 :(得分:1)

harvesine公式的问题在于它不计算实际距离。它是球体上2个点的距离。真正的距离取决于街道或水路。 Harvesine公式也有点复杂,因此更容易让Google-Api给出真正的距离。使用Googlemaps Api,您需要了解api方向。

答案 5 :(得分:0)

distanceBetween不会影响实际距离(道路距离) 因此,我建议您访问此谷歌源代码,它将显示2个地理点之间的真实道路距离。 Link Android 有2个版本,黑莓有1个版本