PostGIS  2.3.8dev-r@@SVN_REVISION@@

◆ LWGEOM_envelope()

Datum LWGEOM_envelope ( PG_FUNCTION_ARGS  )

Definition at line 1696 of file lwgeom_functions_basic.c.

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

Referenced by LWGEOM_to_BOX().

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