名前

ST_MakePolygon — 外殻と穴のリストからポリゴンを生成します。

概要

geometry ST_MakePolygon(geometry linestring);

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

説明

与えられた外殻と任意指定の穴の配列で掲載されるポリゴンを生成します。入力ジオメトリは閉じたラインストリング (リング)でなければなりません。

形式1: 一つの外殻のラインストリングを受け付けます。

形式2: 外殻のラインストリングと内部 (穴)のラインストリングの配列とを受け付けます。ジオメトリ配列はPostgreSQLのarray_agg(), ARRAY[], ARRAY()コンストラクタを使います。

[注記]

この関数はマルチラインストリングを受け付けません。ラインストリングの生成にはST_LineMergeを使用します。また、ラインストリングを抽出するにはST_Dumpを使用します。

This function supports 3d and will not drop the z-index.

例: 単一入力の形式

2次元ラインストリングからのポリゴンの生成。

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

開いたラインストリングを閉じるためにST_StartPointST_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;

3次元ラインストリングからのポリゴンの生成。

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

M値を持つラインストリングからのポリゴンの生成。

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_MakePoint(20,20),1)) ]
        )
FROM (SELECT ST_ExteriorRing(
        ST_Buffer(ST_MakePoint(10,10),10,10)) AS line ) AS ring;

湖を表現する穴を持つ県の境界の集合を生成します。入力は県ポリゴン/マルチポリゴンのテーブルと水涯線のラインストリングのテーブルです。LEFT JOINを使って、湖の無い県を含む全ての県が返ることを保証しています。

[注記]

NULL配列をST_MakePolygonに渡すとNULLが返るので、CASE式を使っています。

SELECT p.gid, p.province_name,
                CASE WHEN array_agg(w.the_geom) IS NULL
                THEN p.the_geom
                ELSE  ST_MakePolygon( ST_LineMerge(ST_Boundary(p.the_geom)), array_agg(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;

他には、相関サブクエリと行集合を配列に変換する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;

関連情報

ST_Boundary, ST_AddPoint, ST_IsClosed, ST_LineMerge, ST_StartPoint, ST_BuildArea