从其他Geometry对象的collection返回一个具体的Geometry值(对应的对象)。
语法
geometry ST_Collect(geometry set g1Field);
geometry ST_Collect(geometry g1 , geometry g2);
geometry ST_Collect(geometry[] g1Array);
参数
参数名称 | 描述 |
g1Field | Geometry对象在数据集中的字段。 |
g1 | 第一个Geometry对象。 |
g2 | 第二个Geometry对象。 |
g1Array | Geometry对象数组。 |
描述
输出类型可以是Multi或GeometryCollection类型。该函数有两种形式:
形式1:输入参数是两个Geometry对象。该函数会根据输入的两个Geometry对象,返回一个Collection对象,输出类型可能是Multi或GeometryCollection类型。
形式2:是一个聚合功能函数,输入对象是一个Geometry对象的集合,返回一个ST_Geometry函数值对应的Geometry对象。
该函数支持CircularString和CurveGeometry对象,但可能不会返回预期的一个MultiCurve类型或Multi类型对象。
函数ST_Collect 和函数ST_Union 经常可以互换使用,除了ST_Collect将始终返回GeometryCollection或Multi类型,而ST_Union溶解边界时可能返回单个Geometry对象。 ST_Union还将在节点相交处分割LineString,而ST_Collect则仅仅返回为MultiLineString。
一般来说函数ST_Collect要比函数ST_Union快很多,因为ST_Collect 函数不会去分解输入Geometry对象的边界或者检查一个MultiPolygon对象是否有重叠部分。它仅仅是把单个的Geometry对象组合成一个Multi类型对象,或者将Multi类型对象组合成一个GeometryCollection集合对象。
为了阻止函数ST_Collect把Multi类型对象变成GeometryCollection类型对象,用户可以使用如下小技巧:利用函数ST_Dump把Multi类型对象转换成单个Geometry对象,再重新聚合他们。
示例
输出MULTI类型对象:
SELECT ST_AsText(ST_Collect('POINT(0 0)'::geometry, 'POINT(0 1)'::geometry)); st_astext --------------------- MULTIPOINT(0 0,0 1) (1 row)
输出GEOMETRYCOLLECTION类型对象:
SELECT ST_AsText(ST_Collect('POINT(0 0)'::geometry, 'LINESTRING(0 2,0 3)'::geometry)); st_astext ---------------------------------------------------- GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 2,0 3)) (1 row)
聚合数据集:
select ST_AsText(ST_Collect(t.geom)) from (select (ST_DumpPoints(st_buffer('POINT(0 0)'::geometry,1,'quad_segs=2'))).geom as geom) as t; st_astext ---------------------------------------------------------------- MULTIPOINT(1 0,0.707106781186548 -0.707106781186547,0 -1,-0.70. .7106781186546 -0.707106781186549,-1 0,-0.70710678118655 0.7071. .06781186545,0 1,0.707106781186544 0.707106781186551,1 0) (1 row)