Calcul de la Distance entre 2 villes [fermé]
14 réponses
si vous devez tenir compte de la courbure de la terre, la distance du grand cercle est ce que vous cherchez. L'article de Wikipedia explique probablement mieux le fonctionnement de la formule que moi, et il y a aussi c'aviation formulaire de la page qui couvre qui va plus dans le détail.
les formules ne sont que la première partie du puzzle cependant, si vous avez besoin de faire ce travail pour les villes arbitraires, vous aurez besoin d'une base de données de localisation pour obtenir les coordonnées lat/long. Heureusement vous pouvez obtenir ceci gratuitement de Geonames.org, bien qu'il y ait des db commerciaux disponibles (demandez à google). Donc, en général, regardez les deux villes que vous voulez, obtenez les co-orinates lat/long et les brancher dans la formule comme dans le Wikipedia Travaillé Exemple.
autres suggestions:
- pour une solution commerciale complète, il y a PC Miler qui est utilisé par de nombreuses entreprises de camionnage pour calculer les tarifs d'expédition.
- faites des appels vers L'api GoogleMaps (ou autre). Si vous avez besoin de faire beaucoup de requêtes par jour, pensez à mettre en cache les résultats sur le serveur.
- très important est d'envisager la construction d'une base de données d'équivalence pour les villes, banlieues, villes etc. si vous pensez que vous aurez jamais besoin de regrouper vos données. Cela devient vraiment compliqué Cependant, et vous pouvez ne pas trouver une solution unique pour votre problème.
dernier mais pas au moins, Joel a écrit un article sur ce problème il y a quelque temps, Alors voilà:Nouvelle Fonctionnalité: La Recherche D'Emploi
c'est très facile à faire avec le type de géographie 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
SRID 4326 est pour WGS84 elipsoidal Terre modèle
vous pouvez utiliser le * algorithme pour trouver le plus court chemin entre ces deux villes et de cette façon vous aurez la distance.
si vous parlez de la distance la plus courte entre deux vraies villes sur une vraie planète sphérique, comme la Terre, vous voulez le grand cercle distance.
Si vous travaillez dans l'avion et que vous souhaitez l' distance euclidienne "comme l'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);
théorème de Pythagore et le fait que les carrés sont toujours positifs de sorte que vous n'avez pas besoin de dx = abs(x1 - x0), etc. pour obtenir un nombre positif pour passer à sqrt().
notez que vous pouvez probablement faire cela en une ligne et un compilateur serait probablement réduire l'équivalent ci-dessus code:
dist = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0));
Vous pouvez obtenir la distance entre deux villes à partir de l'api GoogleMap. 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 le Lat/Lon 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 creuser à la maison, mais comme beaucoup de réponses précédentes, vous avez besoin d'un long / lat db pour faire le calcul
il est préférable d'utiliser une table de recherche pour obtenir la distance entre deux villes.
cela a du sens parce que * La formule de calcul de la distance est très exigeante sur le plan informatique.. * Il est peu probable que la Distance entre les villes change.
donc à moins que vous n'ayez besoin d'être très précis( comme la cartographie du terrain à partir d'un satellite ou d'un algorithme de topographie ou autre), vous devriez simplement sauvegarder la liste des villes et des distances entre elles, dans un tableau et de regarder en tant que de besoin.
j'ai fait beaucoup de travail avec cette récemment. Je trouve que les nouvelles fonctionnalités de SQL2008 rendent cela vraiment facile. Je peux trouver tous les points qui sont avec Xkm d'une table de 100k record dans la sous-seconde fois...pas trop mal.
la méthode du grand cercle (hypothèse sphérique) dans mes essais était à environ 2,5 miles de distance par rapport à la formule de vincenty (hypothèse elipsoïdale, qui est ce que la Terre est).
le vrai truc est d'obtenir le lat et long..pour cela, je suis à l'aide de Google.
@Jared-une petite correction à votre exemple de code. La dernière ligne du premier exemple de code doit lire:
dist = sqrt(dx*dx + dy*dy);
je suis d'accord qu'une fois que vous avez l'information, si elle ne va pas changer, stockez-la d'une façon ou d'une autre. @Marko Tinto Merci pour l'échantillon 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, Vérifiez L'entrée de Wikipedia sur L'algorithme de Vincenty pour plus d'info. Je crois qu'il y a une implémentation js, qui serait (si ce n'est déjà) facilement transposable dans d'autres langues. Aussi, au bas de la page est un lien vers geographicLib, qui prétend être 1000 fois plus précis que L'algorithme de Vincenty (si vous avez des données aussi bonnes, cela pourrait avoir de l'importance).
Pourquoi utiliser quelque chose comme la méthode Vincenty? Parce que la terre n'est pas une sphère parfaite et des méthodes comme celle-ci permettent de saisir un axe majeur et mineur plus précis pour modéliser la terre.