PostGIS  2.3.8dev-r@@SVN_REVISION@@

◆ LWGEOM_expand()

Datum LWGEOM_expand ( PG_FUNCTION_ARGS  )

Definition at line 1595 of file lwgeom_functions_basic.c.

References gbox_expand(), gbox_expand_xyzm(), dumpnode::geom, geometry_serialize(), LW_FAILURE, lwgeom_add_bbox(), lwgeom_calculate_gbox(), lwgeom_free(), lwgeom_from_gserialized(), lwgeom_get_srid(), lwgeom_has_m(), lwgeom_has_z(), lwgeom_is_empty(), lwgeom_set_srid(), LWGEOM_to_BOX(), lwpoly_as_lwgeom(), lwpoly_construct_rectangle(), GBOX::mmax, GBOX::mmin, PG_FUNCTION_INFO_V1(), GBOX::xmax, GBOX::xmin, GBOX::ymax, GBOX::ymin, GBOX::zmax, and GBOX::zmin.

Referenced by LWGEOM_makepoly().

1596 {
1597  GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
1598  LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
1599  int srid = lwgeom_get_srid(lwgeom);
1600  LWPOLY *poly;
1601  GSERIALIZED *result;
1602  GBOX gbox;
1603 
1604  POSTGIS_DEBUG(2, "LWGEOM_expand called.");
1605 
1606  /* Can't expand an empty */
1607  if ( lwgeom_is_empty(lwgeom) )
1608  {
1609  lwgeom_free(lwgeom);
1610  PG_RETURN_POINTER(geom);
1611  }
1612 
1613  /* Can't expand something with no gbox! */
1614  if ( LW_FAILURE == lwgeom_calculate_gbox(lwgeom, &gbox) )
1615  {
1616  lwgeom_free(lwgeom);
1617  PG_RETURN_POINTER(geom);
1618  }
1619 
1620  if (PG_NARGS() == 2)
1621  {
1622  /* Expand the box the same amount in all directions */
1623  double d = PG_GETARG_FLOAT8(1);
1624  gbox_expand(&gbox, d);
1625  }
1626  else
1627  {
1628  double dx = PG_GETARG_FLOAT8(1);
1629  double dy = PG_GETARG_FLOAT8(2);
1630  double dz = PG_GETARG_FLOAT8(3);
1631  double dm = PG_GETARG_FLOAT8(4);
1632 
1633  gbox_expand_xyzm(&gbox, dx, dy, dz, dm);
1634  }
1635 
1636  {
1637  POINT4D p1 = { gbox.xmin, gbox.ymin, gbox.zmin, gbox.mmin };
1638  POINT4D p2 = { gbox.xmin, gbox.ymax, gbox.zmin, gbox.mmin };
1639  POINT4D p3 = { gbox.xmax, gbox.ymax, gbox.zmax, gbox.mmax };
1640  POINT4D p4 = { gbox.xmax, gbox.ymin, gbox.zmax, gbox.mmax };
1641 
1642  poly = lwpoly_construct_rectangle(lwgeom_has_z(lwgeom), lwgeom_has_m(lwgeom), &p1, &p2, &p3, &p4);
1643  }
1644 
1646  lwgeom_set_srid(lwpoly_as_lwgeom(poly), srid);
1647 
1648  /* Construct GSERIALIZED */
1649  result = geometry_serialize(lwpoly_as_lwgeom(poly));
1650 
1652  lwgeom_free(lwgeom);
1653  PG_FREE_IF_COPY(geom, 0);
1654 
1655  PG_RETURN_POINTER(result);
1656 }
void gbox_expand_xyzm(GBOX *g, double dx, double dy, double dz, double dm)
Move the box minimums down and the maximums up by the distances provided.
Definition: g_box.c:126
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
void gbox_expand(GBOX *g, double d)
Move the box minimums down and the maximums up by the distance provided.
Definition: g_box.c:108
double xmax
Definition: liblwgeom.h:292
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1063
int32_t lwgeom_get_srid(const LWGEOM *geom)
Return SRID number.
Definition: lwgeom.c:835
int lwgeom_has_z(const LWGEOM *geom)
Return LW_TRUE if geometry has Z ordinates.
Definition: lwgeom.c:849
LWGEOM * lwpoly_as_lwgeom(const LWPOLY *obj)
Definition: lwgeom.c:252
#define LW_FAILURE
Definition: liblwgeom.h:78
int lwgeom_calculate_gbox(const LWGEOM *lwgeom, GBOX *gbox)
Calculate bounding box of a geometry, automatically taking into account whether it is cartesian or ge...
Definition: lwgeom.c:665
double zmax
Definition: liblwgeom.h:296
double ymin
Definition: liblwgeom.h:293
LWGEOM * geom
double xmin
Definition: liblwgeom.h:291
double ymax
Definition: liblwgeom.h:294
GSERIALIZED * geometry_serialize(LWGEOM *lwgeom)
double mmin
Definition: liblwgeom.h:297
double zmin
Definition: liblwgeom.h:295
void lwgeom_add_bbox(LWGEOM *lwgeom)
Compute a bbox if not already computed.
Definition: lwgeom.c:612
double mmax
Definition: liblwgeom.h:298
void lwgeom_set_srid(LWGEOM *geom, int srid)
Set the SRID on an LWGEOM For collections, only the parent gets an SRID, all the children get SRID_UN...
int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members) ...
Definition: lwgeom.c:1310
int lwgeom_has_m(const LWGEOM *geom)
Return LW_TRUE if geometry has M ordinates.
Definition: lwgeom.c:856
LWPOLY * lwpoly_construct_rectangle(char hasz, char hasm, POINT4D *p1, POINT4D *p2, POINT4D *p3, POINT4D *p4)
Definition: lwpoly.c:80
Here is the call graph for this function:
Here is the caller graph for this function: