Frage

Wie berechnet man die Entfernung zwischen zwei Städten?

War es hilfreich?

Lösung

Wenn Sie die Krümmung der Erde berücksichtigen müssen, ist die Großkreisentfernung genau das Richtige für Sie. Der Wikipedia-Artikel Erklärt die Funktionsweise der Formel wahrscheinlich besser als ich, und das gibt es auch diese Luftfahrt-Formularseite Das deckt das ab und geht näher ins Detail.

Die Formeln sind jedoch nur der erste Teil des Puzzles. Wenn Sie dies für beliebige Städte zum Laufen bringen möchten, benötigen Sie eine Standortdatenbank, um den Breiten- und Längengrad zu ermitteln.Glücklicherweise können Sie dies kostenlos von erhalten Geonames.org, obwohl es kommerzielle Datenbanken gibt (fragen Sie Google).Suchen Sie also im Allgemeinen nach den beiden gewünschten Städten, ermitteln Sie die Breiten- und Längenkoordinaten und setzen Sie sie wie folgt in die Formel ein das Wikipedia-Arbeitsbeispiel.

Weitere Vorschläge:

  • Für eine vollständige kommerzielle Lösung gibt es PC Miler Dies wird von vielen Speditionsunternehmen verwendet, um die Versandraten zu berechnen.
  • Rufen Sie die API von Google Maps (oder einer anderen) auf.Wenn Sie viele Anfragen pro Tag erledigen müssen, sollten Sie die Ergebnisse auf dem Server zwischenspeichern.
  • Auch sehr wichtig besteht darin, den Aufbau einer Äquivalenzdatenbank für Städte, Vororte, Kleinstädte usw. in Betracht zu ziehen.wenn Sie glauben, dass Sie Ihre Daten jemals gruppieren müssen.Das wird jedoch sehr kompliziert und Sie finden möglicherweise keine einheitliche Lösung für Ihr Problem.

Zu guter Letzt hat Joel vor einiger Zeit einen Artikel über dieses Problem geschrieben, also los geht's: Neue Funktion:Arbeitssuche

Andere Tipps

Sie verwenden die Haversin-Formel.

Dies ist mit dem Geografietyp in SQL Server 2008 sehr einfach möglich.

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

4326 ist SRID für das WGS84-Elipsoid-Erdmodell

Sie können das verwenden A* Algorithmus, um den kürzesten Weg zwischen diesen beiden Städten zu finden, und auf diese Weise erhalten Sie die Entfernung.

Wenn Sie über die kürzeste Entfernung zwischen zwei echten Städten auf einem echten kugelförmigen Planeten wie der Erde sprechen, möchten Sie das Großkreisentfernung.

Wenn Sie im Flugzeug arbeiten und das möchten Euklidische Entfernung "wie die Krähe fliegt":

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

Keine Trigonometrie erforderlich!Nur das Satz des Pythagoras und die Tatsache, dass Quadrate immer positiv sind, sodass Sie nicht dx = abs(x1 - x0) usw. benötigen.um eine positive Zahl zu erhalten, die an sqrt() übergeben werden kann.

Beachten Sie, dass Sie dies wahrscheinlich in einer Zeile tun könnten und ein Compiler dies tun würde wahrscheinlich Reduzieren Sie es auf den oben genannten Code:

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

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

Sie können die Entfernung zwischen zwei Städten über die Google Map API ermitteln.Hier ist eine Implementierung davon in 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)

Beispiellink: https://gist.github.com/sarathsp06/cf063e47bcc515b51c84

Sie ermitteln den Breiten- und Längengrad der Stadt und verwenden dann einen Entfernungsschätzungsalgorithmus für Breiten- und Längenkoordinaten.

Wenn Sie ein Codebeispiel benötigen, glaube ich, dass ich eines habe, das ich zu Hause ausgraben könnte, aber wie bei vielen der vorherigen Antworten benötigen Sie eine Long/Lat-Datenbank, um die Berechnung durchzuführen

Es ist besser, eine Nachschlagetabelle zu verwenden, um die Entfernung zwischen zwei Städten zu ermitteln.

Dies ist sinnvoll, weil * die Formel zur Berechnung des Abstands -AIs ziemlich rechenintensiv berechnet wird.* Es ist unwahrscheinlich, dass sich die Entfernung zwischen Städten ändert.

Sofern Ihre Anforderungen also nicht sehr spezifisch sind (z. B. eine Geländekartierung durch einen Satelliten oder einen Topografiealgorithmus oder etwas anderes), sollten Sie einfach die Liste der Städte und die Entfernungen zwischen ihnen in einer Tabelle speichern und bei Bedarf nachschlagen.

Ich habe in letzter Zeit viel damit gearbeitet.Ich finde, dass die neuen Funktionen von SQL2008 dies wirklich einfach machen.Ich kann alle Punkte, die innerhalb von Xkm einer 100.000-Rekordtabelle liegen, in weniger als einer Sekunde finden ... nicht allzu schäbig.

Die Methode des Großkreises (sphärische Annahme) lag in meinen Tests im Vergleich zur Vincenty-Formel (elliptische Annahme, also die Erde ist die Erde) etwa 2,5 Meilen entfernt.

Der eigentliche Trick besteht darin, die Breite und Länge zu ermitteln. Dafür verwende ich Google.

@Jared – eine kleine Korrektur an Ihrem Codebeispiel.Die letzte Zeile des ersten Codebeispiels sollte lauten:

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

Ich bin damit einverstanden, dass Sie die Informationen, sobald Sie sie haben, irgendwie speichern, wenn sie sich nicht ändern.@Marko Tinto Danke für das T-SQL-Beispiel.Für diejenigen, die keinen Zugriff auf SQL Server haben oder eine andere Methode bevorzugen:Wenn Sie eine hohe Genauigkeit benötigen, schauen Sie vorbei Wikipedia-Eintrag zum Vincenty-Algorithmus Für mehr Information.Ich glaube, dass es eine js-Implementierung gibt, die (falls nicht bereits geschehen) problemlos auf andere Sprachen portiert werden könnte.Außerdem befindet sich unten auf dieser Seite ein Link zu geographicLib, der angeblich 1000-mal genauer ist als der Vincenty-Algorithmus (wenn Sie über so gute Daten verfügen, könnte das von Bedeutung sein).

Warum sollten Sie so etwas wie die Vincenty-Methode verwenden?Da die Erde keine perfekte Kugel ist und solche Methoden die Eingabe einer genaueren Haupt- und Nebenachse für die Modellierung der Erde ermöglichen.

ich benutze Distanz so einfach und sauber

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top