ST_Union — ジオメトリの結合の点集合を表現するジオメトリを返します。
geometry ST_Union(
geometry set g1field)
;
geometry ST_Union(
geometry g1, geometry g2)
;
geometry ST_Union(
geometry[] g1_array)
;
MULTI系、単一ジオメトリ、ジオメトリコレクションのいずれでも出力されます。2つの形式があります。ひとつめは、2つのジオメトリからインタセクトしている領域の無い新しいジオメトリを返します。ふたつめは、ジオメトリの集合を取り、インタセクトしている領域の無い単一のST_Geometryを返すものです。
集計関数版: この関数は、ジオメトリの集合から、MULTI系ジオメトリまたは非MULTI系ジオメトリを返します。ST_Union()関数は、PostgreSQL用語で言うところの「集計関数」です。SUM()やMEAN()と同じ方法でデータリストの操作を行うことを意味します。
非集計関数版: この関数は二つの入力ジオメトリの結合したジオメトリを返します。出力型はMULTI系、非MULTI系またはGEOMETRYCOLLECTIONです。
ST_CollectとST_Unionはしばしば交換して使うことができます。ST_Unionは境界を更新し、生成されるMULTI系ジオメトリがインタセクトした領域を持たないようにするため、一般的にST_Collectよりも桁違いに遅く動きます。 |
GEOSモジュールで実現しています。
ご注意: この関数は以前は、"Union"から改名してGeomUnion()と呼ばれていました。UNIONはSQLの予約語であるためです。
初出: 1.4.0 - ST_Unionが強化されました。ST_Union(geomarray)が導入され、また、PostgreSQL内での集計が速くなりました。GEOS 3.1.0以上を使用している場合は、ST_Unionは、http://blog.cleverelephant.ca/2009/01/must-faster-unions-in-postgis-14.htmlに記述がある、Cascaded Unionアルゴリズムを使います。
このメソッドはOpenGIS Simple Features Implementation Specification for SQL 1.1.の実装です s2.1.1.3
集約関数版は、OGC仕様に明示的に定義されていません。 |
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.19 the z-index (elevation) when polygons are involved.
集約関数版の例
SELECT stusps, ST_Multi(ST_Union(f.the_geom)) as singlegeom FROM sometable As f GROUP BY stusps
集約関数版の例
SELECT ST_AsText(ST_Union(ST_GeomFromText('POINT(1 2)'), ST_GeomFromText('POINT(-2 3)') ) ) st_astext ---------- MULTIPOINT(-2 3,1 2) SELECT ST_AsText(ST_Union(ST_GeomFromText('POINT(1 2)'), ST_GeomFromText('POINT(1 2)') ) ); st_astext ---------- POINT(1 2) -- 3次元の例 - 3次元かつ次元混合になっています SELECT ST_AsEWKT(st_union(the_geom)) FROM (SELECT ST_GeomFromEWKT('POLYGON((-7 4.2,-7.1 4.2,-7.1 4.3, -7 4.2))') as the_geom UNION ALL SELECT ST_GeomFromEWKT('POINT(5 5 5)') as the_geom UNION ALL SELECT ST_GeomFromEWKT('POINT(-2 3 1)') as the_geom UNION ALL SELECT ST_GeomFromEWKT('LINESTRING(5 5 5, 10 10 10)') as the_geom ) as foo; st_asewkt --------- 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))); -- 次元混合の無い3次元の例 SELECT ST_AsEWKT(st_union(the_geom)) FROM (SELECT ST_GeomFromEWKT('POLYGON((-7 4.2 2,-7.1 4.2 3,-7.1 4.3 2, -7 4.2 2))') as the_geom UNION ALL SELECT ST_GeomFromEWKT('POINT(5 5 5)') as the_geom UNION ALL SELECT ST_GeomFromEWKT('POINT(-2 3 1)') as the_geom UNION ALL SELECT ST_GeomFromEWKT('LINESTRING(5 5 5, 10 10 10)') as the_geom ) as foo; st_asewkt --------- 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))) -- 配列生成を使った例 SELECT ST_Union(ARRAY(SELECT the_geom FROM sometable)); SELECT ST_AsText(ST_Union(ARRAY[ST_GeomFromText('LINESTRING(1 2, 3 4)'), ST_GeomFromText('LINESTRING(3 4, 4 5)')])) As wktunion; --wktunion--- MULTILINESTRING((3 4,4 5),(1 2,3 4))