Calcul de la Distance entre 2 villes

Comment pour calculer la distance entre 2 villes ?

répondre #1

Si vous avez besoin tenir compte de la courbure de la terre, la distance de grand-cercle est ce que vous cherchez. L' article de Wikipédia ne probablement de mieux expliquer comment la formule fonctionne que moi, et il y a aussi cette aviation formulaire page qui couvre qui va plus en détail.

Les formules sont uniquement la première partie du puzzle, mais, 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 le lat/long de. Heureusement vous pouvez obtenir ce pour exempt de Geonames.org, bien qu'il y a commercial db disponible (demandez à google). Donc, en général, chercher les deux villes vous souhaitez, obtenez le lat/long co-orinates et branchez dans la formule comme dans Wikipédia en Exemple travaillé.

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.
  • Faire des appels à la Google Maps (ou autre) api. Si vous avez besoin de faire plusieurs demandes par jour, envisager la mise en cache les résultats sur le serveur.
  • Aussi très important est d'envisager la construction d'une base de données équivalence pour les villes, banlieues, villes etc. si vous pensez que vous aurez jamais besoin de regrouper vos données. C'est vraiment compliqué mais, et vous ne trouverez pas une solution unique pour votre problème.

Last but not least, Joel a écrit un article sur ce problème, donc ici vous allez : nouvelle fonctionnalité : recherche d'emploi

répondre #2

Vous utilisez la formule Haversine.

répondre #3

Si vous travaillez dans le plan et vous voulez la distance euclidienne « comme le corbeau vole » :

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

Aucun trigonométrie nécessaire ! Simplement le théorème de Pythagore et le fait que les places sont toujours positifs donc vous n'avez pas besoin dx = abs (x 1-x 0), etc., pour obtenir un nombre positif à transmettre à sqrt().

Note que vous pourriez probablement faire cela en une seule ligne et un compilateur aurait probablement réduire l'équivalent au-dessus de code :

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

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

répondre #4

Ca vous utilisez l'algorithme A * pour trouver le chemin le plus court entre ces deux villes et de cette façon vous aurez la distance.

répondre #5

Si vous parlez de la plus courte distance entre deux villes réelles sur une planète sphérique réel, comme la terre, vous voulez que la distance du grand cercle.

répondre #6

Cette réponse stackoverflow pour la même question a aussi c# code exemple

répondre #7

C'est très facile à avec la géographie tapez 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 SRID est modèle de terre elipsoidal WGS84

répondre #8

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

répondre #9

Si vous avez besoin d'un exemple de code, je crois avoir un je pourrais creuser à la maison, mais comme la plupart des réponses précédentes, vous avez besoin d'un long / lat db à faire le calcul

répondre #10

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

Cela est logique car * la formule pour calculer l'ais distance tout calcul intensifs... * Distance entre les villes ne devrait pas changer.

Donc à moins que vos besoins sont très spécifiques (comme la cartographie d'un satellite ou certains ou algorithme de topographie ou quelque chose d'autre), vous devriez vraiment juste enregistrer la liste des villes et des distances entre eux, dans une table et rechercher si nécessaire.

répondre #11

J'ai fait beaucoup de travail avec cette récemment. Je suis trouver des nouvelles fonctionnalités de SQL2008 vraiment rendre cela facile. Je ne peux trouver tous les points qui sont withing Xkm d'une table record de 100 k dans le temps du moins... pas trop minable.

La méthode du grand cercle (hypothèse sphérique) dans mon essai était environ 2,5 milles au large par rapport à la formule vincenty (hypothèse elipsoidal, qui est ce qui est la terre).

Le vrai truc est obtenir les lat et long...pour cela j'utilise Google.

répondre #12

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

dist = sqrt(dx*dx + dy*dy);
répondre #13

Voir la question connexe de StackOverflow

répondre #14

J'utilise les distances entre les villes à cette fin, probablement vous pouvez le vérifier il y

répondre #15

Je suis d'accord qu'une fois que vous avez l'info, si elle ne va pas changer, de stocker d'une certaine façon. @ Marko Tinto Merci pour l'échantillon de T-SQL. Pour ceux qui n'ont accès à SQL Server ou préférer une autre méthode : si vous avez besoin de haute précision, consultez entrée de Wikipédia sur l'algorithme Vincenty pour plus d'info. Selon moi, il y a une mise en œuvre de js, qui serait (si pas déjà) être facilement porté dans d'autres langues. En outre, au bas de cette page est un lien vers geographicLib, qui est censé être 1000 fois plus précis que l'algorithme Vincenty (si vous avez des données que bon, il peut importe).

Pourquoi est-ce que vous pourrait utiliser quelque chose comme la méthode Vincenty ? Parce que la terre n'est pas une sphère parfaite et méthodes comme celle permettant la saisie d'un axe majeur et mineur plus précis pour la modélisation de la terre.


Tags lesen

     
 
logo_banner