]> granicus.if.org Git - postgis/commitdiff
Added null implementations of new GEOS-returning-geometry functions (ie.
authorDavid Blasby <dblasby@gmail.com>
Tue, 5 Aug 2003 18:27:21 +0000 (18:27 +0000)
committerDavid Blasby <dblasby@gmail.com>
Tue, 5 Aug 2003 18:27:21 +0000 (18:27 +0000)
buffer).

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

postgis_geos.c

index d1d03f2ed2c3d25933b5eb22d22aed880507a814..dc2c2c1010793093ed1a220d028994ddcd97f4ad 100644 (file)
@@ -7,9 +7,13 @@
  *
  * This is free software; you can redistribute and/or modify it under
  * the terms of hte GNU General Public Licence. See the COPYING file.
- * 
+ *
  **********************************************************************
  * $Log$
+ * Revision 1.6  2003/08/05 18:27:21  dblasby
+ * Added null implementations of new GEOS-returning-geometry functions (ie.
+ * buffer).
+ *
  * Revision 1.5  2003/08/01 23:58:08  dblasby
  * added the functionality to convert GEOS->PostGIS geometries.  Added those geos
  * functions to postgis.
@@ -22,7 +26,7 @@
 
 
 //--------------------------------------------------------------------------
-//  
+//
 #ifdef USE_GEOS
 
 #include "postgres.h"
@@ -117,7 +121,7 @@ Datum within(PG_FUNCTION_ARGS);
 Datum contains(PG_FUNCTION_ARGS);
 Datum overlaps(PG_FUNCTION_ARGS);
 Datum isvalid(PG_FUNCTION_ARGS);
+
 
 Datum buffer(PG_FUNCTION_ARGS);
 Datum intersection(PG_FUNCTION_ARGS);
@@ -142,7 +146,7 @@ LINE3D *LineFromGeometry(Geometry *g, int *size);
 
 //select geomunion('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))','POLYGON((5 5, 15 5, 15 7, 5 7, 5 5))');
 PG_FUNCTION_INFO_V1(geomunion);
-Datum geomunion(PG_FUNCTION_ARGS) 
+Datum geomunion(PG_FUNCTION_ARGS)
 {
                GEOMETRY                *geom1 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
                GEOMETRY                *geom2 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
@@ -165,13 +169,13 @@ Datum geomunion(PG_FUNCTION_ARGS)
                PG_RETURN_NULL(); //never get here
        }
 
-       
+
        empty = GEOSisEmpty(g3);
        if (empty ==2)
        {
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS union() threw an error (couldnt test empty on result)!");
                PG_RETURN_NULL(); //never get here
        }
@@ -187,16 +191,16 @@ Datum geomunion(PG_FUNCTION_ARGS)
        {
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS union() threw an error (result postgis geometry formation)!");
                PG_RETURN_NULL(); //never get here
        }
-               
-       
+
+
 
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
 
                PG_RETURN_POINTER(result);
 }
@@ -204,7 +208,7 @@ Datum geomunion(PG_FUNCTION_ARGS)
 
 // select symdifference('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))','POLYGON((5 5, 15 5, 15 7, 5 7, 5 5))');
 PG_FUNCTION_INFO_V1(symdifference);
-Datum symdifference(PG_FUNCTION_ARGS) 
+Datum symdifference(PG_FUNCTION_ARGS)
 {
                GEOMETRY                *geom1 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
                GEOMETRY                *geom2 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
@@ -227,13 +231,13 @@ Datum symdifference(PG_FUNCTION_ARGS)
                PG_RETURN_NULL(); //never get here
        }
 
-       
+
        empty = GEOSisEmpty(g3);
        if (empty ==2)
        {
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS symdifference() threw an error (couldnt test empty on result)!");
                PG_RETURN_NULL(); //never get here
        }
@@ -249,23 +253,23 @@ Datum symdifference(PG_FUNCTION_ARGS)
        {
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS symdifference() threw an error (result postgis geometry formation)!");
                PG_RETURN_NULL(); //never get here
        }
-               
-       
+
+
 
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
 
                PG_RETURN_POINTER(result);
 }
 
 
 PG_FUNCTION_INFO_V1(boundary);
-Datum boundary(PG_FUNCTION_ARGS) 
+Datum boundary(PG_FUNCTION_ARGS)
 {
                GEOMETRY                *geom1 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
 
@@ -285,12 +289,12 @@ Datum boundary(PG_FUNCTION_ARGS)
                PG_RETURN_NULL(); //never get here
        }
 
-       
+
        empty = GEOSisEmpty(g3);
        if (empty ==2)
        {
                GEOSdeleteGeometry(g1);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS bounary() threw an error (couldnt test empty on result)!");
                PG_RETURN_NULL(); //never get here
        }
@@ -306,21 +310,21 @@ Datum boundary(PG_FUNCTION_ARGS)
        {
                GEOSdeleteGeometry(g1);
 
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS bounary() threw an error (result postgis geometry formation)!");
                PG_RETURN_NULL(); //never get here
        }
-               
-       
+
+
 
                GEOSdeleteGeometry(g1);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
 
                PG_RETURN_POINTER(result);
 }
 
 PG_FUNCTION_INFO_V1(convexhull);
-Datum convexhull(PG_FUNCTION_ARGS) 
+Datum convexhull(PG_FUNCTION_ARGS)
 {
                GEOMETRY                *geom1 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
                char empty;
@@ -344,7 +348,7 @@ Datum convexhull(PG_FUNCTION_ARGS)
        if (empty ==2)
        {
                GEOSdeleteGeometry(g1);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS convexhull() threw an error (couldnt test empty on result)!");
                PG_RETURN_NULL(); //never get here
        }
@@ -359,19 +363,19 @@ Datum convexhull(PG_FUNCTION_ARGS)
        if (result == NULL)
        {
                GEOSdeleteGeometry(g1);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS convexhull() threw an error (result postgis geometry formation)!");
                PG_RETURN_NULL(); //never get here
        }
                GEOSdeleteGeometry(g1);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
 
                PG_RETURN_POINTER(result);
 
 }
 
 PG_FUNCTION_INFO_V1(buffer);
-Datum buffer(PG_FUNCTION_ARGS) 
+Datum buffer(PG_FUNCTION_ARGS)
 {
                GEOMETRY                *geom1 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
                double                  size   = PG_GETARG_FLOAT8(1);
@@ -396,7 +400,7 @@ Datum buffer(PG_FUNCTION_ARGS)
        if (empty ==2)
        {
                GEOSdeleteGeometry(g1);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS buffer() threw an error (couldnt test empty on result)!");
                PG_RETURN_NULL(); //never get here
        }
@@ -411,12 +415,12 @@ Datum buffer(PG_FUNCTION_ARGS)
        if (result == NULL)
        {
                GEOSdeleteGeometry(g1);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS buffer() threw an error (result postgis geometry formation)!");
                PG_RETURN_NULL(); //never get here
        }
                GEOSdeleteGeometry(g1);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
 
                PG_RETURN_POINTER(result);
 
@@ -437,7 +441,7 @@ Datum buffer(PG_FUNCTION_ARGS)
 //select intersection('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))','MULTILINESTRING((5 5, 10 10),(1 1, 2 2) )');
 //select intersection('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))','MULTIPOLYGON(((5 5, 15 5, 15 7, 5 7, 5 5)),((1 1,1 2,2 2,1 2, 1 1)))');
 PG_FUNCTION_INFO_V1(intersection);
-Datum intersection(PG_FUNCTION_ARGS) 
+Datum intersection(PG_FUNCTION_ARGS)
 {
                GEOMETRY                *geom1 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
                GEOMETRY                *geom2 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
@@ -460,13 +464,13 @@ Datum intersection(PG_FUNCTION_ARGS)
                PG_RETURN_NULL(); //never get here
        }
 
-       
+
        empty = GEOSisEmpty(g3);
        if (empty ==2)
        {
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS Intersection() threw an error (couldnt test empty on result)!");
                PG_RETURN_NULL(); //never get here
        }
@@ -482,23 +486,23 @@ Datum intersection(PG_FUNCTION_ARGS)
        {
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS Intersection() threw an error (result postgis geometry formation)!");
                PG_RETURN_NULL(); //never get here
        }
-               
-       
+
+
 
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
 
                PG_RETURN_POINTER(result);
 }
 
 //select difference('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))','POLYGON((5 5, 15 5, 15 7, 5 7, 5 5))');
 PG_FUNCTION_INFO_V1(difference);
-Datum difference(PG_FUNCTION_ARGS) 
+Datum difference(PG_FUNCTION_ARGS)
 {
                GEOMETRY                *geom1 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
                GEOMETRY                *geom2 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
@@ -521,13 +525,13 @@ Datum difference(PG_FUNCTION_ARGS)
                PG_RETURN_NULL(); //never get here
        }
 
-       
+
        empty = GEOSisEmpty(g3);
        if (empty ==2)
        {
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS difference() threw an error (couldnt test empty on result)!");
                PG_RETURN_NULL(); //never get here
        }
@@ -543,16 +547,16 @@ Datum difference(PG_FUNCTION_ARGS)
        {
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
                elog(ERROR,"GEOS difference() threw an error (result postgis geometry formation)!");
                PG_RETURN_NULL(); //never get here
        }
-               
-       
+
+
 
                GEOSdeleteGeometry(g1);
                GEOSdeleteGeometry(g2);
-               GEOSdeleteGeometry(g3); 
+               GEOSdeleteGeometry(g3);
 
                PG_RETURN_POINTER(result);
 }
@@ -562,7 +566,7 @@ Datum difference(PG_FUNCTION_ARGS)
 //----------------------------------------------
 
 
+
 void errorIfGeometryCollection(GEOMETRY *g1, GEOMETRY *g2)
 {
        if (  (g1->type == COLLECTIONTYPE) || (g2->type == COLLECTIONTYPE) )
@@ -570,7 +574,7 @@ void errorIfGeometryCollection(GEOMETRY *g1, GEOMETRY *g2)
 }
 
 PG_FUNCTION_INFO_V1(isvalid);
-Datum isvalid(PG_FUNCTION_ARGS) 
+Datum isvalid(PG_FUNCTION_ARGS)
 {
                GEOMETRY                *geom1 = (GEOMETRY *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
                bool result;
@@ -940,10 +944,10 @@ POLYGON3D *PolyFromGeometry(Geometry *g, int *size)
                POLYGON3D *poly;
                int npoints;
 
-       
+
                npoints =       GEOSGetNumCoordinate(g);
                pts = GEOSGetCoordinates(g);
-               if (npoints <3) 
+               if (npoints <3)
                {
                        GEOSdeleteChar( (char*) pts);
                        return NULL;
@@ -957,9 +961,9 @@ POLYGON3D *PolyFromGeometry(Geometry *g, int *size)
                        pts_per_ring[t+1] = GEOSGetNumCoordinate(GEOSGetInteriorRingN(g,t));
                }
 
-               
 
-               poly = make_polygon( ninteriorrings+1, pts_per_ring, 
+
+               poly = make_polygon( ninteriorrings+1, pts_per_ring,
                                                        pts, GEOSGetNumCoordinate(g), size);
 
 
@@ -978,7 +982,7 @@ LINE3D *LineFromGeometry(Geometry *g,int *size)
                LINE3D  *line;
                int npoints = GEOSGetNumCoordinate(g);
 
-               if (npoints <2) 
+               if (npoints <2)
                {
                        GEOSdeleteChar( (char*) pts);
                        return NULL;
@@ -1005,7 +1009,7 @@ GEOMETRY *GEOS2POSTGIS(Geometry *g,char want3d)
                                                        (char *) pt,
                                                           POINTTYPE,  want3d, GEOSGetSRID(g),1.0, 0.0, 0.0
                                                );
-               
+
 
                GEOSdeleteChar( (char*) pt);
                return result;
@@ -1018,7 +1022,7 @@ GEOMETRY *GEOS2POSTGIS(Geometry *g,char want3d)
                line = LineFromGeometry(g,&size);
                if (line == NULL)
                        return NULL;
-               
+
 
                result = make_oneobj_geometry(size,
                                                        (char *) line,
@@ -1032,7 +1036,7 @@ GEOMETRY *GEOS2POSTGIS(Geometry *g,char want3d)
                int size;
                POLYGON3D *poly;
 
-               
+
 
                poly = PolyFromGeometry(g,&size);
                if (poly == NULL)
@@ -1053,7 +1057,7 @@ GEOMETRY *GEOS2POSTGIS(Geometry *g,char want3d)
                g_new = NULL;
 
                ngeoms =        GEOSGetNumGeometries(g);
-               if (ngeoms ==0) 
+               if (ngeoms ==0)
                {
                        return NULL;
                }
@@ -1082,7 +1086,7 @@ GEOMETRY *GEOS2POSTGIS(Geometry *g,char want3d)
 
 
                ngeoms =        GEOSGetNumGeometries(g);
-               if (ngeoms ==0) 
+               if (ngeoms ==0)
                {
                        return NULL;
                }
@@ -1115,7 +1119,7 @@ GEOMETRY *GEOS2POSTGIS(Geometry *g,char want3d)
 
 
                ngeoms =        GEOSGetNumGeometries(g);
-               if (ngeoms ==0) 
+               if (ngeoms ==0)
                {
                        return NULL;
                }
@@ -1146,7 +1150,7 @@ GEOMETRY *GEOS2POSTGIS(Geometry *g,char want3d)
                GEOMETRY *geom, *g2, *r;
                int t;
 
-               if (ngeoms ==0) 
+               if (ngeoms ==0)
                {
                        return NULL;
                }
@@ -1159,8 +1163,8 @@ GEOMETRY *GEOS2POSTGIS(Geometry *g,char want3d)
                {
                        g2 = GEOS2POSTGIS(GEOSGetGeometryN(g,t) , want3d);
                        r = geom;
-                       geom = (GEOMETRY *)  
-                               DatumGetPointer( 
+                       geom = (GEOMETRY *)
+                               DatumGetPointer(
                                                DirectFunctionCall2(collector,
                                                                PointerGetDatum(geom),PointerGetDatum(g2)
                                                        )
@@ -1195,7 +1199,7 @@ Geometry *POSTGIS2GEOS(GEOMETRY *g)
 
        switch(g->type)
        {
-               case POINTTYPE: 
+               case POINTTYPE:
                                                        pt = (POINT3D*) ((char *) g +offsets1[0]) ;
                                                        result =  PostGIS2GEOS_point(pt,g->SRID,g->is3d);
                                                        if (result == NULL)
@@ -1204,7 +1208,7 @@ Geometry *POSTGIS2GEOS(GEOMETRY *g)
                                                        }
                                                        return result;
                                                        break;
-               case LINETYPE:          
+               case LINETYPE:
                                                        line = (LINE3D*) ((char *) g +offsets1[0]) ;
                                                        result =  PostGIS2GEOS_linestring(line,g->SRID,g->is3d);
                                                        if (result == NULL)
@@ -1213,7 +1217,7 @@ Geometry *POSTGIS2GEOS(GEOMETRY *g)
                                                        }
                                                        return result;
                                                        break;
-               case POLYGONTYPE:   
+               case POLYGONTYPE:
                                                        poly = (POLYGON3D*) ((char *) g +offsets1[0]) ;
                                                        result =  PostGIS2GEOS_polygon(poly,g->SRID,g->is3d);
                                                        if (result == NULL)
@@ -1322,7 +1326,7 @@ Geometry *POSTGIS2GEOS(GEOMETRY *g)
                                                        {
                                                                elog(ERROR,"Couldnt convert the postgis geometry to GEOS!");
                                                        }
-                                                       return geos; 
+                                                       return geos;
                                                        break;
 
        }
@@ -1361,6 +1365,61 @@ Datum contains(PG_FUNCTION_ARGS);
 Datum overlaps(PG_FUNCTION_ARGS);
 Datum isvalid(PG_FUNCTION_ARGS);
 
+
+Datum buffer(PG_FUNCTION_ARGS);
+Datum intersection(PG_FUNCTION_ARGS);
+Datum convexhull(PG_FUNCTION_ARGS);
+Datum difference(PG_FUNCTION_ARGS);
+Datum boundary(PG_FUNCTION_ARGS);
+Datum symdifference(PG_FUNCTION_ARGS);
+Datum geomunion(PG_FUNCTION_ARGS);
+
+PG_FUNCTION_INFO_V1(intersection);
+Datum intersection(PG_FUNCTION_ARGS)
+{
+       elog(ERROR,"intersection:: operation not implemented - compile PostGIS with GEOS support");
+       PG_RETURN_NULL(); // never get here
+}
+PG_FUNCTION_INFO_V1(convexhull);
+Datum convexhull(PG_FUNCTION_ARGS)
+{
+       elog(ERROR,"convexhull:: operation not implemented - compile PostGIS with GEOS support");
+       PG_RETURN_NULL(); // never get here
+}
+PG_FUNCTION_INFO_V1(difference);
+Datum difference(PG_FUNCTION_ARGS)
+{
+       elog(ERROR,"difference:: operation not implemented - compile PostGIS with GEOS support");
+       PG_RETURN_NULL(); // never get here
+}
+PG_FUNCTION_INFO_V1(boundary);
+Datum boundary(PG_FUNCTION_ARGS)
+{
+       elog(ERROR,"boundary:: operation not implemented - compile PostGIS with GEOS support");
+       PG_RETURN_NULL(); // never get here
+}
+PG_FUNCTION_INFO_V1(symdifference);
+Datum symdifference(PG_FUNCTION_ARGS)
+{
+       elog(ERROR,"symdifference:: operation not implemented - compile PostGIS with GEOS support");
+       PG_RETURN_NULL(); // never get here
+}
+PG_FUNCTION_INFO_V1(geomunion);
+Datum geomunion(PG_FUNCTION_ARGS)
+{
+       elog(ERROR,"geomunion:: operation not implemented - compile PostGIS with GEOS support");
+       PG_RETURN_NULL(); // never get here
+}
+
+PG_FUNCTION_INFO_V1(buffer);
+Datum buffer(PG_FUNCTION_ARGS)
+{
+       elog(ERROR,"buffer:: operation not implemented - compile PostGIS with GEOS support");
+       PG_RETURN_NULL(); // never get here
+}
+
+
+
 PG_FUNCTION_INFO_V1(relate_full);
 Datum relate_full(PG_FUNCTION_ARGS)
 {