รับระยะทางระหว่าง 2 คะแนนโดยใช้ GeoDjango หรือไม่ [ปิด]


11

ฉันมีสถานที่ 2 แห่งที่กำหนดโดย gps coords, lat / long เช่นที่ส่งคืนโดย google maps:

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

ฉันต้องคำนวณระยะทางระหว่างพวกเขา ฉันรู้ว่าฉันสามารถใช้ google API ได้ แต่ฉันจะประมวลผลข้อความค้นหาเป็นจำนวนมากดังนั้นฉันควรทำกับเซิร์ฟเวอร์ของฉันเอง

ฉันใช้เวลาสองสามชั่วโมงกับเอกสารติดตั้ง geodjango แล้ว แต่ฉันไม่สามารถหาตัวอย่างได้ ทุกอย่างในวรรณคดีมีความซับซ้อนกว่าที่ฉันต้องการ

คำตอบ:


9

ดูเหมือนว่าคำตอบจะอยู่ในกลุ่ม Google Groupsนี้:

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
จำไว้ว่าจุด () ใช้แบบฟอร์มจุด (XY) คุณอาจพยายามยกตัวอย่างให้มาดริด แต่ประเด็นที่คุณใช้นั้นจริง ๆ แล้วอยู่ในมหาสมุทรอินเดียและเคนยาตามลำดับ

6
มีจุดประสงค์* 100อะไร?
Cristian Ciupitu

4
คุณไม่ควรแปลงคะแนนเป็นเครื่องฉายเป็นหน่วยเมตรหรือไม่? ใช้โซน UTM เพื่อความแม่นยำที่ดีกว่าถ้าคุณรู้ >>> pnt.transform (900913) >>> pnt2.transform (900913) >>> pnt.distance (pnt2) 1153485.9216961625
monkut

ดูเหมือนว่าPointจะไม่ได้ใช้
Oleg Belousov

1
อย่าใช้คำตอบนี้ ฟังก์ชั่นระยะทางไม่เคารพ SRID ในรูปแบบใด ๆ และจะให้ระยะห่างบนระนาบ 2d
Jonathan Richards


2

คุณสามารถใช้คะแนนได้เช่นกัน

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

คุณสามารถใช้รหัส Python ของ Sven Marnachเพื่อรับผลลัพธ์ที่คุณต้องการ ฉันได้เพิ่มบรรทัดของรหัสในการรับผลเมตร

รหัส:

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

หากคุณต้องการคำตอบที่ไม่ได้ใช้ไลบรารีหรือฟังก์ชัน geodjango มองหาคำถามและคำตอบด้วยแท็กพวกเขาให้สูตรที่จะทำงานกับภาษาหรือกรอบงานใด ๆ คำถามหนึ่งคือระยะห่างระหว่างพิกัด GPS


ฉันอยากจะใช้ geodjango เนื่องจากฉันคิดว่าวิธีที่มีประสิทธิภาพที่สุดในการคำนวณแบบกลุ่มคือตรรกะภายในของฐานข้อมูลเชิงพื้นที่ และส่วนที่เหลือของเว็บไซต์ของฉันคือ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.