PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ ptarray_addPoint()

POINTARRAY* ptarray_addPoint ( const POINTARRAY pa,
uint8_t p,
size_t  pdims,
uint32_t  where 
)

Add a point in a pointarray.

Parameters
pathe source POINTARRAY
pthe point to add
pdimsnumber of ordinates in p (2..4)
whereto insert the point. 0 prepends, pa->npoints appends
Returns
a newly constructed POINTARRAY using a newly allocated buffer for the actual points, or NULL on error.

Definition at line 504 of file ptarray.c.

References POINTARRAY::flags, FLAGS_GET_M, FLAGS_GET_Z, getPoint_internal(), LWDEBUG, LWDEBUGF, lwerror(), POINT4D::m, POINTARRAY::npoints, ptarray_construct(), ptarray_point_size(), POINT4D::x, POINT4D::y, and POINT4D::z.

Referenced by lwcircstring_addpoint(), LWGEOM2GEOS(), lwline_make_geos_friendly(), ptarray_close2d(), and ring_make_geos_friendly().

505 {
506  POINTARRAY *ret;
507  POINT4D pbuf;
508  size_t ptsize = ptarray_point_size(pa);
509 
510  LWDEBUGF(3, "pa %x p %x size %d where %d",
511  pa, p, pdims, where);
512 
513  if ( pdims < 2 || pdims > 4 )
514  {
515  lwerror("ptarray_addPoint: point dimension out of range (%d)",
516  pdims);
517  return NULL;
518  }
519 
520  if ( where > pa->npoints )
521  {
522  lwerror("ptarray_addPoint: offset out of range (%d)",
523  where);
524  return NULL;
525  }
526 
527  LWDEBUG(3, "called with a %dD point");
528 
529  pbuf.x = pbuf.y = pbuf.z = pbuf.m = 0.0;
530  memcpy((uint8_t *)&pbuf, p, pdims*sizeof(double));
531 
532  LWDEBUG(3, "initialized point buffer");
533 
535  FLAGS_GET_M(pa->flags), pa->npoints+1);
536 
537  if ( where == -1 ) where = pa->npoints;
538 
539  if ( where )
540  {
541  memcpy(getPoint_internal(ret, 0), getPoint_internal(pa, 0), ptsize*where);
542  }
543 
544  memcpy(getPoint_internal(ret, where), (uint8_t *)&pbuf, ptsize);
545 
546  if ( where+1 != ret->npoints )
547  {
548  memcpy(getPoint_internal(ret, where+1),
549  getPoint_internal(pa, where),
550  ptsize*(pa->npoints-where));
551  }
552 
553  return ret;
554 }
double x
Definition: liblwgeom.h:352
double m
Definition: liblwgeom.h:352
int ptarray_point_size(const POINTARRAY *pa)
Definition: ptarray.c:54
int npoints
Definition: liblwgeom.h:371
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
uint8_t flags
Definition: liblwgeom.h:369
POINTARRAY * ptarray_construct(char hasz, char hasm, uint32_t npoints)
Construct an empty pointarray, allocating storage and setting the npoints, but not filling in any inf...
Definition: ptarray.c:62
#define FLAGS_GET_Z(flags)
Macros for manipulating the &#39;flags&#39; byte.
Definition: liblwgeom.h:140
double z
Definition: liblwgeom.h:352
#define FLAGS_GET_M(flags)
Definition: liblwgeom.h:141
double y
Definition: liblwgeom.h:352
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
unsigned char uint8_t
Definition: uthash.h:79
uint8_t * getPoint_internal(const POINTARRAY *pa, int n)
Definition: ptarray.c:1753
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: