web-dev-qa-db-fra.com

Calculer la distance entre deux points, en utilisant la latitude, la longitude?

Voici mon essai, c'est juste un extrait de mon code:

final double RADIUS = 6371.01;
double temp = Math.cos(Math.toRadians(latA))
            * Math.cos(Math.toRadians(latB))
            * Math.cos(Math.toRadians((latB) - (latA)))
            + Math.sin(Math.toRadians(latA))
            * Math.sin(Math.toRadians(latB));
    return temp * RADIUS * Math.PI / 180;

J'utilise ces formules pour obtenir la latitude et la longitude:

x = Deg + (Min + Sec / 60) / 60)
74
m4design

Le code Java donné par Dommer ci-dessus donne des résultats légèrement incorrects, mais les petites erreurs s’additionnent si vous traitez une piste GPS. Voici une implémentation de la méthode Haversine dans Java qui prend également en compte les différences de hauteur entre deux points.

/**
 * Calculate distance between two points in latitude and longitude taking
 * into account height difference. If you are not interested in height
 * difference pass 0.0. Uses Haversine method as its base.
 * 
 * lat1, lon1 Start point lat2, lon2 End point el1 Start altitude in meters
 * el2 End altitude in meters
 * @returns Distance in Meters
 */
public static double distance(double lat1, double lat2, double lon1,
        double lon2, double el1, double el2) {

    final int R = 6371; // Radius of the earth

    double latDistance = Math.toRadians(lat2 - lat1);
    double lonDistance = Math.toRadians(lon2 - lon1);
    double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
            + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
            * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    double distance = R * c * 1000; // convert to meters

    double height = el1 - el2;

    distance = Math.pow(distance, 2) + Math.pow(height, 2);

    return Math.sqrt(distance);
}
181
David George

Voici une fonction Java qui calcule la distance entre deux points lat/long .

Modifier

J'ai trouvé ne autre référence au code .

Et, posté ci-dessous, juste au cas où il disparaîtrait à nouveau.

    private double distance(double lat1, double lon1, double lat2, double lon2, char unit) {
      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;
      if (unit == 'K') {
        dist = dist * 1.609344;
      } else if (unit == 'N') {
        dist = dist * 0.8684;
        }
      return (dist);
    }

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    /*::  This function converts decimal degrees to radians             :*/
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    private double deg2rad(double deg) {
      return (deg * Math.PI / 180.0);
    }

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    /*::  This function converts radians to decimal degrees             :*/
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    private double rad2deg(double rad) {
      return (rad * 180.0 / Math.PI);
    }

    System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'M') + " Miles\n");
    System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'K') + " Kilometers\n");
    System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'N') + " Nautical Miles\n");
74
dommer

Remarque: cette solution ne fonctionne que sur de courtes distances.

J'ai essayé d'utiliser la formule affichée de dommer pour une application et j'ai constaté que cela fonctionnait bien sur de longues distances, mais dans mes données, j'utilisais toutes les très courtes distances et le message de dommer était très médiocre. J'avais besoin de vitesse et les calculs géo plus complexes fonctionnaient bien mais étaient trop lents. Donc, dans le cas où vous avez besoin de vitesse et que tous les calculs que vous effectuez sont courts (peut-être <100 m environ). J'ai trouvé cette petite approximation très efficace. cela suppose que le monde est plat, donc ne l'utilisez pas sur de longues distances, cela fonctionne en se rapprochant de la distance d'une seule latitude et de la longitude à la latitude donnée et en renvoyant la distance de Pythagore en mètres.

public class FlatEarthDist {
    //returns distance in meters
    public static double distance(double lat1, double lng1, 
                                      double lat2, double lng2){
     double a = (lat1-lat2)*FlatEarthDist.distPerLat(lat1);
     double b = (lng1-lng2)*FlatEarthDist.distPerLng(lat1);
     return Math.sqrt(a*a+b*b);
    }

    private static double distPerLng(double lat){
      return 0.0003121092*Math.pow(lat, 4)
             +0.0101182384*Math.pow(lat, 3)
                 -17.2385140059*lat*lat
             +5.5485277537*lat+111301.967182595;
    }

    private static double distPerLat(double lat){
            return -0.000000487305676*Math.pow(lat, 4)
                -0.0033668574*Math.pow(lat, 3)
                +0.4601181791*lat*lat
                -1.4558127346*lat+110579.25662316;
    }
}
12
zahmde

Voici une page avec des exemples javascript pour divers calculs sphériques. Le tout premier sur la page devrait vous donner ce dont vous avez besoin.

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

Voici le code Javascript

var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad(); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
        Math.sin(dLon/2) * Math.sin(dLon/2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c;

Où "d" tiendra la distance.

4
Chris Taylor

Les futurs lecteurs qui tombent sur cet article SOF.

De toute évidence, la question a été posée en 2010 et non pas en 2019. Mais elle est apparue tôt dans une recherche sur Internet. La question initiale n'écarte pas l'utilisation de la bibliothèque tierce (lorsque j'ai écrit cette réponse).

public double calculateDistanceEncapsulated(double lat1, double long1, double lat2,
                                     double long2) {


    double dist = org.Apache.lucene.util.SloppyMath.haversinMeters(lat1, long1, lat2, long2);
    return dist;
}

et

<dependency>
  <groupId>org.Apache.lucene</groupId>
  <artifactId>lucene-spatial</artifactId>
  <version>8.2.0</version>
</dependency>

https://mvnrepository.com/artifact/org.Apache.lucene/lucene-spatial/8.2.

Veuillez lire la documentation sur "SloppyMath" avant de plonger!

https://lucene.Apache.org/core/8_2_0/core/org/Apache/lucene/util/SloppyMath.html

1
granadaCoder
package distanceAlgorithm;

public class CalDistance {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    CalDistance obj=new CalDistance();
    /*obj.distance(38.898556, -77.037852, 38.897147, -77.043934);*/
        System.out.println(obj.distance(38.898556, -77.037852, 38.897147, -77.043934, "M") + " Miles\n");
        System.out.println(obj.distance(38.898556, -77.037852, 38.897147, -77.043934, "K") + " Kilometers\n");
        System.out.println(obj.distance(32.9697, -96.80322, 29.46786, -98.53506, "N") + " Nautical Miles\n");       
    }   
    public double distance(double lat1, double lon1, double lat2, double lon2, String sr) {


          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;
          if (sr.equals("K")) {
            dist = dist * 1.609344;
          } else if (sr.equals("N")) {
            dist = dist * 0.8684;
            }
          return (dist);
        }
    public double deg2rad(double deg) {
          return (deg * Math.PI / 180.0);
        }
    public double rad2deg(double rad) {
          return (rad * 180.0 / Math.PI);
        }


    }
1
MAnoj Sarnaik

Cette wikipedia article fournit les formules et un exemple. Le texte est en allemand, mais les calculs parlent d'eux-mêmes.

0
zellus