]> granicus.if.org Git - postgis/commitdiff
Rewrote GEOSCentroid() to pass exception using an input arg, and return
authorSandro Santilli <strk@keybit.net>
Thu, 30 Dec 2004 20:36:49 +0000 (20:36 +0000)
committerSandro Santilli <strk@keybit.net>
Thu, 30 Dec 2004 20:36:49 +0000 (20:36 +0000)
NULL for EMPTY geom.

git-svn-id: http://svn.osgeo.org/postgis/trunk@1200 b70326c6-7e19-0410-871a-916f4a2858ee

lwgeom/lwgeom_geos.c
lwgeom/lwgeom_geos_wrapper.cpp

index 8642d5f3a4f53fec1be62c866616179fd4a07a32..4222474d570c049ea1f73fc545d28f836884ba21 100644 (file)
@@ -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(); 
        }
 
index 355bfe5611728e3cc057471d449319709424f08e..03363a17a21c19a7d7ce50e5e60e543bf92c4a55 100644 (file)
@@ -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;
        }
 }