PostGIS  3.1.6dev-r@@SVN_REVISION@@

◆ ST_ClipByBox2d()

Datum ST_ClipByBox2d ( PG_FUNCTION_ARGS  )

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

1565 {
1566  static const uint32_t geom_idx = 0;
1567  static const uint32_t box2d_idx = 1;
1569  LWGEOM *lwgeom1, *lwresult ;
1570  GBOX bbox1 = {0};
1571  GBOX *bbox2;
1572  uint8_t type;
1573  int32_t srid;
1574  lwflags_t flags;
1575 
1576  if (!gserialized_datum_get_internals_p(PG_GETARG_DATUM(geom_idx), &bbox1, &flags, &type, &srid))
1577  {
1578  /* empty clips to empty, no matter rect */
1579  PG_RETURN_DATUM(PG_GETARG_DATUM(geom_idx));
1580  }
1581 
1582  /* WARNING: this is really a BOX2DF, use only xmin and ymin fields */
1583  bbox2 = (GBOX *)PG_GETARG_POINTER(box2d_idx);
1584  bbox2->flags = 0;
1585 
1586  /* if bbox1 is covered by bbox2, return lwgeom1 */
1587  if (gbox_contains_2d(bbox2, &bbox1))
1588  {
1589  PG_RETURN_DATUM(PG_GETARG_DATUM(geom_idx));
1590  }
1591 
1592  /* If bbox1 outside of bbox2, return empty */
1593  if (!gbox_overlaps_2d(&bbox1, bbox2))
1594  {
1595  /* Get type and srid from datum */
1596  lwresult = lwgeom_construct_empty(type, srid, 0, 0);
1597  result = geometry_serialize(lwresult) ;
1598  lwgeom_free(lwresult) ;
1599  PG_RETURN_POINTER(result);
1600  }
1601 
1602  lwgeom1 = lwgeom_from_gserialized(PG_GETARG_GSERIALIZED_P(geom_idx));
1603  lwresult = lwgeom_clip_by_rect(lwgeom1, bbox2->xmin, bbox2->ymin,
1604  bbox2->xmax, bbox2->ymax);
1605 
1606  lwgeom_free(lwgeom1);
1607 
1608  if (!lwresult)
1609  PG_RETURN_NULL();
1610 
1611  result = geometry_serialize(lwresult) ;
1612  PG_RETURN_POINTER(result);
1613 }
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition: cu_print.c:267
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: gbox.c:323
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: gbox.c:339
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:239
int gserialized_datum_get_internals_p(Datum gsdatum, GBOX *gbox, lwflags_t *flags, uint8_t *type, int32_t *srid)
Peak into a GSERIALIZED datum to find its bounding box and some other metadata.
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1138
uint16_t lwflags_t
Definition: liblwgeom.h:313
LWGEOM * lwgeom_clip_by_rect(const LWGEOM *geom1, double x0, double y0, double x1, double y1)
LWGEOM * lwgeom_construct_empty(uint8_t type, int32_t srid, char hasz, char hasm)
Definition: lwgeom.c:2082
type
Definition: ovdump.py:42
double ymax
Definition: liblwgeom.h:371
double xmax
Definition: liblwgeom.h:369
double ymin
Definition: liblwgeom.h:370
double xmin
Definition: liblwgeom.h:368
lwflags_t flags
Definition: liblwgeom.h:367

References GBOX::flags, gbox_contains_2d(), gbox_overlaps_2d(), gserialized_datum_get_internals_p(), lwgeom_clip_by_rect(), lwgeom_construct_empty(), lwgeom_free(), lwgeom_from_gserialized(), result, ovdump::type, GBOX::xmax, GBOX::xmin, GBOX::ymax, and GBOX::ymin.

Here is the call graph for this function: