Name

ST_MakePolygon — Creates a Polygon or CurvePolygon from a shell and optional list of holes.

Übersicht

geometry ST_MakePolygon(geometry linestring);

geometry ST_MakePolygon(geometry outerlinestring, geometry[] interiorlinestrings);

Beschreibung

Creates a Polygon or CurvePolygon formed by the given shell and optional array of holes. Input geometries must be closed LineStrings, CircularStrings, CompoundCurves, or NURBSCurves (rings). If any input ring is curved, the result is a CurvePolygon.

Variant 1: Accepts one shell ring.

Variant 2: Accepts a shell ring and an array of inner (hole) rings. A geometry array can be constructed using the PostgreSQL array_agg(), ARRAY[] or ARRAY() constructs.

[Anmerkung]

Diese Funktion akzeptiert keine MULTILINESTRINGs. Verwenden Sie bitte ST_LineMerge oder ST_Dump um Linienzüge zu erzeugen.

Diese Funktion unterstützt 3d und lässt den Z-Index nicht fallen.

Enhanced: 3.7.0 - Support for curved input rings was introduced.

Beispiele

Single input variant.

Erzeugt einen LineString aus einem codierten Linienzug.

Code
SELECT ST_MakePolygon('LINESTRING(75 29,77 29,77 29,75 29)');

Erstellen Sie ein Polygon aus einem offenen LineString, indem Sie ST_StartPoint und ST_AddPoint verwenden, um es zu schließen.

Code
SELECT ST_MakePolygon(ST_AddPoint(foo.open_line, ST_StartPoint(foo.open_line)) )
FROM (
  SELECT 'LINESTRING(75 29,77 29,77 29,75 29)'::geometry As open_line) As foo;

Erzeugt einen LineString aus einem codierten Linienzug.

Code
SELECT ST_MakePolygon('LINESTRING(75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1)');
Ausgabe von Rastern
POLYGON((75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1))
Figure
Geometry figure for visual-st-makepolygon-01

Erstellen eines Polygons aus einem LineString mit Maßen

Code
SELECT ST_MakePolygon('LINESTRINGM(75.15 29.53 1,77 29 1,77.6 29.5 2, 75.15 29.53 2)');
Ausgabe von Rastern
POLYGONM((75.15 29.53 1,77 29 1,77.6 29.5 2,75.15 29.53 2))
Figure
Geometry figure for visual-st-makepolygon-02

Create a CurvePolygon from a CircularString shell.

Code
SELECT ST_MakePolygon('CIRCULARSTRING(0 0,1 1,2 0,1 -1,0 0)');
Ausgabe von Rastern
CURVEPOLYGON(CIRCULARSTRING(0 0,1 1,2 0,1 -1,0 0))
Figure
Geometry figure for visual-st-makepolygon-03

Outer shell with inner holes variant.

Erzeugung eines Donuts mit einem Ameisenloch

Code
SELECT ST_MakePolygon(
    ST_ExteriorRing(ST_Buffer(ring.line, 10)),
    ARRAY[  ST_Translate(ring.line, 1, 1),
        ST_ExteriorRing(ST_Buffer(ST_Point(20, 20), 1)) ]
    )
FROM (SELECT ST_ExteriorRing(ST_Buffer(ST_Point(10, 10), 10, 10)) AS line ) AS ring;

Erstellen Sie einen Satz von Provinzgrenzen mit Löchern, die Seen darstellen. Die Eingabe ist eine Tabelle mit Provinz-Polygonen/MultiPolygonen und eine Tabelle mit Wasserlinien. Die Linien, die Seen bilden, werden mit ST_IsClosed ermittelt. Das Provinzlinienwerk wird mit ST_Boundary extrahiert. Wie von ST_MakePolygon gefordert, wird die Begrenzung mit ST_LineMerge zu einem einzigen LineString gezwungen. (Beachten Sie jedoch, dass dies ein ungültiges Polygon ergibt, wenn eine Provinz mehr als eine Region oder Inseln hat). Die Verwendung eines LEFT JOIN stellt sicher, dass alle Provinzen einbezogen werden, auch wenn sie keine Seen haben.

[Anmerkung]

Das Konstrukt mit CASE wird verwendet, da die Übergabe eines NULL-Feldes an ST_MakePolygon NULL ergibt.

Code
SELECT p.gid, p.province_name,
  CASE
    WHEN array_agg(w.geom) IS NULL THEN p.geom
    ELSE ST_MakePolygon(
      ST_LineMerge(ST_Boundary(p.geom)),
      array_agg(w.geom)
    )
  END AS geom
FROM provinces p
LEFT JOIN waterlines w
  ON ST_Within(w.geom, p.geom)
  AND ST_IsClosed(w.geom)
GROUP BY p.gid, p.province_name, p.geom;

Eine andere Technik besteht darin, eine korrelierte Unterabfrage und den ARRAY()-Konstruktor zu verwenden, der einen Zeilensatz in ein Array umwandelt.

Code
SELECT p.gid, p.province_name,
  CASE
    WHEN EXISTS (
      SELECT w.geom
      FROM waterlines w
      WHERE ST_Within(w.geom, p.geom)
      AND ST_IsClosed(w.geom)
    )
    THEN ST_MakePolygon(
      ST_LineMerge(ST_Boundary(p.geom)),
      ARRAY(
        SELECT w.geom
        FROM waterlines w
        WHERE ST_Within(w.geom, p.geom)
        AND ST_IsClosed(w.geom)
      )
    )
    ELSE p.geom
  END AS geom
FROM provinces p;