Ich habe einige Benutzer in meiner Django-App registriert, und ich möchte einfach die geografische Entfernung zwischen zwei Nutzern anhand ihrer Postleitzahl ermitteln und dann eine Liste danach sortieren. Ich könnte mir vorstellen, dass diese Funktionalität nicht in Django integriert ist. Ich habe mir ein paar Optionen angeschaut und bin über Geodjango gestolpert, was so aussieht, als ob es für meine Bedürfnisse übertrieben wäre.
Nach dem Vorschlag von tcarobruce, hier ist mein Kommentar als Antwort:
Das Postleitzahldatenbank-Projekt verfügt über eine Datenbank mit den Breiten- und Längengraden der US-Postleitzahlen, entweder in SQL oder als CSV. Sie stellen auch den folgenden Code für die Entfernungsberechnung zur Verfügung (leicht bearbeitet von mir):
%Vor%Beachten Sie, dass das Ergebnis in Meilen angegeben ist.
Bearbeiten: Korrekturen wegen John Machin.
Dies ist ein dicker Kommentar zum Code, der in der (derzeit akzeptierten) Antwort von @Sven Marnach veröffentlicht wurde.
Ursprünglicher Code von der Website des Zip-Projekts, mit von mir bearbeiteter Einrückung:
%Vor%Code von Sven:
%Vor% Problem 1: WIRD NICHT AUSFÜHREN : muss acos
Problem 2: FALSCHE ANTWORTEN : muss konvertiert werden Längengradunterschied zum Bogenmaß in der vorletzten Zeile
Problem 3: Der Variablenname "distance" ist eine extreme Fehlbezeichnung. Diese Größe ist eigentlich der cos des Winkels zwischen den beiden Linien vom Mittelpunkt der Erde zu den Eingangspunkten. Wechseln Sie zu "cos_x"
Problem 4: Es ist nicht notwendig, den Winkel x in Grad zu konvertieren. Einfach Multiplizieren Sie x mit dem Erdradius in ausgewählten Einheiten (km, nm oder "Statutemeilen")
Nachdem wir all das behoben haben, bekommen wir:
%Vor%Hinweis: Nach der Behebung der Probleme 1 und 2 ist dies das "sphärische Gesetz der Cosinus", wie es üblicherweise implementiert wird. Es ist in Ordnung für Anwendungen wie "Entfernung zwischen zwei US-Postleitzahlen".
Vorbehalt 1: Es ist nicht präzise für kleine Entfernungen wie von Ihrer Haustür zur Straße, so sehr, dass es einen Abstand ungleich null geben oder eine Ausnahme (cos_x & gt; 1,0) auslösen kann, wenn die zwei Punkte identisch sind ; Diese Situation kann speziell behandelt werden.
Vorbehalt 2: Wenn die beiden Punkte antipodisch sind (der geradlinige Pfad verläuft durch den Mittelpunkt der Erde), kann eine Ausnahme ausgelöst werden (cos_x & lt; -1.0). Jeder, der sich darum sorgt, kann cos_x überprüfen, bevor er acos (cos_x) ausführt.
Beispiel:
SFO (37.676, -122.433) nach NYC (40.733, -73.917)
calcDist - & gt; 2570.7758043869976
calc_dist - & gt; 5038.599866130089
calc_dist_fixed - & gt; 2570.9028268899356
Eine Website der US-Regierung (http://www.nhc.noaa.gov/gccalc.shtml) - & gt; 2569
Diese Website (http://www.timeanddate.com/worldclock/distancersult.html?p1=179&p2=224), von der ich die SFO- und NYC-Koordinaten erhielt, - & gt; 2577
Sie können für jeden Ort eine Wegbeschreibung eingeben. Die Gesamtdistanz ist angegeben. Die API scheint JSON auszugeben; Sie könnten entweder die Antwort auf der Serverseite analysieren oder die Entfernung durch JavaScript berechnen lassen.
Ein weiterer einfacher Weg:
Die folgende Funktion gibt die Entfernung zwischen zwei Orten nach der Berechnung der Breiten- und Längengrade aus der Postleitzahl zurück.
lat1
, long1
sind die Breiten- und Längengrade des ersten Ortes.
lat2
, long2
sind die Breiten und Längen des zweiten Standorts.
Tags und Links python django google-maps geodjango