Obtendo distância entre 2 pontos usando o GeoDjango? [fechadas]


11

Eu tenho 2 locais definidos por gps coords, lat / long como retornado pelo google maps:

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

Eu preciso calcular a distância entre eles. Sei que poderia usar a API do Google, mas processarei consultas em massa, preferindo fazê-lo no meu próprio servidor.

Passei algumas horas com os documentos, instalei o geodjango OK, mas não consigo encontrar um exemplo disso. Tudo na literatura é muito mais complicado do que eu preciso.

Respostas:


9

A resposta parece estar neste tópico dos Grupos do 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
Lembre-se de que POINT () assume o formato POINT (XY). Você provavelmente estava tentando dar um exemplo para Madri, mas os pontos que você usa estão na verdade no Oceano Índico e no Quênia, respectivamente.

6
Qual é o propósito * 100?
Cristian Ciupitu

4
você não deve transformar os pontos em uma projeção em metros? Use a zona UTM para obter melhor precisão, se você souber. >>> pnt.transform (900913) >>> pnt2.transform (900913) >>> pnt.distance (PNT2) 1.153.485,9216961625
monkut

Parece que Pointnão é utilizada
Oleg Belousov

1
Não use esta resposta. A função de distância não respeita o SRID de nenhuma forma e simplesmente fornecerá a distância em um plano 2D.
9136 Jonathan Richards


2

Você também pode usar o 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
Não use esta resposta. A função de distância não respeita o SRID de nenhuma forma e simplesmente fornecerá a distância em um plano 2D.
9136 Jonathan Richards

1

Você também pode usar o código Python de Sven Marnach para obter o resultado desejado. Eu adicionei uma linha de código para obter o resultado em 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

Se você deseja uma resposta que não use uma biblioteca ou função do geodjango. procure algumas perguntas e respostas com a etiqueta de . Eles fornecem fórmulas que funcionarão com qualquer idioma ou estrutura. Uma dessas perguntas é a distância entre coordenadas GPS


Prefiro usar o geodjango, pois presumo que a maneira mais eficiente de fazer cálculos em massa é com a lógica interna de um banco de dados espacial. E o resto do meu site é django, então seria bom obter tudo consistente sob a mesma estrutura.
MadMaardigan

0

Gostei muito da solução que já vi uma vez com a ajuda do django e geopy. No entanto, mudei um pouco o código para ter a liberdade de inserir mais do que apenas dois pontos.

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.