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

◆ lwgeom_covers_lwgeom_sphere()

int lwgeom_covers_lwgeom_sphere ( const LWGEOM lwgeom1,
const LWGEOM lwgeom2 
)
extern

Calculate covers predicate for two lwgeoms on the sphere.

Currently only handles point-in-polygon.

Definition at line 2413 of file lwgeodetic.c.

2414{
2415 int type1, type2;
2416 GBOX gbox1, gbox2;
2417 gbox1.flags = gbox2.flags = 0;
2418
2419 assert(lwgeom1);
2420 assert(lwgeom2);
2421
2422 type1 = lwgeom1->type;
2423 type2 = lwgeom2->type;
2424
2425 /* dim(geom2) > dim(geom1) always returns false (because geom2 is bigger) */
2426 if ( (type1 == POINTTYPE && type2 == LINETYPE)
2427 || (type1 == POINTTYPE && type2 == POLYGONTYPE)
2428 || (type1 == LINETYPE && type2 == POLYGONTYPE) )
2429 {
2430 LWDEBUG(4, "dimension of geom2 is bigger than geom1");
2431 return LW_FALSE;
2432 }
2433
2434 /* Make sure we have boxes */
2435 if ( lwgeom1->bbox )
2436 gbox1 = *(lwgeom1->bbox);
2437 else
2438 lwgeom_calculate_gbox_geodetic(lwgeom1, &gbox1);
2439
2440 /* Make sure we have boxes */
2441 if ( lwgeom2->bbox )
2442 gbox2 = *(lwgeom2->bbox);
2443 else
2444 lwgeom_calculate_gbox_geodetic(lwgeom2, &gbox2);
2445
2446
2447 /* Handle the polygon/point case */
2448 if ( type1 == POLYGONTYPE && type2 == POINTTYPE )
2449 {
2450 POINT2D pt_to_test;
2451 getPoint2d_p(((LWPOINT*)lwgeom2)->point, 0, &pt_to_test);
2452 return lwpoly_covers_point2d((LWPOLY*)lwgeom1, &pt_to_test);
2453 }
2454 else if ( type1 == POLYGONTYPE && type2 == LINETYPE)
2455 {
2456 return lwpoly_covers_lwline((LWPOLY*)lwgeom1, (LWLINE*)lwgeom2);
2457 }
2458 else if ( type1 == POLYGONTYPE && type2 == POLYGONTYPE)
2459 {
2460 return lwpoly_covers_lwpoly((LWPOLY*)lwgeom1, (LWPOLY*)lwgeom2);
2461 }
2462 else if ( type1 == LINETYPE && type2 == POINTTYPE)
2463 {
2464 return lwline_covers_lwpoint((LWLINE*)lwgeom1, (LWPOINT*)lwgeom2);
2465 }
2466 else if ( type1 == LINETYPE && type2 == LINETYPE)
2467 {
2468 return lwline_covers_lwline((LWLINE*)lwgeom1, (LWLINE*)lwgeom2);
2469 }
2470 else if ( type1 == POINTTYPE && type2 == POINTTYPE)
2471 {
2472 return lwpoint_same((LWPOINT*)lwgeom1, (LWPOINT*)lwgeom2);
2473 }
2474
2475 /* If any of the first argument parts covers the second argument, it's true */
2476 if ( lwtype_is_collection( type1 ) )
2477 {
2478 uint32_t i;
2479 LWCOLLECTION *col = (LWCOLLECTION*)lwgeom1;
2480
2481 for ( i = 0; i < col->ngeoms; i++ )
2482 {
2483 if ( lwgeom_covers_lwgeom_sphere(col->geoms[i], lwgeom2) )
2484 {
2485 return LW_TRUE;
2486 }
2487 }
2488 return LW_FALSE;
2489 }
2490
2491 /* Only if all of the second arguments are covered by the first argument is the condition true */
2492 if ( lwtype_is_collection( type2 ) )
2493 {
2494 uint32_t i;
2495 LWCOLLECTION *col = (LWCOLLECTION*)lwgeom2;
2496
2497 for ( i = 0; i < col->ngeoms; i++ )
2498 {
2499 if ( ! lwgeom_covers_lwgeom_sphere(lwgeom1, col->geoms[i]) )
2500 {
2501 return LW_FALSE;
2502 }
2503 }
2504 return LW_TRUE;
2505 }
2506
2507 /* Don't get here */
2508 lwerror("lwgeom_covers_lwgeom_sphere: reached end of function without resolution");
2509 return LW_FALSE;
2510
2511}
#define LW_FALSE
Definition liblwgeom.h:108
#define LINETYPE
Definition liblwgeom.h:117
int getPoint2d_p(const POINTARRAY *pa, uint32_t n, POINT2D *point)
Definition lwgeom_api.c:349
int lwtype_is_collection(uint8_t type)
Determine whether a type number is a collection or not.
Definition lwgeom.c:1087
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition liblwgeom.h:116
#define POLYGONTYPE
Definition liblwgeom.h:118
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:107
char lwpoint_same(const LWPOINT *p1, const LWPOINT *p2)
Definition lwpoint.c:264
int lwpoly_covers_point2d(const LWPOLY *poly, const POINT2D *pt_to_test)
Given a polygon (lon/lat decimal degrees) and point (lon/lat decimal degrees) and a guaranteed outsid...
int lwline_covers_lwpoint(const LWLINE *lwline, const LWPOINT *lwpoint)
return LW_TRUE if any of the line segments covers the point
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 poly...
int lwgeom_calculate_gbox_geodetic(const LWGEOM *geom, GBOX *gbox)
Calculate the geodetic bounding box for an LWGEOM.
int lwpoly_covers_lwline(const LWPOLY *poly, const LWLINE *line)
int lwgeom_covers_lwgeom_sphere(const LWGEOM *lwgeom1, const LWGEOM *lwgeom2)
Calculate covers predicate for two lwgeoms on the sphere.
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 ...
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:83
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition lwutil.c:190
lwflags_t flags
Definition liblwgeom.h:339
uint32_t ngeoms
Definition liblwgeom.h:566
LWGEOM ** geoms
Definition liblwgeom.h:561
uint8_t type
Definition liblwgeom.h:448
GBOX * bbox
Definition liblwgeom.h:444

References LWGEOM::bbox, GBOX::flags, LWCOLLECTION::geoms, getPoint2d_p(), LINETYPE, LW_FALSE, LW_TRUE, LWDEBUG, lwerror(), lwgeom_calculate_gbox_geodetic(), lwgeom_covers_lwgeom_sphere(), lwline_covers_lwline(), lwline_covers_lwpoint(), lwpoint_same(), lwpoly_covers_lwline(), lwpoly_covers_lwpoly(), lwpoly_covers_point2d(), lwtype_is_collection(), LWCOLLECTION::ngeoms, POINTTYPE, POLYGONTYPE, and LWGEOM::type.

Referenced by geography_coveredby(), geography_covers(), and lwgeom_covers_lwgeom_sphere().

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