3321{
3327 double tolerance;
3329 int custom_clip_envelope;
3330 int return_polygons;
3331
3332
3333 if (PG_ARGISNULL(0))
3334 PG_RETURN_NULL();
3335
3336
3337 if (PG_ARGISNULL(2))
3338 {
3339 lwpgerror("Tolerance must be a positive number.");
3340 PG_RETURN_NULL();
3341 }
3342
3343 tolerance = PG_GETARG_FLOAT8(2);
3344
3345 if (tolerance < 0)
3346 {
3347 lwpgerror("Tolerance must be a positive number.");
3348 PG_RETURN_NULL();
3349 }
3350
3351
3352 if (PG_ARGISNULL(3))
3353 {
3354 lwpgerror("return_polygons must be true or false.");
3355 PG_RETURN_NULL();
3356 }
3357 return_polygons = PG_GETARG_BOOL(3);
3358
3359
3360 custom_clip_envelope = !PG_ARGISNULL(1);
3361 if (custom_clip_envelope) {
3362 clip = PG_GETARG_GSERIALIZED_P(1);
3364 {
3365 lwpgerror("Could not determine envelope of clipping geometry.");
3366 PG_FREE_IF_COPY(clip, 1);
3367 PG_RETURN_NULL();
3368 }
3369 PG_FREE_IF_COPY(clip, 1);
3370 }
3371
3372
3373 input = PG_GETARG_GSERIALIZED_P(0);
3374
3376
3377 if(!lwgeom_input)
3378 {
3379 lwpgerror("Could not read input geometry.");
3380 PG_FREE_IF_COPY(input, 0);
3381 PG_RETURN_NULL();
3382 }
3383
3384 lwgeom_result =
lwgeom_voronoi_diagram(lwgeom_input, custom_clip_envelope ? &clip_envelope : NULL, tolerance, !return_polygons);
3386
3387 if (!lwgeom_result)
3388 {
3389 lwpgerror("Error computing Voronoi diagram.");
3390 PG_FREE_IF_COPY(input, 0);
3391 PG_RETURN_NULL();
3392 }
3393
3396
3397 PG_FREE_IF_COPY(input, 0);
3398 PG_RETURN_POINTER(result);
3399}
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
int gserialized_get_gbox_p(const GSERIALIZED *g, GBOX *gbox)
Read the box from the GSERIALIZED or calculate it if necessary.
void lwgeom_free(LWGEOM *geom)
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.
GSERIALIZED * geometry_serialize(LWGEOM *lwgeom)