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

◆ LWGEOM_envelope()

Datum LWGEOM_envelope ( PG_FUNCTION_ARGS  )

Definition at line 1700 of file lwgeom_functions_basic.c.

1701{
1702 GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
1703 LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
1704 int32_t srid = lwgeom->srid;
1705 POINT4D pt;
1706 GBOX box;
1707 POINTARRAY *pa;
1708 GSERIALIZED *result;
1709
1710 if (lwgeom_is_empty(lwgeom))
1711 {
1712 /* must be the EMPTY geometry */
1713 PG_RETURN_POINTER(geom);
1714 }
1715
1716 if (lwgeom_calculate_gbox(lwgeom, &box) == LW_FAILURE)
1717 {
1718 /* must be the EMPTY geometry */
1719 PG_RETURN_POINTER(geom);
1720 }
1721
1722 /*
1723 * Alter envelope type so that a valid geometry is always
1724 * returned depending upon the size of the geometry. The
1725 * code makes the following assumptions:
1726 * - If the bounding box is a single point then return a
1727 * POINT geometry
1728 * - If the bounding box represents either a horizontal or
1729 * vertical line, return a LINESTRING geometry
1730 * - Otherwise return a POLYGON
1731 */
1732
1733 if ((box.xmin == box.xmax) && (box.ymin == box.ymax))
1734 {
1735 /* Construct and serialize point */
1736 LWPOINT *point = lwpoint_make2d(srid, box.xmin, box.ymin);
1737 result = geometry_serialize(lwpoint_as_lwgeom(point));
1738 lwpoint_free(point);
1739 }
1740 else if ((box.xmin == box.xmax) || (box.ymin == box.ymax))
1741 {
1742 LWLINE *line;
1743 /* Construct point array */
1744 pa = ptarray_construct_empty(0, 0, 2);
1745
1746 /* Assign coordinates to POINT2D array */
1747 pt.x = box.xmin;
1748 pt.y = box.ymin;
1749 ptarray_append_point(pa, &pt, LW_TRUE);
1750 pt.x = box.xmax;
1751 pt.y = box.ymax;
1752 ptarray_append_point(pa, &pt, LW_TRUE);
1753
1754 /* Construct and serialize linestring */
1755 line = lwline_construct(srid, NULL, pa);
1756 result = geometry_serialize(lwline_as_lwgeom(line));
1757 lwline_free(line);
1758 }
1759 else
1760 {
1761 LWPOLY *poly;
1762 POINTARRAY **ppa = lwalloc(sizeof(POINTARRAY *));
1763 pa = ptarray_construct_empty(0, 0, 5);
1764 ppa[0] = pa;
1765
1766 /* Assign coordinates to POINT2D array */
1767 pt.x = box.xmin;
1768 pt.y = box.ymin;
1769 ptarray_append_point(pa, &pt, LW_TRUE);
1770 pt.x = box.xmin;
1771 pt.y = box.ymax;
1772 ptarray_append_point(pa, &pt, LW_TRUE);
1773 pt.x = box.xmax;
1774 pt.y = box.ymax;
1775 ptarray_append_point(pa, &pt, LW_TRUE);
1776 pt.x = box.xmax;
1777 pt.y = box.ymin;
1778 ptarray_append_point(pa, &pt, LW_TRUE);
1779 pt.x = box.xmin;
1780 pt.y = box.ymin;
1781 ptarray_append_point(pa, &pt, LW_TRUE);
1782
1783 /* Construct polygon */
1784 poly = lwpoly_construct(srid, NULL, 1, ppa);
1785 result = geometry_serialize(lwpoly_as_lwgeom(poly));
1786 lwpoly_free(poly);
1787 }
1788
1789 PG_FREE_IF_COPY(geom, 0);
1790
1791 PG_RETURN_POINTER(result);
1792}
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
LWGEOM * lwpoint_as_lwgeom(const LWPOINT *obj)
Definition lwgeom.c:326
void lwpoint_free(LWPOINT *pt)
Definition lwpoint.c:213
#define LW_FAILURE
Definition liblwgeom.h:110
POINTARRAY * ptarray_construct_empty(char hasz, char hasm, uint32_t maxpoints)
Create a new POINTARRAY with no points.
Definition ptarray.c:59
void * lwalloc(size_t size)
Definition lwutil.c:227
LWLINE * lwline_construct(int32_t srid, GBOX *bbox, POINTARRAY *points)
Definition lwline.c:42
LWPOINT * lwpoint_make2d(int32_t srid, double x, double y)
Definition lwpoint.c:163
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition lwgeom.c:321
LWPOLY * lwpoly_construct(int32_t srid, GBOX *bbox, uint32_t nrings, POINTARRAY **points)
Definition lwpoly.c:43
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:737
int ptarray_append_point(POINTARRAY *pa, const POINT4D *pt, int allow_duplicates)
Append a point to the end of an existing POINTARRAY If allow_duplicate is LW_FALSE,...
Definition ptarray.c:147
void lwpoly_free(LWPOLY *poly)
Definition lwpoly.c:175
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:107
LWGEOM * lwpoly_as_lwgeom(const LWPOLY *obj)
Definition lwgeom.c:311
void lwline_free(LWLINE *line)
Definition lwline.c:67
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:193
GSERIALIZED * geometry_serialize(LWGEOM *lwgeom)
double ymax
Definition liblwgeom.h:343
double xmax
Definition liblwgeom.h:341
double ymin
Definition liblwgeom.h:342
double xmin
Definition liblwgeom.h:340
int32_t srid
Definition liblwgeom.h:446
double x
Definition liblwgeom.h:400
double y
Definition liblwgeom.h:400

References geometry_serialize(), LW_FAILURE, LW_TRUE, lwalloc(), lwgeom_calculate_gbox(), lwgeom_from_gserialized(), lwgeom_is_empty(), lwline_as_lwgeom(), lwline_construct(), lwline_free(), lwpoint_as_lwgeom(), lwpoint_free(), lwpoint_make2d(), lwpoly_as_lwgeom(), lwpoly_construct(), lwpoly_free(), ptarray_append_point(), ptarray_construct_empty(), LWGEOM::srid, POINT4D::x, GBOX::xmax, GBOX::xmin, POINT4D::y, GBOX::ymax, and GBOX::ymin.

Here is the call graph for this function: