Changeset: 0e3c2c35c8dc for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0e3c2c35c8dc
Modified Files:
geom/lib/libgeom.c
geom/lib/libgeom.h
geom/monetdb5/geom.c
geom/monetdb5/geom.mal
geom/sql/40_geom.sql
monetdb5/mal/mal_interpreter.c
monetdb5/mal/mal_scenario.c
monetdb5/mal/mal_session.c
sql/backends/monet5/sql.h
sql/backends/monet5/sql.mal
sql/backends/monet5/sql_cast.c
sql/backends/monet5/sql_cast_impl_up_to_int.h
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_scenario.c
sql/common/sql_types.c
sql/common/sql_types.h
sql/server/rel_updates.c
sql/server/sql_parser.y
sql/server/sql_scan.c
sql/server/sql_symbol.h
Branch: geo
Log Message:
srid added to wkb. geos2wkb, wkb2geos and wkbFROMSTR adapted to this change
diffs (truncated from 807 to 300 lines):
diff --git a/geom/lib/libgeom.c b/geom/lib/libgeom.c
--- a/geom/lib/libgeom.c
+++ b/geom/lib/libgeom.c
@@ -110,6 +110,18 @@ getMbrGeos(mbr *res, const GEOSGeom geos
return 1;
}
+GEOSGeom wkb2geos(wkb* geomWKB) {
+ GEOSGeom geosGeometry;
+
+ if(wkb_isnil(geomWKB))
+ return NULL;
+
+ geosGeometry = GEOSGeomFromWKB_buf((unsigned char *)((geomWKB)->data),
(geomWKB)->len);
+ GEOSSetSRID(geosGeometry, (geomWKB)->srid);
+
+ return geosGeometry;
+}
+
/* Function getMbrGeom
* A wrapper for getMbrGeos on a geom_geometry.
*/
@@ -166,6 +178,24 @@ const char* geom_type2str(int t, int fla
case wkbGeometryCollection:
return "ST_GeometryCollection";
}
-}
+ }
return "UKNOWN";
}
+
+
+/*
+str geomerty_2_geometry(wkb *res, wkb **geom, int* columnType, int*
columnSRID, int* valueSRID) {
+
+//char* geomStr;
+//int len = 0;
+//fprintf(stderr, "geometry_2_geometry\n");
+//wkbTOSTR(&geomStr, &len, *geom);
+if(*geom != NULL)
+fprintf(stderr, "type:%d - wkbTOSTR cannot be seen at this point\n",
*columnType);
+
+if(res == NULL)
+ fprintf(stderr, "-> ");
+
+ fprintf(stderr, "%d vs %d\n", *columnSRID, *valueSRID);
+ return "0";
+}*/
diff --git a/geom/lib/libgeom.h b/geom/lib/libgeom.h
--- a/geom/lib/libgeom.h
+++ b/geom/lib/libgeom.h
@@ -111,6 +111,7 @@ libgeom_export const char *geom_type2str
typedef struct wkb {
int len;
+ int srid;
char data[1];
} wkb;
@@ -129,13 +130,14 @@ libgeom_export void libgeom_exit(void);
* Returns a GEOSGeom, created from a geom_geometry.
* On failure, returns NULL.
*/
-#define wkb2geos( geom ) \
- wkb_isnil((geom))? NULL: \
- GEOSGeomFromWKB_buf((unsigned char *)((geom)->data), (geom)->len)
+//#define wkb2geos( geom ) wkb_isnil((geom))? NULL:
GEOSGeomFromWKB_buf((unsigned char *)((geom)->data), (geom)->len)
#define wkb_nil geos2wkb(NULL);
libgeom_export int wkb_isnil(wkb *wkbp);
libgeom_export int getMbrGeos(mbr *mbr, const GEOSGeom geosGeometry);
libgeom_export int getMbrGeom(mbr *res, wkb *geom);
+libgeom_export GEOSGeom wkb2geos(wkb* geomWKB);
+
+//libgeom_export str geomerty_2_geometry(wkb *res, wkb **geom, int*
columnType, int* columnSRID, int* valueSRID);
#endif /* LIBGEOM_H */
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -62,8 +62,15 @@ geom_export void geom_epilogue(void);
geom_export wkb *wkbNULL(void);
geom_export mbr *mbrNULL(void);
+/* The WKB we use is the EWKB used also in PostGIS
+ * because we decided that it is easire to carry around
+ * the SRID */
+
/* gets a GEOSGeometry and creates a WKB */
-geom_export wkb *geos2wkb(GEOSGeom geosGeometry);
+geom_export wkb* geos2wkb(GEOSGeom geosGeometry);
+/* gets a WKB and creates a GEOSGeometry */
+//geom_export GEOSGeom wkb2geos(wkb* geomWKB);
+
geom_export int mbrFROMSTR(char *src, int *len, mbr **atom);
geom_export int mbrTOSTR(char **dst, int *len, mbr *atom);
@@ -103,6 +110,45 @@ geom_export str wkbIsValidReason(char**
geom_export str wkbIsValidDetail(char** out, wkb **geom);
+geom_export str A_2_B(wkb **res, wkb **geo, int* columnType, int* columnSRID);
+
+str A_2_B(wkb **res, wkb **geo, int* columnType, int* columnSRID) {
+ GEOSGeom geosGeometry;
+ int geoCoordinatesNum = 2;
+ int valueType = 0;
+ int valueSRID = 0;
+
+ if(valueSRID != *columnSRID)
+ throw(MAL, "geom.A_2_B", "Geometry should be expressed in SRID
%d and it is expressed in SRID %d\n", *columnSRID, valueSRID);
+
+ /* get the geosGeometry from the wkb */
+ geosGeometry = wkb2geos(*geo);
+ /* get the number of coordinates the geometry has */
+ geoCoordinatesNum = GEOSGeom_getCoordinateDimension(geosGeometry);
+ /* get the type of the geometry */
+ valueType = (GEOSGeomTypeId(geosGeometry)+1) << 2;
+
+ if(geoCoordinatesNum > 2)
+ valueType += (1<<1);
+ if(geoCoordinatesNum > 3)
+ valueType += 1;
+
+ //fprintf(stderr, "SRDI: %d, type:%d - coordinates:%d\n", *valueSRID,
*valueType, geoCoordinatesNum);
+
+ if(valueType != *columnType)
+ throw(MAL, "geom.A_2_B", "Geometry should be of type %d and it
is of type %d\n", *columnType, valueType);
+
+ /* get the wkb from the geosGeometry */
+ *res = geos2wkb(geosGeometry);
+
+
+
+ //fprintf(stderr, "%d - %d vs %d\n", *columnSRID, *columnType,
*valueType);
+
+ return MAL_SUCCEED;
+}
+
+
/*check if the geometry has z coordinate*/
void geoHasZ(int* res, int* info) {
if(GEOMETRY_HAS_Z(*info)) *res=1;
@@ -171,6 +217,45 @@ wkb *wkbNULL(void) {
return (&nullval);
}
+wkb* geos2wkb(GEOSGeom geosGeometry) {
+ size_t wkbLen = 0;
+ unsigned char *w = NULL;
+ wkb *geosWKB;
+
+ if (geosGeometry != NULL){
+
GEOS_setWKBOutputDims(GEOSGeom_getCoordinateDimension(geosGeometry));
+ w = GEOSGeomToWKB_buf(geosGeometry, &wkbLen);
+ }
+
+ geosWKB = GDKmalloc(wkb_size(wkbLen));
+ if (geosWKB == NULL)
+ return NULL;
+
+ if (geosGeometry == NULL || w == NULL) {
+ *geosWKB = *wkbNULL();
+ } else {
+ assert(wkbLen <= GDK_int_max);
+ geosWKB->len = (int) wkbLen;
+ geosWKB->srid = GEOSGetSRID(geosGeometry);
+ memcpy(&geosWKB->data, w, wkbLen);
+ GEOSFree(w);
+ }
+
+return geosWKB;
+}
+
+/*GEOSGeom wkb2geos(wkb* geomWKB) {
+ GEOSGeom geosGeometry;
+
+ if(wkb_isnil(geom))
+ return NULL;
+
+ geosGeometry = GEOSGeomFromWKB_buf((unsigned char *)((geomWKB)->data),
(geomWKB)->len);
+ GEOSSetSRID(geosGeometry, (geomWKB)->srid);
+
+ return geosGeometry;
+}*/
+
/*str wkbFromString(wkb **w, str *wkt) {
int len = 0;
char *errbuf;
@@ -257,59 +342,73 @@ int mbrTOSTR(char **dst, int *len, mbr *
/* FROMSTR: parse string to @1. */
/* return number of parsed characters. */
int wkbFROMSTR(char *src, int srid, int *len, wkb **atom) {
- GEOSGeom geometry_FROM_wkt = NULL; /* The geometry object that is
parsed from the src string. */
- unsigned char *geometry_TO_wkb = NULL; /* The "well known binary"
serialization of the geometry object. */
- size_t wkbLen = 0; /* The length of the wkbSer string. */
- int nil = 0;
- int coordinateDimensions = 0;
+ GEOSGeom geosGeometry = NULL; /* The geometry object that is parsed
from the src string. */
+ //unsigned char *geometry_TO_wkb = NULL; /* The "well known
binary" serialization of the geometry object. */
+ //size_t wkbLen = 0; /* The length of the wkbSer string. */
+ //int nil = 0;
+ //int coordinateDimensions = 0;
+ GEOSWKTReader *WKT_reader;
- if (strcmp(src, str_nil) == 0)
- nil = 1;
+ if (strcmp(src, str_nil) == 0) {
+ **atom = *wkbNULL();
+ return 0;
+ }
+ //nil = 1;
- if (!nil) {
- GEOSWKTReader *WKT_reader = GEOSWKTReader_create();
- geometry_FROM_wkt = GEOSWKTReader_read(WKT_reader, src); //
GEOSGeomFromWKT(src)) == NULL) {
- GEOSWKTReader_destroy(WKT_reader);
+ //if (!nil) {
+ WKT_reader = GEOSWKTReader_create();
+ geosGeometry = GEOSWKTReader_read(WKT_reader, src); //
GEOSGeomFromWKT(src)) == NULL) {
+ GEOSWKTReader_destroy(WKT_reader);
- if(geometry_FROM_wkt == NULL)
- goto return_nil;
+ if(geosGeometry == NULL){
+ **atom = *wkbNULL();
+ return 0;
+ }
+ // goto return_nil;
+ //}
+
+ //it returns 2 or 3. How can I get 4??
+ //coordinateDimensions = GEOSGeom_getCoordinateDimension(geosGeometry);
+
+ if (GEOSGeomTypeId(geosGeometry) == -1) {
+ GEOSGeom_destroy(geosGeometry);
+ **atom = *wkbNULL();
+ return 0;
}
- ////it returns 2 or 3. How can I get 4??
- coordinateDimensions =
GEOSGeom_getCoordinateDimension(geometry_FROM_wkt);
+// if (!nil) {
+ //add the srid
+ if(srid == 0 )
+ GEOSSetSRID(geosGeometry, 4326);
+ else //should we check whether the srid exists in spatial_ref_sys?
+ GEOSSetSRID(geosGeometry, srid);
+ /* the srid was lost with the transformation of the GEOSGeom to wkb
+ * so we decided to store it in the wkb */
+
+ //set the number of dimensions
+ //GEOS_setWKBOutputDims(coordinateDimensions);
- if (!nil && GEOSGeomTypeId(geometry_FROM_wkt) == -1) {
- GEOSGeom_destroy(geometry_FROM_wkt);
- goto return_nil;
- }
-
- if (!nil) {
- //add the srid
- if(srid == 0 )
- GEOSSetSRID(geometry_FROM_wkt, 4326);
- else //should we check whether the srid exists in
spatial_ref_sys?
- GEOSSetSRID(geometry_FROM_wkt, srid);
- //the srid is lost with the transformation of the GEOSGeom to
wkb
-
- //set the number of dimensions
- GEOS_setWKBOutputDims(coordinateDimensions);
-
- geometry_TO_wkb = GEOSGeomToWKB_buf(geometry_FROM_wkt, &wkbLen);
- GEOSGeom_destroy(geometry_FROM_wkt);
- }
+ /* we have a GEOSGeometry will number of coordinates and SRID and we
+ * want to get the wkb out of it */
+ *atom = geos2wkb(geosGeometry);
+/*
+// geometry_TO_wkb = GEOSGeomToWKB_buf(geometry_FROM_wkt, &wkbLen);
+// GEOSGeom_destroy(geometry_FROM_wkt);
+// }
if (*atom == NULL || *len < (int) wkb_size(wkbLen)) {
if (*atom)
GDKfree(*atom);
*atom = GDKmalloc(*len = (int) wkb_size(wkbLen));
}
- if (!geometry_TO_wkb) {
- **atom = *wkbNULL();
- } else {
- assert(wkbLen <= GDK_int_max);
- (*atom)->len = (int) wkbLen;
- memcpy(&(*atom)->data, geometry_TO_wkb, wkbLen);
- GEOSFree(geometry_TO_wkb);
- }
+// if (!geometry_TO_wkb) {
+// **atom = *wkbNULL();
+// } else {
+
+ assert(wkbLen <= GDK_int_max);
+ (*atom)->len = (int) wkbLen;
+ memcpy(&(*atom)->data, geometry_TO_wkb, wkbLen);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list