Uzyskaj odległość między 2 punktami za pomocą GeoDjango? [Zamknięte]

11

Mam 2 lokalizacje zdefiniowane za pomocą GPS, lat / long jak zwrócone przez Google Maps:

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

Muszę obliczyć odległość między nimi. Wiem, że mogę korzystać z Google API, ale będę przetwarzać zapytania masowe, więc wolę to zrobić na własnym serwerze.

Spędziłem kilka godzin z dokumentami, zainstalowałem geodjango OK, ale nie mogę znaleźć takiego przykładu. Wszystko w literaturze jest o wiele bardziej skomplikowane niż potrzebuję.

MadMaardigan
źródło

Odpowiedzi:

9

Odpowiedź wydaje się znajdować w tym wątku Grup dyskusyjnych Google :

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
MadMaardigan
źródło
3
Pamiętaj, że POINT () ma postać POINT (XY). Prawdopodobnie próbowałeś podać przykład dla Madrytu, ale punkty, które wykorzystujesz, znajdują się odpowiednio na Oceanie Indyjskim i Kenii.
6
Jaki jest cel * 100?
Cristian Ciupitu
4
nie powinieneś przekształcić punktów w rzut w metrach? Użyj strefy UTM dla lepszej dokładności, jeśli ją znasz. >>> pnt.transform (900913) >>> pnt2.transform (900913) >>> pnt. odległość (pnt2) 1153485.9216961625
monkut
Wygląda na Pointto, że nie jest używany
Oleg Belousov
1
Nie używaj tej odpowiedzi. Funkcja odległości nie respektuje SRID w żadnej formie i po prostu podaje odległość na płaszczyźnie 2d.
Jonathan Richards
5

Myślę, że lepiej użyć pyproj:

geod = pyproj.Geod(ellps='WGS84') 
angle1,angle2,distance = geod.inv(long1, lat1, long2, lat2)

Zobacz więcej: http://blog.tremily.us/posts/pyproj/

Ana Sousa
źródło
2

Możesz także użyć Punktu.

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
Virako
źródło
1
Nie używaj tej odpowiedzi. Funkcja odległości nie respektuje SRID w żadnej formie i po prostu podaje odległość na płaszczyźnie 2d.
Jonathan Richards
1

Możesz również użyć kodu Pythona Svena Marnacha, aby uzyskać pożądany wynik. Dodałem wiersz kodu, aby uzyskać wynik w metrach .

Kod:

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
Aragonia
źródło
0

Jeśli potrzebujesz odpowiedzi, która nie korzysta z biblioteki lub funkcji geodjango. poszukaj kilku pytań i odpowiedzi z tagiem . Dają formuły, które będą działać z dowolnym językiem lub strukturą. Jednym z takich pytań jest odległość między współrzędnymi GPS

mhoran_psprep
źródło
Wolałbym używać geodjango, ponieważ uważam, że najbardziej wydajnym sposobem wykonywania obliczeń zbiorczych jest wewnętrzna logika przestrzennej bazy danych. Reszta mojej strony to django, więc byłoby miło uzyskać wszystko spójne w tym samym środowisku.
MadMaardigan,
0

Bardzo podobało mi się rozwiązanie, które widziałem kiedyś przy pomocy django i geopy. Niemniej jednak zmieniłem nieco kod, aby mieć swobodę wprowadzania więcej niż tylko dwóch punktów.

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
g07kore
źródło