Je me bats avec un problème depuis quelques jours et j'ai réalisé que beaucoup de gens sont également bloqués lorsque le sujet est les intersections dans PostGIS (v2.5). C'est pourquoi j'ai décidé de poser une question commune plus détaillée et générique.
J'ai le tableau suivant:
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 );
Cela ressemble à ceci:
Je veux obtenir tous les polygones enfants en fonction de l'intersection des polygones parents. Pour le résultat, on s'attendrait à:
- Les polygones enfants sans chevauchement entre eux.
- Une colonne contenant la somme de la valeur de leurs polygones parents,
- Une colonne contenant le nombre de polygones parents d'une catégorie
- Une colonne contenant le nombre d'une autre catégorie
- Une colonne contenant la catégorie du polygone enfant, basée sur la règle suivante: -Si TOUS les polygones parents appartiennent à une classe, le polygone enfant a également cette classe. Sinon, la catégorie du polygone enfant est une troisième catégorie.
Donc ça ressemble à ça:
Ainsi, à la fin, la table de sortie généré (pour cet exemple) aura 7 lignes (tous les 7, ne se chevauchant pas , les polygones de l' enfant), contenant des colonnes category
, sum_value
, ct_overlap_cat1
,ct_overlap_cat2
Le code suivant que j'ai commencé, me donne les intersections individuelles, en comparant un parent avec un autre.
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);
Comment puis-je parcourir récursivement le résultat de ce code mentionné, que, indépendamment du nombre de polygones se chevauchant, j'obtiens toujours ses «plus petits» polygones (enfants) (Fig.2)?