PostGIS  2.3.8dev-r@@SVN_REVISION@@

◆ ST_ClipByBox2d()

Datum ST_ClipByBox2d ( PG_FUNCTION_ARGS  )

Definition at line 1349 of file postgis/lwgeom_geos.c.

References GBOX::flags, gbox_contains_2d(), gbox_overlaps_2d(), geometry_serialize(), lwgeom_clip_by_rect(), lwgeom_construct_empty(), lwgeom_free(), lwgeom_from_gserialized(), lwgeom_get_bbox(), POSTGIS_GEOS_VERSION, LWGEOM::srid, LWGEOM::type, GBOX::xmax, GBOX::xmin, GBOX::ymax, and GBOX::ymin.

Referenced by centroid().

1350 {
1351 #if POSTGIS_GEOS_VERSION < 35
1352 
1353  lwpgerror("The GEOS version this PostGIS binary "
1354  "was compiled against (%d) doesn't support "
1355  "'GEOSClipByRect' function (3.5.0+ required)",
1357  PG_RETURN_NULL();
1358 
1359 #else /* POSTGIS_GEOS_VERSION >= 35 */
1360 
1361  GSERIALIZED *geom1;
1362  GSERIALIZED *result;
1363  LWGEOM *lwgeom1, *lwresult ;
1364  const GBOX *bbox1;
1365  GBOX *bbox2;
1366 
1367  geom1 = PG_GETARG_GSERIALIZED_P(0);
1368  lwgeom1 = lwgeom_from_gserialized(geom1) ;
1369 
1370  bbox1 = lwgeom_get_bbox(lwgeom1);
1371  if ( ! bbox1 )
1372  {
1373  /* empty clips to empty, no matter rect */
1374  lwgeom_free(lwgeom1);
1375  PG_RETURN_POINTER(geom1);
1376  }
1377 
1378  /* WARNING: this is really a BOX2DF, use only xmin and ymin fields */
1379  bbox2 = (GBOX *)PG_GETARG_POINTER(1);
1380  bbox2->flags = 0;
1381 
1382  /* If bbox1 outside of bbox2, return empty */
1383  if ( ! gbox_overlaps_2d(bbox1, bbox2) )
1384  {
1385  lwresult = lwgeom_construct_empty(lwgeom1->type, lwgeom1->srid, 0, 0);
1386  lwgeom_free(lwgeom1);
1387  PG_FREE_IF_COPY(geom1, 0);
1388  result = geometry_serialize(lwresult) ;
1389  lwgeom_free(lwresult) ;
1390  PG_RETURN_POINTER(result);
1391  }
1392 
1393  /* if bbox1 is covered by bbox2, return lwgeom1 */
1394  if ( gbox_contains_2d(bbox2, bbox1) )
1395  {
1396  lwgeom_free(lwgeom1);
1397  PG_RETURN_POINTER(geom1);
1398  }
1399 
1400  lwresult = lwgeom_clip_by_rect(lwgeom1, bbox2->xmin, bbox2->ymin,
1401  bbox2->xmax, bbox2->ymax);
1402 
1403  lwgeom_free(lwgeom1);
1404  PG_FREE_IF_COPY(geom1, 0);
1405 
1406  if ( lwresult == NULL )
1407  PG_RETURN_NULL();
1408 
1409  result = geometry_serialize(lwresult) ;
1410  lwgeom_free(lwresult) ;
1411  PG_RETURN_POINTER(result);
1412 
1413 #endif /* POSTGIS_GEOS_VERSION >= 35 */
1414 }
#define POSTGIS_GEOS_VERSION
Definition: sqldefines.h:10
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
double xmax
Definition: liblwgeom.h:292
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1063
LWGEOM * lwgeom_clip_by_rect(const LWGEOM *geom1, double x0, double y0, double x1, double y1)
int gbox_contains_2d(const GBOX *g1, const GBOX *g2)
Return LW_TRUE if the first GBOX contains the second on the 2d plane, LW_FALSE otherwise.
Definition: g_box.c:351
int32_t srid
Definition: liblwgeom.h:398
double ymin
Definition: liblwgeom.h:293
double xmin
Definition: liblwgeom.h:291
const GBOX * lwgeom_get_bbox(const LWGEOM *lwgeom)
Get a non-empty geometry bounding box, computing and caching it if not already there.
Definition: lwgeom.c:653
double ymax
Definition: liblwgeom.h:294
LWGEOM * lwgeom_construct_empty(uint8_t type, int srid, char hasz, char hasm)
Definition: lwgeom.c:1820
uint8_t flags
Definition: liblwgeom.h:290
int gbox_overlaps_2d(const GBOX *g1, const GBOX *g2)
Return LW_TRUE if the GBOX overlaps on the 2d plane, LW_FALSE otherwise.
Definition: g_box.c:335
GSERIALIZED * geometry_serialize(LWGEOM *lwgeom)
uint8_t type
Definition: liblwgeom.h:395
Here is the call graph for this function:
Here is the caller graph for this function: