55 votes

Comment calculer la distance entre deux lieux à l'aide de leur longitude et de leur latitude ?

Ici mon code j'ai utilisé le code ci-dessous pour calculer la distance entre deux endroits en utilisant leur latitude et longitude. Il donne une distance erronée. Parfois il obtient une distance correcte et parfois une distance non pertinente.

Nous obtenons lat1 et lng1 de la base de données.

//getting lat2 and lng2 from GPS as below

public class MyLocationListener implements LocationListener {

  @Override
  public void onLocationChanged(Location loc)
  {
    lat2=loc.getLatitude();
    lng2=loc.getLongitude();
    String Text = "My current location is: " +"Latitud = "+ loc.getLatitude() +"Longitud = " + loc.getLongitude();

    //System.out.println("Lat & Lang form Loc"+Text);
    //Toast.makeText( getApplicationContext(), Text,Toast.LENGTH_SHORT).show();
  }

  @Override
  public void onProviderDisabled(String provider)
  {
  }

  @Override
  public void onProviderEnabled(String provider)
  {
  }

  @Override
  public void onStatusChanged(String provider, int status, Bundle extras)
  {
  }

  //Calculating distance
  double earthRadius = 3958.75;

  double dLat = Math.toRadians(lat1-lat2);
  double dLng = Math.toRadians(lng1-lng2);
  double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
             Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(lat1)) *
             Math.sin(dLng/2) * Math.sin(dLng/2);
  double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  double dist = earthRadius * c;

94voto

Nikolay Elenkov Points 32843

Il existe un android.location.Location.distanceBetween() qui fait cela très bien.

Docs pour les développeurs Android : Emplacement

2 votes

S'agit-il d'une distance aérienne ou routière ?

0 votes

Probablement aérien

5 votes

Définitivement aérien :)

80voto

Rasel Points 9997

Ici obtenir la distance en miles (mi)

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

private double deg2rad(double deg) {
    return (deg * Math.PI / 180.0);
}

private double rad2deg(double rad) {
    return (rad * 180.0 / Math.PI);
}

0 votes

Peut-on ajouter la distance à la latte pour obtenir la distance de la latte ?

1 votes

Il serait bien que vous ajoutiez les unités dans votre réponse.

11 votes

Je pense que cette unité de sortie est le Miles, vous pouvez la convertir en kilomètres avec cette formule-> km =mi / 0.62137 ;

76voto

Sandeep Maram Points 251

Essayez ce code.

startPoint.distanceTo(endPoint) renvoie la distance entre ces endroits en mètres.

Location startPoint=new Location("locationA");
startPoint.setLatitude(17.372102);
startPoint.setLongitude(78.484196);

Location endPoint=new Location("locationA");
endPoint.setLatitude(17.375775);
endPoint.setLongitude(78.469218);

double distance=startPoint.distanceTo(endPoint);

aquí "distance" est notre résultat requis dans Mètres . J'espère que cela fonctionnera pour Android.

0 votes

Heyy @sandeepmaaram J'utilise "SphericalUtil.computeDistanceBetween(from, to) ;" pour calculer la distance, mais le problème est que lorsque j'imprime cette distance dans le journal, cela me donne 13047. La distance réelle est également de 15,6 km. Je ne comprends donc pas bien à quoi correspondent ces chiffres ? Si c'est la distance, comment est-elle calculée ?

0 votes

SphericalUtil est cette API fournie par java/Android ? Avez-vous essayé avec ma solution ?

1 votes

Merci beaucoup @sandeepmaaram J'ai essayé votre solution et votre réponse donne l'emplacement exact que je veux. Et oui, l'api SphericalUtil est fournie par Android.

9voto

francisco_ssb Points 2847

Dans build.gradle :

compile 'com.google.maps.android:android-maps-utils:0.4'

et ensuite :

public static Double distanceBetween(LatLng point1, LatLng point2) {
    if (point1 == null || point2 == null) {
        return null;
    }

    return SphericalUtil.computeDistanceBetween(point1, point2);
}

0 votes

Dans cette méthode distanceBetween(), quel est le LatLng ? J'ai essayé de passer une double valeur de longitude et de latitude mais cela ne fonctionne pas.

0 votes

Vous devez mettre le type LatLng et non le double ce qui ressemble à LatLng[21.432432,76.543543]

8voto

Juri Tichomirow Points 137

Si vous avez deux objets de localisation Location loc1 y Location loc2 vous le faites

float distance = loc1.distanceTo(loc2);

Si vous avez des valeurs de longitude et de latitude, vous utilisez la fonction statique distanceBetween() fonction

    float[] results = new float[1];
    Location.distanceBetween(startLatitude, startLongitude,
    endLatitude, endLongitude, results);
    float distance = results[0];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X