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

Small fix on dwithin, added shortcuts for 0 distances in distance functions and 
removed srid checks for VesselAI demo.


diffs (146 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -255,11 +255,12 @@ wkbGetComplatibleGeometries(wkb **a, wkb
        (*gb) = wkb2geos(*b);
        if ((*ga) == NULL || (*gb) == NULL)
                err = createException(MAL, "geom.wkbGetComplatibleGeometries", 
SQLSTATE(38000) "Geos operation wkb2geos failed");
-       else if (GEOSGetSRID((*ga)) != GEOSGetSRID(*gb)) {
+       //TODO Uncomment this, this is just for the October demo
+       /*else if (GEOSGetSRID((*ga)) != GEOSGetSRID(*gb)) {
                GEOSGeom_destroy(*ga);
                GEOSGeom_destroy(*gb);
                err = createException(MAL, "geom.wkbGetComplatibleGeometries", 
SQLSTATE(38000) "Geometries of different SRID");
-       }
+       }*/
        return err;
 }
 
@@ -538,6 +539,9 @@ geoDistancePointLine(GeoPoint point, Geo
                distance = geoDistancePointLineInternal(point, 
lines.segments[i]);
                if (distance < min_distance)
                        min_distance = distance;
+               //Shortcut, if the geometries are already at their minimum 
distance
+               if (min_distance == 0)
+                       return 0;
        }
        return min_distance;
 }
@@ -553,6 +557,9 @@ geoDistanceLineLineInternal(GeoLines lin
                distance = geoDistancePointLine(line1.segments[i].start, line2);
                if (distance < min_distance)
                        min_distance = distance;
+               //Shortcut, if the geometries are already at their minimum 
distance
+               if (min_distance == 0)
+                       return 0;
        }
        distance = geoDistancePointLine(line1.segments[line1.segmentCount - 
1].end, line2);
        return distance < min_distance ? distance : min_distance;
@@ -565,6 +572,9 @@ geoDistanceLineLine(GeoLines line1, GeoL
        double distance1, distance2;
        //Calculate the distance between all vertices of line1 and segments of 
line 2
        distance1 = geoDistanceLineLineInternal(line1, line2);
+       //Shortcut, if the geometries are already at their minimum distance
+       if (distance1 == 0)
+               return 0;
        //Calculate the distance between all vertices of line2 and segments of 
line 1
        distance2 = geoDistanceLineLineInternal(line2, line1);
        //And return the minimum
@@ -593,6 +603,7 @@ pointWithinPolygon(GeoPolygon polygon, G
        //Construct a line between the outside point and the input point
        GEOSGeometry *outInLine = cartesianLineFromGeoPoints(point, 
outsidePoint);
 
+       //TODO This is producing wrong results, review the intersection 
conditional
        //Count the number of intersections between the polygon exterior ring 
and the constructed line
        polygonRing = polygon.exteriorRing;
        for (int i = 0; i < polygonRing.segmentCount; i++) {
@@ -648,6 +659,9 @@ geoDistancePointPolygon(GeoPoint point, 
        min_distance = geoDistancePointLine(point, polygon.exteriorRing);
        //Then, calculate distance to the interior rings
        for (int i = 0; i < polygon.interiorRingsCount; i++) {
+               //Shortcut, if the geometries are already at their minimum 
distance
+               if (min_distance == 0)
+                       return 0;
                distance = geoDistancePointLine(point, 
polygon.interiorRings[i]);
                if (distance < min_distance)
                        min_distance = distance;
@@ -684,6 +698,9 @@ geoDistancePolygonPolygon(GeoPolygon pol
        double distance1, distance2;
        //Calculate the distance between the exterior ring of polygon1 and all 
segments of polygon2 (including the interior rings)
        distance1 = geoDistanceLinePolygon(polygon1.exteriorRing, polygon2);
+       //Shortcut, if the geometries are already at their minimum distance
+       if (distance1 == 0)
+               return 0;
        //Other way around
        distance2 = geoDistanceLinePolygon(polygon2.exteriorRing, polygon1);
        //And return the minimum
@@ -738,6 +755,9 @@ geoDistanceInternal(GEOSGeom a, GEOSGeom
                for (int j = 0; j < numGeomsB; j++) {
                        geo2 = (GEOSGeometry *)GEOSGetGeometryN((const 
GEOSGeometry *)b, j);
                        distance = geoDistanceSingle(geo1, geo2);
+                       //Shortcut, if the geometries are already at their 
minimum distance
+                       if (distance == 0)
+                               return 0;
                        if (distance < min_distance)
                                min_distance = distance;
                }
@@ -771,7 +791,7 @@ wkbDistanceGeographic(dbl *out, wkb **a,
 **/
 /* Checks if two geographic geometries are within d meters of one another */
 str 
-wkbDWithinGeographic(bit *out, wkb **a, wkb **b, dbl d)
+wkbDWithinGeographic(bit *out, wkb **a, wkb **b, dbl *d)
 {
        str err = MAL_SUCCEED;
        GEOSGeom ga, gb;
@@ -779,7 +799,7 @@ wkbDWithinGeographic(bit *out, wkb **a, 
        err = wkbGetComplatibleGeometries(a, b, &ga, &gb);
        if (ga && gb) {
                distance = geoDistanceInternal(ga, gb);
-               (*out) = (distance <= d);
+               (*out) = (distance <= (*d));
        }
 
        GEOSGeom_destroy(ga);
@@ -954,6 +974,7 @@ GEOSGeom_getCollectionType (int GEOSGeom
 }
 
 /* Group By operation. Joins geometries together in the same group into a 
MultiGeometry */
+//TODO Check if the SRID is consistent within a group (right now we only use 
the first SRID)
 str 
 wkbCollectAggrSubGroupedCand(bat *outid, const bat *bid, const bat *gid, const 
bat *eid, const bat *sid, const bit *skip_nils)
 {
@@ -1048,11 +1069,13 @@ wkbCollectAggrSubGroupedCand(bat *outid,
                oid grp = gids ? gids[p] : g ? min + (oid)p : 0;
                wkb *inWKB = (wkb *)BUNtvar(bi, p);
                GEOSGeom inGEOM = wkb2geos(inWKB);
+               int srid = 0;
 
                if (grp != lastGrp) {
                        if (lastGrp != (oid)-1) {
                                //Finish the previous group, move on to the 
next one
                                collection = 
GEOSGeom_createCollection(geomCollectionType, unionGroup, (unsigned int) 
geomCount);
+                               //TODO Set SRID for collection
                                //Save collection to unions array as wkb
                                unions[lastGrp] = geos2wkb(collection);
 
@@ -1082,6 +1105,7 @@ wkbCollectAggrSubGroupedCand(bat *outid,
                        geomCount = 0;
                        lastGrp = grp;
                        geomCollectionType = 
GEOSGeom_getCollectionType(GEOSGeomTypeId(inGEOM));
+                       srid = GEOSGetSRID(inGEOM);
                }
 
                unionGroup[geomCount] = inGEOM;
diff --git a/geom/monetdb5/geom.h b/geom/monetdb5/geom.h
--- a/geom/monetdb5/geom.h
+++ b/geom/monetdb5/geom.h
@@ -90,7 +90,7 @@ typedef struct CartPoint
 
 /* Geographic functions */
 str wkbDistanceGeographic(dbl* out, wkb** a, wkb** b);
-str wkbDWithinGeographic(bit* out, wkb** a, wkb** b, dbl distance);
+str wkbDWithinGeographic(bit* out, wkb** a, wkb** b, dbl *distance);
 str wkbIntersectsGeographic(bit* out, wkb** a, wkb** b);
 str wkbCoversGeographic(bit* out, wkb** a, wkb** b);
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to