From: Sandro Santilli Date: Thu, 30 Dec 2004 20:36:49 +0000 (+0000) Subject: Rewrote GEOSCentroid() to pass exception using an input arg, and return X-Git-Tag: pgis_1_0_0RC1~104 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e302c2cc3fc2a12f37dd05027762012d133d9bf9;p=postgis Rewrote GEOSCentroid() to pass exception using an input arg, and return NULL for EMPTY geom. git-svn-id: http://svn.osgeo.org/postgis/trunk@1200 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/lwgeom/lwgeom_geos.c b/lwgeom/lwgeom_geos.c index 8642d5f3a..4222474d5 100644 --- a/lwgeom/lwgeom_geos.c +++ b/lwgeom/lwgeom_geos.c @@ -82,7 +82,7 @@ extern char GEOSequals(Geometry *g1, Geometry*g2); extern char GEOSisSimple(Geometry *g1); extern char GEOSisRing(Geometry *g1); extern Geometry *GEOSpointonSurface(Geometry *g1); -extern Geometry *GEOSGetCentroid(Geometry *g); +extern Geometry *GEOSGetCentroid(Geometry *g, int *failure); extern bool GEOSHasZ(Geometry *g1); extern void GEOSSetSRID(Geometry *g, int SRID); @@ -963,6 +963,7 @@ Datum centroid(PG_FUNCTION_ARGS) { PG_LWGEOM *geom, *result; Geometry *geosgeom, *geosresult; + int failure; #ifdef PROFILE profstart(PROF_QRUN); @@ -983,15 +984,18 @@ Datum centroid(PG_FUNCTION_ARGS) #ifdef PROFILE profstart(PROF_GRUN); #endif - geosresult = GEOSGetCentroid(geosgeom); + geosresult = GEOSGetCentroid(geosgeom, &failure); #ifdef PROFILE profstop(PROF_GRUN); #endif if ( geosresult == NULL ) { + if ( failure ) { + GEOSdeleteGeometry(geosgeom); + elog(ERROR,"GEOS getCentroid() threw an error!"); + } GEOSdeleteGeometry(geosgeom); - elog(ERROR,"GEOS getCentroid() threw an error!"); PG_RETURN_NULL(); } diff --git a/lwgeom/lwgeom_geos_wrapper.cpp b/lwgeom/lwgeom_geos_wrapper.cpp index 355bfe561..03363a17a 100644 --- a/lwgeom/lwgeom_geos_wrapper.cpp +++ b/lwgeom/lwgeom_geos_wrapper.cpp @@ -153,7 +153,7 @@ extern "C" char GEOSisSimple(Geometry *g1); extern "C" char GEOSequals(Geometry *g1, Geometry*g2); extern "C" char GEOSisRing(Geometry *g1); extern "C" Geometry *GEOSpointonSurface(Geometry *g1); -extern "C" Geometry *GEOSGetCentroid(Geometry *g1); +extern "C" Geometry *GEOSGetCentroid(Geometry *g1, int *failure); extern "C" void NOTICE_MESSAGE(char *msg); extern "C" bool GEOSHasZ(Geometry *g1); @@ -1584,23 +1584,23 @@ const Geometry *GEOSGetInteriorRingN(Geometry *g1,int n) } } -Geometry *GEOSGetCentroid(Geometry *g) +Geometry *GEOSGetCentroid(Geometry *g, int *failure) { try{ Geometry *ret = g->getCentroid(); - if ( ret == NULL ) { - ret = geomFactory->createGeometryCollection(); - } + *failure = 0; return ret; } catch (GEOSException *ge) { + *failure = 1; NOTICE_MESSAGE((char *)ge->toString().c_str()); delete ge; return NULL; } catch(...) { + *failure = 1; return NULL; } }