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