PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ lwcollection_split()

static LWGEOM * lwcollection_split ( const LWCOLLECTION lwcoll_in,
const LWGEOM blade_in 
)
static

Definition at line 494 of file lwgeom_geos_split.c.

495 {
496  LWGEOM** split_vector=NULL;
497  LWCOLLECTION* out;
498  size_t split_vector_capacity;
499  size_t split_vector_size=0;
500  size_t i,j;
501 
502  split_vector_capacity=8;
503  split_vector = lwalloc(split_vector_capacity * sizeof(LWGEOM*));
504  if ( ! split_vector )
505  {
506  lwerror("Out of virtual memory");
507  return NULL;
508  }
509 
510  for (i=0; i<lwcoll_in->ngeoms; ++i)
511  {
512  LWCOLLECTION* col;
513  LWGEOM* split = lwgeom_split(lwcoll_in->geoms[i], blade_in);
514  /* an exception should prevent this from ever returning NULL */
515  if ( ! split ) return NULL;
516 
517  col = lwgeom_as_lwcollection(split);
518  /* Output, if any, will always be a collection */
519  assert(col);
520 
521  /* Reallocate split_vector if needed */
522  if ( split_vector_size + col->ngeoms > split_vector_capacity )
523  {
524  /* NOTE: we could be smarter on reallocations here */
525  split_vector_capacity += col->ngeoms;
526  split_vector = lwrealloc(split_vector,
527  split_vector_capacity * sizeof(LWGEOM*));
528  if ( ! split_vector )
529  {
530  lwerror("Out of virtual memory");
531  return NULL;
532  }
533  }
534 
535  for (j=0; j<col->ngeoms; ++j)
536  {
537  col->geoms[j]->srid = SRID_UNKNOWN; /* strip srid */
538  split_vector[split_vector_size++] = col->geoms[j];
539  }
540  lwfree(col->geoms);
541  lwfree(col);
542  }
543 
544  /* Now split_vector has split_vector_size geometries */
545  out = lwcollection_construct(COLLECTIONTYPE, lwcoll_in->srid,
546  NULL, split_vector_size, split_vector);
547 
548  return (LWGEOM*)out;
549 }
#define COLLECTIONTYPE
Definition: liblwgeom.h:122
void * lwrealloc(void *mem, size_t size)
Definition: lwutil.c:235
void lwfree(void *mem)
Definition: lwutil.c:242
void * lwalloc(size_t size)
Definition: lwutil.c:227
LWCOLLECTION * lwcollection_construct(uint8_t type, int32_t srid, GBOX *bbox, uint32_t ngeoms, LWGEOM **geoms)
Definition: lwcollection.c:42
LWCOLLECTION * lwgeom_as_lwcollection(const LWGEOM *lwgeom)
Definition: lwgeom.c:215
#define SRID_UNKNOWN
Unknown SRID value.
Definition: liblwgeom.h:229
LWGEOM * lwgeom_split(const LWGEOM *lwgeom_in, const LWGEOM *blade_in)
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
uint32_t ngeoms
Definition: liblwgeom.h:566
LWGEOM ** geoms
Definition: liblwgeom.h:561
int32_t srid
Definition: liblwgeom.h:562
int32_t srid
Definition: liblwgeom.h:446

References COLLECTIONTYPE, LWCOLLECTION::geoms, lwalloc(), lwcollection_construct(), lwerror(), lwfree(), lwgeom_as_lwcollection(), lwgeom_split(), lwrealloc(), LWCOLLECTION::ngeoms, LWGEOM::srid, LWCOLLECTION::srid, and SRID_UNKNOWN.

Referenced by lwgeom_split().

Here is the call graph for this function:
Here is the caller graph for this function: