PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ ST_Scroll()

Datum ST_Scroll ( PG_FUNCTION_ARGS  )

Definition at line 1081 of file lwgeom_functions_basic.c.

1082 {
1083  Datum datum_line, datum_point;
1084  GSERIALIZED *ser_line, *ser_point;
1085  LWGEOM *lwgeom_line, *lwgeom_point;
1086  LWLINE *line;
1087  LWPOINT *point;
1088  POINT4D p;
1089  GSERIALIZED *ser_out;
1090  int rv;
1091 
1092  POSTGIS_DEBUG(2, "ST_Scroll called.");
1093 
1094  datum_line = PG_GETARG_DATUM(0);
1095  datum_point = PG_GETARG_DATUM(1);
1096 
1097  ser_line = ((GSERIALIZED *)PG_DETOAST_DATUM(datum_line));
1098  lwgeom_line = lwgeom_from_gserialized(ser_line);
1099  line = lwgeom_as_lwline(lwgeom_line);
1100  if ( ! line ) {
1101  lwpgerror("First argument must be a line");
1102  PG_RETURN_NULL();
1103  }
1104 
1105  ser_point = ((GSERIALIZED *)PG_DETOAST_DATUM(datum_point));
1106  lwgeom_point = lwgeom_from_gserialized(ser_point);
1107  point = lwgeom_as_lwpoint(lwgeom_point);
1108  if ( ! point ) {
1109  lwpgerror("Second argument must be a point");
1110  PG_RETURN_NULL();
1111  }
1112  if ( ! lwpoint_getPoint4d_p(point, &p) ) {
1113  lwpgerror("Second argument must be a non-empty point");
1114  PG_RETURN_NULL();
1115  }
1116 
1117  rv = ptarray_scroll_in_place(line->points, &p);
1118  if ( LW_FAILURE == rv ) {
1119  PG_RETURN_NULL();
1120  }
1121 
1122  ser_out = geometry_serialize(lwgeom_line);
1123 
1124  lwgeom_free(lwgeom_point);
1125  PG_FREE_IF_COPY(ser_line, 0);
1126  PG_FREE_IF_COPY(ser_point, 0);
1127 
1128  PG_RETURN_POINTER(ser_out);
1129 }
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:268
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:1218
int ptarray_scroll_in_place(POINTARRAY *pa, const POINT4D *newbase)
Definition: ptarray.c:2202
static LWPOINT * lwgeom_as_lwpoint(const LWGEOM *lwgeom)
Definition: lwinline.h:127
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: