PostGIS / PostGresQL में अधिकतम ओवरलैप के आधार पर जुड़ें?


11

मेरे पास दो तालिकाओं में दो सेट बहुभुज हैं। सेट एक दूसरे को ओवरलैप करते हैं। सेट ए में प्रत्येक बहुभुज के लिए, मैं सेट बी में बहुभुज की आईडी प्राप्त करना चाहूंगा कि यह सबसे अधिक ओवरलैप करता है। मैं PostgreSQL का उपयोग PostGIS एक्सटेंशन के साथ कर रहा हूं।

मैं एसक्यूएल के बारे में बस इतना जानना चाहता हूं कि आप केवल सही / गलत स्थितियों के आधार पर जुड़ सकते हैं। तो यह काम नहीं करेगा:

SELECT
  a.id as a_id,
  b.id as b_id,
FROM
  a
JOIN
  b
ON
  max(ST_Area(ST_Intersection(a.geom, b.geom)))

क्योंकि अधिकतम () क्लॉज में नहीं हो सकता।

ST_Intersects()एक सच्चा / गलत परीक्षण है, इसलिए मैं उस पर शामिल हो सकता हूं , लेकिन सेट ए में बहुभुज अक्सर सेट बी में एक से अधिक बहुभुज के साथ ओवरलैप होंगे, और मुझे यह जानने की जरूरत है कि कौन सा सबसे अधिक ओवरलैप करता है । ST_Intersects संभवतः ओवरलैप की सीमा की परवाह किए बिना पहली ओवरलैपिंग आईडी लौटाएंगे।

ऐसा लगता है कि ऐसा करना चाहिए, लेकिन यह मेरे से परे है। कोई विचार?

जवाबों:


13

आप कुछ इस तरह का उपयोग कर सकते हैं:

SELECT DISTINCT ON (a.id)
  a.id as a_id,
  b.id as b_id,
  ST_Area(ST_Intersection(a.geom, b.geom)) as intersect_area
FROM a, b
ORDER BY a.id, ST_Area(ST_Intersection(a.geom, b.geom)) DESC

यह:

1) रिकॉर्ड के लिए हर (ए, बी) जोड़ी के लिए ST_Area (ST_Intersection (a.geom, b.geom)) की गणना करता है।

2) उन्हें a.id द्वारा और intersect_area द्वारा आदेश देता है जब a.id समान होते हैं।

3) समान a.id के प्रत्येक समूह में यह firs रिकॉर्ड चुनता है (पहला रिकॉर्ड चरण 2 पर आदेश देने के कारण सबसे अधिक intersect_area है)।


यह समस्या को बहुत करीने से हल करता है। शुक्रिया शुक्रिया! DISTINCT ONमेरे लिए नया है - इस संदर्भ में बहुत उपयोगी है।
ह्यूग स्टिम्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.