PostGIS  2.5.7dev-r@@SVN_REVISION@@

◆ 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 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:77
#define LINETYPE
Definition: liblwgeom.h:86
int getPoint2d_p(const POINTARRAY *pa, uint32_t n, POINT2D *point)
Definition: lwgeom_api.c:348
int lwtype_is_collection(uint8_t type)
Determine whether a type number is a collection or not.
Definition: lwgeom.c:1093
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:85
#define POLYGONTYPE
Definition: liblwgeom.h:87
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:76
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...
Definition: lwgeodetic.c:2518
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:2757
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...
Definition: lwgeodetic.c:2602
int lwgeom_calculate_gbox_geodetic(const LWGEOM *geom, GBOX *gbox)
Calculate the geodetic bounding box for an LWGEOM.
Definition: lwgeodetic.c:3028
int lwpoly_covers_lwline(const LWPOLY *poly, const LWLINE *line)
Definition: lwgeodetic.c:2660
int lwgeom_covers_lwgeom_sphere(const LWGEOM *lwgeom1, const LWGEOM *lwgeom2)
Calculate covers predicate for two lwgeoms on the sphere.
Definition: lwgeodetic.c:2413
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 ...
Definition: lwgeodetic.c:2786
#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
uint8_t flags
Definition: liblwgeom.h:294
uint32_t ngeoms
Definition: liblwgeom.h:510
LWGEOM ** geoms
Definition: liblwgeom.h:512
uint8_t type
Definition: liblwgeom.h:399
GBOX * bbox
Definition: liblwgeom.h:401
unsigned int uint32_t
Definition: uthash.h:78

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_covers(), and lwgeom_covers_lwgeom_sphere().

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