ST_MakePolygon — 与えられた環で形成されるポリゴンを生成します.入力ジオメトリは閉じたラインストリングでなければなりません.
geometry ST_MakePolygon(
geometry linestring)
;
geometry ST_MakePolygon(
geometry outerlinestring, geometry[] interiorlinestrings)
;
与えられた外環で掲載されるポリゴンを生成します.入力ジオメトリは閉じたラインストリングでなければなりません.二つの形式があります.
一つ目は,閉じたラインストリング一つを取ります.
二つ目は,与えられた外環と内環の配列を取ります.ST_AccumまたはPostgreSQLのARRAY[]やARRAY()コンストラクタを使用してジオメトリ配列を生成できます.入力ジオメトリは閉じたラインストリングでなければなりません.
![]() | |
この関数はマルチラインストリングを受け付けません.ST_LineMergeまたはST_Dumpでラインストリングを生成して下さい. |
この関数は三次元をサポートします.Zインデクスを削除しません.
--二次元ライン SELECT ST_MakePolygon(ST_GeomFromText('LINESTRING(75.15 29.53,77 29,77.6 29.5, 75.15 29.53)')); --ラインストリングが閉じていない場合は --開始点を追加して閉じさせることができます SELECT ST_MakePolygon(ST_AddPoint(foo.open_line, ST_StartPoint(foo.open_line))) FROM ( SELECT ST_GeomFromText('LINESTRING(75.15 29.53,77 29,77.6 29.5)') As open_line) As foo; --三次元の閉じたライン SELECT ST_MakePolygon(ST_GeomFromText('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)) --M値を持つライン -- SELECT ST_MakePolygon(ST_GeomFromText('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(foo.line,10)), ARRAY[ST_Translate(foo.line,1,1), ST_ExteriorRing(ST_Buffer(ST_MakePoint(20,20),1)) ] ) FROM (SELECT ST_ExteriorRing(ST_Buffer(ST_MakePoint(10,10),10,10)) As line ) As foo;
県ポリゴン/マルチポリゴンと水涯線ラインストリングから県内の湖を表現する穴を持つ県境の生成です.PostGISのST_Accumを使用する例です.
![]() | |
NULL配列をST_MakePolygonに渡すとNULLを返すのでCASEを使用しています. |
![]() | |
湖の無い県も含めて全ての県を返すためにLEFT JOINを使用しています. |
SELECT p.gid, p.province_name, CASE WHEN ST_Accum(w.the_geom) IS NULL THEN p.the_geom ELSE ST_MakePolygon(ST_LineMerge(ST_Boundary(p.the_geom)), ST_Accum(w.the_geom)) END FROM provinces p LEFT JOIN waterlines w ON (ST_Within(w.the_geom, p.the_geom) AND ST_IsClosed(w.the_geom)) GROUP BY p.gid, p.province_name, p.the_geom; --上と同じ例ですが,関連サブクエリと --行集合を配列に変換するPostgreSQLの組み込み関数ARRAY()を使用しています. SELECT p.gid, p.province_name, CASE WHEN EXISTS(SELECT w.the_geom FROM waterlines w WHERE ST_Within(w.the_geom, p.the_geom) AND ST_IsClosed(w.the_geom)) THEN ST_MakePolygon(ST_LineMerge(ST_Boundary(p.the_geom)), ARRAY(SELECT w.the_geom FROM waterlines w WHERE ST_Within(w.the_geom, p.the_geom) AND ST_IsClosed(w.the_geom))) ELSE p.the_geom END As the_geom FROM provinces p;