Add a measure dimension to a line, interpolating linearly from the start to the end value.
Add a measure dimension to a line, interpolating linearly from the start to the end value.
Definition at line 379 of file lwline.c.
380{
381 int i = 0;
382 int hasm = 0, hasz = 0;
383 int npoints = 0;
384 double length = 0.0;
385 double length_so_far = 0.0;
386 double m_range = m_end - m_start;
387 double m;
390
392 {
393 lwerror(
"lwline_construct_from_lwline: only line types supported");
394 return NULL;
395 }
396
398 hasm = 1;
399
400
402 {
406 }
407
409
410 for ( i = 0; i < npoints; i++ )
411 {
420 if ( length > 0.0 )
421 m = m_start + m_range * length_so_far / length;
422
423 else if ( length == 0.0 && npoints > 1 )
424 m = m_start + m_range * i / (npoints-1);
425 else
426 m = 0.0;
432 p1 = p2;
433 }
434
436}
double distance2d_pt_pt(const POINT2D *p1, const POINT2D *p2)
double ptarray_length_2d(const POINTARRAY *pts)
Find the 2d length of the given POINTARRAY (even if it's 3d)
#define FLAGS_GET_Z(flags)
int getPoint3dz_p(const POINTARRAY *pa, uint32_t n, POINT3DZ *point)
void ptarray_set_point4d(POINTARRAY *pa, uint32_t n, const POINT4D *p4d)
POINTARRAY * ptarray_construct(char hasz, char hasm, uint32_t npoints)
Construct an empty pointarray, allocating storage and setting the npoints, but not filling in any inf...
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
LWLINE * lwline_construct(int32_t srid, GBOX *bbox, POINTARRAY *points)
References distance2d_pt_pt(), LWLINE::flags, FLAGS_GET_Z, getPoint3dz_p(), LINETYPE, lwerror(), lwline_construct(), POINT4D::m, POINTARRAY::npoints, LWLINE::points, ptarray_construct(), ptarray_length_2d(), ptarray_set_point4d(), LWLINE::srid, LWLINE::type, POINT2D::x, POINT3DZ::x, POINT4D::x, POINT2D::y, POINT3DZ::y, POINT4D::y, POINT3DZ::z, and POINT4D::z.
Referenced by lwline_locate_along(), lwmline_measured_from_lwmline(), and ST_AddMeasure().