PostGIS  2.2.8dev-r@@SVN_REVISION@@

◆ optimistic_overlap()

Datum optimistic_overlap ( PG_FUNCTION_ARGS  )

Definition at line 2401 of file lwgeom_functions_basic.c.

References LWGEOM::bbox, error_if_srid_mismatch(), FALSE, gserialized_get_gbox_p(), LWGEOM_affine(), lwgeom_from_gserialized(), LWGEOM_mindistance2d(), MULTIPOLYGONTYPE, PG_FUNCTION_INFO_V1(), POLYGONTYPE, LWGEOM::srid, LWGEOM::type, GBOX::xmax, GBOX::xmin, GBOX::ymax, and GBOX::ymin.

Referenced by LWGEOM_azimuth().

2402 {
2403  GSERIALIZED *pg_geom1 = PG_GETARG_GSERIALIZED_P(0);
2404  GSERIALIZED *pg_geom2 = PG_GETARG_GSERIALIZED_P(1);
2405  double dist = PG_GETARG_FLOAT8(2);
2406  GBOX g1_bvol;
2407  double calc_dist;
2408 
2409  LWGEOM *geom1 = lwgeom_from_gserialized(pg_geom1);
2410  LWGEOM *geom2 = lwgeom_from_gserialized(pg_geom2);
2411 
2412  error_if_srid_mismatch(geom1->srid, geom2->srid);
2413 
2414  if (geom1->type != POLYGONTYPE)
2415  {
2416  elog(ERROR,"optimistic_overlap: first arg isn't a polygon\n");
2417  PG_RETURN_NULL();
2418  }
2419 
2420  if (geom2->type != POLYGONTYPE && geom2->type != MULTIPOLYGONTYPE)
2421  {
2422  elog(ERROR,"optimistic_overlap: 2nd arg isn't a [multi-]polygon\n");
2423  PG_RETURN_NULL();
2424  }
2425 
2426  /*bbox check */
2427  gserialized_get_gbox_p(pg_geom1, &g1_bvol );
2428 
2429  g1_bvol.xmin = g1_bvol.xmin - dist;
2430  g1_bvol.ymin = g1_bvol.ymin - dist;
2431  g1_bvol.xmax = g1_bvol.xmax + dist;
2432  g1_bvol.ymax = g1_bvol.ymax + dist;
2433 
2434  if ( (g1_bvol.xmin > geom2->bbox->xmax) ||
2435  (g1_bvol.xmax < geom2->bbox->xmin) ||
2436  (g1_bvol.ymin > geom2->bbox->ymax) ||
2437  (g1_bvol.ymax < geom2->bbox->ymin) )
2438  {
2439  PG_RETURN_BOOL(FALSE); /*bbox not overlap */
2440  }
2441 
2442  /*
2443  * compute distances
2444  * should be a fast calc if they actually do intersect
2445  */
2446  calc_dist = DatumGetFloat8 ( DirectFunctionCall2(LWGEOM_mindistance2d, PointerGetDatum( pg_geom1 ), PointerGetDatum( pg_geom2 )));
2447 
2448  PG_RETURN_BOOL(calc_dist < dist);
2449 }
int gserialized_get_gbox_p(const GSERIALIZED *g, GBOX *box)
Read the bounding box off a serialization and calculate one if it is not already there.
Definition: g_serialized.c:371
GBOX * bbox
Definition: liblwgeom.h:382
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
#define POLYGONTYPE
Definition: liblwgeom.h:72
double xmax
Definition: liblwgeom.h:277
void error_if_srid_mismatch(int srid1, int srid2)
Definition: lwutil.c:341
int32_t srid
Definition: liblwgeom.h:383
double ymin
Definition: liblwgeom.h:278
double xmin
Definition: liblwgeom.h:276
double ymax
Definition: liblwgeom.h:279
#define MULTIPOLYGONTYPE
Definition: liblwgeom.h:75
#define FALSE
Definition: dbfopen.c:168
Datum LWGEOM_mindistance2d(PG_FUNCTION_ARGS)
uint8_t type
Definition: liblwgeom.h:380
Here is the call graph for this function:
Here is the caller graph for this function: