PostGIS का उपयोग करके निकटतम पड़ोसी गणना का अनुकूलन करना


13

मैं बहुभुज के निकटतम पड़ोसियों की गणना करने के लिए PostGIS का उपयोग कर रहा हूं। मैं जो गणना करना चाहता हूं वह प्रत्येक बहुभुज से निकटतम बहुभुज की न्यूनतम दूरी है।

इस प्रकार अब तक मुझे माइक टोज़ के उत्तर (जिसे मैं एक मामूली बदलाव के साथ उद्धृत करता हूं ) से बहुत मदद मिली है:

SELECT 
  a.hgt AS a_hgt,
  b.hgt AS b_hgt,
  ST_Distance(a.the_geom, b.the_geom) AS distance_between_a_and_b
FROM 
  public."TestArea" AS a, public."TestArea" AS b
WHERE
  a.hgt !=  b.hgt AND ST_Distance(a.the_geom, b.the_geom) < 400

फिर मैंने न्यूनतम गणना की:

SELECT a_hgt, MIN(distance_between_a_and_b)
FROM public."lon_TestArea"
GROUP BY a_hgt

हालांकि, मेरी चुनौती बड़ी संख्या में बहुभुज (1,000,000) के लिए इसकी गणना करना है। जैसा कि ऊपर की गणना प्रत्येक बहुभुज की तुलना हर दूसरे बहुभुज से करती है, मैंने सोचा कि मैं गणना में सुधार कैसे कर सकता हूं ताकि मुझे 10 ^ 12 गणना करने की आवश्यकता न हो।

मैंने सोचा था कि मुझे प्रत्येक बहुभुज को बफर करना था, और फिर उस बहुभुज के लिए बफर के भीतर सभी मूल्यों के निकटतम पड़ोसियों की गणना करना और न्यूनतम रिकॉर्ड करना था। मुझे यकीन नहीं है कि अगर यह सबसे अच्छा तरीका है, या क्या PostGIS में कोई फ़ंक्शन है जो मुझे उपयोग करना चाहिए।


संपादित करें: निकल्स के सुझावों में से एक का उपयोग करते हुए, मैं इसके साथ प्रयोग कर रहा हूं ST_Dwithin():

CREATE TABLE mytable_withinRange AS SELECT 
  a.hgt AS a_hgt,
  b.hgt AS b_hgt,
  ST_DWithin(a.the_geom, b.the_geom, 400)
FROM 
  public."lon_TestArea" AS a, public."lon_TestArea" AS b

यहाँ छवि विवरण दर्ज करें

यह प्रत्येक बहुभुज की आईडी की एक तालिका लौटाता है, और यह एक निश्चित दूरी के भीतर है या नहीं। क्या IF/ELSEएसक्यूएल का उपयोग करके एक प्रकार का बयान बनाना संभव है ? (मैं CASEशर्त का उपयोग करने के बारे में पढ़ता हूं ) या क्या मुझे मूल तालिका में मेरे द्वारा उत्पादित तालिका में शामिल होने का प्रयास करना चाहिए और फिर ST_A शासन का उपयोग करके फिर से क्वेरी चलानी चाहिए?


मेरे जवाब में बोस्टोन जीआईएस लिंक में दूसरे उदाहरण पर एक नज़र डालें। आपको क्वेरी के उस भाग में st_dwithin का उपयोग करना चाहिए।
निकलस एवन

जवाबों:


7

बोस्टनजीआईएस पृष्ठ पर एक बड़ा "निकटतम पड़ोसी" खंड है


संपादित करें:

कैसा रहेगा

CREATE TABLE mytable_withinRange AS SELECT 
 a.hgt AS a_hgt,
 b.hgt AS b_hgt
FROM 
 public."lon_TestArea" AS a, public."lon_TestArea" AS b
WHERE 
 ST_DWithin(a.the_geom, b.the_geom, 400)

के संबंध में मामला बयान :

SELECT a,
   CASE WHEN a=1 THEN 'one'
        WHEN a=2 THEN 'two'
        ELSE 'other'
   END
FROM test;

क्या आप जानते हैं कि यदि रेखा WHERE ST_DWithin(a.the_geom, b.the_geom, 400)अधिक दूरी को रोकती है तो 400गणना की जाएगी या सिर्फ रिकॉर्ड की जाएगी? इसके अलावा, संख्यात्मक गणना के लिए एक केस स्टेटमेंट का उपयोग किया जा सकता है? उदाहरण के लिए:CASE WHEN ST_DWithin(a.the_geom, b.the_geom, 400) == TRUE THEN ST_DWithin(a.the_geom, b.the_geom)
djq

1
@ लेसेनियस यदि दूरी 400 मीटर से अधिक है, तो चयनित भाग की कुछ भी गणना नहीं की जाएगी। मुझे नहीं लगता कि आप मिश्रण में मामला क्यों डालना चाहते हैं।
निकलैस एवन

@ निकल्स ओके - मैं समझता हूं। मैंने सोचा कि इसका मतलब यह हो सकता है कि केवल 400 से कम दूरी पर संग्रहीत किए गए थे; हालाँकि, यह मेरे मुकाबले बहुत आसान है। धन्यवाद!
djq

3

अभिनंदन

कुछ चीजें हैं जो चीजों को तेजी से आगे बढ़ाने के लिए विचार करती हैं, और कुछ चीजें जो भविष्य में संभव हो सकती हैं।

पहले , आपने उल्लेख किया कि आप सभी संयोजनों की गणना से बचने के लिए कुछ न्यूनतम रेंज में बहुभुजों को खोजने के लिए एक बफर का उपयोग करने पर विचार कर रहे हैं।

के रूप में से एक और कड़ी में चर्चा बोस्टन जीआईएस कि PostGIS में उपयोग कर रहा है करने के लिए सही रास्ता ST_Dwithin । ST_Dwithin एक निश्चित सीमा में पड़ोसियों को खोजने के लिए सूचकांक का उपयोग करता है।

यह निश्चित रूप से डेटासेट पर निर्भर करता है, यदि यह सभी बहुभुजों के लिए st_DWithin के लिए एक निश्चित मूल्य का उपयोग करने के लिए पर्याप्त है या यदि आपको अंडरडार्क और वाइल्डइंटेल्ट जैसे कुछ करने की आवश्यकता है, तो चर्चा कर रहे हैं।

एक दूसरी बात यहाँ PostGIS 1.5+ का उपयोग करना है। ऐसा इसलिए है क्योंकि बहुभुज की गणना बहुभुज 1.5 के बाद से बहुत तेज होती है यदि उनके बाउंडिंग बॉक्स प्रतिच्छेद नहीं करते हैं। आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं

तीसरी बात भविष्य की है।

PostgreSQL 9.1 में knn-gist नामक कुछ होगा। यह एक ऐसा सूचकांक है जो केवल हां या ना में जवाब नहीं दे सकता है, बल्कि सूचकांक से सीधे आदेशित परिणाम भी लौटा सकता है। आप यहाँ उसके बारे में पढ़ सकते हैं ।

लेकिन अभी भी बहुत काम करना होगा PostGIS की तरफ से पहले knn gist इस तरह की चीजों के लिए मदद करेगा। उसके लिए यहां टिकट है।

सादर

Nicklas


सुझाव के लिए धन्यवाद Nicklas; जैसा कि मैंने पाया है कि यह pgAdmin / PostGIS पाने के लिए मुश्किल है और मुझे लगता है कि मैं फिलहाल 1.5 का उपयोग करने से बचूंगा। ऐसा लगता है कि ST_Dwithin () इसे हल करने का एक तरीका है।
djq

2
1.5 स्थापित करने से postgresql और pgadmin के बीच संबंध प्रभावित नहीं होंगे। आपके पास डेटाबेस सर्वर में एक से अधिक संस्करण हो सकते हैं और फिर आप उनमें से एक को डेटाबेस में लोड कर सकते हैं। तो आप एक 1.4 और एक 1.5 डेटाबेस एक ही डेटाबेस सर्वर हो सकता है।
निकलैस एवन

1

नाथन केर के स्वामी कार्य से संबंधित निम्नलिखित पृष्ठ इस प्रत्यक्ष मुद्दे पर कुछ अच्छी जानकारी प्रदान करते हैं। मेरे सहकर्मी ने यहां और यहां पर बोसॉन्गिस विधि की कोशिश की , लेकिन कुछ मुद्दों पर इसे सही काम करने के लिए मिला।

एक अन्य दृष्टिकोण के बारे में सोचने के लिए कि बफर के समान एक विस्तार / अनुबंधित आयत करना है। मूल रूप से पास 1 एक बाउंडिंग बॉक्स करता है (यह आपके मूल बहुभुज के बॉक्स के लिए एक सीधा + x इकाइयाँ है) प्रतिच्छेदन जो आपको लगता है कि कम से कम एक चौराहे को पकड़ लेगा। डेटा के लिए जिसे एक इंटरसेक्ट मिला है, एक उप क्वेरी करता है जो निकटतम के लिए उन मैचों का परीक्षण करता है। डेटा के लिए बाउंडिंग बॉक्स का विस्तार करने और दोहराने में विफल रहा।

यह स्पष्ट रूप से एक पुनरावर्ती प्रोग्रामिंग समस्या है, और सीधे पोस्टगिस में 100% से अधिक शेपली के साथ पायथन में किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.