Changeset: 903c4f141ef5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=903c4f141ef5
Modified Files:
        geom/monetdb5/geom.c
Branch: geo
Log Message:

new implementation for IsClosed which itertively checks geometries in 
multilinestring and geometry collection


diffs (106 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -3397,39 +3397,77 @@ static int wkbBasicBoolean(wkb **geom, c
 /* the function checks whether the geometry is closed. GEOS works only with
  * linestring geometries but PostGIS returns true in any geometry that is not
  * a linestring. I made it to be like PostGIS */
+static str geosIsClosed(bit *out, const GEOSGeometry *geosGeometry) {
+       int geometryType = GEOSGeomTypeId(geosGeometry)+1;
+       int i = 0;
+       str err;
+       int geometriesNum;
+
+       *out = bit_nil;
+
+       switch(geometryType) {
+               case -1:
+                       throw(MAL, "geom.IsClosed", "GEOSGeomTypeId failed");
+               case wkbPoint:
+               case wkbPolygon:
+               case wkbMultiPoint:
+               case wkbMultiPolygon:
+                       //In all these case it is always true
+                       *out = 1;
+                       break;
+               case wkbLineString:
+                       //check
+                       if((i = GEOSisClosed(geosGeometry)) == 2)
+                               throw(MAL, "geom.IsClosed", "GEOSisClosed 
failed");
+                       *out = i;
+                       break;
+               case wkbMultiLineString:
+               case wkbGeometryCollection:
+                       //check each one separately
+                       geometriesNum = GEOSGetNumGeometries(geosGeometry);
+                       if(geometriesNum < 0)
+                               throw(MAL, 
"geom.IsClosed","GEOSGetNumGeometries failed");
+
+                       for(i=0; i<geometriesNum; i++) {
+                               const GEOSGeometry *gN = 
GEOSGetGeometryN(geosGeometry, i);
+                               if(!gN)
+                                       throw(MAL, "geom.IsClosed", 
"GEOSGetGeometryN failed");
+                       
+                               if((err = geosIsClosed(out, gN)) != 
MAL_SUCCEED) {
+                                       str msg = createException(MAL, 
"geom.IsClosed", "%s", err);
+                                       GDKfree(err);
+                                       return msg;
+                               }
+
+                               if(!*out) //no reason to check further logical 
AND will always be 0
+                                       return MAL_SUCCEED;
+                       }
+
+                       break;
+               default:
+                       throw(MAL, "geom.IsClosed", "Unknown geometry type");
+       }
+
+       return MAL_SUCCEED;
+}
+
 str wkbIsClosed(bit *out, wkb **geom) {
-       int res = -1;
-       int geometryType = 0;
+       str err;
+
        GEOSGeom geosGeometry = wkb2geos(*geom);
-
-       *out = bit_nil;
-
        if (!geosGeometry)
                throw(MAL, "geom.IsClosed", "wkb2geos failed");
 
-       geometryType = GEOSGeomTypeId(geosGeometry)+1;
-
-       /* if the geometry is point or multipoint it is always closed */
-       if(geometryType == wkbPoint || geometryType == wkbMultiPoint) {
-               *out = 1;
+       if((err = geosIsClosed(out, geosGeometry)) != MAL_SUCCEED) {
+               str msg = createException(MAL, "geom.IsClosed", "%s", err);
+               GDKfree(err);
                GEOSGeom_destroy(geosGeometry);
-               return MAL_SUCCEED;     
-       }
-
-       /* if the geometry is not a point, multipoint or linestring, it is 
always not closed */
-       if(geometryType != wkbLineString) {
-               *out = 0;
-               GEOSGeom_destroy(geosGeometry);
-               return MAL_SUCCEED;     
-       }
-
-       
-       res = GEOSisClosed(geosGeometry);
+
+               return msg;
+       }       
+
        GEOSGeom_destroy(geosGeometry);
 
-       if(res == 2)
-               throw(MAL, "geom.IsClosed", "GEOSisClosed failed");
-       *out = res;
        return MAL_SUCCEED;
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to