名称

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

描述

合并输入几何图形,生成一个没有重叠的几何图形。输出可能是一个原子几何图形、一个 MultiGeometry 或一个 Geometry Collection。 有以下几种变体:

双输入变体:返回两个输入几何图形的并集。如果任一输入为 NULL,则返回 NULL。

数组变体:返回几何图形数组的并集。

聚合变体:返回几何图形行集的并集。ST_Union() 函数在 PostgreSQL 的术语中是一个“聚合”函数。这意味着它像 SUM() 和 AVG() 函数一样操作数据行,并且像大多数聚合函数一样,它也会忽略 NULL 几何图形。

有关非聚合的单输入变体,请参阅 ST_UnaryUnion

ST_Union 数组和集合变体使用 http://blog.cleverelephant.ca/2009/01/must-faster-unions-in-postgis-14.html 中描述的快速级联并集算法。

可以指定一个 gridSize 以在固定精度空间中工作。输入将捕捉到给定大小的网格,结果顶点将在同一网格上计算。(需要 GEOS-3.9.0 或更高版本)

[Note]

如果不需要结果不重叠,有时可以使用 ST_Collect 代替 ST_Union。ST_Collect 通常比 ST_Union 快,因为它不对收集的几何图形执行任何处理。

由 GEOS 模块执行。

ST_Union 创建 MultiLineString,并且不会将 LineString 缝合为单个 LineString。使用 ST_LineMerge 来缝合 LineString。

注意:此函数以前称为 GeomUnion(),由于 UNION 是 SQL 保留字,因此重命名为 "Union"。

增强功能:3.1.0 接受 gridSize 参数。

需要 GEOS >= 3.9.0 才能使用 gridSize 参数

已更改:3.0.0 不依赖 SFCGAL。

可用性:1.4.0 - 增强了 ST_Union。引入了 ST_Union(geomarray),并在 PostgreSQL 中引入了更快的聚合收集。

此方法实现了 OGC Simple Features Implementation Specification for SQL 1.1. s2.1.1.3

[Note]

聚合版本未在 OGC SPEC 中明确定义。

此方法实现了 SQL/MM 规范。SQL-MM 3:5.1.19 当涉及多边形时的 z-index(海拔高度)。

此函数支持 3d 并且不会删除 z-index。但是,结果仅使用 XY 计算。结果 Z 值会被复制、平均或插值。

示例

聚合示例

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

非聚合示例

select ST_AsText(ST_Union('POINT(1 2)' :: geometry, 'POINT(-2 3)' :: geometry))

st_astext
----------
MULTIPOINT(-2 3,1 2)

select ST_AsText(ST_Union('POINT(1 2)' :: geometry, 'POINT(1 2)' :: geometry))

st_astext
----------
POINT(1 2)

3D 示例 - 某种程度上支持 3D(并且具有混合维度!)

select ST_AsEWKT(ST_Union(geom))
from (
         select 'POLYGON((-7 4.2,-7.1 4.2,-7.1 4.3, -7 4.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;

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

3d 示例,不混合维度

select ST_AsEWKT(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;

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

--Examples using new Array construct
SELECT ST_Union(ARRAY(SELECT 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))