PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ LWGEOM_addpoint()

Datum LWGEOM_addpoint ( PG_FUNCTION_ARGS  )

Definition at line 2273 of file lwgeom_functions_basic.c.

2274 {
2275  GSERIALIZED *pglwg1, *pglwg2, *result;
2276  LWPOINT *point;
2277  LWLINE *line, *linecopy;
2278  uint32_t uwhere = 0;
2279 
2280  POSTGIS_DEBUGF(2, "%s called.", __func__);
2281 
2282  pglwg1 = PG_GETARG_GSERIALIZED_P(0);
2283  pglwg2 = PG_GETARG_GSERIALIZED_P(1);
2284 
2285  if (gserialized_get_type(pglwg1) != LINETYPE)
2286  {
2287  elog(ERROR, "First argument must be a LINESTRING");
2288  PG_RETURN_NULL();
2289  }
2290 
2291  if (gserialized_get_type(pglwg2) != POINTTYPE)
2292  {
2293  elog(ERROR, "Second argument must be a POINT");
2294  PG_RETURN_NULL();
2295  }
2296 
2297  if (gserialized_is_empty(pglwg2))
2298  {
2299  PG_RETURN_POINTER(pglwg1);
2300  }
2301 
2302  line = lwgeom_as_lwline(lwgeom_from_gserialized(pglwg1));
2303 
2304  if (PG_NARGS() <= 2)
2305  {
2306  uwhere = line->points->npoints;
2307  }
2308  else
2309  {
2310  int32 where = PG_GETARG_INT32(2);
2311  if (where == -1)
2312  {
2313  uwhere = line->points->npoints;
2314  }
2315  else if (where < 0 || where > (int32)line->points->npoints)
2316  {
2317  elog(ERROR, "%s: Invalid offset", __func__);
2318  PG_RETURN_NULL();
2319  }
2320  else
2321  {
2322  uwhere = where;
2323  }
2324  }
2325 
2326  point = lwgeom_as_lwpoint(lwgeom_from_gserialized(pglwg2));
2328  lwline_free(line);
2329 
2330  if (lwline_add_lwpoint(linecopy, point, uwhere) == LW_FAILURE)
2331  {
2332  elog(ERROR, "Point insert failed");
2333  PG_RETURN_NULL();
2334  }
2335 
2336  result = geometry_serialize(lwline_as_lwgeom(linecopy));
2337 
2338  /* Release memory */
2339  PG_FREE_IF_COPY(pglwg1, 0);
2340  PG_FREE_IF_COPY(pglwg2, 1);
2341  lwpoint_free(point);
2342 
2343  PG_RETURN_POINTER(result);
2344 }
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition: cu_print.c:267
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:268
int gserialized_is_empty(const GSERIALIZED *g)
Check if a GSERIALIZED is empty without deserializing first.
Definition: gserialized.c:181
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:118
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
Definition: lwgeom.c:179
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition: lwgeom.c:339
void lwpoint_free(LWPOINT *pt)
Definition: lwpoint.c:213
#define LW_FAILURE
Definition: liblwgeom.h:96
#define LINETYPE
Definition: liblwgeom.h:103
LWGEOM * lwgeom_clone_deep(const LWGEOM *lwgeom)
Deep clone an LWGEOM, everything is copied.
Definition: lwgeom.c:529
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:102
void lwline_free(LWLINE *line)
Definition: lwline.c:67
int lwline_add_lwpoint(LWLINE *line, LWPOINT *point, uint32_t where)
Add a LWPOINT to an LWLINE.
Definition: lwline.c:327
static LWPOINT * lwgeom_as_lwpoint(const LWGEOM *lwgeom)
Definition: lwinline.h:127
unsigned int int32
Definition: shpopen.c:54
POINTARRAY * points
Definition: liblwgeom.h:483
uint32_t npoints
Definition: liblwgeom.h:427

References gserialized_get_type(), gserialized_is_empty(), LINETYPE, LW_FAILURE, lwgeom_as_lwline(), lwgeom_as_lwpoint(), lwgeom_clone_deep(), lwgeom_from_gserialized(), lwline_add_lwpoint(), lwline_as_lwgeom(), lwline_free(), lwpoint_free(), POINTARRAY::npoints, LWLINE::points, POINTTYPE, and result.

Here is the call graph for this function: