从其他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)