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

◆ geometry_to_path()

Datum geometry_to_path ( PG_FUNCTION_ARGS  )

Definition at line 107 of file geometry_inout.c.

108{
109 PATH *path;
110 LWLINE *lwline;
111 LWGEOM *lwgeom;
112 GSERIALIZED *geom;
113 POINTARRAY *pa;
114 uint32_t i;
115 const POINT2D *pt;
116 size_t size;
117
118 POSTGIS_DEBUG(2, "geometry_to_path called");
119
120 if ( PG_ARGISNULL(0) )
121 PG_RETURN_NULL();
122
123 geom = PG_GETARG_GSERIALIZED_P(0);
124
125 if ( gserialized_get_type(geom) != LINETYPE )
126 elog(ERROR, "geometry_to_path only accepts LineStrings");
127
128 lwgeom = lwgeom_from_gserialized(geom);
129 if ( lwgeom_is_empty(lwgeom) )
130 PG_RETURN_NULL();
131 lwline = lwgeom_as_lwline(lwgeom);
132
133 pa = lwline->points;
134 size = offsetof(PATH, p[0]) + sizeof(path->p[0]) * pa->npoints;
135 path = (PATH*)palloc(size);
136 SET_VARSIZE(path, size);
137 path->npts = pa->npoints;
138 path->closed = 0;
139 path->dummy = 0;
140
141 for ( i = 0; i < pa->npoints; i++ )
142 {
143 pt = getPoint2d_cp(pa, i);
144 (path->p[i]).x = pt->x;
145 (path->p[i]).y = pt->y;
146 }
147
148 lwgeom_free(lwgeom);
149 PG_FREE_IF_COPY(geom,0);
150
151 PG_RETURN_PATH_P(path);
152}
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
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:89
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1138
#define LINETYPE
Definition liblwgeom.h:117
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
Definition lwgeom.c:161
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
Definition lwinline.h:193
static const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
Definition lwinline.h:91
POINTARRAY * points
Definition liblwgeom.h:469
double y
Definition liblwgeom.h:376
double x
Definition liblwgeom.h:376
uint32_t npoints
Definition liblwgeom.h:413

References getPoint2d_cp(), gserialized_get_type(), LINETYPE, lwgeom_as_lwline(), lwgeom_free(), lwgeom_from_gserialized(), lwgeom_is_empty(), POINTARRAY::npoints, LWLINE::points, POINT2D::x, and POINT2D::y.

Here is the call graph for this function: