PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ optimistic_overlap()

Datum optimistic_overlap ( PG_FUNCTION_ARGS  )

Definition at line 2712 of file lwgeom_functions_basic.c.

2713 {
2714  GSERIALIZED *pg_geom1 = PG_GETARG_GSERIALIZED_P(0);
2715  GSERIALIZED *pg_geom2 = PG_GETARG_GSERIALIZED_P(1);
2716  double dist = PG_GETARG_FLOAT8(2);
2717  GBOX g1_bvol;
2718  double calc_dist;
2719  LWGEOM *geom1 = lwgeom_from_gserialized(pg_geom1);
2720  LWGEOM *geom2 = lwgeom_from_gserialized(pg_geom2);
2721  gserialized_error_if_srid_mismatch(pg_geom1, pg_geom2, __func__);
2722 
2723  if (geom1->type != POLYGONTYPE)
2724  {
2725  elog(ERROR, "optimistic_overlap: first arg isn't a polygon\n");
2726  PG_RETURN_NULL();
2727  }
2728 
2729  if (geom2->type != POLYGONTYPE && geom2->type != MULTIPOLYGONTYPE)
2730  {
2731  elog(ERROR, "optimistic_overlap: 2nd arg isn't a [multi-]polygon\n");
2732  PG_RETURN_NULL();
2733  }
2734 
2735  /*bbox check */
2736  gserialized_get_gbox_p(pg_geom1, &g1_bvol);
2737 
2738  g1_bvol.xmin = g1_bvol.xmin - dist;
2739  g1_bvol.ymin = g1_bvol.ymin - dist;
2740  g1_bvol.xmax = g1_bvol.xmax + dist;
2741  g1_bvol.ymax = g1_bvol.ymax + dist;
2742 
2743  if ((g1_bvol.xmin > geom2->bbox->xmax) || (g1_bvol.xmax < geom2->bbox->xmin) ||
2744  (g1_bvol.ymin > geom2->bbox->ymax) || (g1_bvol.ymax < geom2->bbox->ymin))
2745  {
2746  PG_RETURN_BOOL(false); /*bbox not overlap */
2747  }
2748 
2749  /*
2750  * compute distances
2751  * should be a fast calc if they actually do intersect
2752  */
2753  calc_dist =
2754  DatumGetFloat8(DirectFunctionCall2(ST_Distance, PointerGetDatum(pg_geom1), PointerGetDatum(pg_geom2)));
2755 
2756  PG_RETURN_BOOL(calc_dist < dist);
2757 }
void gserialized_error_if_srid_mismatch(const GSERIALIZED *g1, const GSERIALIZED *g2, const char *funcname)
Definition: gserialized.c:403
int gserialized_get_gbox_p(const GSERIALIZED *g, GBOX *gbox)
Read the box from the GSERIALIZED or calculate it if necessary.
Definition: gserialized.c:65
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:239
#define MULTIPOLYGONTYPE
Definition: liblwgeom.h:122
#define POLYGONTYPE
Definition: liblwgeom.h:119
Datum ST_Distance(PG_FUNCTION_ARGS)
double ymax
Definition: liblwgeom.h:372
double xmax
Definition: liblwgeom.h:370
double ymin
Definition: liblwgeom.h:371
double xmin
Definition: liblwgeom.h:369
uint8_t type
Definition: liblwgeom.h:477
GBOX * bbox
Definition: liblwgeom.h:473

References LWGEOM::bbox, gserialized_error_if_srid_mismatch(), gserialized_get_gbox_p(), lwgeom_from_gserialized(), MULTIPOLYGONTYPE, POLYGONTYPE, ST_Distance(), LWGEOM::type, GBOX::xmax, GBOX::xmin, GBOX::ymax, and GBOX::ymin.

Here is the call graph for this function: