PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ LWGEOM_geometryn_collection()

Datum LWGEOM_geometryn_collection ( PG_FUNCTION_ARGS  )

Definition at line 260 of file lwgeom_ogc.c.

261 {
262  GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
264  int type = gserialized_get_type(geom);
265  int32 idx;
266  LWCOLLECTION *coll;
267  LWGEOM *subgeom;
268 
269  POSTGIS_DEBUG(2, "LWGEOM_geometryn_collection called.");
270 
271  /* elog(NOTICE, "GeometryN called"); */
272 
273  idx = PG_GETARG_INT32(1);
274  idx -= 1; /* index is 1-based */
275 
276  if (gserialized_is_empty(geom))
277  {
278  PG_RETURN_NULL();
279  }
280 
281  /* call is valid on multi* geoms only */
285  {
286  if ( idx == 0 ) PG_RETURN_POINTER(geom);
287  PG_RETURN_NULL();
288  }
289 
291 
292  if ( idx < 0 ) PG_RETURN_NULL();
293  if ( idx >= (int32) coll->ngeoms ) PG_RETURN_NULL();
294 
295  subgeom = coll->geoms[idx];
296  subgeom->srid = coll->srid;
297 
298  /* COMPUTE_BBOX==TAINTING */
299  if ( coll->bbox ) lwgeom_add_bbox(subgeom);
300 
301  result = geometry_serialize(subgeom);
302 
303  lwcollection_free(coll);
304  PG_FREE_IF_COPY(geom, 0);
305 
306  PG_RETURN_POINTER(result);
307 
308 }
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition: cu_print.c:262
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:239
int gserialized_is_empty(const GSERIALIZED *g)
Check if a GSERIALIZED is empty without deserializing first.
Definition: gserialized.c:152
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:110
#define CURVEPOLYTYPE
Definition: liblwgeom.h:111
#define LINETYPE
Definition: liblwgeom.h:103
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:102
#define POLYGONTYPE
Definition: liblwgeom.h:104
#define CIRCSTRINGTYPE
Definition: liblwgeom.h:109
void lwcollection_free(LWCOLLECTION *col)
Definition: lwcollection.c:357
#define TRIANGLETYPE
Definition: liblwgeom.h:115
LWCOLLECTION * lwgeom_as_lwcollection(const LWGEOM *lwgeom)
Definition: lwgeom.c:233
void lwgeom_add_bbox(LWGEOM *lwgeom)
Compute a bbox if not already computed.
Definition: lwgeom.c:695
type
Definition: ovdump.py:42
unsigned int int32
Definition: shpopen.c:54
uint32_t ngeoms
Definition: liblwgeom.h:580
GBOX * bbox
Definition: liblwgeom.h:574
LWGEOM ** geoms
Definition: liblwgeom.h:575
int32_t srid
Definition: liblwgeom.h:576
int32_t srid
Definition: liblwgeom.h:460

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

Here is the call graph for this function: