PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ ST_Scroll()

Datum ST_Scroll ( PG_FUNCTION_ARGS  )

Definition at line 1117 of file lwgeom_functions_basic.c.

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

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: