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

◆ lwpoly_covers_lwpoly()

int lwpoly_covers_lwpoly ( const LWPOLY poly1,
const LWPOLY poly2 
)

Given a polygon1 check if all points of polygon2 are inside polygon1 and no intersections of the polygon edges occur.

return LW_TRUE if polygon is inside or on edge of polygon.

Definition at line 2602 of file lwgeodetic.c.

2603{
2604 uint32_t i;
2605
2606 /* Nulls and empties don't contain anything! */
2607 if ( ! poly1 || lwgeom_is_empty((LWGEOM*)poly1) )
2608 {
2609 LWDEBUG(4,"returning false, geometry1 is empty or null");
2610 return LW_FALSE;
2611 }
2612
2613 /* Nulls and empties don't contain anything! */
2614 if ( ! poly2 || lwgeom_is_empty((LWGEOM*)poly2) )
2615 {
2616 LWDEBUG(4,"returning false, geometry2 is empty or null");
2617 return LW_FALSE;
2618 }
2619
2620 /* check if all vertices of poly2 are inside poly1 */
2621 for (i = 0; i < poly2->nrings; i++)
2622 {
2623
2624 /* every other ring is a hole, check if point is inside the actual polygon */
2625 if ( i % 2 == 0)
2626 {
2627 if (LW_FALSE == lwpoly_covers_pointarray(poly1, poly2->rings[i]))
2628 {
2629 LWDEBUG(4,"returning false, geometry2 has point outside of geometry1");
2630 return LW_FALSE;
2631 }
2632 }
2633 else
2634 {
2635 if (LW_TRUE == lwpoly_covers_pointarray(poly1, poly2->rings[i]))
2636 {
2637 LWDEBUG(4,"returning false, geometry2 has point inside a hole of geometry1");
2638 return LW_FALSE;
2639 }
2640 }
2641 }
2642
2643 /* check for any edge intersections, so nothing is partially outside of poly1 */
2644 for (i = 0; i < poly2->nrings; i++)
2645 {
2646 if (LW_TRUE == lwpoly_intersects_line(poly1, poly2->rings[i]))
2647 {
2648 LWDEBUG(4,"returning false, geometry2 is partially outside of geometry1");
2649 return LW_FALSE;
2650 }
2651 }
2652
2653 /* no abort condition found, so the poly2 should be completly inside poly1 */
2654 return LW_TRUE;
2655}
#define LW_FALSE
Definition liblwgeom.h:108
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:107
int lwpoly_intersects_line(const LWPOLY *lwpoly, const POINTARRAY *line)
Checks if any edges of lwpoly intersect with the line formed by the pointarray return LW_TRUE if any ...
int lwpoly_covers_pointarray(const LWPOLY *lwpoly, const POINTARRAY *pta)
return LW_TRUE if all points are inside the polygon
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:83
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
Definition lwinline.h:193

References LW_FALSE, LW_TRUE, LWDEBUG, lwgeom_is_empty(), lwpoly_covers_pointarray(), lwpoly_intersects_line(), LWPOLY::nrings, and LWPOLY::rings.

Referenced by lwgeom_covers_lwgeom_sphere().

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