เริ่มต้นด้วยการสุ่มคะแนนในการพยายามเลียนแบบในภาพของ OP ที่จุดตัดสองจุดแรกจากนั้นจุดที่สองและสามจะมี id แอตทริบิวต์เดียวกัน (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
, จัดกลุ่มตาม id, ไปยังกลุ่มแรกโดยแอตทริบิวต์
- ใช้
ST_ClusterIntersecting
เพื่อรวมสิ่งเหล่านั้นจากกลุ่มเดียวกันที่ตัดกันเชิงพื้นที่
- เพิ่ม id ให้กับแต่ละกลุ่ม (multis ตาราง) - พยายามทำสิ่งนี้โดยตรงใน ClusterIntersecting นำไปสู่รูปทรงเรขาคณิตทั้งหมดที่ได้รับรหัส 1
- รวมรูปทรงเรขาคณิตที่ทิ้งแล้วจากขั้นตอนที่ 2 โดยจัดกลุ่มตามรหัสจากขั้นตอนที่ 3 - นี่คือส่วนที่ละลาย สิ่งนี้ทำให้รูปหลายเหลี่ยมที่ซ้อนกันสองอันในคลัสเตอร์ A ของคุณเข้าร่วมด้วยกันแทนที่จะเป็นรูปแบบซ้อนทับกันเนื่องจากอยู่ตอนท้ายของขั้นตอนที่ 2
ค่อนข้างยาว แต่ใช้งานได้ (และฉันแน่ใจว่ามีวิธีที่สั้นกว่า)
การใช้เครื่องมือ WKT ใน QGIS (และค้นพบว่าฉันน่ากลัวเพียงใดกับเครื่องมือแก้ไข) สร้างกลุ่มดังต่อไปนี้ซึ่งคุณสามารถเห็นกลุ่มของคุณที่มีข้อความว่า a มีอยู่ด้วยกัน - คือสีเดียว
หากคุณใส่ข้อความ ST_AsText แบบสุดท้าย ST_UNION (d.geom) คุณจะเห็นผลลัพธ์ได้โดยตรง
แก้ไขตามข้อมูลเพิ่มเติมในความคิดเห็น:ในขณะที่คุณเริ่มต้นด้วยคะแนนคุณจะต้องรวมบัฟเฟอร์ในโซลูชันดั้งเดิมของฉัน - ซึ่งฉันใส่ CTE ชั่วคราวที่จุดเริ่มต้นเพื่อเลียนแบบไดอะแกรมของคุณ มันจะง่ายกว่าในการเพิ่มบัฟเฟอร์ใน CTE ของสหภาพเพื่อให้คุณสามารถทำรูปทรงเรขาคณิตทั้งหมดในครั้งเดียว ตัวอย่างเช่นการใช้บัฟเฟอร์ระยะทาง 1,000 ตัวอย่างต่อไปนี้จะส่งคืน 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;