PostGIS  3.1.6dev-r@@SVN_REVISION@@

◆ LWGEOM_segmentize2d()

Datum LWGEOM_segmentize2d ( PG_FUNCTION_ARGS  )

Definition at line 1807 of file lwgeom_functions_basic.c.

1808 {
1809  GSERIALIZED *outgeom, *ingeom;
1810  double dist;
1811  LWGEOM *inlwgeom, *outlwgeom;
1812  int type;
1813 
1814  POSTGIS_DEBUG(2, "LWGEOM_segmentize2d called");
1815 
1816  ingeom = PG_GETARG_GSERIALIZED_P(0);
1817  dist = PG_GETARG_FLOAT8(1);
1818  type = gserialized_get_type(ingeom);
1819 
1820  /* Avoid types we cannot segmentize. */
1821  if ((type == POINTTYPE) || (type == MULTIPOINTTYPE) || (type == TRIANGLETYPE) || (type == TINTYPE) ||
1823  {
1824  PG_RETURN_POINTER(ingeom);
1825  }
1826 
1827  if (dist <= 0)
1828  {
1829  /* Protect from knowingly infinite loops, see #1799 */
1830  /* Note that we'll end out of memory anyway for other small distances */
1831  elog(ERROR, "ST_Segmentize: invalid max_distance %g (must be >= 0)", dist);
1832  PG_RETURN_NULL();
1833  }
1834 
1835  LWGEOM_INIT();
1836 
1837  inlwgeom = lwgeom_from_gserialized(ingeom);
1838  if (lwgeom_is_empty(inlwgeom))
1839  {
1840  /* Should only happen on interruption */
1841  lwgeom_free(inlwgeom);
1842  PG_RETURN_POINTER(ingeom);
1843  }
1844 
1845  outlwgeom = lwgeom_segmentize2d(inlwgeom, dist);
1846  if (!outlwgeom)
1847  {
1848  /* Should only happen on interruption */
1849  PG_FREE_IF_COPY(ingeom, 0);
1850  PG_RETURN_NULL();
1851  }
1852 
1853  /* Copy input bounding box if any */
1854  if (inlwgeom->bbox)
1855  outlwgeom->bbox = gbox_copy(inlwgeom->bbox);
1856 
1857  outgeom = geometry_serialize(outlwgeom);
1858 
1859  // lwgeom_free(outlwgeom); /* TODO fix lwgeom_clone / ptarray_clone_deep for consistent semantics */
1860  lwgeom_free(inlwgeom);
1861 
1862  PG_FREE_IF_COPY(ingeom, 0);
1863 
1864  PG_RETURN_POINTER(outgeom);
1865 }
GBOX * gbox_copy(const GBOX *box)
Return a copy of the GBOX, based on dimensionality of flags.
Definition: gbox.c:426
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:239
uint32_t gserialized_get_type(const GSERIALIZED *g)
Extract the geometry type from the serialized form (it hides in the anonymous data area,...
Definition: gserialized.c:89
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1138
LWGEOM * lwgeom_segmentize2d(const LWGEOM *line, double dist)
Definition: lwgeom.c:754
#define MULTIPOINTTYPE
Definition: liblwgeom.h:119
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:116
#define TINTYPE
Definition: liblwgeom.h:130
#define POLYHEDRALSURFACETYPE
Definition: liblwgeom.h:128
#define TRIANGLETYPE
Definition: liblwgeom.h:129
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
type
Definition: ovdump.py:42
GBOX * bbox
Definition: liblwgeom.h:472

References LWGEOM::bbox, gbox_copy(), gserialized_get_type(), lwgeom_free(), lwgeom_from_gserialized(), lwgeom_is_empty(), lwgeom_segmentize2d(), MULTIPOINTTYPE, POINTTYPE, POLYHEDRALSURFACETYPE, TINTYPE, TRIANGLETYPE, and ovdump::type.

Here is the call graph for this function: