GeoDjango kullanarak 2 puan arasında mesafe mi alıyorsunuz? [kapalı]


11

Google Haritalar tarafından döndürülen gibi, enlem / boylam gps koordinatları tarafından tanımlanan 2 konumum var:

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

Aralarındaki mesafeyi hesaplamam gerekiyor. Google API kullanabileceğimi biliyorum, ancak toplu sorguları işleyeceğim, bu yüzden kendi sunucumda yapmayı tercih ederim.

Dokümanlar ile birkaç saat geçirdim, geodjango OK'i yükledim, ancak bunun bir örneğini bulamıyorum. Literatürdeki her şey ihtiyacımdan çok daha karmaşık.

Yanıtlar:


9

Yanıtın bu Google Grupları başlığında olduğu görülüyor :

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 () öğesinin POINT (XY) biçimini aldığını unutmayın. Muhtemelen Madrid için bir örnek vermeye çalışıyordunuz, ancak kullandığınız noktalar sırasıyla Hint Okyanusu ve Kenya'da.

6
Amaç nedir * 100?
Cristian Ciupitu

4
noktaları metre cinsinden bir projeksiyona dönüştürmemelisiniz? UTM bölgesini biliyorsanız daha iyi doğruluk için kullanın. >>> pnt.transform (900913) >>> pnt2.transform (900913) >>> pnt.distance (pnt2) 1153485.9216961625
monkut

PointKullanılmayan gibi görünüyor
Oleg Belousov

1
Bu cevabı kullanmayın. Mesafe fonksiyonu SRID'ye herhangi bir biçimde saygı göstermez ve sadece 2d düzlemde mesafe verir.
Jonathan Richards


2

Nokta'yı da kullanabilirsiniz.

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
Bu cevabı kullanmayın. Mesafe fonksiyonu SRID'ye herhangi bir biçimde saygı göstermez ve sadece 2d düzlemde mesafe verir.
Jonathan Richards

1

İstediğiniz sonucu elde etmek için Sven Marnach'ın Python kodunu da kullanabilirsiniz . Sonucu metre olarak almak için bir kod satırı ekledim .

Kod:

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

Bir geodjango kütüphanesi veya fonksiyonu kullanmayan bir cevap istiyorsanız. etiketi ile ilgili bazı soru ve cevapları arayın . Size herhangi bir dil veya çerçeveyle çalışacak formüller verir. Böyle bir soru GPS koordinatları arasındaki mesafe


Toplu hesaplamalar yapmanın en etkili yolunun bir uzamsal db'nin iç mantığı ile olduğu için geodjango kullanmayı tercih ederim. Ve sitemin geri kalanı django, bu yüzden her şeyi aynı çerçeve altında tutarlı hale getirmek güzel olurdu.
MadMaardigan

0

Ben django ve geopy yardımıyla bir kez gördüğüm çözümü çok sevdim. Bununla birlikte, sadece iki noktadan daha fazla girme özgürlüğüne sahip olmak için kodu biraz değiştirdim.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.