PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ ST_Scroll()

Datum ST_Scroll ( PG_FUNCTION_ARGS  )

Definition at line 1114 of file lwgeom_functions_basic.c.

1115 {
1116  Datum datum_line, datum_point;
1117  GSERIALIZED *ser_line, *ser_point;
1118  LWGEOM *lwgeom_line, *lwgeom_point;
1119  LWLINE *line;
1120  LWPOINT *point;
1121  POINT4D p;
1122  GSERIALIZED *ser_out;
1123  int rv;
1124 
1125  POSTGIS_DEBUG(2, "ST_Scroll called.");
1126 
1127  datum_line = PG_GETARG_DATUM(0);
1128  datum_point = PG_GETARG_DATUM(1);
1129 
1130  ser_line = ((GSERIALIZED *)PG_DETOAST_DATUM(datum_line));
1131  lwgeom_line = lwgeom_from_gserialized(ser_line);
1132  line = lwgeom_as_lwline(lwgeom_line);
1133  if ( ! line ) {
1134  lwpgerror("First argument must be a line");
1135  PG_RETURN_NULL();
1136  }
1137 
1138  ser_point = ((GSERIALIZED *)PG_DETOAST_DATUM(datum_point));
1139  lwgeom_point = lwgeom_from_gserialized(ser_point);
1140  point = lwgeom_as_lwpoint(lwgeom_point);
1141  if ( ! point ) {
1142  lwpgerror("Second argument must be a point");
1143  PG_RETURN_NULL();
1144  }
1145  if ( ! lwpoint_getPoint4d_p(point, &p) ) {
1146  lwpgerror("Second argument must be a non-empty point");
1147  PG_RETURN_NULL();
1148  }
1149 
1150  rv = ptarray_scroll_in_place(line->points, &p);
1151  if ( LW_FAILURE == rv ) {
1152  PG_RETURN_NULL();
1153  }
1154 
1155  ser_out = geometry_serialize(lwgeom_line);
1156 
1157  lwgeom_free(lwgeom_point);
1158  PG_FREE_IF_COPY(ser_line, 0);
1159  PG_FREE_IF_COPY(ser_point, 0);
1160 
1161  PG_RETURN_POINTER(ser_out);
1162 }
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:239
int lwpoint_getPoint4d_p(const LWPOINT *point, POINT4D *out)
Definition: lwpoint.c:57
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
Definition: lwgeom.c:179
#define LW_FAILURE
Definition: liblwgeom.h:111
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1155
int ptarray_scroll_in_place(POINTARRAY *pa, const POINT4D *newbase)
Definition: ptarray.c:2163
static LWPOINT * lwgeom_as_lwpoint(const LWGEOM *lwgeom)
Definition: lwinline.h:131
POINTARRAY * points
Definition: liblwgeom.h:498

References LW_FAILURE, lwgeom_as_lwline(), lwgeom_as_lwpoint(), lwgeom_free(), lwgeom_from_gserialized(), lwpoint_getPoint4d_p(), LWLINE::points, and ptarray_scroll_in_place().

Here is the call graph for this function: