Mendapatkan jarak antara 2 poin menggunakan GeoDjango? [Tutup]


11

Saya memiliki 2 lokasi yang ditentukan oleh GPS coords, lat / long seperti yang dikembalikan oleh google maps:

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

Saya perlu menghitung jarak di antara mereka. Saya tahu saya bisa menggunakan google API tapi saya akan memproses permintaan massal jadi saya lebih suka melakukannya di server saya sendiri.

Saya telah menghabiskan beberapa jam dengan dokumen, menginstal geodjango OK, tapi sepertinya saya tidak dapat menemukan contohnya. Segala sesuatu dalam literatur jauh lebih rumit daripada yang saya butuhkan.

Jawaban:


9

Jawabannya sepertinya ada di utas Grup Google ini :

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
Ingat bahwa TITIK () mengambil bentuk TITIK (XY). Anda mungkin mencoba memberikan contoh untuk Madrid, tetapi poin yang Anda gunakan sebenarnya masing-masing di Samudera Hindia dan Kenya.

6
Apa tujuannya * 100?
Cristian Ciupitu

4
bukankah seharusnya Anda mengubah poin menjadi proyeksi dalam meter? Gunakan zona UTM untuk akurasi yang lebih baik jika Anda mengetahuinya. >>> pnt.transform (900913) >>> pnt2.transform (900913) >>> pnt.distance (pnt2) 1153485.9216961625
monkut

Sepertinya Pointtidak digunakan
Oleg Belousov

1
Jangan gunakan jawaban ini. Fungsi jarak tidak menghormati SRID dalam bentuk apa pun dan hanya akan memberi jarak pada bidang 2d.
Jonathan Richards


2

Anda dapat menggunakan Point juga.

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
Jangan gunakan jawaban ini. Fungsi jarak tidak menghormati SRID dalam bentuk apa pun dan hanya akan memberi jarak pada bidang 2d.
Jonathan Richards

1

Anda juga dapat menggunakan kode Python dari Sven Marnach untuk mendapatkan hasil yang Anda inginkan. Saya telah menambahkan satu baris kode untuk mendapatkan hasil dalam meter .

Kode:

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

Jika Anda menginginkan jawaban yang tidak menggunakan pustaka atau fungsi geodjango. cari beberapa pertanyaan dan jawaban dengan label . Mereka memberi Anda formula yang akan bekerja dengan bahasa atau kerangka kerja apa pun. Salah satu pertanyaannya adalah Jarak antar koordinat GPS


Saya lebih suka menggunakan geodjango karena saya menganggap cara paling efisien untuk melakukan perhitungan massal adalah dengan logika internal db spasial. Dan sisa situs saya adalah Django, jadi alangkah baiknya untuk mendapatkan semuanya konsisten dalam kerangka yang sama.
MadMaardigan

0

Saya sangat menyukai solusi yang pernah saya lihat dengan bantuan Django dan Geopy. Namun demikian, saya mengubah kode sedikit agar memiliki kebebasan untuk memasukkan lebih dari dua poin.

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.