ST_MakePolygon — 從外殼和可選的孔洞列表建立多邊形。
geometry ST_MakePolygon(
geometry 線字串)
;
geometry ST_MakePolygon(
geometry 外線字串, geometry[] 內線字串)
;
建立一個由給定的外殼和可選的孔洞陣列形成的多邊形。輸入的幾何形狀必須是封閉的 LineString(環)。
變體 1: 接受一個外殼 LineString。
變體 2: 接受一個外殼 LineString 和一個內部(孔洞)LineString 的陣列。可以使用 PostgreSQL 的 array_agg()、ARRAY[] 或 ARRAY() 結構來建立幾何陣列。
![]() |
|
此函數不接受 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_StartPoint 和 ST_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 可確保即使沒有湖泊的所有省份都包含在內。
![]() |
|
之所以使用 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;