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

◆ lwline_measured_from_lwline()

LWLINE * lwline_measured_from_lwline ( const LWLINE lwline,
double  m_start,
double  m_end 
)
extern

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 389 of file lwline.c.

390{
391 int i = 0;
392 int hasm = 0, hasz = 0;
393 int npoints = 0;
394 double length = 0.0;
395 double length_so_far = 0.0;
396 double m_range = m_end - m_start;
397 double m;
398 POINTARRAY *pa = NULL;
399 POINT3DZ p1, p2;
400
401 if ( lwline->type != LINETYPE )
402 {
403 lwerror("lwline_construct_from_lwline: only line types supported");
404 return NULL;
405 }
406
407 hasz = FLAGS_GET_Z(lwline->flags);
408 hasm = 1;
409
410 /* Null points or npoints == 0 will result in empty return geometry */
411 if ( lwline->points )
412 {
413 npoints = lwline->points->npoints;
414 length = ptarray_length_2d(lwline->points);
415 getPoint3dz_p(lwline->points, 0, &p1);
416 }
417
418 pa = ptarray_construct(hasz, hasm, npoints);
419
420 for ( i = 0; i < npoints; i++ )
421 {
422 POINT4D q;
423 POINT2D a, b;
424 getPoint3dz_p(lwline->points, i, &p2);
425 a.x = p1.x;
426 a.y = p1.y;
427 b.x = p2.x;
428 b.y = p2.y;
429 length_so_far += distance2d_pt_pt(&a, &b);
430 if ( length > 0.0 )
431 m = m_start + m_range * length_so_far / length;
432 /* #3172, support (valid) zero-length inputs */
433 else if ( length == 0.0 && npoints > 1 )
434 m = m_start + m_range * i / (npoints-1);
435 else
436 m = 0.0;
437 q.x = p2.x;
438 q.y = p2.y;
439 q.z = p2.z;
440 q.m = m;
441 ptarray_set_point4d(pa, i, &q);
442 p1 = p2;
443 }
444
445 return lwline_construct(lwline->srid, NULL, pa);
446}
double distance2d_pt_pt(const POINT2D *p1, const POINT2D *p2)
Definition measures.c:2344
#define LINETYPE
Definition liblwgeom.h:103
double ptarray_length_2d(const POINTARRAY *pts)
Find the 2d length of the given POINTARRAY (even if it's 3d)
Definition ptarray.c:1975
#define FLAGS_GET_Z(flags)
Definition liblwgeom.h:165
int getPoint3dz_p(const POINTARRAY *pa, uint32_t n, POINT3DZ *point)
Definition lwgeom_api.c:215
void ptarray_set_point4d(POINTARRAY *pa, uint32_t n, const POINT4D *p4d)
Definition lwgeom_api.c:369
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...
Definition ptarray.c:51
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)
Definition lwline.c:42
lwflags_t flags
Definition liblwgeom.h:485
POINTARRAY * points
Definition liblwgeom.h:483
uint8_t type
Definition liblwgeom.h:486
int32_t srid
Definition liblwgeom.h:484
double y
Definition liblwgeom.h:390
double x
Definition liblwgeom.h:390
double z
Definition liblwgeom.h:396
double x
Definition liblwgeom.h:396
double y
Definition liblwgeom.h:396
double m
Definition liblwgeom.h:414
double x
Definition liblwgeom.h:414
double z
Definition liblwgeom.h:414
double y
Definition liblwgeom.h:414
uint32_t npoints
Definition liblwgeom.h:427

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().

Here is the call graph for this function:
Here is the caller graph for this function: