271 votes

Fonction permettant de calculer la distance entre deux coordonnées

J'utilise actuellement la fonction ci-dessous et elle ne fonctionne pas correctement. Selon Google Maps, la distance entre ces coordonnées (à partir de 59.3293371,13.4877472 a 59.3225525,13.4619422 ) sont 2.2 kilomètres alors que la fonction renvoie 1.6 kilomètres. Comment puis-je faire en sorte que cette fonction renvoie la bonne distance ?

function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) {
  var R = 6371; // Radius of the earth in km
  var dLat = deg2rad(lat2-lat1);  // deg2rad below
  var dLon = deg2rad(lon2-lon1); 
  var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  var d = R * c; // Distance in km
  return d;
}

function deg2rad(deg) {
  return deg * (Math.PI/180)
}

jsFiddle : http://jsfiddle.net/edgren/gAHJB/

301voto

Ethan Brown Points 10832

Ce que vous utilisez s'appelle le formule haversine qui calcule la distance entre deux points sur une sphère à vol d'oiseau . Le lien Google Maps que vous avez fourni indique une distance de 2,2 km car il ne s'agit pas d'une ligne droite.

Wolfram Alpha est une excellente ressource pour effectuer des calculs géographiques, et indique également une distance de 1,652 km entre ces deux points .

Drive distance vs. straight line distance (red line mine).

Si vous recherchez la distance en ligne droite (comme le lime le corbeau), votre fonction fonctionne correctement. Si vous souhaitez connaître la distance en voiture (ou en vélo, en transports en commun ou à pied), vous devrez utiliser une API de cartographie ( Google o Bing étant la plus populaire) pour obtenir l'itinéraire approprié, qui inclura la distance.

Par ailleurs, l'API Google Maps fournit une méthode intégrée pour la distance sphérique, dans sa section google.maps.geometry.spherical espace de noms (rechercher computeDistanceBetween ). Cette méthode est probablement meilleure que la vôtre (pour commencer, elle utilise une valeur plus précise pour le rayon de la Terre).

Pour les plus pointilleux d'entre nous, lorsque je parle de "distance en ligne droite", je fais référence à une "ligne droite sur une sphère", qui est en fait une ligne courbe (c'est-à-dire la distance du grand cercle), bien entendu.

137voto

Derek Points 5127

J'ai déjà écrit une équation similaire, je l'ai testée et j'ai obtenu 1,6 km.

Votre google maps indiquait la distance en voiture.

Votre fonction consiste à calculer la distance à vol d'oiseau (distance en ligne droite).

alert(calcCrow(59.3293371,13.4877472,59.3225525,13.4619422).toFixed(1));

    //This function takes in latitude and longitude of two location and returns the distance between them as the crow flies (in km)
    function calcCrow(lat1, lon1, lat2, lon2) 
    {
      var R = 6371; // km
      var dLat = toRad(lat2-lat1);
      var dLon = toRad(lon2-lon1);
      var lat1 = toRad(lat1);
      var lat2 = toRad(lat2);

      var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
      var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
      var d = R * c;
      return d;
    }

    // Converts numeric degrees to radians
    function toRad(Value) 
    {
        return Value * Math.PI / 180;
    }

25voto

Behzad Points 395

La solution de Derek a bien fonctionné pour moi, et je l'ai simplement convertie en PHP, j'espère que cela aidera quelqu'un !

function calcCrow($lat1, $lon1, $lat2, $lon2){
        $R = 6371; // km
        $dLat = toRad($lat2-$lat1);
        $dLon = toRad($lon2-$lon1);
        $lat1 = toRad($lat1);
        $lat2 = toRad($lat2);

        $a = sin($dLat/2) * sin($dLat/2) +sin($dLon/2) * sin($dLon/2) * cos($lat1) * cos($lat2); 
        $c = 2 * atan2(sqrt($a), sqrt(1-$a)); 
        $d = $R * $c;
        return $d;
}

// Converts numeric degrees to radians
function toRad($Value) 
{
    return $Value * pi() / 180;
}

18voto

Saik0 Points 346

En utilisant la formule d'Haversine, source du code :

//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::                                                                         :::
//:::  This routine calculates the distance between two points (given the     :::
//:::  latitude/longitude of those points). It is being used to calculate     :::
//:::  the distance between two locations using GeoDataSource (TM) prodducts  :::
//:::                                                                         :::
//:::  Definitions:                                                           :::
//:::    South latitudes are negative, east longitudes are positive           :::
//:::                                                                         :::
//:::  Passed to function:                                                    :::
//:::    lat1, lon1 = Latitude and Longitude of point 1 (in decimal degrees)  :::
//:::    lat2, lon2 = Latitude and Longitude of point 2 (in decimal degrees)  :::
//:::    unit = the unit you desire for results                               :::
//:::           where: 'M' is statute miles (default)                         :::
//:::                  'K' is kilometers                                      :::
//:::                  'N' is nautical miles                                  :::
//:::                                                                         :::
//:::  Worldwide cities and other features databases with latitude longitude  :::
//:::  are available at https://www.geodatasource.com                         :::
//:::                                                                         :::
//:::  For enquiries, please contact sales@geodatasource.com                  :::
//:::                                                                         :::
//:::  Official Web site: https://www.geodatasource.com                       :::
//:::                                                                         :::
//:::               GeoDataSource.com (C) All Rights Reserved 2018            :::
//:::                                                                         :::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

function distance(lat1, lon1, lat2, lon2, unit) {
    if ((lat1 == lat2) && (lon1 == lon2)) {
        return 0;
    }
    else {
        var radlat1 = Math.PI * lat1/180;
        var radlat2 = Math.PI * lat2/180;
        var theta = lon1-lon2;
        var radtheta = Math.PI * theta/180;
        var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
        if (dist > 1) {
            dist = 1;
        }
        dist = Math.acos(dist);
        dist = dist * 180/Math.PI;
        dist = dist * 60 * 1.1515;
        if (unit=="K") { dist = dist * 1.609344 }
        if (unit=="N") { dist = dist * 0.8684 }
        return dist;
    }
}

Le code d'exemple est sous licence LGPLv3.

14voto

Nicholas Smith Points 354

Ajout pour les utilisateurs de Node.JS. Vous pouvez utiliser l'option haversine-distance afin que vous n'ayez pas à effectuer les calculs vous-même. Voir le module page npm pour plus d'informations .

Pour l'installation :

npm install --save haversine-distance

Vous pouvez utiliser le module comme suit :

var haversine = require("haversine-distance");

//First point in your haversine calculation
var point1 = { lat: 6.1754, lng: 106.8272 }

//Second point in your haversine calculation
var point2 = { lat: 6.1352, lng: 106.8133 }

var haversine_m = haversine(point1, point2); //Results in meters (default)
var haversine_km = haversine_m /1000; //Results in kilometers

console.log("distance (in meters): " + haversine_m + "m");
console.log("distance (in kilometers): " + haversine_km + "km");

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