PostGIS  2.5.0dev-r@@SVN_REVISION@@

◆ lwmcurve_linearize()

static LWMLINE* lwmcurve_linearize ( const LWMCURVE mcurve,
double  tol,
LW_LINEARIZE_TOLERANCE_TYPE  type,
int  flags 
)
static
Parameters
mcurveinput compound curve
toltolerance, semantic driven by tolerance_type
tolerance_typesee LW_LINEARIZE_TOLERANCE_TYPE
flagssee flags in lwarc_linearize
Returns
a newly allocated LWMLINE

Definition at line 579 of file lwstroke.c.

References CIRCSTRINGTYPE, COMPOUNDTYPE, LWMCURVE::flags, FLAGS_NDIMS, LWMCURVE::geoms, LINETYPE, lwalloc(), lwcircstring_linearize(), lwcollection_construct(), lwcompound_linearize(), LWDEBUGF, lwerror(), lwline_construct(), MULTILINETYPE, LWMCURVE::ngeoms, ptarray_clone_deep(), LWMCURVE::srid, ovdump::type, and LWGEOM::type.

Referenced by lwcurve_linearize().

582 {
583  LWMLINE *ogeom;
584  LWGEOM **lines;
585  uint32_t i;
586 
587  LWDEBUGF(2, "lwmcurve_linearize called, geoms=%d, dim=%d.", mcurve->ngeoms, FLAGS_NDIMS(mcurve->flags));
588 
589  lines = lwalloc(sizeof(LWGEOM *)*mcurve->ngeoms);
590 
591  for (i = 0; i < mcurve->ngeoms; i++)
592  {
593  const LWGEOM *tmp = mcurve->geoms[i];
594  if (tmp->type == CIRCSTRINGTYPE)
595  {
596  lines[i] = (LWGEOM *)lwcircstring_linearize((LWCIRCSTRING *)tmp, tol, type, flags);
597  }
598  else if (tmp->type == LINETYPE)
599  {
600  lines[i] = (LWGEOM *)lwline_construct(mcurve->srid, NULL, ptarray_clone_deep(((LWLINE *)tmp)->points));
601  }
602  else if (tmp->type == COMPOUNDTYPE)
603  {
604  lines[i] = (LWGEOM *)lwcompound_linearize((LWCOMPOUND *)tmp, tol, type, flags);
605  }
606  else
607  {
608  lwerror("Unsupported geometry found in MultiCurve.");
609  return NULL;
610  }
611  }
612 
613  ogeom = (LWMLINE *)lwcollection_construct(MULTILINETYPE, mcurve->srid, NULL, mcurve->ngeoms, lines);
614  return ogeom;
615 }
#define LINETYPE
Definition: liblwgeom.h:85
uint8_t flags
Definition: liblwgeom.h:545
LWCOLLECTION * lwcollection_construct(uint8_t type, int srid, GBOX *bbox, uint32_t ngeoms, LWGEOM **geoms)
Definition: lwcollection.c:43
#define COMPOUNDTYPE
Definition: liblwgeom.h:92
static LWLINE * lwcompound_linearize(const LWCOMPOUND *icompound, double tol, LW_LINEARIZE_TOLERANCE_TYPE tolerance_type, int flags)
Definition: lwstroke.c:452
int32_t srid
Definition: liblwgeom.h:547
unsigned int uint32_t
Definition: uthash.h:78
LWLINE * lwline_construct(int srid, GBOX *bbox, POINTARRAY *points)
Definition: lwline.c:42
POINTARRAY * ptarray_clone_deep(const POINTARRAY *ptarray)
Deep clone a pointarray (also clones serialized pointlist)
Definition: ptarray.c:628
static LWLINE * lwcircstring_linearize(const LWCIRCSTRING *icurve, double tol, LW_LINEARIZE_TOLERANCE_TYPE tolerance_type, int flags)
Definition: lwstroke.c:392
LWGEOM ** geoms
Definition: liblwgeom.h:550
uint8_t type
Definition: liblwgeom.h:398
type
Definition: ovdump.py:41
#define CIRCSTRINGTYPE
Definition: liblwgeom.h:91
void * lwalloc(size_t size)
Definition: lwutil.c:229
uint32_t ngeoms
Definition: liblwgeom.h:548
#define MULTILINETYPE
Definition: liblwgeom.h:88
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
#define FLAGS_NDIMS(flags)
Definition: liblwgeom.h:151
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
Here is the call graph for this function:
Here is the caller graph for this function: