Estoy luchando con un problema durante un par de días y me di cuenta de que muchas personas también se estancan cuando el tema es las intersecciones en PostGIS (v2.5). Es por eso que decidí pedir una pregunta común más detallada y genérica.
Tengo la siguiente tabla:
DROP TABLE IF EXISTS tbl_foo;
CREATE TABLE tbl_foo (
id bigint NOT NULL,
geom public.geometry(MultiPolygon, 4326),
att_category character varying(15),
att_value integer
);
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(1, ST_SetSRID('MULTIPOLYGON (((0 6, 0 12, 8 9, 0 6)))'::geometry,4326) , 'cat1', 2 );
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(2, ST_SetSRID('MULTIPOLYGON (((5 0, 5 12, 9 12, 9 0, 5 0)))'::geometry,4326), 'cat1', 1 );
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(3, ST_SetSRID('MULTIPOLYGON (((4 4, 3 8, 4 12, 7 14,10 12, 11 8, 10 4, 4 4)))'::geometry,4326) , 'cat2', 5 );
Se parece a esto:
Quiero obtener todos los polígonos secundarios basados en la intersección de los polígonos principales. Para el resultado, se esperaría:
- Los polígonos secundarios sin superposición entre ellos.
- Una columna que contiene la suma del valor de sus polígonos principales,
- Una columna que contiene el recuento de polígonos primarios de una categoría.
- Una columna que contiene el recuento de otra categoría.
- Una columna que contiene la categoría del polígono secundario, basada en la siguiente regla: -Si TODOS los polígonos principales son de una clase, el polígono secundario también tiene esta clase. De lo contrario, la categoría del polígono hijo es una tercera categoría.
Así se ve así:
Por lo tanto, al final, la tabla de salida generados (para este ejemplo) tendrá 7 filas (todos los 7,, niño polígonos no se solapan), que contienen columnas de category
, sum_value
, ct_overlap_cat1
,ct_overlap_cat2
El siguiente código que comencé, me da las intersecciones individuales, comparando un padre con otro.
SELECT
(ST_Dump(
ST_SymDifference(a.geom, b.geom)
)).geom
FROM tbl_foo a, tbl_foo b
WHERE a.ID < b.ID AND ST_INTERSECTS(a.geom, b.geom)
UNION ALL
SELECT
ST_Intersection(a.geom, b.geom) as geom
FROM tbl_foo a, tbl_foo b
WHERE a.ID < b.ID AND ST_INTERSECTS(a.geom, b.geom);
¿Cómo recorro recursivamente el resultado de este código mencionado, que, independientemente del número de polígonos superpuestos, siempre obtengo sus polígonos 'más pequeños' (secundarios) (Fig. 2)?
Supongo que si usa el tipo de geometría de polígono en lugar de MultiPolygon, todo encajará:
El resultado son 9 entradas que corresponden a las diferentes opciones de intersección en el ejemplo dado por usted.
fuente