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