Puisque vous avez dit que vous obteniez un groupe de polygones se croisant pour chaque polygone qui vous intéresse, vous pouvez créer ce que l'on appelle une "superposition de polygone".
Ce n'est pas exactement ce que fait la solution d'Adam. Pour voir la différence, regardez cette image d'une intersection ABC:
Je crois que la solution d’Adam créera un polygone "AB" couvrant à la fois les surfaces "AB! C" et "ABC", ainsi qu’un polygone "AC" recouvrant "AC! B" et "ABC", ainsi que " BC "polygone qui est" BC! A "et" ABC ". Ainsi, les polygones de sortie "AB", "AC" et "BC" chevaucheraient tous la zone "ABC".
Une superposition de polygone produit des polygones qui ne se chevauchent pas. AB! C serait donc un polygone et ABC, un polygone.
Créer une superposition de polygones dans PostGIS est en réalité assez simple.
Il y a essentiellement trois étapes.
L'étape 1 consiste à extraire le trait (notez que j'utilise l' anneau extérieur du polygone, cela devient un peu plus compliqué si vous voulez gérer correctement les trous):
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
L'étape 2 consiste à "nouer" le travail de ligne (produire un nœud à chaque intersection). Certaines bibliothèques comme JTS ont des classes "Noder" que vous pouvez utiliser pour cela, mais dans PostGIS, la fonction ST_Union le fait pour vous:
SELECT ST_Union(the_geom) AS the_geom FROM (...your lines...) AS noded_lines
L'étape 3 consiste à créer tous les polygones possibles qui ne peuvent pas se chevaucher et qui peuvent provenir de toutes ces lignes, à l'aide de la fonction ST_Polygonize :
SELECT ST_Polygonize(the_geom) AS the_geom FROM (...your noded lines...)
Vous pouvez enregistrer la sortie de chacune de ces étapes dans une table temporaire ou les combiner dans une seule instruction:
CREATE TABLE my_poly_overlay AS
SELECT geom FROM ST_Dump((
SELECT ST_Polygonize(the_geom) AS the_geom FROM (
SELECT ST_Union(the_geom) AS the_geom FROM (
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
) AS noded_lines
)
)
J'utilise ST_Dump parce que la sortie de ST_Polygonize est une collection de géométries et qu'il est (généralement) plus pratique de disposer d'un tableau dans lequel chaque ligne est l'un des polygones constituant la superposition de polygone.