GeoDjango를 사용하여 두 점 사이의 거리를 알기 [닫은]


11

Google지도에서 반환 한 것과 같이 위도 / 경도가 GPS 좌표로 정의 된 두 개의 위치가 있습니다.

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

그들 사이의 거리를 계산해야합니다. Google API를 사용할 수는 있지만 대량 쿼리를 처리하므로 자체 서버에서 처리하고 싶습니다.

나는 문서와 함께 몇 시간을 보냈고 지장 고를 설치했지만 이것의 예를 찾을 수없는 것 같습니다. 문헌의 모든 것은 내가 필요한 것보다 훨씬 복잡합니다.

답변:


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무엇입니까?
Cristian Ciupitu

4
포인트를 미터 단위의 투영으로 변환해서는 안됩니까? 알고있는 경우 UTM 영역을 사용하여 정확도를 높이십시오. >>> pnt.transform (900913) >>> pnt2.transform (900913) >>> pnt.distance (pnt2) 1153485.9216961625
monkut

이처럼 보인다 Point미사용
올렉 Belousov

1
이 답변을 사용하지 마십시오. 거리 기능은 어떤 형태의 SRID도 존중하지 않으며 단순히 2D 평면에서 거리를 제공합니다.
Jonathan Richards


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 평면에서 거리를 제공합니다.
Jonathan Richards

1

Sven Marnach의 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 좌표 사이의 거리입니다


대량 계산을 수행하는 가장 효율적인 방법은 공간 DB의 내부 논리를 사용하는 것으로 가정하기 때문에 측 장고를 사용하고 싶습니다. 그리고 내 사이트의 나머지 부분은 장고이므로 동일한 프레임 워크에서 모든 것을 일관되게 유지하는 것이 좋습니다.
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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.