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

◆ lwgeom_covers_lwgeom_sphere()

int lwgeom_covers_lwgeom_sphere ( const LWGEOM lwgeom1,
const LWGEOM lwgeom2 
)

Calculate covers predicate for two lwgeoms on the sphere.

Currently only handles point-in-polygon.

Definition at line 2292 of file lwgeodetic.c.

2293{
2294 int type1, type2;
2295 GBOX gbox1, gbox2;
2296 gbox1.flags = gbox2.flags = 0;
2297
2298 assert(lwgeom1);
2299 assert(lwgeom2);
2300
2301 type1 = lwgeom1->type;
2302 type2 = lwgeom2->type;
2303
2304 /* dim(geom2) > dim(geom1) always returns false (because geom2 is bigger) */
2305 if ( (type1 == POINTTYPE && type2 == LINETYPE)
2306 || (type1 == POINTTYPE && type2 == POLYGONTYPE)
2307 || (type1 == LINETYPE && type2 == POLYGONTYPE) )
2308 {
2309 LWDEBUG(4, "dimension of geom2 is bigger than geom1");
2310 return LW_FALSE;
2311 }
2312
2313 /* Make sure we have boxes */
2314 if ( lwgeom1->bbox )
2315 gbox1 = *(lwgeom1->bbox);
2316 else
2317 lwgeom_calculate_gbox_geodetic(lwgeom1, &gbox1);
2318
2319 /* Make sure we have boxes */
2320 if ( lwgeom2->bbox )
2321 gbox2 = *(lwgeom2->bbox);
2322 else
2323 lwgeom_calculate_gbox_geodetic(lwgeom2, &gbox2);
2324
2325
2326 /* Handle the polygon/point case */
2327 if ( type1 == POLYGONTYPE && type2 == POINTTYPE )
2328 {
2329 POINT2D pt_to_test;
2330 getPoint2d_p(((LWPOINT*)lwgeom2)->point, 0, &pt_to_test);
2331 return lwpoly_covers_point2d((LWPOLY*)lwgeom1, &pt_to_test);
2332 }
2333 else if ( type1 == POLYGONTYPE && type2 == LINETYPE)
2334 {
2335 return lwpoly_covers_lwline((LWPOLY*)lwgeom1, (LWLINE*)lwgeom2);
2336 }
2337 else if ( type1 == POLYGONTYPE && type2 == POLYGONTYPE)
2338 {
2339 return lwpoly_covers_lwpoly((LWPOLY*)lwgeom1, (LWPOLY*)lwgeom2);
2340 }
2341 else if ( type1 == LINETYPE && type2 == POINTTYPE)
2342 {
2343 return lwline_covers_lwpoint((LWLINE*)lwgeom1, (LWPOINT*)lwgeom2);
2344 }
2345 else if ( type1 == LINETYPE && type2 == LINETYPE)
2346 {
2347 return lwline_covers_lwline((LWLINE*)lwgeom1, (LWLINE*)lwgeom2);
2348 }
2349 else if ( type1 == POINTTYPE && type2 == POINTTYPE)
2350 {
2351 return lwpoint_same((LWPOINT*)lwgeom1, (LWPOINT*)lwgeom2);
2352 }
2353
2354 /* If any of the first argument parts covers the second argument, it's true */
2355 if ( lwtype_is_collection( type1 ) )
2356 {
2357 uint32_t i;
2358 LWCOLLECTION *col = (LWCOLLECTION*)lwgeom1;
2359
2360 for ( i = 0; i < col->ngeoms; i++ )
2361 {
2362 if ( lwgeom_covers_lwgeom_sphere(col->geoms[i], lwgeom2) )
2363 {
2364 return LW_TRUE;
2365 }
2366 }
2367 return LW_FALSE;
2368 }
2369
2370 /* Only if all of the second arguments are covered by the first argument is the condition true */
2371 if ( lwtype_is_collection( type2 ) )
2372 {
2373 uint32_t i;
2374 LWCOLLECTION *col = (LWCOLLECTION*)lwgeom2;
2375
2376 for ( i = 0; i < col->ngeoms; i++ )
2377 {
2378 if ( ! lwgeom_covers_lwgeom_sphere(lwgeom1, col->geoms[i]) )
2379 {
2380 return LW_FALSE;
2381 }
2382 }
2383 return LW_TRUE;
2384 }
2385
2386 /* Don't get here */
2387 lwerror("lwgeom_covers_lwgeom_sphere: reached end of function without resolution");
2388 return LW_FALSE;
2389
2390}
#define LW_FALSE
Definition liblwgeom.h:94
#define LINETYPE
Definition liblwgeom.h:103
int getPoint2d_p(const POINTARRAY *pa, uint32_t n, POINT2D *point)
Definition lwgeom_api.c:342
int lwtype_is_collection(uint8_t type)
Determine whether a type number is a collection or not.
Definition lwgeom.c:1196
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition liblwgeom.h:102
#define POLYGONTYPE
Definition liblwgeom.h:104
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:93
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:101
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
lwflags_t flags
Definition liblwgeom.h:353
uint32_t ngeoms
Definition liblwgeom.h:580
LWGEOM ** geoms
Definition liblwgeom.h:575
uint8_t type
Definition liblwgeom.h:462
GBOX * bbox
Definition liblwgeom.h:458

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: