Dato che hai detto di ottenere un gruppo di poligoni che si intersecano per ogni poligono a cui sei interessato, potresti voler creare quello che viene chiamato "overlay poligonale".
Questo non è esattamente ciò che sta facendo la soluzione di Adam. Per vedere la differenza, dai un'occhiata a questa immagine di un incrocio ABC:
Credo che la soluzione di Adam creerà un poligono "AB" che copre sia l'area di "AB! C" e "ABC", sia un poligono "AC" che copre "AC! B" e "ABC", e un " BC "poligono che è" BC! A "e" ABC ". Quindi i poligoni di output "AB", "AC" e "BC" si sovrappongono all'area "ABC".
Una sovrapposizione di poligoni produce poligoni non sovrapposti, quindi AB! C sarebbe un poligono e ABC sarebbe un poligono.
La creazione di un overlay poligonale in PostGIS è in realtà piuttosto semplice.
Ci sono sostanzialmente tre passaggi.
Il passaggio 1 è quello di estrarre le linee [Nota che sto usando l' anello esterno del poligono, diventa un po 'più complicato se vuoi gestire correttamente i fori]:
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
Il passaggio 2 consiste nel "nodo" della linea (produrre un nodo ad ogni intersezione). Alcune librerie come JTS hanno classi "Noder" che puoi usare per farlo, ma in PostGIS la funzione ST_Union lo fa per te:
SELECT ST_Union(the_geom) AS the_geom FROM (...your lines...) AS noded_lines
Il passaggio 3 è creare tutti i possibili poligoni non sovrapposti che possono provenire da tutte quelle linee, fatto dalla funzione ST_Polygonize :
SELECT ST_Polygonize(the_geom) AS the_geom FROM (...your noded lines...)
È possibile salvare l'output di ciascuno di questi passaggi in una tabella temporanea oppure combinarli tutti in un'unica istruzione:
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
)
)
Sto usando ST_Dump perché l'output di ST_Polygonize è una raccolta di geometrie ed è (di solito) più conveniente avere una tabella in cui ogni riga è uno dei poligoni che compongono la sovrapposizione di poligoni.