名前

ST_Union — 入力ジオメトリーのポイント集合の結合を表現するジオメトリーを返します。

概要

geometry ST_Union(geometry g1, geometry g2);

geometry ST_Union(geometry g1, geometry g2, float8 gridSize);

geometry ST_Union(geometry[] g1_array);

geometry ST_Union(geometry set g1field);

geometry ST_Union(geometry set g1field, float8 gridSize);

説明

入力ジオメトリーを結合してオーバラップをしない結果ジオメトリーを生成します。出力は単一ジオメトリー、マルチ系ジオメトリー、ジオメトリーコレクションのいずれにかなる可能性があります。次の通り複数の形式があります。

二入力形式: 二つの入力ジオメトリーの結合のジオメトリを返します。いずれかの入力が NULL の場合には NULL を返します。

配列形式: ジオメトリー配列を結合したジオメトリを返します。

集約関数形式: ジオメトリーの集合を結合したジオメトリを返します。ST_Union() 関数は、PostgreSQL 用語で言うところの「集約関数」です。つまり、SUM() や MEAN() と同じ方法で複数のデータ行の操作を行い、他の集約関数と同じように NULL ジオメトリーを無視します。

非集約関数で入力が一つの形式であるST_UnaryUnionも参照して下さい。

ST_Union の配列形式と集合形式では、http://blog.cleverelephant.ca/2009/01/must-faster-unions-in-postgis-14.htmlで紹介されている早いカスケード結合アルゴリズムを使っています。

任意パラメーター gridSize が与えらえれると (GEOS-3.9.0 が必要です)、全ての結果の頂点が指定サイズのスナップ用グリッドに落ちることが保証されます。グリッド上で行われる処理は、グリッドに揃える際に意図しない小さな変更が発生する可能性があることに注意して下さい。ST_ReducePrecision を参照して下さい。

[注記]

ST_Collect は、結果に重ね合わせが無いことを求めていない場合には、時々 ST_Union の代わりに用いられます。ST_Collect は、集めレれたジオメトリーに処理を実行しないため、通常は ST_Union より早い動作速度になります。

GEOS モジュールで実現しています。

ST_Union は MULTILINESTRING を生成し、新しい LINESTRING を単一の LINESTRING に縫い付けません。LINESTRING に縫い付けるにはST_LineMergeを使用します。

ご注意: この関数は以前は、"Union"から名称変更して GeomUnion() と呼ばれていました。UNION は SQL の予約語であるためです。

Enhanced: 3.1.0 gridSize パラメータを受け付けるようになりました。

gridSize パラメータを使うには GEOS 3.9.0以上が必要です

Changed: 3.0.0 SFCGAL 非依存になりました。

Availability: 1.4.0 - ST_Union が機能強化されました。ST_Union(geomarray) が導入され、PostgreSQL の高速なコレクションの集約が導入されました。

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

[注記]

集約関数版は、OGC 仕様に明示的に定義されていません。

このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.19 ポリゴンが含まれる時、Z 値 (標高) を持ちます。

この関数は3次元に対応し、Z値を削除しません。 ただし、結果は XY のみを使用して計算されます。結果の Z 値は複写するか、平均値になるか、補間されます。

集約関数版の例

コード
SELECT id,
       ST_Union(geom) as singlegeom
FROM sometable f
GROUP BY id;
              

非集約関数の例

コード
SELECT ST_Union('POINT(1 2)'::geometry, 'POINT(-2 3)'::geometry);
出力
MULTIPOINT((1 2),(-2 3))
Geometry figure for visual-st-union-01
コード
SELECT ST_Union('POINT(1 2)'::geometry, 'POINT(1 2)'::geometry);
出力
POINT(1 2)
Geometry figure for visual-st-union-02

3次元の例 - 3次元対応のです (そしてジオメトリータイプが混在します!)

コード
SELECT ST_Union(geom)
FROM (
    SELECT 'POLYGON Z((-7 4.2 5,-7.1 4.2 5,-7.1 4.3 5,-7 4.2 5))'::geometry geom
    UNION ALL
    SELECT 'POINT Z(5 5 5)'::geometry geom
    UNION ALL
    SELECT 'POINT Z(-2 3 1)'::geometry geom
    UNION ALL
    SELECT 'LINESTRING Z(5 5 5,10 10 10)'::geometry geom
) AS foo;
出力
GEOMETRYCOLLECTION(POINT(-2 3 1), LINESTRING(5 5 5,10 10 10), POLYGON((-7 4.2 5,-7.1 4.2 5,-7.1 4.3 5,-7 4.2 5)))
Geometry figure for visual-st-union-03

この 3次元の例では座標次元の混在はありません。

コード
SELECT ST_Union(geom)
FROM (
    SELECT 'POLYGON((-7 4.2 2,-7.1 4.2 3,-7.1 4.3 2,-7 4.2 2))'::geometry geom
    UNION ALL
    SELECT 'POINT(5 5 5)'::geometry geom
    UNION ALL
    SELECT 'POINT(-2 3 1)'::geometry geom
    UNION ALL
    SELECT 'LINESTRING(5 5 5,10 10 10)'::geometry geom
) AS foo;
出力
GEOMETRYCOLLECTION(POINT(-2 3 1), LINESTRING(5 5 5,10 10 10), POLYGON((-7 4.2 2,-7.1 4.2 3,-7.1 4.3 2,-7 4.2 2)))
Geometry figure for visual-st-union-04

この例ではクエリーから構築された配列を結合しています。

コード
SELECT ST_Union(ARRAY(SELECT geom FROM sometable));

この例ではラインストリングの配列を結合しています。

コード
SELECT ST_Union(ARRAY[
    'LINESTRING(1 2,3 4)'::geometry,
    'LINESTRING(4 5,5 6)'::geometry
]) As wktunion;
出力
MULTILINESTRING((1 2,3 4),(4 5,5 6))
Geometry figure for visual-st-union-05