Ottenere la distanza tra 2 punti usando GeoDjango? [chiuso]


11

Ho 2 posizioni definite da GPS Coord, lat / long come restituite da Google Maps:

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

Devo calcolare la distanza tra loro. So che potrei usare l'API di Google, ma elaborerò query di massa, quindi preferirei farlo sul mio server.

Ho trascorso alcune ore con i documenti, installato geodjango OK, ma non riesco a trovare un esempio di questo. Tutto in letteratura è molto più complicato del necessario.

Risposte:


9

La risposta sembra essere in questa discussione di Google Gruppi :

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
Ricorda che POINT () assume la forma POINT (XY). Probabilmente stavi cercando di dare un esempio per Madrid, ma i punti che usi sono in realtà rispettivamente nell'Oceano Indiano e in Kenya.

6
Qual è lo scopo di * 100?
Cristian Ciupitu,

4
non dovresti trasformare i punti in una proiezione in metri? Utilizzare la zona UTM per una migliore precisione se lo si conosce. >>> pnt.transform (900913) >>> pnt2.transform (900913) >>> pnt.distance (pnt2) 1153485.9216961625
monkut

Sembra Pointinutilizzato
Oleg Belousov

1
Non usare questa risposta. La funzione di distanza non rispetta l'SRID in nessuna forma e fornirà semplicemente la distanza su un piano 2d.
Jonathan Richards,


2

Puoi usare anche Point.

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
Non usare questa risposta. La funzione di distanza non rispetta l'SRID in nessuna forma e fornirà semplicemente la distanza su un piano 2d.
Jonathan Richards,

1

Puoi anche usare il codice Python di Sven Marnach per ottenere il risultato che desideri. Ho aggiunto una riga di codice per ottenere il risultato in metri .

Codice:

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

Se vuoi una risposta che non usi una libreria o una funzione geodjango. cerca alcune domande e risposte con il tag di . Ti danno formule che funzionano con qualsiasi lingua o framework. Una di queste domande è la distanza tra le coordinate GPS


Preferirei usare geodjango poiché presumo che il modo più efficiente per eseguire calcoli di massa sia con la logica interna di un db spaziale. E il resto del mio sito è Django, quindi sarebbe bello avere tutto coerente nello stesso framework.
MadMaardigan,

0

Mi è piaciuta molto la soluzione che ho visto una volta con l'aiuto di Django e geopy. Tuttavia, ho modificato un po 'il codice per avere la libertà di inserire più di due soli punti.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.