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

◆ LWGEOM_geometryn_collection()

Datum LWGEOM_geometryn_collection ( PG_FUNCTION_ARGS  )

Definition at line 259 of file lwgeom_ogc.c.

260{
261 GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
262 GSERIALIZED *result;
263 int type = gserialized_get_type(geom);
264 int32 idx;
265 LWCOLLECTION *coll;
266 LWGEOM *subgeom;
267
268 POSTGIS_DEBUG(2, "LWGEOM_geometryn_collection called.");
269
270 /* elog(NOTICE, "GeometryN called"); */
271
272 idx = PG_GETARG_INT32(1);
273 idx -= 1; /* index is 1-based */
274
275 /* call is valid on multi* geoms only */
276 if (type==POINTTYPE || type==LINETYPE || type==CIRCSTRINGTYPE ||
277 type==COMPOUNDTYPE || type==POLYGONTYPE ||
278 type==CURVEPOLYTYPE || type==TRIANGLETYPE)
279 {
280 if ( idx == 0 ) PG_RETURN_POINTER(geom);
281 PG_RETURN_NULL();
282 }
283
285
286 if ( idx < 0 ) PG_RETURN_NULL();
287 if ( idx >= (int32) coll->ngeoms ) PG_RETURN_NULL();
288
289 subgeom = coll->geoms[idx];
290 subgeom->srid = coll->srid;
291
292 /* COMPUTE_BBOX==TAINTING */
293 if ( coll->bbox ) lwgeom_add_bbox(subgeom);
294
295 result = geometry_serialize(subgeom);
296
297 lwcollection_free(coll);
298 PG_FREE_IF_COPY(geom, 0);
299
300 PG_RETURN_POINTER(result);
301
302}
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
#define COMPOUNDTYPE
Definition liblwgeom.h:124
#define CURVEPOLYTYPE
Definition liblwgeom.h:125
#define LINETYPE
Definition liblwgeom.h:117
LWCOLLECTION * lwgeom_as_lwcollection(const LWGEOM *lwgeom)
Definition lwgeom.c:215
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition liblwgeom.h:116
#define POLYGONTYPE
Definition liblwgeom.h:118
#define CIRCSTRINGTYPE
Definition liblwgeom.h:123
void lwcollection_free(LWCOLLECTION *col)
#define TRIANGLETYPE
Definition liblwgeom.h:129
void lwgeom_add_bbox(LWGEOM *lwgeom)
Compute a bbox if not already computed.
Definition lwgeom.c:677
GSERIALIZED * geometry_serialize(LWGEOM *lwgeom)
unsigned int int32
Definition shpopen.c:273
uint32_t ngeoms
Definition liblwgeom.h:566
GBOX * bbox
Definition liblwgeom.h:560
LWGEOM ** geoms
Definition liblwgeom.h:561
int32_t srid
Definition liblwgeom.h:562
int32_t srid
Definition liblwgeom.h:446

References LWCOLLECTION::bbox, CIRCSTRINGTYPE, COMPOUNDTYPE, CURVEPOLYTYPE, geometry_serialize(), LWCOLLECTION::geoms, gserialized_get_type(), LINETYPE, lwcollection_free(), lwgeom_add_bbox(), lwgeom_as_lwcollection(), lwgeom_from_gserialized(), LWCOLLECTION::ngeoms, POINTTYPE, POLYGONTYPE, LWGEOM::srid, LWCOLLECTION::srid, and TRIANGLETYPE.

Here is the call graph for this function: