Changeset: c949ca2c95bd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c949ca2c95bd
Modified Files:
        geom/lib/libgeom.c
        geom/monetdb5/geom.c
Branch: default
Log Message:

Merge with Jun2016 branch.


diffs (truncated from 3423 to 300 lines):

diff --git a/geom/lib/libgeom.c b/geom/lib/libgeom.c
--- a/geom/lib/libgeom.c
+++ b/geom/lib/libgeom.c
@@ -113,10 +113,10 @@ wkb2geos(wkb *geomWKB)
        if (wkb_isnil(geomWKB))
                return NULL;
 
-       geosGeometry = GEOSGeomFromWKB_buf((unsigned char *) ((geomWKB)->data), 
(geomWKB)->len);
+       geosGeometry = GEOSGeomFromWKB_buf((unsigned char *) geomWKB->data, 
geomWKB->len);
 
        if (geosGeometry != NULL)
-               GEOSSetSRID(geosGeometry, (geomWKB)->srid);
+               GEOSSetSRID(geosGeometry, geomWKB->srid);
 
        return geosGeometry;
 }
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -47,18 +47,18 @@ wkbNULLcopy(void)
 static void
 degrees2radians(double *x, double *y, double *z)
 {
-       (*x) *= M_PI / 180.0;
-       (*y) *= M_PI / 180.0;
-       (*z) *= M_PI / 180.0;
+       *x *= M_PI / 180.0;
+       *y *= M_PI / 180.0;
+       *z *= M_PI / 180.0;
 }
 
 /** convert radians to degrees */
 static void
 radians2degrees(double *x, double *y, double *z)
 {
-       (*x) *= 180.0 / M_PI;
-       (*y) *= 180.0 / M_PI;
-       (*z) *= 180.0 / M_PI;
+       *x *= 180.0 / M_PI;
+       *y *= 180.0 / M_PI;
+       *z *= 180.0 / M_PI;
 }
 
 static str
@@ -67,11 +67,10 @@ transformCoordSeq(int idx, int coordinat
        double x = 0, y = 0, z = 0;
        int *errorNum = 0;
 
-       GEOSCoordSeq_getX(gcs_old, idx, &x);
-       GEOSCoordSeq_getY(gcs_old, idx, &y);
-
-       if (coordinatesNum > 2)
-               GEOSCoordSeq_getZ(gcs_old, idx, &z);
+       if (!GEOSCoordSeq_getX(gcs_old, idx, &x) ||
+           !GEOSCoordSeq_getY(gcs_old, idx, &y) ||
+           (coordinatesNum > 2 && !GEOSCoordSeq_getZ(gcs_old, idx, &z)))
+               throw(MAL, "geom.Transform", "Couldn't get coordinates");
 
        /* check if the passed reference system is geographic (proj=latlong)
         * and change the degrees to radians because pj_transform works with 
radians*/
@@ -83,9 +82,9 @@ transformCoordSeq(int idx, int coordinat
        errorNum = pj_get_errno_ref();
        if (*errorNum != 0) {
                if (coordinatesNum > 2)
-                       throw(MAL, "geom.wkbTransform", "Couldn't transform 
point (%f %f %f): %s\n", x, y, z, pj_strerrno(*errorNum));
+                       throw(MAL, "geom.Transform", "Couldn't transform point 
(%f %f %f): %s\n", x, y, z, pj_strerrno(*errorNum));
                else
-                       throw(MAL, "geom.wkbTransform", "Couldn't transform 
point (%f %f): %s\n", x, y, pj_strerrno(*errorNum));
+                       throw(MAL, "geom.Transform", "Couldn't transform point 
(%f %f): %s\n", x, y, pj_strerrno(*errorNum));
        }
 
        /* check if the destination reference system is geographic and change
@@ -93,11 +92,10 @@ transformCoordSeq(int idx, int coordinat
        if (pj_is_latlong(proj4_dst))
                radians2degrees(&x, &y, &z);
 
-       GEOSCoordSeq_setX(gcs_new, idx, x);
-       GEOSCoordSeq_setY(gcs_new, idx, y);
-
-       if (coordinatesNum > 2)
-               GEOSCoordSeq_setZ(gcs_new, idx, z);
+       if (!GEOSCoordSeq_setX(gcs_new, idx, x) ||
+           !GEOSCoordSeq_setY(gcs_new, idx, y) ||
+           (coordinatesNum > 2 && !GEOSCoordSeq_setZ(gcs_new, idx, z)))
+               throw(MAL, "geom.Transform", "Couldn't set coordinates");
 
        return MAL_SUCCEED;
 }
@@ -118,12 +116,12 @@ transformPoint(GEOSGeometry **transforme
        gcs_old = GEOSGeom_getCoordSeq(geosGeometry);
 
        if (gcs_old == NULL)
-               throw(MAL, "geom.wkbTransform", "GEOSGeom_getCoordSeq failed");
+               throw(MAL, "geom.Transform", "GEOSGeom_getCoordSeq failed");
 
        /* create the coordinates sequence for the transformed geometry */
        gcs_new = GEOSCoordSeq_create(1, coordinatesNum);
        if (gcs_new == NULL)
-               throw(MAL, "geom.wkbTransform", "GEOSGeom_getCoordSeq failed");
+               throw(MAL, "geom.Transform", "GEOSGeom_getCoordSeq failed");
 
        /* create the transformed coordinates */
        ret = transformCoordSeq(0, coordinatesNum, proj4_src, proj4_dst, 
gcs_old, gcs_new);
@@ -136,7 +134,7 @@ transformPoint(GEOSGeometry **transforme
        *transformedGeometry = GEOSGeom_createPoint(gcs_new);
        if (*transformedGeometry == NULL) {
                GEOSCoordSeq_destroy(gcs_new);
-               throw(MAL, "geom.wkbTransform", "GEOSGeom_getCoordSeq failed");
+               throw(MAL, "geom.Transform", "GEOSGeom_getCoordSeq failed");
        }
 
        return MAL_SUCCEED;
@@ -156,15 +154,16 @@ transformLine(GEOSCoordSeq *gcs_new, con
        gcs_old = GEOSGeom_getCoordSeq(geosGeometry);
 
        if (gcs_old == NULL)
-               throw(MAL, "geom.wkbTransform", "GEOSGeom_getCoordSeq failed");
+               throw(MAL, "geom.Transform", "GEOSGeom_getCoordSeq failed");
 
        /* get the number of points in the geometry */
-       GEOSCoordSeq_getSize(gcs_old, &pointsNum);
+       if (!GEOSCoordSeq_getSize(gcs_old, &pointsNum))
+               throw(MAL, "geom.Transform", "GEOSCoordSeq_getSize failed");
 
        /* create the coordinates sequence for the transformed geometry */
        *gcs_new = GEOSCoordSeq_create(pointsNum, coordinatesNum);
        if (*gcs_new == NULL)
-               throw(MAL, "geom.wkbTransform", "GEOSCoordSeq_create failed");
+               throw(MAL, "geom.Transform", "GEOSCoordSeq_create failed");
 
        /* create the transformed coordinates */
        for (i = 0; i < pointsNum; i++) {
@@ -236,7 +235,7 @@ transformPolygon(GEOSGeometry **transfor
        exteriorRingGeometry = GEOSGetExteriorRing(geosGeometry);
        if (exteriorRingGeometry == NULL) {
                *transformedGeometry = NULL;
-               throw(MAL, "geom.wkbTransform", "GEOSGetExteriorRing failed");
+               throw(MAL, "geom.Transform", "GEOSGetExteriorRing failed");
        }
 
        ret = transformLinearRing(&transformedExteriorRingGeometry, 
exteriorRingGeometry, proj4_src, proj4_dst);
@@ -250,7 +249,7 @@ transformPolygon(GEOSGeometry **transfor
        if (numInteriorRings == -1) {
                *transformedGeometry = NULL;
                GEOSGeom_destroy(transformedExteriorRingGeometry);
-               throw(MAL, "geom.wkbTransform", "GEOSGetInteriorRingN failed.");
+               throw(MAL, "geom.Transform", "GEOSGetInteriorRingN failed.");
        }
 
        /* iterate over the interiorRing and transform each one of them */
@@ -258,7 +257,7 @@ transformPolygon(GEOSGeometry **transfor
        if (transformedInteriorRingGeometries == NULL) {
                *transformedGeometry = NULL;
                GEOSGeom_destroy(transformedExteriorRingGeometry);
-               throw(MAL, "geom.wkbTransform", MAL_MALLOC_FAIL);
+               throw(MAL, "geom.Transform", MAL_MALLOC_FAIL);
        }
        for (i = 0; i < numInteriorRings; i++) {
                ret = 
transformLinearRing(&transformedInteriorRingGeometries[i], 
GEOSGetInteriorRingN(geosGeometry, i), proj4_src, proj4_dst);
@@ -277,7 +276,7 @@ transformPolygon(GEOSGeometry **transfor
        if (*transformedGeometry == NULL) {
                for (i = 0; i < numInteriorRings; i++)
                        GEOSGeom_destroy(transformedInteriorRingGeometries[i]);
-               ret = createException(MAL, "geom.wkbTransform", 
"GEOSGeom_createPolygon failed");
+               ret = createException(MAL, "geom.Transform", 
"GEOSGeom_createPolygon failed");
        }
        GDKfree(transformedInteriorRingGeometries);
        GEOSGeom_destroy(transformedExteriorRingGeometry);
@@ -294,31 +293,35 @@ transformMultiGeometry(GEOSGeometry **tr
        str ret = MAL_SUCCEED;
 
        geometriesNum = GEOSGetNumGeometries(geosGeometry);
+       if (geometriesNum == -1)
+               throw(MAL, "geom.Transform", "GEOSGetNumGeometries failed");
        transformedMultiGeometries = GDKmalloc(geometriesNum * 
sizeof(GEOSGeometry *));
        if (transformedMultiGeometries == NULL)
                throw(MAL, "geom.Transform", MAL_MALLOC_FAIL);
 
        for (i = 0; i < geometriesNum; i++) {
-               multiGeometry = GEOSGetGeometryN(geosGeometry, i);
-
-               subGeometryType = GEOSGeomTypeId(multiGeometry) + 1;
-
-               switch (subGeometryType) {
-               case wkbPoint_mdb:
-                       ret = transformPoint(&transformedMultiGeometries[i], 
multiGeometry, proj4_src, proj4_dst);
-                       break;
-               case wkbLineString_mdb:
-                       ret = 
transformLineString(&transformedMultiGeometries[i], multiGeometry, proj4_src, 
proj4_dst);
-                       break;
-               case wkbLinearRing_mdb:
-                       ret = 
transformLinearRing(&transformedMultiGeometries[i], multiGeometry, proj4_src, 
proj4_dst);
-                       break;
-               case wkbPolygon_mdb:
-                       ret = transformPolygon(&transformedMultiGeometries[i], 
multiGeometry, proj4_src, proj4_dst, srid);
-                       break;
-               default:
-                       ret = createException(MAL, "geom.Transform", "Unknown 
geometry type");
-                       break;
+               if ((multiGeometry = GEOSGetGeometryN(geosGeometry, i)) == NULL)
+                       ret = createException(MAL, "geom.Transform", 
"GEOSGetGeometryN failed");
+               else if ((subGeometryType = GEOSGeomTypeId(multiGeometry) + 1) 
== 0)
+                       ret = createException(MAL, "geom.Transform", 
"GEOSGeomTypeId failed");
+               else {
+                       switch (subGeometryType) {
+                       case wkbPoint_mdb:
+                               ret = 
transformPoint(&transformedMultiGeometries[i], multiGeometry, proj4_src, 
proj4_dst);
+                               break;
+                       case wkbLineString_mdb:
+                               ret = 
transformLineString(&transformedMultiGeometries[i], multiGeometry, proj4_src, 
proj4_dst);
+                               break;
+                       case wkbLinearRing_mdb:
+                               ret = 
transformLinearRing(&transformedMultiGeometries[i], multiGeometry, proj4_src, 
proj4_dst);
+                               break;
+                       case wkbPolygon_mdb:
+                               ret = 
transformPolygon(&transformedMultiGeometries[i], multiGeometry, proj4_src, 
proj4_dst, srid);
+                               break;
+                       default:
+                               ret = createException(MAL, "geom.Transform", 
"Unknown geometry type");
+                               break;
+                       }
                }
 
                if (ret != MAL_SUCCEED) {
@@ -370,6 +373,11 @@ projFromStr(const char *projStr)
 
        t = 1;
        for (loc = strchr(str, ' '); loc != NULL; loc = strchr(loc, ' ')) {
+               if (t == (int) (sizeof(params) / sizeof(params[0]))) {
+                       /* too many parameters */
+                       GDKfree(str);
+                       return NULL;
+               }
                *loc++ = 0;     // null terminate and advance
                params[t++] = loc;
        }
@@ -387,11 +395,11 @@ wkbTransform(wkb **transformedWKB, wkb *
 {
 #ifndef HAVE_PROJ
        *transformedWKB = NULL;
-       (void) **geomWKB;
-       (void) *srid_src;
-       (void) *srid_dst;
-       (void) **proj4_src_str;
-       (void) **proj4_dst_str;
+       (void) geomWKB;
+       (void) srid_src;
+       (void) srid_dst;
+       (void) proj4_src_str;
+       (void) proj4_dst_str;
        throw(MAL, "geom.Transform", "Function Not Implemented");
 #else
        projPJ proj4_src, proj4_dst;
@@ -400,14 +408,24 @@ wkbTransform(wkb **transformedWKB, wkb *
 
        str ret = MAL_SUCCEED;
 
-       if (!strcmp(*proj4_src_str, "null"))
-               throw(MAL, "geom.wkbTransform", "Could not find in 
spatial_ref_sys srid %d\n", *srid_src);
-       if (!strcmp(*proj4_dst_str, "null"))
-               throw(MAL, "geom.wkbTransform", "Could not find in 
spatial_ref_sys srid %d\n", *srid_dst);
-
        if (*geomWKB == NULL)
                throw(MAL, "geom.Transform", "wkb is null");
 
+       if (wkb_isnil(*geomWKB) ||
+           *srid_src == int_nil ||
+           *srid_dst == int_nil ||
+           strcmp(*proj4_src_str, str_nil) == 0 ||
+           strcmp(*proj4_dst_str, str_nil) == 0) {
+               if ((*transformedWKB = wkbNULLcopy()) == NULL)
+                       throw(MAL, "geom.Transform", MAL_MALLOC_FAIL);
+               return MAL_SUCCEED;
+       }
+
+       if (strcmp(*proj4_src_str, "null") == 0)
+               throw(MAL, "geom.Transform", "Could not find in spatial_ref_sys 
srid %d\n", *srid_src);
+       if (strcmp(*proj4_dst_str, "null") == 0)
+               throw(MAL, "geom.Transform", "Could not find in spatial_ref_sys 
srid %d\n", *srid_dst);
+
        proj4_src = /*pj_init_plus */ projFromStr(*proj4_src_str);
        proj4_dst = /*pj_init_plus */ projFromStr(*proj4_dst_str);
        if (proj4_src == NULL || proj4_dst == NULL) {
@@ -451,7 +469,7 @@ wkbTransform(wkb **transformedWKB, wkb *
                GEOSSetSRID(transformedGeosGeometry, *srid_dst);
                /* get the wkb */
                if ((*transformedWKB = geos2wkb(transformedGeosGeometry)) == 
NULL)
-                       ret = createException(MAL, "geom.wkbTransform", 
"geos2wkb failed");
+                       ret = createException(MAL, "geom.Transform", "geos2wkb 
failed");
                /* destroy the geos geometries */
                GEOSGeom_destroy(transformedGeosGeometry);
        }
@@ -475,9 +493,9 @@ forceDimCoordSeq(int idx, int coordinate
                throw(MAL, "geom.ForceDim", "GEOSCoordSeq_getX failed");
        if (!GEOSCoordSeq_getY(gcs_old, idx, &y))
                throw(MAL, "geom.ForceDim", "GEOSCoordSeq_getY failed");
-       if (coordinatesNum > 2 && dim > 2)      //read it only if needed (dim 
>2)
-               if (!GEOSCoordSeq_getZ(gcs_old, idx, &z))
-                       throw(MAL, "geom.ForceDim", "GEOSCoordSeq_getZ failed");
+       if (coordinatesNum > 2 && dim > 2 &&    //read it only if needed (dim 
>2)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to