PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ LWGEOM_force_collection()

Datum LWGEOM_force_collection ( PG_FUNCTION_ARGS  )

Definition at line 453 of file lwgeom_functions_basic.c.

454{
455 GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
456 GSERIALIZED *result;
457 LWGEOM **lwgeoms;
458 LWGEOM *lwgeom;
459 int32_t srid;
460 GBOX *bbox;
461
462 POSTGIS_DEBUG(2, "LWGEOM_force_collection called");
463
464 /*
465 * This funx is a no-op only if a bbox cache is already present
466 * in input. If bbox cache is not there we'll need to handle
467 * automatic bbox addition FOR_COMPLEX_GEOMS.
468 */
470 {
471 PG_RETURN_POINTER(geom);
472 }
473
474 /* deserialize into lwgeoms[0] */
475 lwgeom = lwgeom_from_gserialized(geom);
476
477 /* alread a multi*, just make it a collection */
478 if (lwgeom_is_collection(lwgeom))
479 {
480 lwgeom->type = COLLECTIONTYPE;
481 }
482
483 /* single geom, make it a collection */
484 else
485 {
486 srid = lwgeom->srid;
487 /* We transfer bbox ownership from input to output */
488 bbox = lwgeom->bbox;
489 lwgeom->srid = SRID_UNKNOWN;
490 lwgeom->bbox = NULL;
491 lwgeoms = palloc(sizeof(LWGEOM *));
492 lwgeoms[0] = lwgeom;
493 lwgeom = (LWGEOM *)lwcollection_construct(COLLECTIONTYPE, srid, bbox, 1, lwgeoms);
494 }
495
496 result = geometry_serialize(lwgeom);
497 lwgeom_free(lwgeom);
498
499 PG_FREE_IF_COPY(geom, 0);
500 PG_RETURN_POINTER(result);
501}
int gserialized_has_bbox(const GSERIALIZED *g)
Check if a GSERIALIZED has a bounding box without deserializing first.
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
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:89
LWCOLLECTION * lwcollection_construct(uint8_t type, int32_t srid, GBOX *bbox, uint32_t ngeoms, LWGEOM **geoms)
#define COLLECTIONTYPE
Definition liblwgeom.h:122
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1138
int lwgeom_is_collection(const LWGEOM *lwgeom)
Determine whether a LWGEOM can contain sub-geometries or not.
Definition lwgeom.c:1079
#define SRID_UNKNOWN
Unknown SRID value.
Definition liblwgeom.h:229
GSERIALIZED * geometry_serialize(LWGEOM *lwgeom)
uint8_t type
Definition liblwgeom.h:448
GBOX * bbox
Definition liblwgeom.h:444
int32_t srid
Definition liblwgeom.h:446

References LWGEOM::bbox, COLLECTIONTYPE, geometry_serialize(), gserialized_get_type(), gserialized_has_bbox(), lwcollection_construct(), lwgeom_free(), lwgeom_from_gserialized(), lwgeom_is_collection(), LWGEOM::srid, SRID_UNKNOWN, and LWGEOM::type.

Here is the call graph for this function: