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

◆ 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 2652 of file lwgeodetic.c.

2653{
2654 uint32_t i, j;
2655 GEOGRAPHIC_EDGE e1, e2;
2656 GEOGRAPHIC_POINT p1, p2;
2657 int start = LW_FALSE;
2658 int changed = LW_FALSE;
2659
2660 /* first point on line */
2661 if ( ! lwline_covers_lwpoint(lwline1, lwline_get_lwpoint(lwline2, 0)))
2662 {
2663 LWDEBUG(4,"returning false, first point of line2 is not covered by line1");
2664 return LW_FALSE;
2665 }
2666
2667 /* last point on line */
2668 if ( ! lwline_covers_lwpoint(lwline1, lwline_get_lwpoint(lwline2, lwline2->points->npoints - 1)))
2669 {
2670 LWDEBUG(4,"returning false, last point of line2 is not covered by line1");
2671 return LW_FALSE;
2672 }
2673
2674 j = 0;
2675 i = 0;
2676 while (i < lwline1->points->npoints - 1 && j < lwline2->points->npoints - 1)
2677 {
2678 changed = LW_FALSE;
2679 const POINT2D* a1 = getPoint2d_cp(lwline1->points, i);
2680 const POINT2D* a2 = getPoint2d_cp(lwline1->points, i+1);
2681 const POINT2D* b1 = getPoint2d_cp(lwline2->points, j);
2682 const POINT2D* b2 = getPoint2d_cp(lwline2->points, j+1);
2683
2684 geographic_point_init(a1->x, a1->y, &(e1.start));
2685 geographic_point_init(a2->x, a2->y, &(e1.end));
2686 geographic_point_init(b1->x, b1->y, &p2);
2687
2688 /* we already know, that the last point is on line1, so we're done */
2689 if ( j == lwline2->points->npoints - 1)
2690 {
2691 return LW_TRUE;
2692 }
2693 else if (start == LW_TRUE)
2694 {
2695 /* point is on current line1 edge, check next point in line2 */
2696 if ( edge_contains_point(&e1, &p2)) {
2697 j++;
2698 changed = LW_TRUE;
2699 }
2700
2701 geographic_point_init(a1->x, a1->y, &(e2.start));
2702 geographic_point_init(a2->x, b2->y, &(e2.end));
2703 geographic_point_init(a1->x, a1->y, &p1);
2704
2705 /* point is on current line2 edge, check next point in line1 */
2706 if ( edge_contains_point(&e2, &p1)) {
2707 i++;
2708 changed = LW_TRUE;
2709 }
2710
2711 /* no edge progressed -> point left one line */
2712 if ( changed == LW_FALSE )
2713 {
2714 LWDEBUG(4,"returning false, found point not covered by both lines");
2715 return LW_FALSE;
2716 }
2717 else
2718 {
2719 continue;
2720 }
2721 }
2722
2723 /* find first edge to cover line2 */
2724 if (edge_contains_point(&e1, &p2))
2725 {
2726 start = LW_TRUE;
2727 }
2728
2729 /* next line1 edge */
2730 i++;
2731 }
2732
2733 /* no uncovered point found */
2734 return LW_TRUE;
2735}
#define LW_FALSE
Definition liblwgeom.h:94
LWPOINT * lwline_get_lwpoint(const LWLINE *line, uint32_t where)
Returns freshly allocated LWPOINT that corresponds to the index where.
Definition lwline.c:319
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:93
int lwline_covers_lwpoint(const LWLINE *lwline, const LWPOINT *lwpoint)
return LW_TRUE if any of the line segments covers the point
void geographic_point_init(double lon, double lat, GEOGRAPHIC_POINT *g)
Initialize a geographic point.
Definition lwgeodetic.c:180
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:986
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:101
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:97
GEOGRAPHIC_POINT start
Definition lwgeodetic.h:64
GEOGRAPHIC_POINT end
Definition lwgeodetic.h:65
Two-point great circle segment from a to b.
Definition lwgeodetic.h:63
Point in spherical coordinates on the world.
Definition lwgeodetic.h:54
POINTARRAY * points
Definition liblwgeom.h:483
double y
Definition liblwgeom.h:390
double x
Definition liblwgeom.h:390
uint32_t npoints
Definition liblwgeom.h:427

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

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