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

MakePoint should allows the user to set SRID. The user can do it through  
ST_SetSRID, however, in a bat with millions of Point Geometries, it is an 
expensive operation.


diffs (192 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -3072,7 +3072,7 @@ wkbMLineStringToPolygon(wkb **geomWKB, s
 }
 
 str
-wkbMakePoint(wkb **out, dbl *x, dbl *y, dbl *z, dbl *m, int *zmFlag)
+wkbMakePoint(wkb **out, dbl *x, dbl *y, dbl *z, dbl *m, int *zmFlag, int *srid)
 {
        GEOSGeom geosGeometry;
        GEOSCoordSeq seq;
@@ -3114,6 +3114,9 @@ wkbMakePoint(wkb **out, dbl *x, dbl *y, 
                throw(MAL, "geom.MakePoint", "Failed to create GEOSGeometry 
from the coordinates");
        }
 
+    if (*srid)
+       GEOSSetSRID(geosGeometry, *srid);
+
        *out = geos2wkb(geosGeometry);
        GEOSGeom_destroy(geosGeometry);
 
diff --git a/geom/monetdb5/geom.h b/geom/monetdb5/geom.h
--- a/geom/monetdb5/geom.h
+++ b/geom/monetdb5/geom.h
@@ -159,8 +159,8 @@ geom_export str wkbDWithin(bit*, wkb**, 
 
 //geom_export str wkbFromString(wkb**, str*); 
 
-geom_export str wkbMakePoint(wkb**, dbl*, dbl*, dbl*, dbl*, int*);
-geom_export str wkbMakePoint_bat(bat*, bat*, bat*, bat*, bat*, int*);
+geom_export str wkbMakePoint(wkb**, dbl*, dbl*, dbl*, dbl*, int*, int*);
+geom_export str wkbMakePoint_bat(bat*, bat*, bat*, bat*, bat*, int*, int*);
 
 geom_export str wkbCoordDim(int* , wkb**);
 geom_export str wkbSetSRID(wkb**, wkb**, int*);
diff --git a/geom/monetdb5/geom.mal b/geom/monetdb5/geom.mal
--- a/geom/monetdb5/geom.mal
+++ b/geom/monetdb5/geom.mal
@@ -174,22 +174,41 @@ function BdMPolyFromText(wkt:str, srid:i
 end BdMPolyFromText;
 
 
-command MakePointXYZM(x:dbl, y:dbl, z:dbl, m:dbl, zmFlag:int) :wkb address 
wkbMakePoint
+command MakePointXYZM(x:dbl, y:dbl, z:dbl, m:dbl, zmFlag:int, srid:int) :wkb 
address wkbMakePoint
 comment "creates a point using the coordinates";
 function MakePoint(x:dbl, y:dbl) :wkb;
-       p := MakePointXYZM(x, y, 0:dbl, 0:dbl, 0);
+       p := MakePointXYZM(x, y, 0:dbl, 0:dbl, 0, 0);
        return p;
 end MakePoint;
-function MakePoint(x:dbl, y:dbl, z:dbl) :wkb;
-       p := MakePointXYZM(x, y, z, 0:dbl, 10);
+function MakePoint(x:dbl, y:dbl, srid:int) :wkb;
+       p := MakePointXYZM(x, y, 0:dbl, 0:dbl, 0, srid);
        return p;
 end MakePoint;
+
+function MakePoint(x:dbl, y:dbl, z:dbl) :wkb;
+       p := MakePointXYZM(x, y, z, 0:dbl, 10, 0);
+       return p;
+end MakePoint;
+function MakePoint(x:dbl, y:dbl, z:dbl, srid:int) :wkb;
+       p := MakePointXYZM(x, y, z, 0:dbl, 10, srid);
+       return p;
+end MakePoint;
+
 function MakePointM(x:dbl, y:dbl, m:dbl) :wkb;
-       p := MakePointXYZM(x, y, 0:dbl, m, 1);
+       p := MakePointXYZM(x, y, 0:dbl, m, 1, 0);
        return p;
 end MakePointM;
+function MakePointM(x:dbl, y:dbl, m:dbl, srid:int) :wkb;
+       p := MakePointXYZM(x, y, 0:dbl, m, 1, srid);
+       return p;
+end MakePointM;
+
 function MakePoint(x:dbl, y:dbl, z:dbl, m:dbl) :wkb;
-       p := MakePointXYZM(x, y, z, m, 11);
+       p := MakePointXYZM(x, y, z, m, 11, 0);
+       return p;
+end MakePoint;
+function MakePoint(x:dbl, y:dbl, z:dbl, m:dbl, srid:int) :wkb;
+       p := MakePointXYZM(x, y, z, m, 11, srid);
        return p;
 end MakePoint;
 
@@ -621,22 +640,42 @@ function GeometryType2(w:bat[:oid,:wkb])
        return x;
 end GeometryType2;
 
-command MakePointXYZM(x:bat[:oid,:dbl], y:bat[:oid,:dbl], z:bat[:oid,:dbl], 
m:bat[:oid,:dbl], zmFlag:int) :bat[:oid,:wkb] address wkbMakePoint_bat
+command MakePointXYZM(x:bat[:oid,:dbl], y:bat[:oid,:dbl], z:bat[:oid,:dbl], 
m:bat[:oid,:dbl], zmFlag:int, srid:int) :bat[:oid,:wkb] address wkbMakePoint_bat
 comment "creates a point using the coordinates";
+
 function MakePoint(x:bat[:oid,:dbl], y:bat[:oid,:dbl]) :bat[:oid,:wkb];
-       p := MakePointXYZM(x, y, nil:bat, nil:bat, 0);
+       p := MakePointXYZM(x, y, nil:bat, nil:bat, 0, 0);
        return p;
 end MakePoint;
-function MakePoint(x:bat[:oid,:dbl], y:bat[:oid,:dbl], z:bat[:oid,:dbl]) 
:bat[:oid,:wkb];
-       p := MakePointXYZM(x, y, z, nil:bat, 10);
+function MakePoint(x:bat[:oid,:dbl], y:bat[:oid,:dbl], srid:int) 
:bat[:oid,:wkb];
+       p := MakePointXYZM(x, y, nil:bat, nil:bat, 0, srid);
        return p;
 end MakePoint;
+
+function MakePoint(x:bat[:oid,:dbl], y:bat[:oid,:dbl], z:bat[:oid,:dbl]) 
:bat[:oid,:wkb];
+       p := MakePointXYZM(x, y, z, nil:bat, 10, 0);
+       return p;
+end MakePoint;
+function MakePoint(x:bat[:oid,:dbl], y:bat[:oid,:dbl], z:bat[:oid,:dbl], 
srid:int) :bat[:oid,:wkb];
+       p := MakePointXYZM(x, y, z, nil:bat, 10, srid);
+       return p;
+end MakePoint;
+
 function MakePointM(x:bat[:oid,:dbl], y:bat[:oid,:dbl], m:bat[:oid,:dbl]) 
:bat[:oid,:wkb];
-       p := MakePointXYZM(x, y, nil:bat, m, 1);
+       p := MakePointXYZM(x, y, nil:bat, m, 1, 0);
        return p;
 end MakePointM;
+function MakePointM(x:bat[:oid,:dbl], y:bat[:oid,:dbl], m:bat[:oid,:dbl], 
srid:int) :bat[:oid,:wkb];
+       p := MakePointXYZM(x, y, nil:bat, m, 1, srid);
+       return p;
+end MakePointM;
+
 function MakePoint(x:bat[:oid,:dbl], y:bat[:oid,:dbl], z:bat[:oid,:dbl], 
m:bat[:oid,:dbl]) :bat[:oid,:wkb];
-       p := MakePointXYZM(x, y, z, m, 11);
+       p := MakePointXYZM(x, y, z, m, 11, 0);
+       return p;
+end MakePoint;
+function MakePoint(x:bat[:oid,:dbl], y:bat[:oid,:dbl], z:bat[:oid,:dbl], 
m:bat[:oid,:dbl], srid:int) :bat[:oid,:wkb];
+       p := MakePointXYZM(x, y, z, m, 11, srid);
        return p;
 end MakePoint;
 
diff --git a/geom/monetdb5/geomBulk.c b/geom/monetdb5/geomBulk.c
--- a/geom/monetdb5/geomBulk.c
+++ b/geom/monetdb5/geomBulk.c
@@ -876,7 +876,7 @@ wkbFromWKB_bat(bat *outBAT_id, bat *inBA
 /********* Multiple inputs **********/
 /************************************/
 str
-wkbMakePoint_bat(bat *outBAT_id, bat *xBAT_id, bat *yBAT_id, bat *zBAT_id, bat 
*mBAT_id, int *zmFlag)
+wkbMakePoint_bat(bat *outBAT_id, bat *xBAT_id, bat *yBAT_id, bat *zBAT_id, bat 
*mBAT_id, int *zmFlag, int *srid)
 {
        BAT *outBAT = NULL, *xBAT = NULL, *yBAT = NULL, *zBAT = NULL, *mBAT = 
NULL;
        BATiter xBAT_iter, yBAT_iter, zBAT_iter, mBAT_iter;
@@ -932,15 +932,15 @@ wkbMakePoint_bat(bat *outBAT_id, bat *xB
                if (mBAT)
                        m = *((double *) BUNtail(mBAT_iter, i + 
BUNfirst(mBAT)));
 
-               if ((ret = wkbMakePoint(&pointWKB, &x, &y, &z, &m, zmFlag)) != 
MAL_SUCCEED) {   //check
-                       BBPunfix(outBAT->batCacheid);
-
-                       goto clean;
-               }
-               BUNappend(outBAT, pointWKB, TRUE);      //add the result to the 
outBAT
-               GDKfree(pointWKB);
-               pointWKB = NULL;
-       }
+        if ((ret = wkbMakePoint(&pointWKB, &x, &y, &z, &m, zmFlag, srid)) != 
MAL_SUCCEED) {    //check
+            BBPunfix(outBAT->batCacheid);
+            goto clean;
+        }
+        BUNappend(outBAT, pointWKB, TRUE);     //add the result to the outBAT
+        if (pointWKB)
+            GDKfree(pointWKB);
+        pointWKB = NULL;
+    }
 
        //set the number of elements in the outBAT
        BATsetcount(outBAT, BATcount(xBAT));
diff --git a/geom/sql/40_geom.sql b/geom/sql/40_geom.sql
--- a/geom/sql/40_geom.sql
+++ b/geom/sql/40_geom.sql
@@ -4169,10 +4169,15 @@ CREATE FUNCTION ST_GeomCollFromText(wkt 
 
 -- Create Geometry from simpler geometries
 CREATE FUNCTION ST_MakePoint(x double, y double) RETURNS Geometry EXTERNAL 
NAME geom."MakePoint"; 
+CREATE FUNCTION ST_MakePoint(x double, y double, srid integer) RETURNS 
Geometry EXTERNAL NAME geom."MakePoint"; 
 CREATE FUNCTION ST_Point(x double, y double) RETURNS Geometry EXTERNAL NAME 
geom."MakePoint";
 CREATE FUNCTION ST_MakePoint(x double, y double, z double) RETURNS Geometry 
EXTERNAL NAME geom."MakePoint";
+CREATE FUNCTION ST_MakePoint(x double, y double, z double, srid integer) 
RETURNS Geometry EXTERNAL NAME geom."MakePoint";
 CREATE FUNCTION ST_MakePoint(x double, y double, z double, m double) RETURNS 
Geometry EXTERNAL NAME geom."MakePoint";
+CREATE FUNCTION ST_MakePoint(x double, y double, z double, m double, srid 
integer) RETURNS Geometry EXTERNAL NAME geom."MakePoint";
+
 CREATE FUNCTION ST_MakePointM(x double, y double, m double) RETURNS Geometry 
EXTERNAL NAME geom."MakePointM";
+
 --CREATE FUNCTION ST_MakeLine(geometry set geoms)?????
 CREATE AGGREGATE ST_MakeLine(geom Geometry) RETURNS Geometry external name 
geom."MakeLine";
 CREATE FUNCTION ST_MakeLine(geom1 Geometry, geom2 Geometry) RETURNS Geometry 
external name geom."MakeLine"; --two single geometries
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to