Починаючи з якихось випадкових точок, у посвідченні імітувати ті, на зображенні ОП, де перші два просторово перетинаються, потім 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
, групування за id, до першої групи за атрибутом
- використовувати
ST_ClusterIntersecting
для об'єднання тих, хто з однієї групи, які перетинаються просторово
- додайте ідентифікатор до кожного з кластерів (таблиця multis) - спроба зробити це безпосередньо в ClusterIntersecting призводить до того, що всі геометрії отримують ідентифікатор 1
- Об'єднайте геометрию, що скидається з кроку 2, групуючи за ідентифікатором з кроку 3 - це частина, що розпускається . Це призводить до того, що два полігони, що перекриваються у вашому кластері A, повинні бути з'єднані разом, а не перекриваються, як вони є в кінці кроку 2.
Досить довго, але це працює (і, я впевнений, є коротший шлях).
Використовуючи інструмент WKT в QGIS (і виявляючи, як мені страшно за допомогою інструментів редагування), створюються кластери на зразок наступного, де ви бачите кластер, позначений як ", - це все разом, тобто один колір.
Якщо ви поставите ST_AsText навколо фіналу, ST_UNION (d.geom), то ви можете бачити результати безпосередньо.
ЗРЕДИТИ наступну інформацію в коментарях: Оскільки ви починаєте з пунктів, вам потрібно буде включити буфер у моє оригінальне рішення - яке я поставив у темп CTE на початку, щоб імітувати вашу діаграму. Простіше було б додати буфер до об'єднань CTE, так що ви можете робити всі геометрії одночасно. Отже, використовуючи буферну відстань 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;