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

Fix a bunch of SRIDs


diffs (295 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -777,6 +777,7 @@ wkbForceDim(wkb **outWKB, wkb **geomWKB,
        GEOSGeometry *outGeometry;
        GEOSGeom geosGeometry;
        str err;
+    int srid;
 
        if (wkb_isnil(*geomWKB) || *dim == int_nil) {
                if ((*outWKB = wkbNULLcopy()) == NULL)
@@ -789,6 +790,7 @@ wkbForceDim(wkb **outWKB, wkb **geomWKB,
                *outWKB = NULL;
                throw(MAL, "geom.ForceDim", "wkb2geos failed");
        }
+    srid = GEOSGetSRID(geosGeometry);
 
        if ((err = forceDimGeometry(&outGeometry, geosGeometry, *dim)) != 
MAL_SUCCEED) {
                GEOSGeom_destroy(geosGeometry);
@@ -796,7 +798,7 @@ wkbForceDim(wkb **outWKB, wkb **geomWKB,
                return err;
        }
 
-       GEOSSetSRID(outGeometry, GEOSGetSRID(geosGeometry));
+       GEOSSetSRID(outGeometry, srid);
 
        *outWKB = geos2wkb(outGeometry);
 
@@ -1155,6 +1157,7 @@ wkbSegmentize(wkb **outWKB, wkb **geomWK
 {
        GEOSGeometry *outGeometry;
        GEOSGeom geosGeometry;
+    int srid;
        str err;
 
        if (wkb_isnil(*geomWKB) || *sz == dbl_nil) {
@@ -1168,6 +1171,7 @@ wkbSegmentize(wkb **outWKB, wkb **geomWK
                *outWKB = NULL;
                throw(MAL, "geom.Segmentize", "wkb2geos failed");
        }
+    srid = GEOSGetSRID(geosGeometry);
 
        if ((err = segmentizeGeometry(&outGeometry, geosGeometry, *sz)) != 
MAL_SUCCEED) {
                GEOSGeom_destroy(geosGeometry);
@@ -1175,7 +1179,7 @@ wkbSegmentize(wkb **outWKB, wkb **geomWK
                return err;
        }
 
-       GEOSSetSRID(outGeometry, GEOSGetSRID(geosGeometry));
+       GEOSSetSRID(outGeometry, srid);
 
        *outWKB = geos2wkb(outGeometry);
 
@@ -1477,6 +1481,7 @@ wkbTranslate(wkb **outWKB, wkb **geomWKB
 {
        GEOSGeometry *outGeometry;
        GEOSGeom geosGeometry;
+    int srid;
        str err;
 
        if (wkb_isnil(*geomWKB) || *dx == dbl_nil || *dy == dbl_nil || *dz == 
dbl_nil) {
@@ -1490,6 +1495,7 @@ wkbTranslate(wkb **outWKB, wkb **geomWKB
                *outWKB = NULL;
                throw(MAL, "geom.Translate", "wkb2geos failed");
        }
+    srid = GEOSGetSRID(geosGeometry);
 
        if ((err = translateGeometry(&outGeometry, geosGeometry, *dx, *dy, 
*dz)) != MAL_SUCCEED) {
                GEOSGeom_destroy(geosGeometry);
@@ -1497,7 +1503,7 @@ wkbTranslate(wkb **outWKB, wkb **geomWKB
                return err;
        }
 
-       GEOSSetSRID(outGeometry, GEOSGetSRID(geosGeometry));
+       GEOSSetSRID(outGeometry, srid);
 
        *outWKB = geos2wkb(outGeometry);
 
@@ -1545,6 +1551,7 @@ wkbDelaunayTriangles(wkb **outWKB, wkb *
 str
 wkbPointOnSurface(wkb **resWKB, wkb **geomWKB)
 {
+    int srid;
        GEOSGeom geosGeometry, resGeosGeometry;
 
        if (wkb_isnil(*geomWKB)) {
@@ -1558,6 +1565,7 @@ wkbPointOnSurface(wkb **resWKB, wkb **ge
                *resWKB = NULL;
                throw(MAL, "geom.PointOnSurface", "wkb2geos failed");
        }
+    srid = GEOSGetSRID(geosGeometry);
 
        resGeosGeometry = GEOSPointOnSurface(geosGeometry);
        if (resGeosGeometry == NULL) {
@@ -1566,7 +1574,7 @@ wkbPointOnSurface(wkb **resWKB, wkb **ge
                throw(MAL, "geom.PointOnSurface", "GEOSPointOnSurface failed");
        }
        //set the srid of the point the same as the srid of the input geometry
-       GEOSSetSRID(resGeosGeometry, GEOSGetSRID(geosGeometry));
+       GEOSSetSRID(resGeosGeometry, srid);
 
        *resWKB = geos2wkb(resGeosGeometry);
 
@@ -1666,6 +1674,7 @@ dumpGeometriesGeometry_(BAT *idBAT, BAT 
 {
        int geometryType = GEOSGeomTypeId(geosGeometry) + 1;
        unsigned int lvl = 0;
+    bit empty;
 
        //check the type of the geometry
        switch (geometryType) {
@@ -1681,7 +1690,8 @@ dumpGeometriesGeometry_(BAT *idBAT, BAT 
        case wkbGeometryCollection_mdb:
                //Multi Geometry
                //check if the geometry was empty
-               if (GEOSisEmpty(geosGeometry) == 1) {
+        empty = GEOSisEmpty(geosGeometry);
+               if (empty) {
                        str err;
                        //handle it as single
                        if ((err = dumpGeometriesSingle(idBAT, geomBAT, 
geosGeometry, &lvl, path)) != MAL_SUCCEED)
@@ -3632,6 +3642,7 @@ wkbMakeLine(wkb **out, wkb **geom1WKB, w
        unsigned int i = 0, geom1Size = 0, geom2Size = 0;
        unsigned geom1Dimension = 0, geom2Dimension = 0;
        double x, y, z;
+    int srid;
        str err = MAL_SUCCEED;
 
        if (wkb_isnil(*geom1WKB) || wkb_isnil(*geom2WKB)) {
@@ -3652,6 +3663,8 @@ wkbMakeLine(wkb **out, wkb **geom1WKB, w
                GEOSGeom_destroy(geom1Geometry);
                throw(MAL, "geom.MakeLine", "wkb2geos failed");
        }
+    srid = GEOSGetSRID(geom1Geometry);
+
        //make sure the geometries are of the same srid
        if (GEOSGetSRID(geom1Geometry) != GEOSGetSRID(geom2Geometry)) {
                err = createException(MAL, "geom.MakeLine", "Geometries of 
different SRID");
@@ -3720,7 +3733,7 @@ wkbMakeLine(wkb **out, wkb **geom1WKB, w
                throw(MAL, "geom.MakeLine", "GEOSGeom_createLineString failed");
        }
 
-       GEOSSetSRID(outGeometry, GEOSGetSRID(geom1Geometry));
+       GEOSSetSRID(outGeometry, srid);
        *out = geos2wkb(outGeometry);
        GEOSGeom_destroy(outGeometry);
        GEOSGeom_destroy(geom1Geometry);
@@ -4558,6 +4571,7 @@ wkbCentroid(wkb **out, wkb **geom)
 {
        GEOSGeom geosGeometry;
        GEOSGeom outGeometry;
+    int srid;
 
        if (wkb_isnil(*geom)) {
                if ((*out = wkbNULLcopy()) == NULL)
@@ -4567,9 +4581,10 @@ wkbCentroid(wkb **out, wkb **geom)
        geosGeometry = wkb2geos(*geom);
        if (geosGeometry == NULL)
                throw(MAL, "geom.Centroid", MAL_MALLOC_FAIL);
+    srid = GEOSGetSRID(geosGeometry);
 
        outGeometry = GEOSGetCentroid(geosGeometry);
-       GEOSSetSRID(outGeometry, GEOSGetSRID(geosGeometry));    //the centroid 
has the same SRID with the the input geometry
+       GEOSSetSRID(outGeometry, srid); //the centroid has the same SRID with 
the the input geometry
        *out = geos2wkb(outGeometry);
 
        GEOSGeom_destroy(geosGeometry);
@@ -4677,6 +4692,7 @@ static str
 wkbanalysis(wkb **out, wkb **geom1WKB, wkb **geom2WKB, GEOSGeometry *(*func) 
(const GEOSGeometry *, const GEOSGeometry *), const char *name)
 {
        GEOSGeom outGeometry, geom1Geometry, geom2Geometry;
+    int srid;
        str err = MAL_SUCCEED;
 
        if (wkb_isnil(*geom1WKB) || wkb_isnil(*geom2WKB)) {
@@ -4695,6 +4711,7 @@ wkbanalysis(wkb **out, wkb **geom1WKB, w
                        GEOSGeom_destroy(geom2Geometry);
                throw(MAL, name, "wkb2geos failed");
        }
+    srid = GEOSGetSRID(geom1Geometry);
 
        //make sure the geometries are of the same srid
        if (GEOSGetSRID(geom1Geometry) != GEOSGetSRID(geom2Geometry)) {
@@ -4702,7 +4719,7 @@ wkbanalysis(wkb **out, wkb **geom1WKB, w
        } else if ((outGeometry = (*func) (geom1Geometry, geom2Geometry)) == 
NULL) {
                err = createException(MAL, name, "GEOS%s failed", name + 5);
        } else {
-               GEOSSetSRID(outGeometry, GEOSGetSRID(geom1Geometry));
+               GEOSSetSRID(outGeometry, srid);
                *out = geos2wkb(outGeometry);
                GEOSGeom_destroy(outGeometry);
        }
@@ -4790,7 +4807,7 @@ wkbUnionAggr(wkb **outWKB, bat *inBAT_id
 static str
 wkbUnaryUnion(wkb **out, wkb **geoms, int num_geoms)
 {
-    int i = 0, j = 0;
+    int i = 0, j = 0, srid;
        GEOSGeom outGeometry, *geomGeometries = NULL, geomCollection;
 
     if ( (geomGeometries = (GEOSGeom*) GDKmalloc(sizeof(GEOSGeom)*num_geoms)) 
== NULL) {
@@ -4814,6 +4831,7 @@ wkbUnaryUnion(wkb **out, wkb **geoms, in
             throw(MAL, "GEOSUnaryUnion", "wkb2geos failed");
         }
     }
+    srid = GEOSGetSRID(geomGeometries[0]);
 
        if ( (geomCollection = GEOSGeom_createCollection(wkbMultiPoint_mdb - 1, 
geomGeometries, num_geoms)) == NULL ) {
                *out = NULL;
@@ -4829,7 +4847,7 @@ wkbUnaryUnion(wkb **out, wkb **geoms, in
                throw(MAL, "GEOSUnaryUnion", "GEOSUnaryUnion failed");
        }
 
-       GEOSSetSRID(outGeometry, GEOSGetSRID(geomGeometries[0]));
+       GEOSSetSRID(outGeometry, srid);
        *out = geos2wkb(outGeometry);
     GDKfree(geomGeometries);
 
@@ -5008,7 +5026,7 @@ wkbCollect(wkb **out, wkb **geom1WKB, wk
 static str
 wkbUnaryCollect(wkb **out, wkb **geoms, int num_geoms)
 {
-    int i = 0, j = 0, type, geometryType;
+    int i = 0, j = 0, type, geometryType, srid;
        GEOSGeom outGeometry, *geomGeometries = NULL, geomCollection;
 
     if ( (geomGeometries = (GEOSGeom*) GDKmalloc(sizeof(GEOSGeom)*num_geoms)) 
== NULL) {
@@ -5058,8 +5076,8 @@ wkbUnaryCollect(wkb **out, wkb **geoms, 
             }
         } else if (type != geometryType)
             type = wkbGeometryCollection_mdb - 1;
-
     }
+    srid = GEOSGetSRID(geomGeometries[0]);
 
        if ( (geomCollection = 
GEOSGeom_createCollection(wkbGeometryCollection_mdb - 1, geomGeometries, 
num_geoms)) == NULL ) {
                *out = NULL;
@@ -5069,7 +5087,7 @@ wkbUnaryCollect(wkb **out, wkb **geoms, 
                throw(MAL, "GEOSUnaryCollection", "GEOSGeom_createCollection 
failed");
     }
 
-       GEOSSetSRID(geomCollection, GEOSGetSRID(geomGeometries[0]));
+       GEOSSetSRID(geomCollection, srid);
        *out = geos2wkb(geomCollection);
     GDKfree(geomGeometries);
 
@@ -5394,6 +5412,7 @@ wkbCollectAppend(wkb **out, wkb **geom1W
     GEOSGeometry **geomGeometries = NULL;
        str err = MAL_SUCCEED;
     int i, type, geometry1Type, geometry2Type, num_geoms = 0, srid;
+    bit empty;
 
        if (wkb_isnil(*geom1WKB) || wkb_isnil(*geom2WKB)) {
                if ((*out = wkbNULLcopy()) == NULL)
@@ -5412,14 +5431,15 @@ wkbCollectAppend(wkb **out, wkb **geom1W
         throw(MAL, "geom.collect" , "wkb2geos failed");
     }
     srid = GEOSGetSRID(geom2Geometry);
+    empty = GEOSisEmpty(geom1Geometry);
 
     //make sure the geometries are of the same srid
-    if ((GEOSisEmpty(geom1Geometry) == 0) && (GEOSGetSRID(geom1Geometry) != 
GEOSGetSRID(geom2Geometry))) {
+    if ( !empty && (GEOSGetSRID(geom1Geometry) != GEOSGetSRID(geom2Geometry))) 
{
         err = createException(MAL, "geom.collect", "Geometries of different 
SRID");
     } else { 
         geometry1Type = GEOSGeomTypeId(geom1Geometry);
         geometry2Type = GEOSGeomTypeId(geom2Geometry);
-        if ( (GEOSisEmpty(geom1Geometry) == 0) &&  (geometry1Type != 
geometry2Type)) {
+        if ( !empty &&  (geometry1Type != geometry2Type)) {
             type = geometry1Type;
             switch (geometry1Type + 1) {
                 case wkbMultiPoint_mdb:
@@ -5904,11 +5924,13 @@ wkbAddPointIdx(wkb** out, wkb** lineWKB,
     const GEOSCoordSequence *gcs_old = NULL;
     GEOSCoordSeq gcs_new = NULL;
     double px, py, pz, x, y, z;
+    int srid;
     uint32_t lineDim, numGeom, i, idx = 0, jump = 0;
     const GEOSGeometry *line;
     GEOSGeom point, outGeometry;
     line = wkb2geos(*lineWKB);
     point = wkb2geos(*pointWKB);
+    srid = GEOSGetSRID(line);
 
     if (idxPoint)
         idx = *idxPoint;
@@ -5990,7 +6012,7 @@ wkbAddPointIdx(wkb** out, wkb** lineWKB,
                throw(MAL, "geom.AddPoint", "GEOSGeom_createLineString failed");
        }
 
-       GEOSSetSRID(outGeometry, GEOSGetSRID(line));
+       GEOSSetSRID(outGeometry, srid);
        *out = geos2wkb(outGeometry);
     
     return ret;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to