Получение расстояния между 2 точками, используя GeoDjango? [закрыто]


11

У меня есть 2 местоположения, определенные GPS-координаты, широта / долгота, как возвращаются карты Google:

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-код Свена Марнача для получения желаемого результата. Я добавил строку кода для получения результата в метрах .

Код:

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


Я бы предпочел использовать геоджанго, так как я предполагаю, что наиболее эффективный способ выполнять массовые вычисления - с использованием внутренней логики пространственной базы данных. А остальная часть моего сайта - django, поэтому было бы неплохо, чтобы все было согласованно в одной структуре.
MadMaardigan

0

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

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.