#ST_UNION
ST_UNION函数的功能是对输入的geometry进行并集计算,返回一个合并后的ST_GEOMETRY类型数据。
ST_UNION有两种形式,当入参为两个geometry参数时该函数作为普通函数,当入参为一组geometry字段时该函数作为聚合函数。 两种形式均支持一个可选的参数gridsize,用于指定固定精度空间的工作网格大小,控制并集计算的精度,函数会将geometry对象投射到网格线上进行计算并返回结果。
geometry
通用表达式,其值必须为有效的ST_GEOMETRY类型的数据。
当作为普通函数使用时,输入的geometry1和geometry2须具有相同的空间参考系标识号(SRID)。
当作为聚合函数使用时,返回结果的空间参考系标识号(SRID)会使用这组geometry中第一个有效SRID。
gridsize
gridsize的数据类型为DOUBLE,表示函数计算时使用的网格线大小,省略则默认为-1。
普通函数形式的ST_UNION函数遵守如下规划:
- 当geometry1和geometry2均为EMPTY时,函数返回geometry1。
- 当geometry1和geometry2其中一个为EMPTY时,函数返回该非空对象。
- 当输入的参数存在NULL时,函数返回NULL。
- 当输入的参数中包含Nan时,函数返回错误。
- 支持输入3D坐标,但函数会忽略Z坐标进行计算。
聚合函数形式的ST_UNION函数遵守如下规则:
- 不支持DISTINCT和ALL关键字。
- 当所有输入的Geometry均为NULL时,函数返回NULL。
- 当部分Geometry为NULL时,NULL值被忽略,仅对非NULL几何进行并集计算。
- 当所有输入的Geometry均为空几何对象(EMPTY)时,函数返回类型编号最大的EMPTY几何(GEOMETRYCOLLECTION EMPTY > MULTIPOLYGON EMPTY > MULTILINESTRING EMPTY > MULTIPOINT EMPTY > POLYGON EMPTY > LINESTRING EMPTY > POINT EMPTY)。
- 当输入的部分Geometry为EMPTY时,EMPTY几何被忽略,仅对非空Geometry对象进行并集计算。
- 支持输入3D坐标,但函数会忽略Z坐标进行计算。
- 该函数无法指定OVER关键字去作为窗口函数使用。
示例(HEAP表)
-- 1. 普通函数形式
SELECT ST_ASTEXT(ST_UNION(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'),ST_GEOMFROMTEXT('POLYGON((1 0,0 8,8 8,8 0,1 0))'))) res FROM DUAL;
RES
----------------------------------------------------------------
POLYGON ((0.000000000000000 5.000000000000000, 0.375000000000000 5.000000000000000, 0.000000000000000 8.000000000000000, 8.000000000000000 8.000000000000000, 8.000000000000000 0.000000000000000, 5.000000000000000 0.000000000000000, 1.000000000000000 0.000000000000000, 0.000000000000000 0.000000000000000, 0.000000000000000 5.000000000000000))
--geometry1和geometry2均为EMPTY时返回geometry1
SELECT ST_ASTEXT(ST_UNION(ST_GEOMFROMTEXT('POLYGON EMPTY'),ST_GEOMFROMTEXT('LINESTRING EMPTY'))) res FROM DUAL;
RES
----------------------------------------------------------------
POLYGON EMPTY
--geometry1和geometry2其中一个为EMPTY时返回非空对象
SELECT ST_ASTEXT(ST_UNION(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'),ST_GEOMFROMTEXT('LINESTRING EMPTY'))) res FROM DUAL;
RES
----------------------------------------------------------------
POLYGON ((0.000000000000000 0.000000000000000, 0.000000000000000 5.000000000000000, 5.000000000000000 5.000000000000000, 5.000000000000000 0.000000000000000, 0.000000000000000 0.000000000000000))
--参数存在NULL时返回NULL
SELECT ST_ASTEXT(ST_UNION(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'),NULL)) res FROM DUAL;
RES
----------------------------------------------------------------
SELECT ST_ASTEXT(ST_UNION(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'),ST_GEOMFROMTEXT('POLYGON((1 0,0 8,8 8,8 0,1 0))'),NULL)) res FROM DUAL;
RES
----------------------------------------------------------------
--SRID不同时返回错误
SELECT ST_ASTEXT(ST_UNION(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))',6),ST_GEOMFROMTEXT('POLYGON((1 0,0 8,8 8,8 0,1 0))',1))) res FROM DUAL;
YAS-07202 plugin execution error, Operation on mixed SRID geometries: 6 != 1
--参数中含有Nan时返回错误
SELECT ST_ASTEXT(ST_UNION(ST_GEOMFROMTEXT('POLYGON((0 0,0 Nan,5 5,5 0,0 0))'),ST_GEOMFROMTEXT('POLYGON((1 0,0 8,8 8,8 0,1 0))'))) res FROM DUAL;
YAS-07202 plugin execution error, POLYGON has invalid coordinate
-- 2 聚合函数形式
CREATE TABLE geom(id INT, col_geom GEOMETRY);
INSERT INTO geom VALUES(1, ST_GEOMFROMTEXT('POLYGON((0 0,2 0,2 2,0 2,0 0))'));
INSERT INTO geom VALUES(1, ST_GEOMFROMTEXT('POLYGON((1 1,3 1,3 3,1 3,1 1))'));
INSERT INTO geom VALUES(2, ST_GEOMFROMTEXT('POLYGON((5 5,6 5,6 6,5 6,5 5))'));
-- 2.1.通过聚合函数对表中的GEOMETRY进行并集
SELECT id, ST_ASTEXT(ST_UNION(col_geom)) res FROM geom GROUP BY id ORDER BY id;
ID RES
----- ----------------------------------------------------------------
1 POLYGON ((0.000000000000000 0.000000000000000, 2.000000000000000 0.000000000000000, 2.000000000000000 2.000000000000000, 1.000000000000000 2.000000000000000, 1.000000000000000 3.000000000000000, 3.000000000000000 3.000000000000000, 3.000000000000000 1.000000000000000, 2.000000000000000 1.000000000000000, 2.000000000000000 0.000000000000000, 0.000000000000000 0.000000000000000))
2 POLYGON ((5.000000000000000 5.000000000000000, 6.000000000000000 5.000000000000000, 6.000000000000000 6.000000000000000, 5.000000000000000 6.000000000000000, 5.000000000000000 5.000000000000000))
SELECT ST_ASTEXT(ST_UNION(col_geom)) res FROM geom;
RES
----- ----------------------------------------------------------------
MULTIPOLYGON (((2.000000000000000 0.000000000000000, 0.000000000000000 0.000000000000000, 0.000000000000000 2.000000000000000, 1.000000000000000 2.000000000000000, 1.000000000000000 3.000000000000000, 3.000000000000000 3.000000000000000, 3.000000000000000 1.000000000000000, 2.000000000000000 1.000000000000000, 2.000000000000000 0.000000000000000)), ((6.000000000000000 6.000000000000000, 6.000000000000000 5.000000000000000, 5.000000000000000 5.000000000000000, 5.000000000000000 6.000000000000000, 6.000000000000000 6.000000000000000)))
-- 2.2.通过聚合函数使用gridSize参数进行并集
SELECT ST_ASTEXT(ST_UNION(col_geom, 0.3)) res FROM geom;
RES
----------------------------------------------------------------
MULTIPOLYGON (((2.100000000000000 0.000000000000000, 0.000000000000000 0.000000000000000, 0.000000000000000 2.100000000000000, 0.900000000000000 2.100000000000000, 0.900000000000000 3.000000000000000, 3.000000000000000 3.000000000000000, 3.000000000000000 0.900000000000000, 2.100000000000000 0.900000000000000, 2.100000000000000 0.000000000000000)), ((6.000000000000000 6.000000000000000, 6.000000000000000 5.100000000000000, 5.100000000000000 5.100000000000000, 5.100000000000000 6.000000000000000, 6.000000000000000 6.000000000000000)))

