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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list