PostGIS  2.5.1dev-r@@SVN_REVISION@@

◆ lwline_covers_lwline()

int lwline_covers_lwline ( const LWLINE lwline1,
const LWLINE lwline2 
)

Check if first and last point of line2 are covered by line1 and then each point in between has to be one line1 in the exact same order return LW_TRUE if all edge points of line2 are on line1.

Definition at line 2699 of file lwgeodetic.c.

References edge_contains_point(), GEOGRAPHIC_EDGE::end, geographic_point_init(), getPoint2d_cp(), LW_FALSE, LW_TRUE, LWDEBUG, lwline_covers_lwpoint(), lwline_get_lwpoint(), POINTARRAY::npoints, LWLINE::points, GEOGRAPHIC_EDGE::start, POINT2D::x, and POINT2D::y.

Referenced by lwgeom_covers_lwgeom_sphere().

2700 {
2701  uint32_t i, j;
2702  GEOGRAPHIC_EDGE e1, e2;
2703  GEOGRAPHIC_POINT p1, p2;
2704  int start = LW_FALSE;
2705  int changed = LW_FALSE;
2706 
2707  /* first point on line */
2708  if ( ! lwline_covers_lwpoint(lwline1, lwline_get_lwpoint(lwline2, 0)))
2709  {
2710  LWDEBUG(4,"returning false, first point of line2 is not covered by line1");
2711  return LW_FALSE;
2712  }
2713 
2714  /* last point on line */
2715  if ( ! lwline_covers_lwpoint(lwline1, lwline_get_lwpoint(lwline2, lwline2->points->npoints - 1)))
2716  {
2717  LWDEBUG(4,"returning false, last point of line2 is not covered by line1");
2718  return LW_FALSE;
2719  }
2720 
2721  j = 0;
2722  i = 0;
2723  while (i < lwline1->points->npoints - 1 && j < lwline2->points->npoints - 1)
2724  {
2725  changed = LW_FALSE;
2726  const POINT2D* a1 = getPoint2d_cp(lwline1->points, i);
2727  const POINT2D* a2 = getPoint2d_cp(lwline1->points, i+1);
2728  const POINT2D* b1 = getPoint2d_cp(lwline2->points, j);
2729  const POINT2D* b2 = getPoint2d_cp(lwline2->points, j+1);
2730 
2731  geographic_point_init(a1->x, a1->y, &(e1.start));
2732  geographic_point_init(a2->x, a2->y, &(e1.end));
2733  geographic_point_init(b1->x, b1->y, &p2);
2734 
2735  /* we already know, that the last point is on line1, so we're done */
2736  if ( j == lwline2->points->npoints - 1)
2737  {
2738  return LW_TRUE;
2739  }
2740  else if (start == LW_TRUE)
2741  {
2742  /* point is on current line1 edge, check next point in line2 */
2743  if ( edge_contains_point(&e1, &p2)) {
2744  j++;
2745  changed = LW_TRUE;
2746  }
2747 
2748  geographic_point_init(a1->x, a1->y, &(e2.start));
2749  geographic_point_init(a2->x, b2->y, &(e2.end));
2750  geographic_point_init(a1->x, a1->y, &p1);
2751 
2752  /* point is on current line2 edge, check next point in line1 */
2753  if ( edge_contains_point(&e2, &p1)) {
2754  i++;
2755  changed = LW_TRUE;
2756  }
2757 
2758  /* no edge progressed -> point left one line */
2759  if ( changed == LW_FALSE )
2760  {
2761  LWDEBUG(4,"returning false, found point not covered by both lines");
2762  return LW_FALSE;
2763  }
2764  else
2765  {
2766  continue;
2767  }
2768  }
2769 
2770  /* find first edge to cover line2 */
2771  if (edge_contains_point(&e1, &p2))
2772  {
2773  start = LW_TRUE;
2774  }
2775 
2776  /* next line1 edge */
2777  i++;
2778  }
2779 
2780  /* no uncovered point found */
2781  return LW_TRUE;
2782 }
Two-point great circle segment from a to b.
Definition: lwgeodetic.h:56
int edge_contains_point(const GEOGRAPHIC_EDGE *e, const GEOGRAPHIC_POINT *p)
Returns true if the point p is on the minor edge defined by the end points of e.
Definition: lwgeodetic.c:1003
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
Point in spherical coordinates on the world.
Definition: lwgeodetic.h:47
unsigned int uint32_t
Definition: uthash.h:78
double x
Definition: liblwgeom.h:330
#define LW_FALSE
Definition: liblwgeom.h:76
GEOGRAPHIC_POINT start
Definition: lwgeodetic.h:58
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:75
GEOGRAPHIC_POINT end
Definition: lwgeodetic.h:59
double y
Definition: liblwgeom.h:330
void geographic_point_init(double lon, double lat, GEOGRAPHIC_POINT *g)
Initialize a geographic point.
Definition: lwgeodetic.c:171
int lwline_covers_lwpoint(const LWLINE *lwline, const LWPOINT *lwpoint)
return LW_TRUE if any of the line segments covers the point
Definition: lwgeodetic.c:2670
LWPOINT * lwline_get_lwpoint(const LWLINE *line, uint32_t where)
Returns freshly allocated LWPOINT that corresponds to the index where.
Definition: lwline.c:318
const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from...
Definition: lwgeom_api.c:364
POINTARRAY * points
Definition: liblwgeom.h:424
uint32_t npoints
Definition: liblwgeom.h:373
Here is the call graph for this function:
Here is the caller graph for this function: