#ST_UNION

st_union
ST_UNION ( geometry1 , geometry2 , gridsize )
st_union
ST_UNION ( geomField , gridsize )

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)))
pdf-btn 下载文档 copy-btn 复制链接
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流