Obtenir la distance entre 2 points en utilisant GeoDjango? [fermé]


11

J'ai 2 emplacements définis par les coordonnées GPS, lat / long comme retourné par Google Maps:

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

J'ai besoin de calculer la distance entre eux. Je sais que je pourrais utiliser l'API Google, mais je traiterai des requêtes en masse, donc je préfère le faire sur mon propre serveur.

J'ai passé quelques heures avec les documents, installé geodjango OK, mais je n'arrive pas à trouver un exemple de cela. Tout dans la littérature est bien plus compliqué que je n'en ai besoin.

Réponses:


9

La réponse semble être dans ce fil de discussion Google Groupes :

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
N'oubliez pas que POINT () prend la forme POINT (XY). Vous essayiez probablement de donner un exemple pour Madrid, mais les points que vous utilisez se trouvent en fait dans l'océan Indien et au Kenya, respectivement.

6
Quel est le but de * 100?
Cristian Ciupitu

4
ne devriez-vous pas transformer les points en projection en mètres? Utilisez la zone UTM pour une meilleure précision si vous la connaissez. >>> pnt.transform (900913) >>> pnt2.transform (900913) >>> pnt.distance (PNT2) 1153485,9216961625
Monkut

Il semble que ce Pointsoit inutilisé
Oleg Belousov

1
N'utilisez pas cette réponse. La fonction de distance ne respecte le SRID sous aucune forme et donnera simplement la distance sur un plan 2D.
Jonathan Richards


2

Vous pouvez également utiliser 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'utilisez pas cette réponse. La fonction de distance ne respecte le SRID sous aucune forme et donnera simplement la distance sur un plan 2D.
Jonathan Richards

1

Vous pouvez également utiliser le code Python de Sven Marnach pour obtenir le résultat souhaité. J'ai ajouté une ligne de code pour obtenir le résultat en mètres .

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

Si vous voulez une réponse qui n'utilise pas de bibliothèque ou de fonction geodjango. recherchez quelques questions et réponses avec l' étiquette de . Ils vous donnent des formules qui fonctionneront avec n'importe quel langage ou framework. L'une de ces questions est la distance entre les coordonnées GPS


Je préfère utiliser geodjango car je suppose que le moyen le plus efficace de faire des calculs en masse est avec la logique interne d'une base de données spatiale. Et le reste de mon site est Django, donc ce serait bien d'avoir tout cohérent sous le même framework.
MadMaardigan

0

J'ai beaucoup aimé la solution que j'ai vue une fois avec l'aide de Django et de Geopy. Néanmoins, j'ai changé un peu le code afin d'avoir la liberté de saisir plus de deux points.

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.