PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ LWGEOM_addpoint()

Datum LWGEOM_addpoint ( PG_FUNCTION_ARGS  )

Definition at line 2300 of file lwgeom_functions_basic.c.

2301{
2302 GSERIALIZED *pglwg1, *pglwg2, *result;
2303 LWPOINT *point;
2304 LWLINE *line, *linecopy;
2305 uint32_t uwhere = 0;
2306
2307 POSTGIS_DEBUGF(2, "%s called.", __func__);
2308
2309 pglwg1 = PG_GETARG_GSERIALIZED_P(0);
2310 pglwg2 = PG_GETARG_GSERIALIZED_P(1);
2311
2312 if (gserialized_get_type(pglwg1) != LINETYPE)
2313 {
2314 elog(ERROR, "First argument must be a LINESTRING");
2315 PG_RETURN_NULL();
2316 }
2317
2318 if (gserialized_get_type(pglwg2) != POINTTYPE)
2319 {
2320 elog(ERROR, "Second argument must be a POINT");
2321 PG_RETURN_NULL();
2322 }
2323
2324 if (gserialized_is_empty(pglwg2))
2325 {
2326 PG_RETURN_POINTER(pglwg1);
2327 }
2328
2330
2331 if (PG_NARGS() <= 2)
2332 {
2333 uwhere = line->points->npoints;
2334 }
2335 else
2336 {
2337 int32 where = PG_GETARG_INT32(2);
2338 if (where == -1)
2339 {
2340 uwhere = line->points->npoints;
2341 }
2342 else if (where < 0 || where > (int32)line->points->npoints)
2343 {
2344 elog(ERROR, "%s: Invalid offset", __func__);
2345 PG_RETURN_NULL();
2346 }
2347 else
2348 {
2349 uwhere = where;
2350 }
2351 }
2352
2355 lwline_free(line);
2356
2357 if (lwline_add_lwpoint(linecopy, point, uwhere) == LW_FAILURE)
2358 {
2359 elog(ERROR, "Point insert failed");
2360 PG_RETURN_NULL();
2361 }
2362
2363 result = geometry_serialize(lwline_as_lwgeom(linecopy));
2364
2365 /* Release memory */
2366 PG_FREE_IF_COPY(pglwg1, 0);
2367 PG_FREE_IF_COPY(pglwg2, 1);
2368 lwpoint_free(point);
2369
2370 PG_RETURN_POINTER(result);
2371}
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.
int gserialized_is_empty(const GSERIALIZED *g)
Check if a GSERIALIZED is empty without deserializing first.
uint32_t gserialized_get_type(const GSERIALIZED *g)
Extract the geometry type from the serialized form (it hides in the anonymous data area,...
void lwpoint_free(LWPOINT *pt)
Definition lwpoint.c:213
#define LW_FAILURE
Definition liblwgeom.h:96
#define LINETYPE
Definition liblwgeom.h:103
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition liblwgeom.h:102
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition lwgeom.c:367
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
Definition lwgeom.c:207
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:337
LWGEOM * lwgeom_clone_deep(const LWGEOM *lwgeom)
Deep clone an LWGEOM, everything is copied.
Definition lwgeom.c:557
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: