Calcul de la Distance entre 2 villes [fermé]

Comment calculer la distance entre 2 villes?

16
demandé sur OysterD 2008-08-23 01:39:41

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

32
répondu Dana the Sane 2018-03-05 04:41:59

Vous utilisez le formule de Haversine.

9
répondu Ian Nelson 2008-08-22 21:42:08

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

2
répondu Marko Tintor 2009-02-01 17:39:54

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

1
répondu Michał Piaskowski 2008-08-22 21:45:35

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.

1
répondu Mike Powell 2008-08-22 22:17:54

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));

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

1
répondu Jared Updike 2008-08-22 22:29:33

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

1
répondu Sarath Sadasivan Pillai 2014-07-04 04:09:24

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

0
répondu EndangeredMassa 2008-08-22 21:41:18

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

0
répondu jonezy 2008-08-22 21:46:26

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.

0
répondu Pascal 2008-08-22 22:00:12

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.

0
répondu Webjedi 2008-08-22 23:23:35

@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);
0
répondu Josh Brown 2008-08-22 23:44:18

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.

0
répondu Stonetip 2011-03-08 18:37:58

j'utilise distancy si simple et propre

0
répondu user1436185 2012-06-04 22:48:46