PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ lwgeom_voronoi_diagram()

LWGEOM* lwgeom_voronoi_diagram ( const LWGEOM g,
const GBOX env,
double  tolerance,
int  output_edges 
)

Take vertices of a geometry and build the Voronoi diagram.

Parameters
gthe input geometry
envan optional envelope for clipping the results
tolerancean optional snapping tolerance for improved robustness
output_edgesif non-zero the result will be a MULTILINESTRING, otherwise it'll be a COLLECTION of polygons.

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

1836 {
1837  uint32_t num_points = lwgeom_count_vertices(g);
1838  LWGEOM* lwgeom_result;
1839  char is_3d = LW_FALSE;
1840  int32_t srid = lwgeom_get_srid(g);
1841  GEOSCoordSequence* coords;
1842  GEOSGeometry* geos_geom;
1843  GEOSGeometry* geos_env = NULL;
1844  GEOSGeometry* geos_result;
1845 
1846  if (num_points < 2)
1847  {
1849  return lwcollection_as_lwgeom(empty);
1850  }
1851 
1852  initGEOS(lwnotice, lwgeom_geos_error);
1853 
1854  /* Instead of using the standard LWGEOM2GEOS transformer, we read the vertices of the LWGEOM directly and put
1855  * them into a single GEOS CoordinateSeq that can be used to define a LineString. This allows us to process
1856  * geometry types that may not be supported by GEOS, and reduces the memory requirements in cases of many
1857  * geometries with few points (such as LWMPOINT).*/
1858  coords = lwgeom_get_geos_coordseq_2d(g, num_points);
1859  if (!coords) return NULL;
1860 
1861  geos_geom = GEOSGeom_createLineString(coords);
1862  if (!geos_geom)
1863  {
1864  GEOSCoordSeq_destroy(coords);
1865  return NULL;
1866  }
1867 
1868  if (env) geos_env = GBOX2GEOS(env);
1869 
1870  geos_result = GEOSVoronoiDiagram(geos_geom, geos_env, tolerance, output_edges);
1871 
1872  GEOSGeom_destroy(geos_geom);
1873  if (env) GEOSGeom_destroy(geos_env);
1874 
1875  if (!geos_result)
1876  {
1877  lwerror("GEOSVoronoiDiagram: %s", lwgeom_geos_errmsg);
1878  return NULL;
1879  }
1880 
1881  lwgeom_result = GEOS2LWGEOM(geos_result, is_3d);
1882  GEOSGeom_destroy(geos_result);
1883 
1884  lwgeom_set_srid(lwgeom_result, srid);
1885 
1886  return lwgeom_result;
1887 }
char lwgeom_geos_errmsg[LWGEOM_GEOS_ERRMSG_MAXSIZE]
GEOSGeometry * GBOX2GEOS(const GBOX *box)
LWGEOM * GEOS2LWGEOM(const GEOSGeometry *geom, uint8_t want3d)
void lwgeom_geos_error(const char *fmt,...)
static GEOSCoordSequence * lwgeom_get_geos_coordseq_2d(const LWGEOM *g, uint32_t num_points)
#define LW_FALSE
Definition: liblwgeom.h:94
LWGEOM * lwcollection_as_lwgeom(const LWCOLLECTION *obj)
Definition: lwgeom.c:309
#define COLLECTIONTYPE
Definition: liblwgeom.h:108
int32_t lwgeom_get_srid(const LWGEOM *geom)
Return SRID number.
Definition: lwgeom.c:927
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:1610
uint32_t lwgeom_count_vertices(const LWGEOM *geom)
Count the total number of vertices in any LWGEOM.
Definition: lwgeom.c:1309
LWCOLLECTION * lwcollection_construct_empty(uint8_t type, int32_t srid, char hasz, char hasm)
Definition: lwcollection.c:92
void lwnotice(const char *fmt,...) __attribute__((format(printf
Write a notice out to the notice handler.
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.

References COLLECTIONTYPE, GBOX2GEOS(), GEOS2LWGEOM(), LW_FALSE, lwcollection_as_lwgeom(), lwcollection_construct_empty(), lwerror(), lwgeom_count_vertices(), lwgeom_geos_errmsg, lwgeom_geos_error(), lwgeom_get_geos_coordseq_2d(), lwgeom_get_srid(), lwgeom_set_srid(), and lwnotice().

Referenced by assert_empty_diagram(), ST_Voronoi(), test_lwgeom_voronoi_diagram(), and test_lwgeom_voronoi_diagram_custom_envelope().

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