Abstand zwischen 2 Punkten mit GeoDjango ermitteln? [geschlossen]


11

Ich habe 2 Orte, die durch GPS-Koordinaten definiert sind, lat / long wie von Google Maps zurückgegeben:

http://gmaps-samples.googlecode.com/svn/trunk/geocoder/singlegeocode.html

Ich muss den Abstand zwischen ihnen berechnen. Ich weiß, dass ich die Google-API verwenden könnte, aber ich werde Massenanfragen verarbeiten, also mache ich das lieber auf meinem eigenen Server.

Ich habe ein paar Stunden mit den Dokumenten verbracht, Geodjango OK installiert, aber ich kann anscheinend kein Beispiel dafür finden. Alles in der Literatur ist viel komplizierter als ich brauche.

Antworten:


9

Die Antwort scheint in diesem Google Groups-Thread zu sein :

from django.contrib.gis.geos import GEOSGeometry
pnt = GEOSGeometry('SRID=4326;POINT(40.396764 -3.68042)')
pnt2 = GEOSGeometry('SRID=4326;POINT( 48.835797 2.329102  )')
pnt.distance(pnt2) * 100

3
Denken Sie daran, dass POINT () die Form POINT (XY) hat. Sie haben wahrscheinlich versucht, ein Beispiel für Madrid zu geben, aber die Punkte, die Sie verwenden, befinden sich tatsächlich im Indischen Ozean bzw. in Kenia.

6
Was ist der Zweck von * 100?
Cristian Ciupitu

4
Sollten Sie die Punkte nicht in eine Projektion in Metern umwandeln? Verwenden Sie die UTM-Zone für eine bessere Genauigkeit, wenn Sie sie kennen. >>> pnt.transform (900913) >>> pnt2.transform (900913) >>> pnt.distance (pnt2) 1153485.9216961625
monkut

Es scheint Pointunbenutzt zu sein
Oleg Belousov

1
Verwenden Sie diese Antwort nicht. Die Distanzfunktion berücksichtigt die SRID in keiner Form und gibt einfach die Distanz in einer 2D-Ebene an.
Jonathan Richards


2

Sie können auch Point verwenden.

from django.contrib.gis.geos import Point
p1 = Point(37.2676483,-6.9273579)
p2 = Point(37.2653293,-6.9249401)
distance = p1.distance(p2)
distance_in_km = distance * 100

1
Verwenden Sie diese Antwort nicht. Die Distanzfunktion berücksichtigt die SRID in keiner Form und gibt einfach die Distanz in einer 2D-Ebene an.
Jonathan Richards

1

Sie können auch den Python-Code von Sven Marnach verwenden , um das gewünschte Ergebnis zu erzielen. Ich habe eine Codezeile hinzugefügt, um das Ergebnis in Metern zu erhalten .

Code:

from math import sin, cos, radians, degrees, acos

def calc_dist(lat_a, long_a, lat_b, long_b):
    lat_a = radians(lat_a)
    lat_b = radians(lat_b)
    long_diff = radians(long_a - long_b)
    distance = (sin(lat_a) * sin(lat_b) +
                cos(lat_a) * cos(lat_b) * cos(long_diff))
    resToMile = degrees(acos(distance)) * 69.09
    resToMt = resToMile / 0.00062137119223733
    return resToMt

0

Wenn Sie eine Antwort wünschen, die keine Geodjango-Bibliothek oder -Funktion verwendet. Suchen Sie nach einigen Fragen und Antworten mit dem Tag. Sie geben Ihnen Formeln, die mit jeder Sprache oder jedem Framework funktionieren. Eine solche Frage ist die Entfernung zwischen GPS-Koordinaten


Ich würde lieber Geodjango verwenden, da ich davon ausgehe, dass die effizienteste Methode für Massenberechnungen die interne Logik einer räumlichen Datenbank ist. Und der Rest meiner Seite ist Django, also wäre es schön, alles unter dem gleichen Rahmen konsistent zu machen.
MadMaardigan

0

Die Lösung, die ich einmal mit Hilfe von Django und Geopy gesehen habe, hat mir sehr gut gefallen. Trotzdem habe ich den Code ein wenig geändert, um mehr als nur zwei Punkte eingeben zu können.

from django.contrib.gis.geos import Point
from geopy.distance import distance as geopy_distance
from itertools import tee, izip


def pairwise(iterable):
    a, b= tee(iterable)
    next(b, None)
    return izip(a,b)

chicago = Point(41.50, 87.37)
san_francisco = Point(37.47, 122.26)
st_louis = Point(38.62, 90.19)
washington = Point(38.53, 77.02)

points = (washington, st_louis, chicago, san_francisco)

d = sum(geopy_distance(a,b).meters for (a,b) in pairwise(points))

distance_km = d/1000
distance_miles = distance_km*0.621371

print "Distance in kilometre: ",distance_km
print "Distance in miles: ",distance_miles
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.