354 votes

Calculer la distance entre deux points dans google maps V3

Comment calculer la distance entre deux marqueurs dans Google maps V3 (similaire à l'option distanceFrom fonction dansV2.)

Merci..

1 votes

513voto

Mike Williams Points 3445

Si vous voulez le calculer vous-même, vous pouvez utiliser la formule Haversine :

var rad = function(x) {
  return x * Math.PI / 180;
};

var getDistance = function(p1, p2) {
  var R = 6378137; // Earth’s mean radius in meter
  var dLat = rad(p2.lat() - p1.lat());
  var dLong = rad(p2.lng() - p1.lng());
  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) *
    Math.sin(dLong / 2) * Math.sin(dLong / 2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c;
  return d; // returns the distance in meter
};

4 votes

Pourquoi suggérez-vous d'utiliser Math.atan2(Math.sqrt(a),Math.sqrt(1-a)) au lieu de la plus simple Math.asin(Math.sqrt(a)) ?

1 votes

@TomHart Je suppose que vous avez déjà trouvé qu'il retourne les km - j'avais besoin de mètres donc j'ai changé la deuxième ligne en var R = 6371000; // earth's mean radius in metres

1 votes

J'essaie d'utiliser cette formule, mais j'ai du mal à comprendre ce que signifie p1.lat() etc. Il semble s'agir d'une fonction, mais où est-elle définie ? J'essaie de passer deux objets p1 et p2 avec les propriétés lat et lng comme coordonnées, mais cela renvoie d=0 - où est-ce que je me trompe ?

322voto

Emil Badh Points 2746

Il semble en fait exister une méthode dans GMap3. C'est une méthode statique de la google.maps.geometry.spherical espace de noms.

Il prend comme arguments deux LatLng et utilisera un rayon terrestre par défaut de 6378137 mètres, bien que ce rayon par défaut puisse être remplacé par une valeur personnalisée si nécessaire.

Assurez-vous d'inclure :

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&v=3&libraries=geometry"></script>

dans votre section tête.

L'appel sera :

google.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB);

10 votes

Alors pourquoi y a-t-il une différence de 1 % entre la réponse donnée par la formule sphérique computeDistanceBetween de Google et la formule de distance Haversine ?

7 votes

@RamenRecon Je ne suis pas certain mais je pense qu'ils utilisent des valeurs différentes pour le rayon de la terre.

12 votes

@RamenRecon oui, Emil a raison sur ce point. La documentation dit : Le rayon par défaut est le rayon terrestre de 6378137 mètres. Mais Mike, dans l'Haversine ci-dessus, utilise 6371km à la place.

34voto

16voto

Plamen Todorov Points 61

Ajoutez simplement ceci au début de votre code JavaScript :

google.maps.LatLng.prototype.distanceFrom = function(latlng) {
  var lat = [this.lat(), latlng.lat()]
  var lng = [this.lng(), latlng.lng()]
  var R = 6378137;
  var dLat = (lat[1]-lat[0]) * Math.PI / 180;
  var dLng = (lng[1]-lng[0]) * Math.PI / 180;
  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
  Math.cos(lat[0] * Math.PI / 180 ) * Math.cos(lat[1] * Math.PI / 180 ) *
  Math.sin(dLng/2) * Math.sin(dLng/2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  var d = R * c;
  return Math.round(d);
}

et ensuite utiliser la fonction comme ceci :

var loc1 = new GLatLng(52.5773139, 1.3712427);
var loc2 = new GLatLng(52.4788314, 1.7577444);
var dist = loc2.distanceFrom(loc1);
alert(dist/1000);

0 votes

Solution intellectuelle mais je veux savoir dans quelles unités il renvoie le résultat. J'ai obtenu 3.013 est-ce que c'est en miles, en km ?

0 votes

La valeur renvoyée est en mètres. Donc dist/1000 vous donne la valeur en km.

11voto

Naveed Ahmad Points 265

Voici l'implémentation en c# de cette formule.

 public class DistanceAlgorithm
{
    const double PIx = 3.141592653589793;
    const double RADIO = 6378.16;

    /// <summary>
    /// This class cannot be instantiated.
    /// </summary>
    private DistanceAlgorithm() { }

    /// <summary>
    /// Convert degrees to Radians
    /// </summary>
    /// <param name="x">Degrees</param>
    /// <returns>The equivalent in radians</returns>
    public static double Radians(double x)
    {
        return x * PIx / 180;
    }

    /// <summary>
    /// Calculate the distance between two places.
    /// </summary>
    /// <param name="lon1"></param>
    /// <param name="lat1"></param>
    /// <param name="lon2"></param>
    /// <param name="lat2"></param>
    /// <returns></returns>
    public static double DistanceBetweenPlaces(
        double lon1,
        double lat1,
        double lon2,
        double lat2)
    {
        double dlon =  Radians(lon2 - lon1);
        double dlat =  Radians(lat2 - lat1);

        double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(Radians(lat1)) * Math.Cos(Radians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2));
        double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
        return (angle * RADIO) * 0.62137;//distance in miles
    }

}

5 votes

Cela ne s'applique pas à la question initiale de savoir comment le faire dans Google Maps.

0 votes

Il n'y a pas de fonction intégrée pour calculer la distance directement, vous devez utiliser les services d'annuaire pour deux points et extraire la distance à partir du XML/JSON retourné.

1 votes

Mon commentaire portait sur le fait qu'il aurait été préférable de fournir une solution en javascript, car l'auteur du fil de discussion n'a pas précisé s'il utilisait php, .net ou html statique.

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