1167{
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
1177 if (PG_ARGISNULL(0) && PG_ARGISNULL(1))
1178 PG_RETURN_NULL();
1179
1180
1181 if (PG_ARGISNULL(0))
1182 PG_RETURN_DATUM(PG_GETARG_DATUM(1));
1183
1184
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);
1191
1192 POSTGIS_DEBUGF(3,
1193 "LWGEOM_collect(%s, %s): call",
1196
1199 {
1200 elog(ERROR, "Cannot ST_Collect geometries with differing dimensionality.");
1201 PG_RETURN_NULL();
1202 }
1203
1205
1208
1209 type1 = lwgeoms[0]->
type;
1210 type2 = lwgeoms[1]->
type;
1211
1214 else
1216
1217 POSTGIS_DEBUGF(3, " outtype = %d", outtype);
1218
1219
1224
1226 result = geometry_serialize(outlwg);
1227
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]
void gserialized_error_if_srid_mismatch(const GSERIALIZED *g1, const GSERIALIZED *g2, const char *funcname)
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)...
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
int gserialized_has_m(const GSERIALIZED *g)
Check if a GSERIALIZED has an M ordinate.
int gserialized_has_z(const GSERIALIZED *g)
Check if a GSERIALIZED has a Z ordinate.
uint32_t gserialized_get_type(const GSERIALIZED *g)
Extract the geometry type from the serialized form (it hides in the anonymous data area,...
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
LWCOLLECTION * lwcollection_construct(uint8_t type, int32_t srid, GBOX *bbox, uint32_t ngeoms, LWGEOM **geoms)
uint32_t lwtype_get_collectiontype(uint8_t type)
Given an lwtype number, what homogeneous collection can hold it?
void lwgeom_free(LWGEOM *geom)
void lwgeom_drop_bbox(LWGEOM *lwgeom)
Call this function to drop BBOX and SRID from LWGEOM.
int lwgeom_is_collection(const LWGEOM *lwgeom)
Determine whether a LWGEOM contains sub-geometries or not This basically just checks that the struct ...
void lwgeom_drop_srid(LWGEOM *lwgeom)