Question

Comment calculer la distance entre 2 villes ?

Était-ce utile?

La solution

Si vous devez prendre en compte la courbure de la Terre, la distance du grand cercle est ce que vous recherchez. L'article Wikipédia fait probablement un meilleur travail que moi pour expliquer le fonctionnement de la formule, et il y a aussi cette page de formulaire d'aviation qui couvre cela entre plus en détail.

Les formules ne sont que la première partie du puzzle, cependant, si vous devez faire en sorte que cela fonctionne pour des villes arbitraires, vous aurez besoin d'une base de données de localisation pour obtenir la latitude/longitude.Heureusement, vous pouvez l'obtenir gratuitement auprès de Géonames.org, bien qu'il existe des bases de données commerciales disponibles (demandez à Google).Donc, en général, recherchez les deux villes que vous souhaitez, obtenez les coordonnées latitude/longitude et branchez-les dans la formule comme dans l'exemple concret de Wikipédia.

Autres suggestions :

  • Pour une solution commerciale complète, il y a PC Miler qui est utilisé par de nombreuses sociétés de camionnage pour calculer les tarifs d'expédition.
  • Passez des appels vers l'API Google Maps (ou autre).Si vous devez effectuer plusieurs requêtes par jour, pensez à mettre les résultats en cache sur le serveur.
  • Aussi très important est d'envisager de créer une base de données d'équivalence pour les villes, les banlieues, les villages, etc.si vous pensez avoir besoin un jour de regrouper vos données.Cela devient cependant très compliqué et vous ne trouverez peut-être pas de solution universelle à votre problème.

Enfin et surtout, Joel a écrit un article sur ce problème il y a quelque temps, alors voilà : Nouvelle fonctionnalité:Recherche d'emploi

Autres conseils

Vous utilisez le Formule Haversine.

C'est très simple à faire avec le type géographique dans SQL Server 2008.

SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326))
-- computes distance in meters using eliptical model, accurate to the mm

4326 est SRID pour le modèle terrestre ellipsoïdal WGS84

Vous pouvez utiliser le UN* algorithme pour trouver le chemin le plus court entre ces deux villes et de cette façon vous aurez la distance.

Si vous parlez de la distance la plus courte entre deux villes réelles sur une planète sphérique réelle, comme la Terre, vous voulez la distance orthodromique.

Si vous travaillez dans l'avion et que vous souhaitez Distance euclidienne "à vol d'oiseau":

// Cities are points x0,y0 and x1,y1 in kilometers or miles or Smoots[1]
dx = x1 - x0;
dy = y1 - y0;
dist = sqrt(dx*dx + dy*y);

Pas besoin de trigonométrie !Seulement le théorème de Pythagore et le fait que les carrés sont toujours positifs donc vous n'avez pas besoin de dx = abs(x1 - x0), etc.pour obtenir un nombre positif à transmettre à sqrt().

Notez que vous pourriez probablement le faire sur une seule ligne et qu'un compilateur le ferait probablement réduisez-le le code équivalent ci-dessus :

dist = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0));

[1] http://en.wikipedia.org/wiki/Smoot

Vous pouvez obtenir la distance entre deux villes à partir de l'API Google Map.En voici une implémentation en Python

#!/usr/bin/python
import requests
from sys import argv 
def get_distance(origin,destination):
    gmap='http://maps.googleapis.com/maps/api/distancematrix/json'
    payload={"origins":origin,"destinations":destination,"sensor":'false' }
    try:
        a=requests.get(gmap,params=payload)
        data = a.json()
        origin = str(data['origin_addresses'][0])
        destination= str(data['destination_addresses'][0])
        distance = data['rows'][0]['elements'][0]['distance']['text']
        return distance,origin,destination
    except Exception,e:
        print "The %s or %destination does not exists :(" %(origin,destination)
        exit()

if __name__=="__main__":
    if len(argv)<3:
        print "sorry Check the format"
    else:
        origin=argv[1]
        destination=argv[2]
        distance,origin,destination=get_distance(origin,destination)
        print "%s ---> %s    :   %s" %(origin,destination,distance)

Exemple de lien : https://gist.github.com/sarathsp06/cf063e47bcc515b51c84

Vous trouvez la latitude/longitude de la ville, puis utilisez un algorithme d'estimation de distance pour les coordonnées Lat/Lon.

si vous avez besoin d'un exemple de code, je pense que j'en ai un que je pourrais trouver à la maison, mais comme beaucoup de réponses précédentes, vous avez besoin d'une base de données long/lat pour faire le calcul

Il est préférable d'utiliser une table de correspondance pour obtenir la distance entre deux villes.

Cela a du sens parce que * la formule pour calculer la distance est très intensive en calcul.* Il est peu probable que la distance entre les villes change.

Donc, à moins que vos besoins ne soient très spécifiques (comme la cartographie du terrain à partir d'un satellite ou autre ou un algorithme de topographie ou autre chose), vous devriez simplement enregistrer la liste des villes et les distances entre elles dans un tableau et la rechercher si nécessaire.

J'ai fait beaucoup de travail avec ça récemment.Je trouve que les nouvelles fonctionnalités de SQL2008 facilitent vraiment les choses.Je peux trouver tous les points qui se trouvent dans Xkm d'une table d'enregistrement de 100 000 en moins d'une seconde... pas trop mal.

La méthode du grand cercle (hypothèse sphérique) dans mes tests était à environ 2,5 miles de distance par rapport à la formule de Vincenty (hypothèse ellipsoïdale, qui est ce qu'est la Terre).

Le vrai truc est d'obtenir la latitude et la longueur... pour cela, j'utilise Google.

@Jared - une correction mineure à votre exemple de code.La dernière ligne du premier exemple de code doit se lire :

dist = sqrt(dx*dx + dy*dy);

Je suis d'accord qu'une fois que vous avez les informations, si elles ne changent pas, stockez-les d'une manière ou d'une autre.@Marko Tinto Merci pour l'exemple T-SQL.Pour ceux qui n'ont pas accès à SQL Server ou préfèrent une autre méthode :Si vous avez besoin d'une grande précision, consultez Entrée de Wikipédia sur l'algorithme Vincenty pour plus d'informations.Je crois qu'il existe une implémentation js, qui serait (si ce n'est déjà fait) facilement portée vers d'autres langages.De plus, au bas de cette page se trouve un lien vers bibliothèque géographique, qui prétend être 1 000 fois plus précis que l'algorithme Vincenty (si vous disposez de données aussi bonnes, cela peut avoir de l'importance).

Pourquoi utiliseriez-vous quelque chose comme la méthode Vincenty ?Parce que la Terre n'est pas une sphère parfaite et que des méthodes comme celle-là permettent de saisir un axe majeur et mineur plus précis pour modéliser la Terre.

j'utilise distance si simple et propre

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top