PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ LWGEOM_envelope()

Datum LWGEOM_envelope ( PG_FUNCTION_ARGS  )

Definition at line 1760 of file lwgeom_functions_basic.c.

1761 {
1762  GSERIALIZED *geom = PG_GETARG_GSERIALIZED_P(0);
1763  LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
1764  int32_t srid = lwgeom->srid;
1765  POINT4D pt;
1766  GBOX box;
1767  POINTARRAY *pa;
1769 
1770  if (lwgeom_is_empty(lwgeom))
1771  {
1772  /* must be the EMPTY geometry */
1773  PG_RETURN_POINTER(geom);
1774  }
1775 
1776  if (lwgeom_calculate_gbox(lwgeom, &box) == LW_FAILURE)
1777  {
1778  /* must be the EMPTY geometry */
1779  PG_RETURN_POINTER(geom);
1780  }
1781 
1782  /*
1783  * Alter envelope type so that a valid geometry is always
1784  * returned depending upon the size of the geometry. The
1785  * code makes the following assumptions:
1786  * - If the bounding box is a single point then return a
1787  * POINT geometry
1788  * - If the bounding box represents either a horizontal or
1789  * vertical line, return a LINESTRING geometry
1790  * - Otherwise return a POLYGON
1791  */
1792 
1793  if ((box.xmin == box.xmax) && (box.ymin == box.ymax))
1794  {
1795  /* Construct and serialize point */
1796  LWPOINT *point = lwpoint_make2d(srid, box.xmin, box.ymin);
1797  result = geometry_serialize(lwpoint_as_lwgeom(point));
1798  lwpoint_free(point);
1799  }
1800  else if ((box.xmin == box.xmax) || (box.ymin == box.ymax))
1801  {
1802  LWLINE *line;
1803  /* Construct point array */
1804  pa = ptarray_construct_empty(0, 0, 2);
1805 
1806  /* Assign coordinates to POINT2D array */
1807  pt.x = box.xmin;
1808  pt.y = box.ymin;
1809  ptarray_append_point(pa, &pt, LW_TRUE);
1810  pt.x = box.xmax;
1811  pt.y = box.ymax;
1812  ptarray_append_point(pa, &pt, LW_TRUE);
1813 
1814  /* Construct and serialize linestring */
1815  line = lwline_construct(srid, NULL, pa);
1816  result = geometry_serialize(lwline_as_lwgeom(line));
1817  lwline_free(line);
1818  }
1819  else
1820  {
1821  LWPOLY *poly;
1822  POINTARRAY **ppa = lwalloc(sizeof(POINTARRAY *));
1823  pa = ptarray_construct_empty(0, 0, 5);
1824  ppa[0] = pa;
1825 
1826  /* Assign coordinates to POINT2D array */
1827  pt.x = box.xmin;
1828  pt.y = box.ymin;
1829  ptarray_append_point(pa, &pt, LW_TRUE);
1830  pt.x = box.xmin;
1831  pt.y = box.ymax;
1832  ptarray_append_point(pa, &pt, LW_TRUE);
1833  pt.x = box.xmax;
1834  pt.y = box.ymax;
1835  ptarray_append_point(pa, &pt, LW_TRUE);
1836  pt.x = box.xmax;
1837  pt.y = box.ymin;
1838  ptarray_append_point(pa, &pt, LW_TRUE);
1839  pt.x = box.xmin;
1840  pt.y = box.ymin;
1841  ptarray_append_point(pa, &pt, LW_TRUE);
1842 
1843  /* Construct polygon */
1844  poly = lwpoly_construct(srid, NULL, 1, ppa);
1845  result = geometry_serialize(lwpoly_as_lwgeom(poly));
1846  lwpoly_free(poly);
1847  }
1848 
1849  PG_FREE_IF_COPY(geom, 0);
1850 
1851  PG_RETURN_POINTER(result);
1852 }
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition: cu_print.c:267
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:239
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition: lwgeom.c:339
LWPOINT * lwpoint_make2d(int32_t srid, double x, double y)
Definition: lwpoint.c:163
void lwpoint_free(LWPOINT *pt)
Definition: lwpoint.c:213
#define LW_FAILURE
Definition: liblwgeom.h:111
LWGEOM * lwpoly_as_lwgeom(const LWPOLY *obj)
Definition: lwgeom.c:329
LWLINE * lwline_construct(int32_t srid, GBOX *bbox, POINTARRAY *points)
Definition: lwline.c:42
LWGEOM * lwpoint_as_lwgeom(const LWPOINT *obj)
Definition: lwgeom.c:344
POINTARRAY * ptarray_construct_empty(char hasz, char hasm, uint32_t maxpoints)
Create a new POINTARRAY with no points.
Definition: ptarray.c:59
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:755
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 * lwalloc(size_t size)
Definition: lwutil.c:227
void lwpoly_free(LWPOLY *poly)
Definition: lwpoly.c:175
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:108
LWPOLY * lwpoly_construct(int32_t srid, GBOX *bbox, uint32_t nrings, POINTARRAY **points)
Definition: lwpoly.c:43
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:203
double ymax
Definition: liblwgeom.h:372
double xmax
Definition: liblwgeom.h:370
double ymin
Definition: liblwgeom.h:371
double xmin
Definition: liblwgeom.h:369
int32_t srid
Definition: liblwgeom.h:475
double x
Definition: liblwgeom.h:429
double y
Definition: liblwgeom.h:429

References 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(), result, LWGEOM::srid, POINT4D::x, GBOX::xmax, GBOX::xmin, POINT4D::y, GBOX::ymax, and GBOX::ymin.

Here is the call graph for this function: