Отримати відстань між 2 балами за допомогою GeoDjango? [зачинено]


11

У мене є 2 місця, визначені gps-координатами, lat / long як повернуті google maps:

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

Мені потрібно обчислити відстань між ними. Я знаю, що міг би скористатися API google, але я обробляю масові запити, тому краще зробити це на власному сервері.

Я провів кілька годин з документами, встановив geodjango ОК, але я не можу знайти приклад цього. У літературі все складніше, ніж мені потрібно.

Відповіді:


9

Здається, відповідь міститься в цій темі груп 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
Пам'ятайте, що POINT () приймає форму POINT (XY). Ви, мабуть, намагалися навести приклад для Мадрида, але бали, які ви використовуєте, є насправді в Індійському океані та Кенії відповідно.

6
Яка мета * 100?
Крістіан Цюпіту

4
ви не повинні перетворювати точки в проекцію в метрах? Використовуйте зону UTM для кращої точності, якщо ви це знаєте. >>> pnt.transform (900913) >>> pnt2.transform (900913) >>> pnt.distance (pnt2) 1153485.9216961625
monkut

Здається Point, невикористаний
Олег Білоусов

1
Не використовуйте цю відповідь. Функція відстані не поважає SRID в будь-якій формі і просто дасть відстань у 2d площині.
Джонатан Річардс


2

Ви також можете використовувати 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
Не використовуйте цю відповідь. Функція відстані не поважає SRID в будь-якій формі і просто дасть відстань у 2d площині.
Джонатан Річардс

1

Ви також можете скористатися кодом Python Sven Marnach, щоб отримати бажаний результат. Я додав рядок коду для отримання результату в метрах .

Код:

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

Якщо ви хочете відповісти, яка не використовує бібліотеку або функцію геоджанго. шукайте деякі запитання та відповіді за допомогою позначки . Вони дають вам формули, які працюватимуть з будь-якою мовою чи рамкою. Одне таке питання - відстань між координатами GPS


Я вважаю за краще використовувати geodjango, оскільки я вважаю, що найефективніший спосіб робити об'ємні обчислення - це внутрішня логіка просторового db. А решта мого сайту - це джанго, тому було б непогано, щоб все було узгоджено в одних рамках.
MadMaardigan

0

Мені дуже сподобалось рішення, яке я бачив колись за допомогою джанго та геопії. Тим не менш, я трохи змінив код, щоб мати свободу вводити більше ніж два пункти.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.