Changeset: 14cada59b5e9 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=14cada59b5e9 Modified Files: geom/monetdb5/geom.c geom/sql/40_geom.sql Branch: geo Log Message:
geom handles 3d geometries (x,y,z) diffs (184 lines): diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c --- a/geom/monetdb5/geom.c +++ b/geom/monetdb5/geom.c @@ -47,7 +47,6 @@ #define GEOMETRY_HAS_Z(info)(info & 0x02) #define GEOMETRY_HAS_M(info)(info & 0x01) -#define COORDINATES_NUM 3 /* the first argument in the functions is the return variable */ @@ -63,6 +62,7 @@ geom_export void geom_epilogue(void); geom_export wkb *wkbNULL(void); geom_export mbr *mbrNULL(void); +/* gets a GEOSGeometry and creates a WKB */ geom_export wkb *geos2wkb(GEOSGeom geosGeometry); geom_export int mbrFROMSTR(char *src, int *len, mbr **atom); @@ -71,6 +71,7 @@ geom_export int wkbFROMSTR(char *src, in geom_export int wkbTOSTR(char **dst, int *len, wkb *atom); geom_export str wkbFromText(wkb **w, str *wkt, int srid, int *tpe); geom_export str wkbAsText(str *r, wkb **w); +//geom_export str wkbFromString(wkb**, str*); geom_export str geomMakePoint2D(wkb**, double*, double*); geom_export str geomMakePoint3D(wkb**, double*, double*, double*); @@ -166,6 +167,30 @@ wkb *wkbNULL(void) { return (&nullval); } +/*str wkbFromString(wkb **w, str *wkt) { + int len = 0; + char *errbuf; + str ex; + + if (wkbFROMSTR(*wkt, 0, &len, w)) + return MAL_SUCCEED; + errbuf = GDKerrbuf; + if (errbuf) { + if (strncmp(errbuf, "!ERROR: ", 8) == 0) + errbuf += 8; + } else { + errbuf = "cannot parse string"; + } + + ex = createException(MAL, "wkb.FromString", "%s", errbuf); + + if (GDKerrbuf) + GDKerrbuf[0] = '\0'; + + return ex; +}*/ + + /* FROMSTR: parse string to mbr. */ /* return number of parsed characters. */ int mbrFROMSTR(char *src, int *len, mbr **atom) { @@ -232,17 +257,22 @@ int wkbFROMSTR(char *src, int srid, int 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; + int coordinateDimensions = 0; if (strcmp(src, str_nil) == 0) nil = 1; - if (!nil && (geometry_FROM_wkt = GEOSGeomFromWKT(src)) == NULL) { - goto return_nil; + if (!nil) { + GEOSWKTReader *WKT_reader = GEOSWKTReader_create(); + geometry_FROM_wkt = GEOSWKTReader_read(WKT_reader, src); // GEOSGeomFromWKT(src)) == NULL) { + GEOSWKTReader_destroy(WKT_reader); + + if(geometry_FROM_wkt == NULL) + goto return_nil; } ////it returns 2 or 3. How can I get 4?? - //coordinateDimensions = GEOSGeom_getCoordinateDimension(geosGeometry); + coordinateDimensions = GEOSGeom_getCoordinateDimension(geometry_FROM_wkt); if (!nil && GEOSGeomTypeId(geometry_FROM_wkt) == -1) { GEOSGeom_destroy(geometry_FROM_wkt); @@ -258,7 +288,7 @@ int wkbFROMSTR(char *src, int srid, int //the srid is lost with the transformation of the GEOSGeom to wkb //set the number of dimensions - GEOS_setWKBOutputDims(COORDINATES_NUM); + GEOS_setWKBOutputDims(coordinateDimensions); geometry_TO_wkb = GEOSGeomToWKB_buf(geometry_FROM_wkt, &wkbLen); GEOSGeom_destroy(geometry_FROM_wkt); @@ -297,14 +327,17 @@ int wkbTOSTR(char **dst, int *len, wkb * GEOSGeom geosGeometry = wkb2geos(atom); -dstStrLen = -1; -dstStrLen = GEOSGeom_getCoordinateDimension(geosGeometry); if (geosGeometry) { size_t l; - wkt = GEOSGeomToWKT(geosGeometry); + GEOSWKTWriter *WKT_wr = GEOSWKTWriter_create(); + //set the number of dimensions in the writer so that it can + //read correctly the geometry coordinates + GEOSWKTWriter_setOutputDimension(WKT_wr, GEOSGeom_getCoordinateDimension(geosGeometry)); + wkt = GEOSWKTWriter_write(WKT_wr, geosGeometry); l = strlen(wkt); assert(l < GDK_int_max); dstStrLen = (int) l + 2; /* add quotes */ + GEOSWKTWriter_destroy(WKT_wr); GEOSGeom_destroy(geosGeometry); } @@ -849,7 +882,6 @@ geom_export mbr *mbrREAD(mbr *a, stream geom_export int mbrWRITE(mbr *c, stream *s, size_t cnt); geom_export str mbrFromString(mbr **w, str *src); geom_export str mbrFromMBR(mbr **w, mbr **src); -//geom_export str wkbFromString(wkb **w, str *wkt); geom_export str wkbFromWKB(wkb **w, wkb **src); geom_export BUN wkbHASH(wkb *w); geom_export int wkbCOMP(wkb *l, wkb *r); @@ -1001,30 +1033,6 @@ mbrFromMBR(mbr **w, mbr **src) -/*str -wkbFromString(wkb **w, str *wkt) -{ - int len = 0; - char *errbuf; - str ex; - - if (wkbFROMSTR(*wkt, &len, w)) - return MAL_SUCCEED; - errbuf = GDKerrbuf; - if (errbuf) { - if (strncmp(errbuf, "!ERROR: ", 8) == 0) - errbuf += 8; - } else { - errbuf = "cannot parse string"; - } - - ex = createException(MAL, "wkb.FromString", "%s", errbuf); - - if (GDKerrbuf) - GDKerrbuf[0] = '\0'; - - return ex; -}*/ str wkbFromWKB(wkb **w, wkb **src) @@ -1184,15 +1192,13 @@ wkbMBR(mbr **res, wkb **geom) throw(MAL, "geom.mbr", "Failed to create mbr"); } -wkb * -geos2wkb(GEOSGeom geosGeometry) -{ +wkb* geos2wkb(GEOSGeom geosGeometry) { size_t wkbLen = 0; unsigned char *w = NULL; wkb *atom; if (geosGeometry != NULL){ - GEOS_setWKBOutputDims(COORDINATES_NUM); + GEOS_setWKBOutputDims(GEOSGeom_getCoordinateDimension(geosGeometry)); w = GEOSGeomToWKB_buf(geosGeometry, &wkbLen); } 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 @@ -56,7 +56,7 @@ CREATE FUNCTION ST_AsText(g Geometry) RE CREATE FUNCTION ST_GeomFromText(wkt string, srid integer) RETURNS Geometry EXTERNAL NAME geom."GeomFromText"; CREATE FUNCTION ST_GeometryFromText(wkt string, srid integer) RETURNS Geometry EXTERNAL NAME geom."GeomFromText"; CREATE FUNCTION ST_PointFromText(wkt string, srid integer) RETURNS Geometry EXTERNAL NAME geom."PointFromText"; -CREATE FUNCTION ST_LineFromText(wkt string, srid integer) RETURNS Geometry EXTERNAL NAME geom."LineFromText"; +CREATE FUNCTION ST_LineFromText(wkt string, srid integer) RETURNS GeometrySubtype EXTERNAL NAME geom."LineFromText"; CREATE FUNCTION ST_PolygonFromText(wkt string, srid integer) RETURNS Geometry EXTERNAL NAME geom."PolygonFromText"; CREATE FUNCTION ST_MPointFromText(wkt string, srid integer) RETURNS Geometry EXTERNAL NAME geom."MPointFromText"; CREATE FUNCTION ST_MLineFromText(wkt string, srid integer) RETURNS Geometry EXTERNAL NAME geom."MLineFromText"; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list