PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ LWGEOM_expand()

Datum LWGEOM_expand ( PG_FUNCTION_ARGS  )

Definition at line 1628 of file lwgeom_functions_basic.c.

1629{
1630 GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
1631 LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
1632 int32_t srid = lwgeom_get_srid(lwgeom);
1633 LWPOLY *poly;
1635 GBOX gbox;
1636
1637 POSTGIS_DEBUG(2, "LWGEOM_expand called.");
1638
1639 /* Can't expand an empty */
1640 if (lwgeom_is_empty(lwgeom))
1641 {
1642 lwgeom_free(lwgeom);
1643 PG_RETURN_POINTER(geom);
1644 }
1645
1646 /* Can't expand something with no gbox! */
1647 if (LW_FAILURE == lwgeom_calculate_gbox(lwgeom, &gbox))
1648 {
1649 lwgeom_free(lwgeom);
1650 PG_RETURN_POINTER(geom);
1651 }
1652
1653 if (PG_NARGS() == 2)
1654 {
1655 /* Expand the box the same amount in all directions */
1656 double d = PG_GETARG_FLOAT8(1);
1657 gbox_expand(&gbox, d);
1658 }
1659 else
1660 {
1661 double dx = PG_GETARG_FLOAT8(1);
1662 double dy = PG_GETARG_FLOAT8(2);
1663 double dz = PG_GETARG_FLOAT8(3);
1664 double dm = PG_GETARG_FLOAT8(4);
1665
1666 gbox_expand_xyzm(&gbox, dx, dy, dz, dm);
1667 }
1668
1669 {
1670 POINT4D p1 = {gbox.xmin, gbox.ymin, gbox.zmin, gbox.mmin};
1671 POINT4D p2 = {gbox.xmin, gbox.ymax, gbox.zmin, gbox.mmin};
1672 POINT4D p3 = {gbox.xmax, gbox.ymax, gbox.zmax, gbox.mmax};
1673 POINT4D p4 = {gbox.xmax, gbox.ymin, gbox.zmax, gbox.mmax};
1674
1675 poly = lwpoly_construct_rectangle(lwgeom_has_z(lwgeom), lwgeom_has_m(lwgeom), &p1, &p2, &p3, &p4);
1676 }
1677
1679 lwgeom_set_srid(lwpoly_as_lwgeom(poly), srid);
1680
1681 /* Construct GSERIALIZED */
1682 result = geometry_serialize(lwpoly_as_lwgeom(poly));
1683
1685 lwgeom_free(lwgeom);
1686 PG_FREE_IF_COPY(geom, 0);
1687
1688 PG_RETURN_POINTER(result);
1689}
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition cu_print.c:267
void gbox_expand(GBOX *g, double d)
Move the box minimums down and the maximums up by the distance provided.
Definition gbox.c:97
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 gbox.c:115
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
int32_t lwgeom_get_srid(const LWGEOM *geom)
Return SRID number.
Definition lwgeom.c:955
void lwgeom_set_srid(LWGEOM *geom, int32_t srid)
Set the SRID on an LWGEOM For collections, only the parent gets an SRID, all the children get SRID_UN...
Definition lwgeom.c:1638
#define LW_FAILURE
Definition liblwgeom.h:96
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1246
int lwgeom_has_z(const LWGEOM *geom)
Return LW_TRUE if geometry has Z ordinates.
Definition lwgeom.c:962
LWPOLY * lwpoly_construct_rectangle(char hasz, char hasm, POINT4D *p1, POINT4D *p2, POINT4D *p3, POINT4D *p4)
Definition lwpoly.c:80
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:783
int lwgeom_has_m(const LWGEOM *geom)
Return LW_TRUE if geometry has M ordinates.
Definition lwgeom.c:969
LWGEOM * lwpoly_as_lwgeom(const LWPOLY *obj)
Definition lwgeom.c:357
void lwgeom_add_bbox(LWGEOM *lwgeom)
Compute a bbox if not already computed.
Definition lwgeom.c:723
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
Definition lwinline.h:199
double ymax
Definition liblwgeom.h:357
double zmax
Definition liblwgeom.h:359
double xmax
Definition liblwgeom.h:355
double zmin
Definition liblwgeom.h:358
double mmax
Definition liblwgeom.h:361
double ymin
Definition liblwgeom.h:356
double xmin
Definition liblwgeom.h:354
double mmin
Definition liblwgeom.h:360

References gbox_expand(), gbox_expand_xyzm(), 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(), lwpoly_as_lwgeom(), lwpoly_construct_rectangle(), GBOX::mmax, GBOX::mmin, result, GBOX::xmax, GBOX::xmin, GBOX::ymax, GBOX::ymin, GBOX::zmax, and GBOX::zmin.

Here is the call graph for this function: