PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ lwmline_measured_from_lwmline()

LWMLINE* lwmline_measured_from_lwmline ( const LWMLINE lwmline,
double  m_start,
double  m_end 
)

Re-write the measure ordinate (or add one, if it isn't already there) interpolating the measure between the supplied start and end values.

Definition at line 56 of file lwmline.c.

References LWMLINE::flags, FLAGS_GET_Z, LWMLINE::geoms, if(), lwalloc(), lwcollection_construct(), lwcollection_construct_empty(), lwerror(), lwgeom_is_empty(), lwline_measured_from_lwline(), MULTILINETYPE, LWMLINE::ngeoms, POINTARRAY::npoints, LWLINE::points, ptarray_length_2d(), LWGEOM::srid, LWGEOM::type, and LWMLINE::type.

Referenced by ST_AddMeasure().

57 {
58  int i = 0;
59  int hasm = 0, hasz = 0;
60  double length = 0.0, length_so_far = 0.0;
61  double m_range = m_end - m_start;
62  LWGEOM **geoms = NULL;
63 
64  if ( lwmline->type != MULTILINETYPE )
65  {
66  lwerror("lwmline_measured_from_lmwline: only multiline types supported");
67  return NULL;
68  }
69 
70  hasz = FLAGS_GET_Z(lwmline->flags);
71  hasm = 1;
72 
73  /* Calculate the total length of the mline */
74  for ( i = 0; i < lwmline->ngeoms; i++ )
75  {
76  LWLINE *lwline = (LWLINE*)lwmline->geoms[i];
77  if ( lwline->points && lwline->points->npoints > 1 )
78  {
79  length += ptarray_length_2d(lwline->points);
80  }
81  }
82 
83  if ( lwgeom_is_empty((LWGEOM*)lwmline) )
84  {
85  return (LWMLINE*)lwcollection_construct_empty(MULTILINETYPE, lwmline->srid, hasz, hasm);
86  }
87 
88  geoms = lwalloc(sizeof(LWGEOM*) * lwmline->ngeoms);
89 
90  for ( i = 0; i < lwmline->ngeoms; i++ )
91  {
92  double sub_m_start, sub_m_end;
93  double sub_length = 0.0;
94  LWLINE *lwline = (LWLINE*)lwmline->geoms[i];
95 
96  if ( lwline->points && lwline->points->npoints > 1 )
97  {
98  sub_length = ptarray_length_2d(lwline->points);
99  }
100 
101  sub_m_start = (m_start + m_range * length_so_far / length);
102  sub_m_end = (m_start + m_range * (length_so_far + sub_length) / length);
103 
104  geoms[i] = (LWGEOM*)lwline_measured_from_lwline(lwline, sub_m_start, sub_m_end);
105 
106  length_so_far += sub_length;
107  }
108 
109  return (LWMLINE*)lwcollection_construct(lwmline->type, lwmline->srid, NULL, lwmline->ngeoms, geoms);
110 }
LWLINE * lwline_measured_from_lwline(const LWLINE *lwline, double m_start, double m_end)
Add a measure dimension to a line, interpolating linearly from the start to the end value...
Definition: lwline.c:396
uint8_t type
Definition: liblwgeom.h:477
LWCOLLECTION * lwcollection_construct(uint8_t type, int srid, GBOX *bbox, uint32_t ngeoms, LWGEOM **geoms)
Definition: lwcollection.c:43
int npoints
Definition: liblwgeom.h:371
double ptarray_length_2d(const POINTARRAY *pts)
Find the 2d length of the given POINTARRAY (even if it&#39;s 3d)
Definition: ptarray.c:1692
int32_t srid
Definition: liblwgeom.h:399
int ngeoms
Definition: liblwgeom.h:481
uint8_t flags
Definition: liblwgeom.h:478
#define FLAGS_GET_Z(flags)
Macros for manipulating the &#39;flags&#39; byte.
Definition: liblwgeom.h:140
LWLINE ** geoms
Definition: liblwgeom.h:483
uint8_t type
Definition: liblwgeom.h:396
void * lwalloc(size_t size)
Definition: lwutil.c:229
int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members) ...
Definition: lwgeom.c:1346
#define MULTILINETYPE
Definition: liblwgeom.h:89
LWCOLLECTION * lwcollection_construct_empty(uint8_t type, int srid, char hasz, char hasm)
Definition: lwcollection.c:94
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
if(!(yy_init))
POINTARRAY * points
Definition: liblwgeom.h:422
Here is the call graph for this function:
Here is the caller graph for this function: