Yo estoy luchando con un problema por un par de días y me di cuenta que muchas personas que también se bloquea cuando el tema es intersecciones en PostGIS (v2.5). Es por eso que me decidí a pedir una más detallada y genérico, común de la pregunta.
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 recibir todo lo que el niño polígonos en función de la intersección de los padres de los polígonos. Para el resultado, que sería esperado:
- El niño polígonos con ningún solapamiento entre ellos.
- Una columna que contiene la suma de los valores de sus padres polígonos,
- Una columna que contiene el recuento de los padres de los polígonos de una categoría
- Una columna que contiene el recuento de otra categoría
- Una columna que contiene la categoría de el niño polígono, con base en la siguiente regla: -Si TODOS los padres de los polígonos que son de una clase, el niño polígono de esta clase. Otra cosa, la categoría del niño polígono es una tercera categoría.
Así que me parece que:
Así que, al final, la tabla de salida generada (para este ejemplo) tiene 7 filas (todos los 7, que no se superponen, hijo de polígonos), que contiene las columnas de category
, sum_value
, ct_overlap_cat1
, ct_overlap_cat2
El código siguiente empecé, me da el individuo intersecciones, la comparación de uno de los padres con el 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 se forma recursiva bucle a través del resultado de este mencionado código, que, independientemente de la cantidad de superposición de polígonos siempre consigo su 'más pequeño' (niño) polígonos (Fig. 2)?