¿Obtener distancia entre 2 puntos usando GeoDjango? [cerrado]


11

Tengo 2 ubicaciones definidas por gps coords, lat / long como devuelto por google maps:

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

Necesito calcular la distancia entre ellos. Sé que podría usar la API de Google, pero estaré procesando consultas masivas, así que prefiero hacerlo en mi propio servidor.

Pasé unas horas con los documentos, instalé geodjango OK, pero parece que no puedo encontrar un ejemplo de esto. Todo en la literatura es mucho más complicado de lo que necesito.

Respuestas:


9

La respuesta parece estar en este hilo de Grupos de 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

3
Recuerde que POINT () toma la forma POINT (XY). Probablemente estaba tratando de dar un ejemplo para Madrid, pero los puntos que usa están en realidad en el Océano Índico y Kenia, respectivamente.

66
¿Para qué sirve * 100?
Cristian Ciupitu

44
¿No deberías transformar los puntos en una proyección en metros? Use la zona UTM para una mejor precisión si la conoce. >>> pnt.transform (900913) >>> pnt2.transform (900913) >>> pnt.distance (pnt2) 1153485.9216961625
monkut

Parece que Pointno se usa
Oleg Belousov

1
No uses esta respuesta. La función de distancia no respeta el SRID de ninguna forma y simplemente dará distancia en un plano 2D.
Jonathan Richards el


2

Puedes usar Point también.

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
No uses esta respuesta. La función de distancia no respeta el SRID de ninguna forma y simplemente dará distancia en un plano 2D.
Jonathan Richards el

1

También puede usar el código Python de Sven Marnach para obtener el resultado que desea. He agregado una línea de código para obtener el resultado en metros .

Código:

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

Si desea una respuesta que no use una biblioteca o función geodjango. Busque algunas preguntas y respuestas con la etiqueta de . Le dan fórmulas que funcionarán con cualquier lenguaje o marco. Una de esas preguntas es la distancia entre las coordenadas GPS


Preferiría usar geodjango ya que supongo que la forma más eficiente de hacer cálculos masivos es con la lógica interna de un db espacial. Y el resto de mi sitio es django, por lo que sería bueno tener todo consistente bajo el mismo marco.
MadMaardigan

0

Me gustó mucho la solución que he visto una vez con la ayuda de django y geopy. Sin embargo, cambié un poco el código para tener la libertad de ingresar más de solo dos puntos.

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.