名前

ST_GeometryN — ジオメトリコレクションの要素を一つ返します。

概要

geometry ST_GeometryN(geometry geomA, integer n);

説明

GEOMETRYCOLLECTION, MULTIPOINT, MULTILINESTRING, MULTICURVE, MULTIPOLYGON の 1始まりのN番目の要素を返します。単一ジオメトリーは、TIN や POLYHEDRALSURFACE を含んで、1 番目の要素として入力ジオメトリ自体を返し、他の数字の場合には NULL を返します。TIN や POLYHEDRALSURFACE のフェイスにアクセスしたりフェイス数を数える場合には、ST_PatchNST_NumPatches をそれぞれ使います。

[注記]

OGC仕様のため0.8.0版からインデックスを1始まりにしています。これより前の版では0始まりになっています。

[注記]

ジオメトリの全ての要素を抽出するにはST_Dumpの方が効率的ですし、単一ジオメトリでも動作します。

Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。

Changed: 2.0.0 以前の版では非マルチのジオメトリではNULLが返りました。ST_GeometryN(..,1)の場合にはジオメトリを返すよう変更されました。

Changed: 3.6.0 TIN と POLYHEDRALSURFACE が単一ジオメトリーとして扱われるようになり、パッチに分解されなくなりました。フェイスにアクセスする場合には ST_PatchN を使います。

このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。

このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 9.1.5

この関数は3次元に対応し、Z値を削除しません。

このメソッドは曲線ストリングと曲線に対応しています。

この関数は多面体サーフェスに対応しています。

この関数は三角形と不規則三角網 (TIN)に対応しています。

標準的な例

3次元MULTIPOINTからポイントの部分集合の抽出。

Code
SELECT n, ST_GeometryN(geom, n) As geomewkt
FROM (
VALUES
    (1, 'MULTIPOINT((1 2 7), (3 4 7), (5 6 7), (8 9 10))'::geometry ),
    (2, 'MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))'::geometry )
    ) As foo(id, geom)
    CROSS JOIN generate_series(1,100) n
WHERE n <= ST_NumGeometries(geom)
ORDER BY id, n;
出力:
 n |               geomewkt
---+-----------------------------------------
 1 | POINT(1 2 7)
 2 | POINT(3 4 7)
 3 | POINT(5 6 7)
 4 | POINT(8 9 10)
 1 | CIRCULARSTRING(2.5 2.5,4.5 2.5,3.5 3.5)
 2 | LINESTRING(10 11,12 11)
Figure
Geometry figure for visual-st-geometryn-01

全てのジオメトリーを抽出します (IDを付けたい場合に使います)。

Code
SELECT gid, n, ST_GeometryN(geom, n)
FROM sometable CROSS JOIN generate_series(1,100) n
WHERE n <= ST_NumGeometries(geom);

多面体サーフェス、TIN、三角形の例

POLYHEDRALSURFACE または TIN が単一ジオメトリーとして扱われ、フェイスのコレクションとしては扱われません。ST_GeometryN はサーフェイスをパッチに分解しないので、1 より大きいインデックス値を与えると、NULL を返します。個々のフェイスにアクセスするには、ST_PatchNST_NumPatches を使います。

この例では POLYHEDRALSURFACE の3番目の要素を求めています。

Code
SELECT ST_GeometryN(p_geom, 3) As geom_ewkt
  FROM (SELECT 'POLYHEDRALSURFACE(
((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),
((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),
((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),
((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)),
((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)),
((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1))
)'::geometry  AS p_geom )  AS a;
出力:
NULL
Figure
Geometry figure for visual-st-geometryn-02

この例では TIN の 2番目の要素を求めています。

Code
SELECT ST_GeometryN(geom, 2) as wkt
  FROM
    (SELECT
       'TIN (((
                0 0 0,
                0 0 1,
                0 1 0,
                0 0 0
            )),((
                0 0 0,
                0 1 0,
                1 1 0,
                0 0 0
            ))
            )'::geometry  AS geom
    ) AS g;
出力:
NULL
Figure
Geometry figure for visual-st-geometryn-03