Changeset: 9d288c36d901 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9d288c36d901
Modified Files:
        geom/monetdb5/geom.h
        geom/monetdb5/geom.mal
        geom/monetdb5/geomBulk.c
Branch: sfcgal
Log Message:

Fix bug in the ST_Translate bulk version. Add bulk version for Centroid and 
Intersects


diffs (199 lines):

diff --git a/geom/monetdb5/geom.h b/geom/monetdb5/geom.h
--- a/geom/monetdb5/geom.h
+++ b/geom/monetdb5/geom.h
@@ -144,6 +144,7 @@ geom_export str wkbBoundary_bat(bat *inB
 geom_export str wkbEquals(bit*, wkb**, wkb**);
 geom_export str wkbDisjoint(bit*, wkb**, wkb**);
 geom_export str wkbIntersects(bit*, wkb**, wkb**);
+geom_export str wkbIntersects_bat(bat *outBAT_id, bat *aBAT_id, bat *bBAT_id);
 geom_export str wkbTouches(bit*, wkb**, wkb**);
 geom_export str wkbCrosses(bit*, wkb**, wkb**);
 geom_export str wkbWithin(bit*, wkb**, wkb**);
@@ -204,6 +205,7 @@ geom_export str wkbIsValidDetail(char** 
 geom_export str wkbArea(dbl *out, wkb **a);
 geom_export str wkbArea_bat(bat *inBAT_id, bat *outBAT_id);
 geom_export str wkbCentroid(wkb **out, wkb **geom);
+geom_export str wkbCentroid_bat(bat *outBAT_id, bat *inBAT_id);
 geom_export str wkbDistance(dbl *out, wkb **a, wkb **b);
 geom_export str wkbLength(dbl *out, wkb **a);
 geom_export str wkbConvexHull(wkb **out, wkb **geom);
diff --git a/geom/monetdb5/geom.mal b/geom/monetdb5/geom.mal
--- a/geom/monetdb5/geom.mal
+++ b/geom/monetdb5/geom.mal
@@ -362,6 +362,10 @@ command Contains(a:wkb, x:dbl, y:dbl) :b
 address wkbContains_point
 comment "Returns true if the Geometry a 'spatially contains' Geometry b";
 
+command Contains(a:wkb, px:bat[:oid,:dbl], py:bat[:oid,:dbl]) :bat[:oid,:bit]
+address wkbContains_point_bat
+comment "Returns true if the Geometry-BAT a 'spatially contains' Geometry-B b";
+
 
 command Translate3D(g:wkb, dx:dbl, dy:dbl, dz:dbl) :wkb address wkbTranslate
 comment "Moves all points of the geometry by dx, dy, dz";
@@ -376,11 +380,6 @@ function Translate(g:wkb, dx:dbl, dy:dbl
        return x;
 end Translate;
 
-command Contains(a:wkb, px:bat[:oid,:dbl], py:bat[:oid,:dbl]) :bat[:oid,:bit]
-address wkbContains_point_bat
-comment "Returns true if the Geometry-BAT a 'spatially contains' Geometry-B b";
-
-
 command PointsNum(w:wkb, check:int) :int address wkbNumPoints
 comment "The number of points in the Geometry. If check=1, the geometry should 
be a linestring";
 function NumPoints(w:wkb) :int;
@@ -758,6 +757,9 @@ command Distance(a:bat[:oid,:wkb], b:bat
 command Distance(a:wkb, b:bat[:oid,:wkb]) :bat[:oid,:dbl] address 
wkbDistance_geom_bat;
 command Distance(a:bat[:oid,:wkb], b:wkb) :bat[:oid,:dbl] address 
wkbDistance_bat_geom;
 
+command Centroid(w:bat[:oid,:wkb]) :bat[:oid,:wkb] address wkbCentroid_bat
+comment "Computes the geometric center of a geometry, or equivalently, the 
center of mass of the geometry as a POINT.";
+
 command Contains(a:bat[:oid,:wkb], b:bat[:oid,:wkb]) :bat[:oid,:bit] address 
wkbContains_bat;
 command Contains(a:wkb, b:bat[:oid,:wkb]) :bat[:oid,:bit] address 
wkbContains_geom_bat;
 command Contains(a:bat[:oid,:wkb], b:wkb) :bat[:oid,:bit] address 
wkbContains_bat_geom;
@@ -826,6 +828,8 @@ end YMaxFromMBR;
 command Area(:bat[:oid,:wkb]) :bat[:oid,:dbl] address wkbArea_bat
 comment "Returns the area of the surface if it is a polygon or multi-polygon";
 
+command Intersects(a:bat[:oid,:wkb], b:bat[:oid,:wkb]) :bat[:oid,:bit] address 
wkbIntersects_bat
+comment "Returns true if these Geometries 'spatially intersect in 2D'";
 
 module calc;
 
diff --git a/geom/monetdb5/geomBulk.c b/geom/monetdb5/geomBulk.c
--- a/geom/monetdb5/geomBulk.c
+++ b/geom/monetdb5/geomBulk.c
@@ -344,6 +344,11 @@ wkbBoundary_bat(bat *outBAT_id, bat *inB
        return WKBtoWKB_bat(outBAT_id, inBAT_id, wkbBoundary, 
"batgeom.wkbBoundary");
 }
 
+str
+wkbCentroid_bat(bat *outBAT_id, bat *inBAT_id)
+{
+       return WKBtoWKB_bat(outBAT_id, inBAT_id, wkbCentroid, 
"batgeom.wkbCentroid");
+}
 
 
/**************************************************************************************/
 /*************************** IN: wkb - OUT: wkb - FLAG:int 
****************************/
@@ -501,6 +506,85 @@ wkbIsValid_bat(bat *outBAT_id, bat *inBA
        return WKBtoBIT_bat(outBAT_id, inBAT_id, wkbIsValid, 
"batgeom.wkbIsValid");
 }
 
+/***************************************************************************/
+/*************************** IN: wkb wkb - OUT: bit 
****************************/
+/***************************************************************************/
+
+static str
+WKBWKBtoBIT_bat(bat *outBAT_id, bat *aBAT_id, bat *bBAT_id, str (*func) (bit 
*, wkb **, wkb **), const char *name)
+{
+       BAT *outBAT = NULL, *aBAT = NULL, *bBAT = NULL;
+       BUN p = 0, q = 0;
+       BATiter aBAT_iter, bBAT_iter;
+       str msg = MAL_SUCCEED;
+    static struct timeval start, stop;
+    unsigned long long t;
+
+       //get the descriptor of the BAT
+       if ((aBAT = BATdescriptor(*aBAT_id)) == NULL) {
+               throw(MAL, name, RUNTIME_OBJECT_MISSING);
+       }
+       if ((bBAT = BATdescriptor(*bBAT_id)) == NULL) {
+               BBPunfix(aBAT->batCacheid);
+               throw(MAL, name, RUNTIME_OBJECT_MISSING);
+       }
+
+       //create a new for the output BAT
+       if ((outBAT = COLnew(aBAT->hseqbase, ATOMindex("bit"), BATcount(aBAT), 
TRANSIENT)) == NULL) {
+               BBPunfix(aBAT->batCacheid);
+               BBPunfix(bBAT->batCacheid);
+               throw(MAL, name, MAL_MALLOC_FAIL);
+       }
+
+       //iterator over the input BAT
+       aBAT_iter = bat_iterator(aBAT);
+       bBAT_iter = bat_iterator(bBAT);
+
+    omp_set_dynamic(0);     // Explicitly disable dynamic teams
+    omp_set_num_threads(1);
+    q = BUNlast(aBAT);
+    fprintf(stdout, "%d %d\n", p, q);
+    gettimeofday(&start, NULL);
+       //BATloop(inBAT, p, q) {        //iterate over all valid elements
+    #pragma omp parallel for
+    for (p = 0; p < q; p++) {
+        str err = NULL;
+           wkb *aWKB = NULL, *bWKB = NULL;
+        bit out;
+
+        aWKB = (wkb *) BUNtail(aBAT_iter, p);
+        bWKB = (wkb *) BUNtail(bBAT_iter, p);
+        if ((err = (*func) (&out, &aWKB, &bWKB)) != MAL_SUCCEED) {
+            msg = err;
+            #pragma omp cancelregion
+        }
+        BUNappend(outBAT, &out, TRUE); //add the result to the new BAT
+    }
+    gettimeofday(&stop, NULL);
+    t = 1000 * (stop.tv_sec - start.tv_sec) + (stop.tv_usec - start.tv_usec) / 
1000;
+    fprintf(stdout, "%llu ms\n", t);
+
+    if (msg != MAL_SUCCEED) {
+        BBPunfix(aBAT->batCacheid);
+        BBPunfix(bBAT->batCacheid);
+        BBPunfix(outBAT->batCacheid);
+        return msg;
+    }
+
+       //set the number of elements in the outBAT
+       //BATsetcount(outBAT, BATcount(inBAT));
+       BBPunfix(aBAT->batCacheid);
+       BBPunfix(bBAT->batCacheid);
+       BBPkeepref(*outBAT_id = outBAT->batCacheid);
+
+       return MAL_SUCCEED;
+}
+
+str
+wkbIntersects_bat(bat *outBAT_id, bat *aBAT_id, bat *bBAT_id)
+{
+       return WKBWKBtoBIT_bat(outBAT_id, aBAT_id, bBAT_id, wkbIntersects, 
"batgeom.wkbIntersects");
+}
 
 /***************************************************************************/
 /*************************** IN: wkb - OUT: int ****************************/
@@ -730,25 +814,25 @@ WKBtoWKBxyzDBL_bat(bat *outBAT_id, bat *
                str err = NULL;
            wkb *inWKB = NULL;
                wkb *outSingle;
-        double *x = NULL, *y = NULL, *z = NULL;
+        double x, y, z;
 
 
         inWKB = (wkb *) BUNtail(inBAT_iter, p);
 
         if (*inXBAT_id != bat_nil)
-            x = (double *) BUNtail(inXBAT_iter, p);
+            x = *(double *) BUNtail(inXBAT_iter, p);
         else
-            *x = *dx;
+            x = *dx;
         if (*inYBAT_id != bat_nil)
-            y = (double *) BUNtail(inYBAT_iter, p);
+            y = *(double *) BUNtail(inYBAT_iter, p);
         else
-            *y = *dy;
+            y = *dy;
         if (*inZBAT_id != bat_nil)
-            z = (double *) BUNtail(inZBAT_iter, p);
+            z = *(double *) BUNtail(inZBAT_iter, p);
         else
-            *z = *dz;
+            z = *dz;
 
-        if ((err = (*func) (&outSingle, &inWKB, x, y, z)) != MAL_SUCCEED) {
+        if ((err = (*func) (&outSingle, &inWKB, &x, &y, &z)) != MAL_SUCCEED) {
             BBPunfix(inBAT->batCacheid);
             if (*inXBAT_id != bat_nil)
                 BBPunfix(inXBAT->batCacheid);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to