Bắt đầu với một số điểm ngẫu nhiên, trong một nhận thức bắt chước những điểm trong hình ảnh của OP, trong đó hai điểm đầu tiên giao nhau về mặt không gian, sau đó điểm thứ 2 và thứ 3 có cùng thuộc tính id (2), với một vài điểm khác không giao nhau về mặt không gian và không có cùng thuộc tính, truy vấn sau đây tạo ra 3 cụm:
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;
Có một số bước ở đây:
- sử dụng
ST_Union
, nhóm theo id, để nhóm đầu tiên theo thuộc tính
- sử dụng
ST_ClusterIntersecting
để kết hợp những người từ cùng một nhóm giao nhau trong không gian
- thêm một id vào mỗi cụm (bảng multis) - cố gắng thực hiện điều này trực tiếp trong ClusterIntersecting dẫn đến tất cả các hình học nhận được id là 1
- Liên kết các hình học bị đổ từ bước 2, nhóm theo id từ bước 3 - đây là phần hòa tan . Điều này làm cho hai đa giác chồng chéo trong cụm A của bạn, được nối với nhau, thay vì chồng chéo, vì chúng ở cuối bước 2.
Khá dài, nhưng nó hoạt động (và, tôi chắc chắn có một cách ngắn hơn).
Sử dụng công cụ WKT trong QGIS, (và khám phá mức độ khủng khiếp của tôi với các công cụ chỉnh sửa) tạo ra các cụm như sau, trong đó bạn có thể thấy cụm được gắn nhãn là a, hoàn toàn cùng nhau - tức là một màu.
Nếu bạn đặt ST_AsText vào vòng chung kết, ST_UNION (d.geom), thì bạn có thể xem kết quả trực tiếp.
EDIT theo dõi thêm thông tin trong các bình luận: Khi bạn bắt đầu với các điểm, bạn sẽ cần kết hợp bộ đệm vào giải pháp ban đầu của tôi - mà tôi đã đưa vào CTE tạm thời khi bắt đầu mô phỏng sơ đồ của bạn. Sẽ dễ dàng hơn để thêm bộ đệm trong các hiệp hội CTE, vì vậy bạn có thể thực hiện tất cả các hình học cùng một lúc. Vì vậy, sử dụng khoảng cách bộ đệm là 1000, làm ví dụ, sau đây trả về 3 cụm, như mong đợi.
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;