Changeset: 8c77d2cddb4a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8c77d2cddb4a
Modified Files:
        geom/monetdb5/sfcgal.c
        geom/monetdb5/sfcgal.h
        geom/monetdb5/sfcgal.mal
Branch: sfcgal
Log Message:

geom_sfcgal_triangulate2DZ added. When converting from a sfcgal geom to geom, a 
triangle should be return as a collection of polygons or multistrings, or TINs. 
Fix some MAL exceptions.


diffs (153 lines):

diff --git a/geom/monetdb5/sfcgal.c b/geom/monetdb5/sfcgal.c
--- a/geom/monetdb5/sfcgal.c
+++ b/geom/monetdb5/sfcgal.c
@@ -57,7 +57,8 @@ sfcgal_type_to_geom_type(int *res, sfcga
 
         case SFCGAL_TYPE_TRIANGULATEDSURFACE:
         case SFCGAL_TYPE_TRIANGLE:
-            *res = wkbTin_mdb;
+            *res = wkbGeometryCollection_mdb;
+            //*res = wkbTin_mdb;
             break;
 
         default:
@@ -111,7 +112,7 @@ ring_from_sfcgal(GEOSGeom *res, const sf
 }
 
 str
-sfcgal_to_geom(GEOSGeom *res, const sfcgal_geometry_t* geom, int force3D, int 
srid)
+sfcgal_to_geom(GEOSGeom *res, const sfcgal_geometry_t* geom, int force3D, int 
srid, int flags)
 {
     uint32_t ngeoms, nshells, npoints;
     double point_x, point_y, point_z;
@@ -203,8 +204,8 @@ sfcgal_to_geom(GEOSGeom *res, const sfcg
                 *res = NULL;
                 break;
             }
-
-            npoints = sfcgal_linestring_num_points(geom);
+            
+            npoints = 4;
             //create the coordSeq for the new geometry
             if (!(outCoordSeq = GEOSCoordSeq_create(npoints, want3d ? 3 : 2))) 
{
                 *res = NULL;
@@ -216,23 +217,43 @@ sfcgal_to_geom(GEOSGeom *res, const sfcg
                 const sfcgal_geometry_t* pt = sfcgal_triangle_vertex(geom, 
(i%3));
                 point_x = sfcgal_point_x(pt);
                 point_y = sfcgal_point_y(pt);
-                GEOSCoordSeq_setX(outCoordSeq, i, point_x);
-                GEOSCoordSeq_setY(outCoordSeq, i, point_y);
+                   GEOSCoordSeq_setOrdinate(outCoordSeq, i, 0, point_x);
+                   GEOSCoordSeq_setOrdinate(outCoordSeq, i, 1, point_y);
 
                 if ( sfcgal_geometry_is_3d(geom)) {
                     point_z = sfcgal_point_z(pt);
-                    GEOSCoordSeq_setZ(outCoordSeq, i, point_z);
+                       GEOSCoordSeq_setOrdinate(outCoordSeq, i, 2, point_z);
                 } else if (want3d) {
                     point_z = 0.0;
-                    GEOSCoordSeq_setZ(outCoordSeq, i, point_z);
+                       GEOSCoordSeq_setOrdinate(outCoordSeq, i, 2, point_z);
                 }
 
             }
-            if (!(outGeometry = GEOSGeom_createLineString(outCoordSeq))) {
-                *res = NULL;
-                throw(MAL, "sfcgal_to_geom", "GEOSGeom_createLineString 
failed");
+
+            //Collection of Polygons
+            if (flags == 0) {
+                if (!(outGeometry = GEOSGeom_createLinearRing(outCoordSeq))) {
+                    *res = NULL;
+                    throw(MAL, "sfcgal_to_geom", "GEOSGeom_createLineString 
failed");
+                }
+                *res = GEOSGeom_createPolygon(outGeometry, NULL, 0);
             }
-            *res = outGeometry;
+
+            //Collection of MultiStrings
+            if (flags == 1) {
+                if (!(outGeometry = GEOSGeom_createLineString(outCoordSeq))) {
+                    *res = NULL;
+                    throw(MAL, "sfcgal_to_geom", "GEOSGeom_createLineString 
failed");
+                }
+                *res = outGeometry;
+            }
+            
+            //TIN
+            if (flags == 2) {
+                    *res = NULL;
+                    throw(MAL, "sfcgal_to_geom", "TIN format is not yet 
supported");
+            }
+
             break;
         case SFCGAL_TYPE_POLYGON:
             if (sfcgal_geometry_is_empty(geom)) {
@@ -739,10 +760,46 @@ geom_sfcgal_tesselate(wkb **res, wkb **g
     if ( sfcgal_to_geom(&outGeos, outGeom, 0, srid) != MAL_SUCCEED) {
                *res = NULL;
         //TODO: free ret
-               return createException(MAL, "geom.Extrude", "GEOSExtrude 
failed");
+               return createException(MAL, "geom.Tesselate", "GEOSTesselate 
failed");
     }
 
        *res = geos2wkb(outGeos);
        return MAL_SUCCEED;
 }
 
+str
+geom_sfcgal_triangulate2DZ(wkb **res, wkb **geom)
+{
+       sfcgal_geometry_t *outGeom, *inGeom;
+       GEOSGeom inGeos = wkb2geos(*geom), outGeos;
+    int srid;
+
+    if (wkbGetSRID(&srid, geom) != MAL_SUCCEED) {
+               *res = NULL;
+        //TODO: free ret
+               return createException(MAL, "geom.Triangulate2DZ", 
"GEOSTriangulate2DZ failed");
+    }
+
+       if (geom_to_sfcgal(&inGeom, inGeos) != MAL_SUCCEED) {
+               *res = NULL;
+        //TODO: free ret
+               return createException(MAL, "geom.Triangulate2DZ", 
"GEOSTriangulate2DZ failed");
+       }
+
+    //TODO
+       if (!(outGeom = sfcgal_geometry_triangulate_2dz(inGeom))) {
+               *res = NULL;
+        //TODO: free ret
+               return createException(MAL, "geom.Tesselate", "GEOSTesselate 
failed");
+       }
+
+
+    if ( sfcgal_to_geom(&outGeos, outGeom, 0, srid) != MAL_SUCCEED) {
+               *res = NULL;
+        //TODO: free ret
+               return createException(MAL, "geom.Triangulate2DZ", 
"GEOSTriangulate2DZ failed");
+    }
+
+       *res = geos2wkb(outGeos);
+       return MAL_SUCCEED;
+}
diff --git a/geom/monetdb5/sfcgal.h b/geom/monetdb5/sfcgal.h
--- a/geom/monetdb5/sfcgal.h
+++ b/geom/monetdb5/sfcgal.h
@@ -42,4 +42,5 @@ geom_export char * geom_sfcgal_version(c
 geom_export str geom_sfcgal_extrude(wkb **res, wkb **geom, double *ex, double 
*ey, double *ez);
 geom_export str geom_sfcgal_straightSkeleton(wkb **res, wkb **geom);
 geom_export str geom_sfcgal_tesselate(wkb **res, wkb **geom);
+geom_export str geom_sfcgal_triangulate2DZ(wkb **res, wkb **geom, int *flags);
 
diff --git a/geom/monetdb5/sfcgal.mal b/geom/monetdb5/sfcgal.mal
--- a/geom/monetdb5/sfcgal.mal
+++ b/geom/monetdb5/sfcgal.mal
@@ -18,6 +18,6 @@ comment "Compute a straight skeleton fro
 command tesselate(geo:wkb) : wkb address geom_sfcgal_tesselate
 comment "Perform surface Tesselation of a polygon or polyhedralsurface and 
returns as a TIN or collection of TINS"
 
-command triangulate2DZ(geo:wkb) : wkb address geom_sfcgal_triangulate2DZ
+command triangulate2DZ(geo:wkb, flags:int) : wkb address 
geom_sfcgal_triangulate2DZ
 comment "Triangulates a geometry collection"
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to