ST_MakePolygon — 从壳和可选的孔列表创建多边形。
geometry ST_MakePolygon(geometry linestring);
geometry ST_MakePolygon(geometry outerlinestring, geometry[] interiorlinestrings);
创建由给定壳和可选孔阵列形成的多边形。输入几何图形必须是闭合线串(环)。
变体1: 接受一个壳线串。
变体2: 接受壳线串和内部(孔)线串的数组。可以使用PostgreSQL ARRAY_AGG()、ARRAY[]或ARRAY()构造几何数组。
| ![[Note]](images/note.png) | |
| 此函数不接受多行字符串。使用 ST_LineMerge 要生成线条,或 ST_Dump 若要提取线条字符串,请执行以下操作。 | 
 This function supports 3d and will not drop the z-index.
 This function supports 3d and will not drop the z-index.
从二维线串创建多边形。
SELECT ST_MakePolygon( ST_GeomFromText('LINESTRING(75 29,77 29,77 29, 75 29)'));
使用从开放的线串创建面 ST_StartPoint 和 ST_AddPoint 来关闭它。
SELECT ST_MakePolygon( ST_AddPoint(foo.open_line, ST_StartPoint(foo.open_line)) )
FROM (
  SELECT ST_GeomFromText('LINESTRING(75 29,77 29,77 29, 75 29)') As open_line) As foo;
从三维线串创建面
SELECT ST_AsEWKT( ST_MakePolygon( 'LINESTRING(75.15 29.53 1,77 29 1,77.6 29.5 1, 75.15 29.53 1)')); st_asewkt ----------- POLYGON((75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1))
从带测量的线串创建面
SELECT ST_AsEWKT( ST_MakePolygon( 'LINESTRINGM(75.15 29.53 1,77 29 1,77.6 29.5 2, 75.15 29.53 2)' )); st_asewkt ---------- POLYGONM((75.15 29.53 1,77 29 1,77.6 29.5 2,75.15 29.53 2))
创建一个带有额外孔的圆环多边形
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;
创建一组带有代表湖泊的洞的省边界。输入是省多边形表/多重多边形表和水线串表。形成湖泊的线是通过使用 ST_IsClosed 。省级线条的提取是使用 ST_Boundary 。按照以下条件要求 ST_MakePolygon ,将边界强制为单个线条,方法是使用 ST_LineMerge 。(但是,请注意,如果某个省有多个区域或岛屿,则会生成无效的面。)使用左连接可确保包括所有省份,即使它们没有湖泊。 
| ![[Note]](images/note.png) | |
| 之所以使用CASE构造,是因为将空数组传递到ST_MakePolygon会导致空返回值。 | 
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
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;
另一种技术是利用相关子查询和将行集转换为数组的数组()构造函数。
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;