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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list