PostGIS  3.2.2dev-r@@SVN_REVISION@@

◆ lwgeom_delaunay_triangulation()

LWGEOM* lwgeom_delaunay_triangulation ( const LWGEOM geom,
double  tolerance,
int32_t  edgeOnly 
)

Take vertices of a geometry and build a delaunay triangulation on them.

Parameters
geomthe input geometry
tolerancean optional snapping tolerance for improved robustness
edgeOnlyif non-zero the result will be a MULTILINESTRING, otherwise it'll be a COLLECTION of polygons.

Definition at line 1956 of file liblwgeom/lwgeom_geos.c.

1957 {
1958  LWGEOM* result;
1959  int32_t srid = RESULT_SRID(geom);
1960  uint8_t is3d = FLAGS_GET_Z(geom->flags);
1961  GEOSGeometry *g1, *g3;
1962 
1963  if (output < 0 || output > 2)
1964  {
1965  lwerror("%s: invalid output type specified %d", __func__, output);
1966  return NULL;
1967  }
1968 
1969  if (srid == SRID_INVALID) return NULL;
1970 
1971  initGEOS(lwnotice, lwgeom_geos_error);
1972 
1973  if (!(g1 = LWGEOM2GEOS(geom, AUTOFIX))) GEOS_FAIL();
1974 
1975  /* if output != 1 we want polys */
1976  g3 = GEOSDelaunayTriangulation(g1, tolerance, output == 1);
1977 
1978  if (!g3) GEOS_FREE_AND_FAIL(g1);
1979  GEOSSetSRID(g3, srid);
1980 
1981  if (output == 2)
1982  {
1983  result = (LWGEOM*)lwtin_from_geos(g3, is3d);
1984  if (!result)
1985  {
1986  GEOS_FREE(g1, g3);
1987  lwerror("%s: cannot convert output geometry", __func__);
1988  return NULL;
1989  }
1990  lwgeom_set_srid(result, srid);
1991  }
1992  else if (!(result = GEOS2LWGEOM(g3, is3d)))
1993  GEOS_FREE_AND_FAIL(g1, g3);
1994 
1995  GEOS_FREE(g1, g3);
1996  return result;
1997 }
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition: cu_print.c:267
#define GEOS_FREE(...)
#define AUTOFIX
#define RESULT_SRID(...)
#define GEOS_FAIL()
#define GEOS_FREE_AND_FAIL(...)
GEOSGeometry * LWGEOM2GEOS(const LWGEOM *lwgeom, uint8_t autofix)
LWGEOM * GEOS2LWGEOM(const GEOSGeometry *geom, uint8_t want3d)
void lwgeom_geos_error(const char *fmt,...)
LWTIN * lwtin_from_geos(const GEOSGeometry *geom, uint8_t want3d)
#define SRID_INVALID
Definition: liblwgeom.h:233
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:1530
#define FLAGS_GET_Z(flags)
Definition: liblwgeom.h:179
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
void lwnotice(const char *fmt,...)
Write a notice out to the notice handler.
Definition: lwutil.c:177
lwflags_t flags
Definition: liblwgeom.h:475

References AUTOFIX, LWGEOM::flags, FLAGS_GET_Z, GEOS2LWGEOM(), GEOS_FAIL, GEOS_FREE, GEOS_FREE_AND_FAIL, lwerror(), LWGEOM2GEOS(), lwgeom_geos_error(), lwgeom_set_srid(), lwnotice(), lwtin_from_geos(), result, RESULT_SRID, and SRID_INVALID.

Referenced by ST_DelaunayTriangles(), and test_lwgeom_delaunay_triangulation().

Here is the call graph for this function:
Here is the caller graph for this function: