PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ LWGEOM_collect()

Datum LWGEOM_collect ( PG_FUNCTION_ARGS  )

Definition at line 1166 of file lwgeom_functions_basic.c.

1167 {
1168  GSERIALIZED *gser1, *gser2, *result;
1169  LWGEOM *lwgeoms[2], *outlwg;
1170  uint32 type1, type2;
1171  uint8_t outtype;
1172  int32_t srid;
1173 
1174  POSTGIS_DEBUG(2, "LWGEOM_collect called.");
1175 
1176  /* return null if both geoms are null */
1177  if (PG_ARGISNULL(0) && PG_ARGISNULL(1))
1178  PG_RETURN_NULL();
1179 
1180  /* Return the second geom if the first geom is null */
1181  if (PG_ARGISNULL(0))
1182  PG_RETURN_DATUM(PG_GETARG_DATUM(1));
1183 
1184  /* Return the first geom if the second geom is null */
1185  if (PG_ARGISNULL(1))
1186  PG_RETURN_DATUM(PG_GETARG_DATUM(0));
1187 
1188  gser1 = PG_GETARG_GSERIALIZED_P(0);
1189  gser2 = PG_GETARG_GSERIALIZED_P(1);
1190  gserialized_error_if_srid_mismatch(gser1, gser2, __func__);
1191 
1192  POSTGIS_DEBUGF(3,
1193  "LWGEOM_collect(%s, %s): call",
1196 
1197  if ((gserialized_has_z(gser1) != gserialized_has_z(gser2)) ||
1198  (gserialized_has_m(gser1) != gserialized_has_m(gser2)))
1199  {
1200  elog(ERROR, "Cannot ST_Collect geometries with differing dimensionality.");
1201  PG_RETURN_NULL();
1202  }
1203 
1204  srid = gserialized_get_srid(gser1);
1205 
1206  lwgeoms[0] = lwgeom_from_gserialized(gser1);
1207  lwgeoms[1] = lwgeom_from_gserialized(gser2);
1208 
1209  type1 = lwgeoms[0]->type;
1210  type2 = lwgeoms[1]->type;
1211 
1212  if ((type1 == type2) && (!lwgeom_is_collection(lwgeoms[0])))
1213  outtype = lwtype_get_collectiontype(type1);
1214  else
1215  outtype = COLLECTIONTYPE;
1216 
1217  POSTGIS_DEBUGF(3, " outtype = %d", outtype);
1218 
1219  /* Drop input geometries bbox and SRID */
1220  lwgeom_drop_bbox(lwgeoms[0]);
1221  lwgeom_drop_srid(lwgeoms[0]);
1222  lwgeom_drop_bbox(lwgeoms[1]);
1223  lwgeom_drop_srid(lwgeoms[1]);
1224 
1225  outlwg = (LWGEOM *)lwcollection_construct(outtype, srid, NULL, 2, lwgeoms);
1226  result = geometry_serialize(outlwg);
1227 
1228  lwgeom_free(lwgeoms[0]);
1229  lwgeom_free(lwgeoms[1]);
1230 
1231  PG_FREE_IF_COPY(gser1, 0);
1232  PG_FREE_IF_COPY(gser2, 1);
1233 
1234  PG_RETURN_POINTER(result);
1235 }
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition: cu_print.c:267
void gserialized_error_if_srid_mismatch(const GSERIALIZED *g1, const GSERIALIZED *g2, const char *funcname)
Definition: gserialized.c:432
int32_t gserialized_get_srid(const GSERIALIZED *g)
Extract the SRID from the serialized form (it is packed into three bytes so this is a handy function)...
Definition: gserialized.c:155
int gserialized_has_m(const GSERIALIZED *g)
Check if a GSERIALIZED has an M ordinate.
Definition: gserialized.c:214
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:268
int gserialized_has_z(const GSERIALIZED *g)
Check if a GSERIALIZED has a Z ordinate.
Definition: gserialized.c:203
uint32_t gserialized_get_type(const GSERIALIZED *g)
Extract the geometry type from the serialized form (it hides in the anonymous data area,...
Definition: gserialized.c:118
uint32_t lwtype_get_collectiontype(uint8_t type)
Given an lwtype number, what homogeneous collection can hold it?
Definition: lwgeom.c:1194
#define COLLECTIONTYPE
Definition: liblwgeom.h:108
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1218
void lwgeom_drop_bbox(LWGEOM *lwgeom)
Call this function to drop BBOX and SRID from LWGEOM.
Definition: lwgeom.c:682
int lwgeom_is_collection(const LWGEOM *lwgeom)
Determine whether a LWGEOM contains sub-geometries or not This basically just checks that the struct ...
Definition: lwgeom.c:1097
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
Definition: lwutil.c:216
LWCOLLECTION * lwcollection_construct(uint8_t type, int32_t srid, GBOX *bbox, uint32_t ngeoms, LWGEOM **geoms)
Definition: lwcollection.c:42
void lwgeom_drop_srid(LWGEOM *lwgeom)
Definition: lwgeom.c:765
uint8_t type
Definition: liblwgeom.h:462

References COLLECTIONTYPE, gserialized_error_if_srid_mismatch(), gserialized_get_srid(), gserialized_get_type(), gserialized_has_m(), gserialized_has_z(), lwcollection_construct(), lwgeom_drop_bbox(), lwgeom_drop_srid(), lwgeom_free(), lwgeom_from_gserialized(), lwgeom_is_collection(), lwtype_get_collectiontype(), lwtype_name(), result, and LWGEOM::type.

Here is the call graph for this function: