Comment calculer la distance entre deux marqueurs dans Google maps V3 (similaire à l'option distanceFrom
fonction dansV2.)
Merci..
Comment calculer la distance entre deux marqueurs dans Google maps V3 (similaire à l'option distanceFrom
fonction dansV2.)
Merci..
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
};
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)) ?
@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
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 ?
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);
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 ?
@RamenRecon Je ne suis pas certain mais je pense qu'ils utilisent des valeurs différentes pour le rayon de la terre.
@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.
Il y a le calculer la distance entre (lat,lng) dans le nouveau Bibliothèque de géométrie V3
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);
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
}
}
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é.
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.
1 votes
stackoverflow.com/a/7997732/1458162