267{
268#if POSTGIS_GEOS_VERSION < 30900
269
270 lwpgerror("The GEOS version this PostGIS binary "
271 "was compiled against (%d) doesn't support "
272 "'GEOSMaximumInscribedCircle' function (3.9.0+ required)",
274 PG_RETURN_NULL();
275
276#else
280 TupleDesc resultTupleDesc;
281 HeapTuple resultTuple;
283 Datum result_values[3];
284 bool result_is_null[3];
285 double radius = 0.0;
287 bool is3d;
288
289 if (PG_ARGISNULL(0))
290 PG_RETURN_NULL();
291
292 geom = PG_GETARG_GSERIALIZED_P(0);
295
296
298 {
301 center = geometry_serialize(lwcenter);
302 nearest = geometry_serialize(lwnearest);
303 radius = 0.0;
304 }
305 else
306 {
307 GEOSGeometry *ginput, *gcircle, *gcenter, *gnearest;
308 double width, height, size, tolerance;
310 int gtype;
314 {
315 lwpgerror("Geometry contains invalid coordinates");
316 PG_RETURN_NULL();
317 }
319
321 PG_RETURN_NULL();
322
325 size = width > height ? width : height;
326 tolerance = size / 1000.0;
327
329
331 if (!ginput)
333
336 {
337 gcircle = GEOSMaximumInscribedCircle(ginput, tolerance);
338 if (!gcircle)
339 {
340 lwpgerror("Error calculating GEOSMaximumInscribedCircle.");
341 GEOSGeom_destroy(ginput);
342 PG_RETURN_NULL();
343 }
344 }
345 else
346 {
347 gcircle = GEOSLargestEmptyCircle(ginput, NULL, tolerance);
348 if (!gcircle)
349 {
350 lwpgerror("Error calculating GEOSLargestEmptyCircle.");
351 GEOSGeom_destroy(ginput);
352 PG_RETURN_NULL();
353 }
354 }
355
356 gcenter = GEOSGeomGetStartPoint(gcircle);
357 gnearest = GEOSGeomGetEndPoint(gcircle);
358 GEOSDistance(gcenter, gnearest, &radius);
359 GEOSSetSRID(gcenter, srid);
360 GEOSSetSRID(gnearest, srid);
361
364 GEOSGeom_destroy(gcenter);
365 GEOSGeom_destroy(gnearest);
366 GEOSGeom_destroy(gcircle);
367 GEOSGeom_destroy(ginput);
368 }
369
370 get_call_result_type(fcinfo, NULL, &resultTupleDesc);
371 BlessTupleDesc(resultTupleDesc);
372
373 result_values[0] = PointerGetDatum(center);
374 result_is_null[0] = false;
375 result_values[1] = PointerGetDatum(nearest);
376 result_is_null[1] = false;
377 result_values[2] = Float8GetDatum(radius);
378 result_is_null[2] = false;
379 resultTuple = heap_form_tuple(resultTupleDesc, result_values, result_is_null);
380
381 result = HeapTupleGetDatum(resultTuple);
382
384
385#endif
386}
char result[OUT_DOUBLE_BUFFER_SIZE]
int32_t gserialized_get_srid(const GSERIALIZED *g)
Extract the SRID from the serialized form (it is packed into three bytes so this is a handy function)...
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.
int gserialized_is_empty(const GSERIALIZED *g)
Check if a GSERIALIZED is empty without deserializing first.
int gserialized_has_z(const GSERIALIZED *g)
Check if a GSERIALIZED has a Z ordinate.
uint32_t gserialized_get_type(const GSERIALIZED *g)
Extract the geometry type from the serialized form (it hides in the anonymous data area,...
void lwgeom_geos_error(const char *fmt,...)
void lwgeom_free(LWGEOM *geom)
int lwgeom_isfinite(const LWGEOM *lwgeom)
Check if a LWGEOM has any non-finite (NaN or Inf) coordinates.
LWPOINT * lwpoint_construct_empty(int32_t srid, char hasz, char hasm)
#define SRID_UNKNOWN
Unknown SRID value.
GSERIALIZED * GEOS2POSTGIS(GEOSGeom geom, char want3d)
GEOSGeometry * POSTGIS2GEOS(const GSERIALIZED *pglwgeom)
#define HANDLE_GEOS_ERROR(label)
#define POSTGIS_GEOS_VERSION