2012-07-19 8 views
5

मैं geodjango का उपयोग कर रहा हूँ और मेरे डेटाबेस में अंक का संग्रह है। एक निश्चित क्षेत्र मैं इस का उपयोग भीतर अंकों की क्वेरीसमूह पाने के लिए:geodjango का उपयोग कर एक बिंदु से सबसे कम दूरी के साथ एक रिकॉर्ड कैसे वापस करें?

queryset = Spot.objects.filter(point__distance_lte=(origin, distance_m)) 

मेरे सवाल यह है कि मैं केवल एक ही बिंदु बिंदु मैं इसे पारित किया है से (सबसे कम दूरी साथ बिंदु) लौट सकते है?

संपादित

मुझे लगता है कि मैं निर्देशांक में गुजर रहा हूँ और उनके साथ एक Point वस्तु बनाने के लिए इच्छुक उल्लेख करना चाहिए। फिर उस बिंदु को उत्पत्ति के रूप में पास करें और उसके खिलाफ फ़िल्टर करें। उदाहरण के लिए मैं कोशिश की है:

from spots.models import * 
from django.contrib.gis.geos import * 

origin = Point(28.011030, -26.029430) 
distance_m = 1000 

queryset = Spot.objects.filter(point__distance_lte=(origin, distance_m)) 
for q in queryset: 
    print q.distance 

कोड के इस स्निपेट मुझे इस त्रुटि देता है:

Traceback (most recent call last): 
    File "<console>", line 2, in <module> 
AttributeError: 'Spot' object has no attribute 'distance' 

दिलचस्प बात यह है कि अगर मैं निम्न कार्य करें:

origin = Spot.objects.get(name='Montecasino').point 
distance_m = 1000 

for city in Spot.objects.distance(origin): 
    print(city.name, city.distance) 

(u'Design Quarter Parking', Distance(m=677.347841801)) 
(u'Montecasino', Distance(m=0.0)) 
(u'Fourways', Distance(m=1080.67723755)) 

उत्तर

4

अंततः GeoDjango distance filter with distance value stored within model - query से सुराग से एकत्रित एक समाधान जो मुझे इस post पर ले जाता है। इस जानकारी से मैं यह इकट्ठा करने में सक्षम था कि माप दूरी पैरामीटर आपकी दूरी क्वेरी में निर्दिष्ट करें। आप नीचे स्निपेट में देखेंगे, मैं आयात डी के रूप में आयात करता हूं। फिर क्वेरी में इसका इस्तेमाल करें।

ValueError: Tuple required for `distance_lte` lookup type. 

सिर्फ न्यूनतम दूरी मैं order_by('distance')[:1][0]

from spots.models import * 
from django.contrib.gis.geos import * 
from django.contrib.gis.measure import D 

distance_m = 20000 
origin = Point(28.011030, -26.029430) 

closest_spot = Spot.objects.filter(point__distance_lte=(origin, D(m=distance_m))).distance(origin).order_by('distance')[:1][0] 
+0

क्या आप समझा सकते हैं कि आपके पास – Sevenearths

+1

अंत में' [: 1] [0] 'क्यों है, कृपया डीबग करने से पहले इसे देखें: [https://docs.djangoproject.com/en/1.6/ref/contrib/जीआईएस/डीबी-एपीआई/# संगतता-सारणी] बस कुछ घंटे बिताए बिना बिगड़ती बिंदु__distance_lte बिताती है जब यह MySQL के लिए समर्थित नहीं है – PKaura

0
queryset = Spot.objects.distance(origin).filter(distance__lte=distance_m) 
point = queryset.order_by('distance')[:1][0] 

https://docs.djangoproject.com/en/dev/ref/contrib/gis/geoquerysets/#distance

+2

आपके सुझाव की कोशिश कर मुझे एक त्रुटि मिलती है। 'फ़ील्ड त्रुटि: फ़ील्ड में कीवर्ड' दूरी 'को हल नहीं कर सकता। विकल्प हैं: लेखक, बनाया_ऑन, आईडी, नाम, बिंदु, स्लग, अपडेट_ऑन 'मेरे मॉडल पर कोई दूरी फ़ील्ड नहीं है। – darren

+0

@ डैरेन यह तब हो सकता है जब आप उपयोगकर्ता 'ऑब्जेक्ट्स = GeoManager()' को भूल जाते हैं, यह django.contrib.gis.db.models.manager से 'GeoManager' से सेटिंग्स में आता है I डेटाबेस को 'इंजन' का उपयोग करना याद है: ' django.contrib.gis.db.backends।postgis ', ' – andi

0

इस्तेमाल किया मैं कैसे सॉर्ट करने के लिए पर एक उदाहरण के लिए देख रहा था के साथ बात करने के लिए: आप इसे निर्दिष्ट नहीं करते हैं तो आपको यह त्रुटि मिल जाएगा geodjango के साथ एक स्थान के खिलाफ परिणाम, तो मेरा उपयोग मामला इस के बहुत करीब था। हालांकि स्वीकार किए गए समाधान ने काम किया, लेकिन बड़े डेटा सेट (140000 से अधिक पंक्तियों) के लिए प्रदर्शन बहुत खराब था।

लघु कहानी: distance_lte फ़ंक्शन को तालिका की प्रत्येक पंक्ति के लिए मूल से दूरी की गणना करनी चाहिए और भौगोलिक अनुक्रमणिका का उपयोग नहीं कर सकता है। ऐसा लगता है कि dwithin समारोह में इस तरह के अनुक्रमणिका का उपयोग कर सकते हैं और वास्तव में से पहले से पहले प्रतिबंध से किया जाता है प्रत्येक पंक्ति के लिए मूल करने के लिए दूरी की गणना की जरूरत नहीं है, तो यह तरीका अधिक कुशल है:

origin = Point(28.011030, -26.029430) 
closest_spot = Spot.objects.filter(point__dwithin=(origin, 1)) \ 
    .distance(origin).order_by('distance')[:1][0] 

dwithin समारोह डिग्री में भौगोलिक डेटा के साथ काम करता है (क्वेरी में "1")।

संबंधित मुद्दे