ST_Polygonize — Calcola un insieme di poligoni formati dalle linee di un insieme di geometrie.
geometry ST_Polygonize(geometry set geomfield);
geometry ST_Polygonize(geometry[] geom_array);
Crea una GeometryCollection contenente i poligoni formati dalle linee di un insieme di geometrie. Se le linee di input non formano alcun poligono, viene restituita una GeometryCollection vuota.
Questa funzione crea poligoni che coprono tutte le aree delimitate. Se il risultato è destinato a formare una geometria poligonale valida, utilizzare ST_BuildArea per evitare che vengano riempiti dei buchi.
|
|
|
Affinché questa funzione funzioni correttamente, il tracciato di input deve essere nodato. Per assicurarsi che lo sia, utilizzare ST_Node sulla geometria di input prima di poligonare. |
|
|
|
Le GeometryCollections possono essere difficili da gestire con strumenti esterni. Utilizzare ST_Dump per convertire il risultato poligonizzato in poligoni separati. |
Eseguito dal modulo GEOS.
Disponibilità: dalla versione 1.0.0RC1
Polygonize a set of input lines.
WITH data(geom) AS (
VALUES
('LINESTRING (180 40,30 20,20 90)'::geometry),
('LINESTRING (180 40,160 160)'::geometry),
('LINESTRING (80 60,120 130,150 80)'::geometry),
('LINESTRING (80 60,150 80)'::geometry),
('LINESTRING (20 90,70 70,80 130)'::geometry),
('LINESTRING (80 130,160 160)'::geometry),
('LINESTRING (20 90,20 160,70 190)'::geometry),
('LINESTRING (70 190,80 130)'::geometry),
('LINESTRING (70 190,160 160)'::geometry)
)
SELECT ST_Polygonize(geom)
FROM data;
GEOMETRYCOLLECTION(POLYGON((180 40,30 20,20 90,70 70,80 130,160 160,180 40),(150 80,120 130,80 60,150 80)), POLYGON((80 60,120 130,150 80,80 60)), POLYGON((80 130,70 70,20 90,20 160,70 190,80 130)), POLYGON((160 160,80 130,70 190,160 160)))
Polygonizing two polygon coverages and transferring attributes to the resultants:
WITH poly_a(id, geom) AS (VALUES
('a1', 'POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))'::geometry),
('a2', 'POLYGON ((4 0, 8 0, 8 4, 4 4, 4 0))'::geometry)
),
poly_b(id, geom) AS (VALUES
('b1', 'POLYGON ((0 0, 8 0, 8 2, 0 2, 0 0))'::geometry),
('b2', 'POLYGON ((0 2, 8 2, 8 4, 0 4, 0 2))'::geometry)
),
lines AS (
SELECT ST_Boundary(geom) AS geom FROM poly_a
UNION ALL
SELECT ST_Boundary(geom) FROM poly_b
),
noded AS (
SELECT ST_UnaryUnion(ST_Collect(geom)) AS geom FROM lines
),
cells AS (
SELECT (ST_Dump(ST_Polygonize(geom))).geom AS geom FROM noded
)
SELECT a.id AS id_a,
b.id AS id_b,
c.geom AS geom
FROM cells AS c
LEFT JOIN poly_a AS a ON ST_Within(ST_PointOnSurface(c.geom), a.geom)
LEFT JOIN poly_b AS b ON ST_Within(ST_PointOnSurface(c.geom), b.geom)
WHERE a.id IS NOT NULL OR b.id IS NOT NULL
ORDER BY id_a, id_b;
id_a | id_b | geom ------+------+-------------------------------- a1 | b1 | POLYGON((4 0,0 0,0 2,4 2,4 0)) a1 | b2 | POLYGON((4 4,4 2,0 2,0 4,4 4)) a2 | b1 | POLYGON((4 0,4 2,8 2,8 0,4 0)) a2 | b2 | POLYGON((4 2,4 4,8 4,8 2,4 2))
Poligonatura di una tabella di linee:
SELECT ST_Polygonize(geom_4269) As geomtextrep FROM (SELECT geom_4269 FROM ma.suffolk_edges) As foo;
geomtextrep ------------- SRID=4269;GEOMETRYCOLLECTION(POLYGON((-71.040878 42.285678,-71.040943 42.2856,-71.04096 42.285752,-71.040878 42.285678)), POLYGON((-71.17166 42.353675,-71.172026 42.354044,-71.17239 42.354358,-71.171794 42.354971,-71.170511 42.354855, -71.17112 42.354238,-71.17166 42.353675))) (1 row)
Use ST_Dump to dump out the polygonize geoms into individual polygons.
SELECT (ST_Dump(t.polycoll)).geom AS geomtextrep
FROM (SELECT ST_Polygonize(geom_4269) AS polycoll
FROM (SELECT geom_4269 FROM ma.suffolk_edges)
As foo) AS t;
geomtextrep ------------- SRID=4269;POLYGON((-71.040878 42.285678,-71.040943 42.2856,-71.04096 42.285752, -71.040878 42.285678)) SRID=4269;POLYGON((-71.17166 42.353675,-71.172026 42.354044,-71.17239 42.354358, -71.171794 42.354971,-71.170511 42.354855,-71.17112 42.354238,-71.17166 42.353675)) (2 rows)
ST_BuildArea, ST_Boundary, ST_Collect, ST_Dump, ST_Node, ST_PointOnSurface, ST_UnaryUnion, ST_Within