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