名稱

ST_MakePolygon — 從外殼和可選的孔洞列表建立多邊形。

概要

geometry ST_MakePolygon(geometry 線字串);

geometry ST_MakePolygon(geometry 外線字串, geometry[] 內線字串);

描述

建立一個由給定的外殼和可選的孔洞陣列形成的多邊形。輸入的幾何形狀必須是封閉的 LineString(環)。

變體 1: 接受一個外殼 LineString。

變體 2: 接受一個外殼 LineString 和一個內部(孔洞)LineString 的陣列。可以使用 PostgreSQL 的 array_agg()、ARRAY[] 或 ARRAY() 結構來建立幾何陣列。

[Note]

此函數不接受 MultiLineString。使用 ST_LineMerge 生成 LineString,或使用 ST_Dump 提取 LineString。

此函數支援 3D,並且不會丟棄 z 索引。

範例:單一輸入變體

從 2D LineString 建立多邊形。

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

使用 ST_StartPointST_AddPoint 來封閉一個開放的 LineString,並從中建立多邊形。

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;

從 3D LineString 建立多邊形

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))

從具有測量的 LineString 建立多邊形

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 強制邊界為單一 LineString。(但是請注意,如果一個省份有多個區域或有島嶼,這將會產生無效的多邊形。)使用 LEFT JOIN 可確保即使沒有湖泊的所有省份都包含在內。

[Note]

之所以使用 CASE 結構,是因為將 null 陣列傳遞到 ST_MakePolygon 會導致 NULL 回傳值。

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;

另一種技術是使用相關子查詢和將行集轉換為陣列的 ARRAY() 建構子。

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;

另請參閱

ST_BuildArea ST_Polygon