2014-02-12 3 views
2

В моем приложении для Android, Я должен рассчитать расстояние между текущим местоположением пользователя и точкой, которую пользователь нажимает на карту. Я использую эту функцию для вычисления:Как получить расстояние между двумя местами в километре в google map v2 с помощью LatLng

 public double CalculationByDistance(LatLng StartP, LatLng EndP) { 
    int Radius=6371;//radius of earth in Km   
    double lat1 = StartP.latitude; 
    double lat2 = EndP.latitude; 
    double lon1 = StartP.longitude; 
    double lon2 = EndP.longitude; 
    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.asin(Math.sqrt(a)); 
    double valueResult= Radius*c; 
    double km=valueResult/1; 
    DecimalFormat newFormat = new DecimalFormat("####"); 
    int kmInDec = Integer.valueOf(newFormat.format(km)); 
    double meter=valueResult%1000; 
    int meterInDec= Integer.valueOf(newFormat.format(meter)); 
    Log.i("Radius Value",""+valueResult+" KM "+kmInDec+" Meter "+meterInDec); 

    return Radius * c; 
    } 

Но я получаю очень большое расстояние, как результат, например, для. Я получаю как 10947 км как расстояние между двумя местами, которое находится всего в 20 м. Может кто-нибудь мне помочь?

ответ

0

Поиск об уравнении Haversine. вот одна реализация, которая возвращает расстояние в метре:

public static double haversine(double lat1, double lon1, double lat2, double lon2) { 
    double dLat = Math.toRadians(lat2 - lat1); 
    double dLon = Math.toRadians(lon2 - lon1); 
    lat1 = Math.toRadians(lat1); 
    lat2 = Math.toRadians(lat2); 

    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 

    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 

    return R * c; 
} 

Где R = 6371000;

+0

это работает !. большое спасибо – EasterKim

4

Android предлагает метод вычисления расстояния между двумя точками lat/lon.

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

Используйте этот метод:

 private double distance(double lat1, double lon1, double lat2, 
      double lon2) { 
     double theta = lon1 - lon2; 
     double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) 
       + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) 
       * Math.cos(deg2rad(theta)); 
     dist = Math.acos(dist); 
     dist = rad2deg(dist); 
     dist = dist * 60 * 1.1515; 
     return (dist); 
    } 

Или просто проверить эту conversation

+0

может у обеспечить deg2rad метод? – EasterKim

+0

см. Эту ссылку http://stackoverflow.com/questions/6981916/how-to-calculate-distance-between-two-locations-using-their-longitude-and-latitu ... – Ranjit

0

Метод расчета расстояния в километрах

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); 

     double dist_travelled = Math 
       .acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) 
         * Math.cos(lat2Rad) * Math.cos(deltaLonRad)) 
       * EARTH_RADIUS_KM; 

     dist_travelled = Double.parseDouble(new DecimalFormat("##.######") 
       .format(dist_travelled)); 
     return dist_travelled; 

    } 
Смежные вопросы