PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

मैं geodjango के लिए k निकटतम पड़ोसी कैसे प्राप्त करूं?

आप raw() पोस्टगिस का उपयोग करने के लिए एसक्यूएल क्वेरी order_by ऑपरेटर:

  1. <-> जो अंतर-वस्तु दूरी की गणना करने के लिए बाउंडिंग बॉक्स के केंद्रों का उपयोग करके निकटतम पड़ोसी प्राप्त करता है।

  2. <#> जो इंटर-ऑब्जेक्ट दूरियों की गणना करने के लिए स्वयं बाउंडिंग बॉक्स का उपयोग करके निकटतम पड़ोसी प्राप्त करता है।

आपके मामले में जो आप चाहते हैं वह लगता है <-> ऑपरेटर, इस प्रकार कच्ची क्वेरी:

knn = Person.objects.raw(
    'SELECT * FROM myapp_person 
    ORDER BY location <-> ST_SetSRID(ST_MakePoint(%s, %s),4326)',
    [location.x, location.y]
)[:k]

स्वयं की मूर्खता के कारण संपादित करें: आप [:k] . को छोड़ सकते हैं जोड़ने के लिए LIMIT 1 कच्ची SQL क्वेरी पर। (जैसा मैंने किया दोनों का उपयोग न करें!)

आपके अन्य प्रश्न का उत्तर देने की प्रक्रिया में:-table-in-geodjango/">geodjango में दूरी (संपूर्ण तालिका) के आधार पर ऑर्डर करना कितना प्रभावी है , एक और समाधान संभव हो सकता है:

spatial indexing enabling को सक्षम करके और तार्किक बाधाओं के माध्यम से अपनी क्वेरी को कम करना (जैसा कि समझाया गया है -entire-table-in-geodjango/45433627#45433627">मेरे जवाब में उपरोक्त से जुड़े प्रश्न में) आप बहुत तेज़ KNN . प्राप्त कर सकते हैं क्वेरी इस प्रकार है:

current_location = me.location
people = People.objects.filter(
    location__dwithin=(current_location, D(km=50))
).annotate(
    distance=Distance('location', current_location)
).order_by('distance')[:k]



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज 10 . का उपयोग करते समय अद्यतन में सेट-रिटर्न फ़ंक्शन की अनुमति नहीं है

  2. मैं एक स्कीमा केवल बैकअप कैसे करूं और PostgreSQL में पुनर्स्थापित करूं?

  3. पोस्टग्रेज:समग्र कुंजी कैसे करें?

  4. PostgreSQL स्ट्रीमिंग प्रतिकृति - एक गहरा गोता

  5. PostgreSQL में मूविंग एवरेज की गणना कैसे करें