Dimulai dengan beberapa titik acak, dalam upaya meniru orang-orang di gambar OP, di mana dua spasial pertama berpotongan, kemudian ke-2 dan ke-3 memiliki atribut id yang sama (2), dengan beberapa titik lain yang tidak berpotongan secara spasial atau memiliki atribut yang sama, permintaan berikut menghasilkan 3 cluster:
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;
Ada beberapa langkah di sini:
- gunakan
ST_Union
, pengelompokan berdasarkan id, ke grup pertama berdasarkan atribut
- gunakan
ST_ClusterIntersecting
untuk menggabungkan mereka dari kelompok yang sama yang bersinggungan secara spasial
- tambahkan id ke masing-masing cluster (tabel multis) - mencoba melakukan ini secara langsung di mengarah ClusterIntersecting ke semua geometri mendapatkan id 1
- Menyatukan geometri yang dibuang dari langkah 2, pengelompokan berdasarkan id dari langkah 3 - ini adalah bagian terlarut . Ini menyebabkan dua poligon yang tumpang tindih di gugus A Anda, untuk digabungkan bersama, bukannya tumpang tindih, karena mereka berada di akhir langkah 2.
Agak panjang, tapi berhasil (dan, saya yakin ada jalan yang lebih pendek).
Menggunakan alat WKT di QGIS, (dan menemukan betapa buruknya saya dengan alat pengeditan) menghasilkan cluster seperti berikut, di mana Anda dapat melihat cluster yang Anda beri label sebagai, semuanya bersama-sama - yaitu satu warna.
Jika Anda meletakkan ST_AsText di babak final, ST_UNION (d.geom), maka Anda dapat melihat hasilnya secara langsung.
Sunting berikut informasi lebih lanjut di komentar: Ketika Anda mulai dengan poin Anda akan perlu memasukkan buffer ke dalam solusi asli saya - yang saya masukkan ke dalam CTE temp di awal untuk meniru diagram Anda. Akan lebih mudah untuk menambahkan buffer di CTE serikat pekerja, sehingga Anda dapat melakukan semua geometri sekaligus. Jadi, dengan menggunakan jarak buffer 1000, sebagai contoh, yang berikut sekarang mengembalikan 3 cluster, seperti yang diharapkan.
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;