Changeset: 6ca55805d7cd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6ca55805d7cd
Modified Files:
        geom/monetdb5/geod.c
        geom/monetdb5/geom.c
Branch: geo-update
Log Message:

Fix non-existing bounding box on polygon for distancegeographic, makeline 
temporary fix


diffs (161 lines):

diff --git a/geom/monetdb5/geod.c b/geom/monetdb5/geod.c
--- a/geom/monetdb5/geod.c
+++ b/geom/monetdb5/geod.c
@@ -174,6 +174,8 @@ geoLinesFromGeom(GEOSGeom geom)
        return geo;
 }
 
+static BoundingBox * boundingBoxLines(GeoLines lines);
+
 /* Converts the a GEOSGeom Line into GeoPolygon (with exterior ring and 
zero-to-multiple interior rings)
    Argument must be a Polygon geometry. */
 static GeoPolygon
@@ -192,8 +194,8 @@ geoPolygonFromGeom(GEOSGeom geom)
        //Get interior rings GeoLines
        for (int i = 0; i < geo.interiorRingsCount; i++)
                geo.interiorRings[i] = 
geoLinesFromGeom((GEOSGeom)GEOSGetInteriorRingN(geom, i));
-       //TODO Calculate Boundind Box on initializion?
-       geo.bbox = NULL;
+       // If the geometry doesn't have BoundingBoxe, calculate it
+       geo.bbox = boundingBoxLines(geo.exteriorRing);
        return geo;
 }
 
@@ -722,18 +724,12 @@ geoDistanceSingle(GEOSGeom aGeom, GEOSGe
                /* Line/LinearRing and Polygon */
                GeoLines a = geoLinesFromGeom(aGeom);
                GeoPolygon b = geoPolygonFromGeom(bGeom);
-               // If the geometry doesn't have BoundingBoxe, calculate it
-               if (b.bbox == NULL)
-                       b.bbox = boundingBoxLines(b.exteriorRing);
                distance = geoDistanceLinePolygon(a, b);
                freeGeoLines(a);
                freeGeoPolygon(b);
        } else if (dimA == 2 && dimB == 1) {
                /* Polygon and Line/LinearRing */
                GeoPolygon a = geoPolygonFromGeom(aGeom);
-               // If the geometry doesn't have BoundingBoxe, calculate it
-               if (a.bbox == NULL)
-                       a.bbox = boundingBoxLines(a.exteriorRing);
                GeoLines b = geoLinesFromGeom(bGeom);
                distance = geoDistanceLinePolygon(b, a);
                freeGeoPolygon(a);
@@ -742,11 +738,6 @@ geoDistanceSingle(GEOSGeom aGeom, GEOSGe
                /* Polygon and Polygon */
                GeoPolygon a = geoPolygonFromGeom(aGeom);
                GeoPolygon b = geoPolygonFromGeom(bGeom);
-               // If the geometries don't have BoundingBoxes, calculate them
-               if (a.bbox == NULL)
-                       a.bbox = boundingBoxLines(a.exteriorRing);
-               if (b.bbox == NULL)
-                       b.bbox = boundingBoxLines(b.exteriorRing);
                distance = geoDistancePolygonPolygon(a, b);
                freeGeoPolygon(a);
                freeGeoPolygon(b);
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -3384,14 +3384,12 @@ wkbMakeLineAggr(wkb **outWKB, bat *bid)
        return err;
 }
 
-static str
+/*static str
 wkbMakeLineAggrArray(wkb **outWKB, wkb **inWKB_array, int size) {
        str msg = MAL_SUCCEED;
        int i;
        wkb *aWKB, *bWKB;
 
-       /* TODO: what should be returned if the input is less than
-        * two rows? --sjoerd */
        if (size == 0) {
                if ((*outWKB = wkbNULLcopy()) == NULL)
                        throw(MAL, "aggr.MakeLine", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
@@ -3420,6 +3418,70 @@ wkbMakeLineAggrArray(wkb **outWKB, wkb *
                GDKfree(aWKB);
        }
        return msg;
+}*/
+
+static str
+wkbExtractPointToCoordSeq(GEOSCoordSeq *outCoordSeq, wkb *inWKB, int index) {
+       double x,y;
+       str msg = MAL_SUCCEED;
+       GEOSGeom inGeometry;
+       const GEOSCoordSequence *inCoordSeq = NULL;
+
+       inGeometry = wkb2geos(inWKB);
+       if (!inGeometry) {
+               throw(MAL, "geom.MakeLine", SQLSTATE(38000) "Geos operation 
wkb2geos failed");
+       }
+       inCoordSeq = GEOSGeom_getCoordSeq(inGeometry);
+       GEOSCoordSeq_getX(inCoordSeq, 0, &x);
+       GEOSCoordSeq_getY(inCoordSeq, 0, &y);
+       if (!GEOSCoordSeq_setX(*outCoordSeq, index, x) ||
+           !GEOSCoordSeq_setY(*outCoordSeq, index, y)) {
+               throw(MAL, "geom.MakeLine", SQLSTATE(38000) "Geos operation 
GEOSCoordSeq_set[XY] failed");
+       }
+       return msg;
+}
+
+static str
+wkbMakeLineAggrArray2(wkb **outWKB, wkb **inWKB_array, int size) {
+       str msg = MAL_SUCCEED;
+       int i;
+       wkb *aWKB, *bWKB;
+       GEOSGeom outGeometry;
+       GEOSCoordSeq outCoordSeq = NULL;
+
+       /* TODO: what should be returned if the input is less than
+        * two rows? --sjoerd */
+       if (size == 0) {
+               if ((*outWKB = wkbNULLcopy()) == NULL)
+                       throw(MAL, "aggr.MakeLine", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               return MAL_SUCCEED;
+       }
+       aWKB = inWKB_array[0];
+       if (size == 1) {
+               msg = wkbFromWKB(outWKB, &aWKB);
+               if (msg) {
+                       freeException(msg);
+                       throw(MAL, "aggr.MakeLine", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               }
+               return MAL_SUCCEED;
+       }
+       bWKB = inWKB_array[1];
+       //create the first line using the first two geometries
+       //msg = wkbMakeLine(outWKB, &aWKB, &bWKB);
+       outCoordSeq = GEOSCoordSeq_create(size, 2);
+
+       msg = wkbExtractPointToCoordSeq(&outCoordSeq, aWKB, 0);
+       msg = wkbExtractPointToCoordSeq(&outCoordSeq, bWKB, 1);
+
+       // add one more segment for each following row
+       for (i = 2; msg == MAL_SUCCEED && i < size; i++) {
+               msg = wkbExtractPointToCoordSeq(&outCoordSeq, inWKB_array[i], 
i);
+       }
+       if ((outGeometry = GEOSGeom_createLineString(outCoordSeq)) == NULL) {
+               msg = createException(MAL, "geom.MakeLine", SQLSTATE(38000) 
"Geos operation GEOSGeom_createLineString failed");
+       }
+       *outWKB = geos2wkb(outGeometry);
+       return msg;
 }
 
 //TODO Check SRID
@@ -3510,14 +3572,14 @@ wkbMakeLineAggrSubGroupedCand(bat *outid
 
                if (grp != lastGrp) {
                        if (lastGrp != (oid)-1) {
-                               msg = wkbMakeLineAggrArray(&lines[lastGrp], 
lineGroup, position);
+                               msg = wkbMakeLineAggrArray2(&lines[lastGrp], 
lineGroup, position);
                                position = 0;
                        }
                        lastGrp = grp;
                }
                lineGroup[position++] = inWKB;
        }
-       msg = wkbMakeLineAggrArray(&lines[lastGrp], lineGroup, position);
+       msg = wkbMakeLineAggrArray2(&lines[lastGrp], lineGroup, position);
 
        if (BUNappendmulti(out, lines, ngrp, false) != GDK_SUCCEED) {
                //TODO Free out BAT
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to