Namn

ST_Polygonize — Beräknar en samling polygoner som bildas av linjerna i en uppsättning geometrier.

Synopsis

geometry ST_Polygonize(geometry set geomfield);

geometry ST_Polygonize(geometry[] geom_array);

Beskrivning

Skapar en GeometryCollection som innehåller de polygoner som bildas av linjeverket i en uppsättning geometrier. Om det inmatade linjeverket inte bildar några polygoner returneras en tom GeometryCollection.

Denna funktion skapar polygoner som täcker alla avgränsade områden. Om resultatet är avsett att bilda en giltig polygongeometri, använd ST_BuildArea för att förhindra att hål fylls.

[Notera]

Inmatningsgeometrin måste vara korrekt nodad för att denna funktion ska fungera korrekt. För att säkerställa att inmatningen är nodad använder du ST_Node på inmatningsgeometrin innan du polygoniserar.

[Notera]

GeometryCollections kan vara svåra att hantera med externa verktyg. Använd ST_Dump för att konvertera det polygoniserade resultatet till separata polygoner.

Utförs av GEOS-modulen.

Tillgänglighet: 1.0.0RC1

Exempel

Polygonize a set of input lines.

Code
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;
Rasterutdata
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)))
Figure
Geometry figure for visual-st-polygonize-01

Polygonizing two polygon coverages and transferring attributes to the resultants:

Code
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;
Rasterutdata
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))
Figure
Geometry figure for visual-st-polygonize-02

Polygonisera en tabell med linestrings:

Code
SELECT ST_Polygonize(geom_4269) As geomtextrep
FROM (SELECT geom_4269 FROM ma.suffolk_edges) As foo;
Rasterutdata
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.

Code
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;
Rasterutdata
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)