Lấy khoảng cách giữa 2 điểm bằng GeoDjango? [đóng cửa]


11

Tôi có 2 vị trí được xác định bởi coords gps, lat / long like được trả về bởi google maps:

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

Tôi cần tính khoảng cách giữa chúng. Tôi biết tôi có thể sử dụng Google API nhưng tôi sẽ xử lý các truy vấn hàng loạt vì vậy tôi muốn thực hiện nó trên máy chủ của riêng mình.

Tôi đã dành vài giờ với các tài liệu, cài đặt geodjango OK, nhưng dường như tôi không thể tìm thấy một ví dụ về điều này. Tất cả mọi thứ trong văn học là cách phức tạp hơn tôi cần.

Câu trả lời:


9

Câu trả lời dường như nằm trong chuỗi Google Groups này :

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
Hãy nhớ rằng POINT () có dạng POINT (XY). Có lẽ bạn đang cố gắng đưa ra một ví dụ cho Madrid, nhưng những điểm bạn sử dụng thực sự ở Ấn Độ Dương và Kenya, tương ứng.

6
Mục đích của là * 100gì?
Cristian Ciupitu

4
bạn không nên chuyển đổi các điểm thành một hình chiếu trong mét? Sử dụng vùng UTM để có độ chính xác cao hơn nếu bạn biết. >>> pnt.transform (900.913) >>> pnt2.transform (900.913) >>> pnt.distance (pnt2) 1.153.485,9216961625
monkut

Có vẻ như Pointkhông được sử dụng
Oleg Belousov

1
Không sử dụng câu trả lời này. Hàm khoảng cách không tôn trọng SRID dưới mọi hình thức và chỉ đơn giản sẽ cung cấp khoảng cách trên mặt phẳng 2d.
Jonathan Richards


2

Bạn cũng có thể sử dụng Điểm.

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
Không sử dụng câu trả lời này. Hàm khoảng cách không tôn trọng SRID dưới mọi hình thức và chỉ đơn giản sẽ cung cấp khoảng cách trên mặt phẳng 2d.
Jonathan Richards

1

Bạn cũng có thể sử dụng mã Python của Sven Marnach để nhận kết quả mà bạn muốn. Tôi đã thêm một dòng mã để nhận kết quả tính bằng mét .

Mã số:

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

Nếu bạn muốn một câu trả lời không sử dụng thư viện hoặc hàm geodjango. tìm kiếm một số câu hỏi và câu trả lời với thẻ Họ cung cấp cho bạn các công thức sẽ làm việc với bất kỳ ngôn ngữ hoặc khung. Một câu hỏi như vậy là Khoảng cách giữa các tọa độ GPS


Tôi thà sử dụng geodjango vì tôi cho rằng cách hiệu quả nhất để thực hiện các phép tính hàng loạt là với logic bên trong của một db không gian. Và phần còn lại của trang web của tôi là django, vì vậy thật tuyệt khi có mọi thứ nhất quán trong cùng một khuôn khổ.
MadMaardigan

0

Tôi thích rất nhiều giải pháp tôi đã thấy một lần với sự giúp đỡ của django và geopy. Tuy nhiên, tôi đã thay đổi mã một chút để có quyền tự do nhập nhiều hơn chỉ hai điểm.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.