ओपी की छवि में उन लोगों की नकल करने के लिए कुछ यादृच्छिक बिंदुओं के साथ शुरू करना, जहां पहले दो स्थानिक रूप से प्रतिच्छेद होता है, फिर 2 और 3 में एक ही विशेषता आईडी (2) होती है, कुछ अन्य बिंदुओं के साथ जो न तो स्थानिक रूप से प्रतिच्छेद करते हैं और न ही एक ही विशेषता, निम्नलिखित क्वेरी 3 क्लस्टर का उत्पादन करती है:
WITH
temp (id, geom) AS
(VALUES (1, ST_Buffer(ST_Makepoint(0, 0), 2)),
(2, ST_Buffer(ST_MakePoint(-0.7,0.5), 2)),
(2, ST_Buffer(ST_MakePoint(10, 10), 2)),
(3, ST_Buffer(ST_MakePoint(-2, 12), 2)),
(4, ST_Buffer(ST_MakePoint(5, -6), 2))),
unions(geoms) AS
(SELECT ST_Union(geom) FROM temp GROUP BY id),
clusters(geoms) AS
(SELECT ST_CollectionExtract(unnest(ST_ClusterIntersecting(geoms)), 3)
FROM unions),
multis(id, geoms) AS
(SELECT row_number() over() as id, geoms FROM clusters)
SELECT ST_UNION(d.geom) FROM
(SELECT id, (ST_DUMP(geoms)).geom FROM multis) d GROUP BY id;
यहाँ कई चरण हैं:
- उपयोग
ST_Union
, आईडी द्वारा समूहीकरण, विशेषता द्वारा पहले समूह के लिए
ST_ClusterIntersecting
एक ही समूह से उन लोगों को संयोजित करने के लिए उपयोग करें जो स्थानिक रूप से प्रतिच्छेद करते हैं
- प्रत्येक क्लस्टर में एक आईडी जोड़ें (टेबल मल्टीस) - क्लस्टरस्टर इन्टरसेक्टिंग में सीधे ऐसा करने की कोशिश करने से सभी ज्यामितीय 1 की आईडी प्राप्त करते हैं।
- चरण 2 से डंप किए गए ज्यामितीय संघ, चरण 3 से आईडी द्वारा समूहीकरण - यह भंग हिस्सा है। यह आपके क्लस्टर ए में दो ओवरलैपिंग बहुभुज का कारण बनता है, ओवरलैपिंग के बजाय एक साथ शामिल होने के लिए, जैसा कि वे चरण 2 के अंत में हैं।
बल्कि लंबा है, लेकिन यह काम करता है (और, मुझे यकीन है कि एक छोटा रास्ता है)।
क्यूजीआईएस में डब्ल्यूकेटी टूल का उपयोग करना, (और यह पता लगाना कि मैं संपादन टूल के साथ कितना भयानक हूं) निम्नलिखित जैसे क्लस्टर का उत्पादन करता है, जहां आप क्लस्टर को अपने लेबल के रूप में देख सकते हैं, यह सब एक साथ है - यानी, एक रंग।
यदि आप अंतिम, ST_UNION (d.geom) के लिए एक ST_AsText राउंड लगाते हैं, तो आप सीधे परिणाम देख सकते हैं।
EDIT टिप्पणियों में अधिक जानकारी के बाद: जैसा कि आप बिंदुओं के साथ शुरू कर रहे हैं, आपको बफर को मेरे मूल समाधान में शामिल करना होगा - जिसे मैंने अपने आरेख की नकल करने के लिए शुरुआत में अस्थायी सीटीई में डाल दिया था। यूनियनों सीटीई में बफर को जोड़ना आसान होगा, इसलिए आप एक ही बार में सभी ज्यामितीय कार्य कर सकते हैं। इसलिए, एक उदाहरण के रूप में, 1000 की बफर दूरी का उपयोग करते हुए, निम्नलिखित अब अपेक्षित रूप से 3 क्लस्टर लौटाता है।
WITH temp(id, geom) AS
(VALUES
(1, ST_SetSRID(ST_GeomFromText('MultiPoint(12370 361685)'), 31256)),
(2, ST_SetSRID(ST_GeomFromText('MultiPoint(13520 360880, 19325 364350)'), 31256)),
(3, ST_SetSRID(ST_GeomFromText('MultiPoint(11785 367775)'), 31256)),
(4, ST_SetSRID(ST_GeomFromText('MultiPoint(19525 356305)'), 31256))
),
unions(geoms) AS
(SELECT st_buffer(ST_Union(geom), 1000) FROM temp GROUP BY id),
clusters(geoms) AS
(SELECT ST_CollectionExtract(unnest(ST_ClusterIntersecting(geoms)), 3)
FROM unions),
multis(id, geoms) AS
(SELECT row_number() over() as id, geoms FROM clusters)
SELECT id, ST_UNION(d.geom) FROM
(SELECT id, (ST_DUMP(geoms)).geom FROM multis) d GROUP BY id;