Changeset: 8f4731eb13ee for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8f4731eb13ee Added Files: geom/sql/postgis_spatial_ref_sys.csv geom/sql/testInsert.sql Modified Files: geom/lib/libgeom.h geom/monetdb5/geom.c geom/monetdb5/geom.mal geom/sql/40_geom.sql Branch: geo Log Message:
spatial_ref_sys csv from postgis more function implemented diffs (truncated from 12106 to 300 lines): diff --git a/geom/lib/libgeom.h b/geom/lib/libgeom.h --- a/geom/lib/libgeom.h +++ b/geom/lib/libgeom.h @@ -131,6 +131,7 @@ libgeom_export void libgeom_exit(void); #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); diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c --- a/geom/monetdb5/geom.c +++ b/geom/monetdb5/geom.c @@ -89,6 +89,9 @@ geom_export str wkbEndPoint(wkb **out, w geom_export str wkbNumPoints(int *out, wkb **geom); geom_export str wkbPointN(wkb **out, wkb **geom, short *n); geom_export str wkbEnvelope(wkb **out, wkb **geom); +geom_export str wkbExteriorRing(wkb**, wkb**); +geom_export str wkbInteriorRingN(wkb**, wkb**, short*); +geom_export str wkbNumInteriorRings(int*, wkb**); geom_export str wkbIsEmpty(bit *out, wkb **geom); geom_export str wkbIsSimple(bit *out, wkb **geom); @@ -362,7 +365,7 @@ static str geomMakePoint(wkb **out, GEOS GEOSGeom_destroy(geosGeometry); if(!wkbSer) { - **out = *wkbNULL(); + *out = wkb_nil; throw(MAL, "geomMakePoint", "Failed to create wkb from GEOSGeometry"); } @@ -370,7 +373,7 @@ static str geomMakePoint(wkb **out, GEOS *out = GDKmalloc((int) wkb_size(wkbLen)); if(*out == NULL) { - **out = *wkbNULL(); + *out = wkb_nil; throw(MAL, "geomMakePoint", "Failed to reserve memory for *wkb"); } @@ -392,7 +395,7 @@ str geomMakePoint2D(wkb** out, double* x geosGeometry = GEOSGeom_createPoint(seq); if(geosGeometry == NULL){ - **out = *wkbNULL(); + *out = wkb_nil; throw(MAL, "geomMakePoint", "Failed to create GEOSGeometry from the coordiates"); } @@ -411,7 +414,7 @@ str geomMakePoint3D(wkb** out, double* x geosGeometry = GEOSGeom_createPoint(seq); if(geosGeometry == NULL){ - **out = *wkbNULL(); + *out = wkb_nil; throw(MAL, "geomMakePoint", "Failed to create GEOSGeometry from the coordiates"); } @@ -431,7 +434,7 @@ str geomMakePoint4D(wkb** out, double* x geosGeometry = GEOSGeom_createPoint(seq); if(geosGeometry == NULL){ - **out = *wkbNULL(); + *out = wkb_nil; throw(MAL, "geomMakePoint", "Failed to create GEOSGeometry from the coordiates"); } @@ -450,7 +453,7 @@ str geomMakePointM(wkb** out, double* x, geosGeometry = GEOSGeom_createPoint(seq); if(geosGeometry == NULL){ - **out = *wkbNULL(); + *out = wkb_nil; throw(MAL, "geomMakePoint", "Failed to create GEOSGeometry from the coordiates"); } @@ -556,7 +559,7 @@ static str wkbBasic(wkb **out, wkb **geo GEOSGeom geosGeometry = wkb2geos(*geom); if (!geosGeometry) { - *out = geos2wkb(NULL); + *out = wkb_nil; throw(MAL, name, "wkb2geos failed"); } @@ -580,12 +583,12 @@ static str wkbBorderPoint(wkb **out, wkb GEOSGeom geosGeometry = wkb2geos(*geom); if (!geosGeometry) { - *out = geos2wkb(NULL); + *out = wkb_nil; throw(MAL, name, "wkb2geos failed"); } if (GEOSGeomTypeId(geosGeometry) != GEOS_LINESTRING) { - *out = geos2wkb(NULL); + *out = wkb_nil; throw(MAL, name, "GEOSGeomGet%s failed. Geometry not a LineString", name + 5); } @@ -612,7 +615,7 @@ str wkbNumPoints(int *out, wkb **geom) { if (!geosGeometry) { *out = int_nil; - return MAL_SUCCEED; + throw(MAL, "geolib/libgeom.hm.NumPoints", "wkb2geos failed"); } if (GEOSGeomTypeId(geosGeometry) != GEOS_LINESTRING) { @@ -635,24 +638,24 @@ str wkbPointN(wkb **out, wkb **geom, sho GEOSGeom geosGeometry = wkb2geos(*geom); if (!geosGeometry) { - *out = geos2wkb(NULL); - return MAL_SUCCEED; + *out = wkb_nil; + throw(MAL, "geom.PointN", "wkb2geos failed"); } if (GEOSGeomTypeId(geosGeometry) != GEOS_LINESTRING) { - *out = geos2wkb(NULL); - throw(MAL, "geom.PointN", "GEOSGeomGetPointN failed. Geometry not a LineString"); + *out = wkb_nil; + throw(MAL, "geom.PointN", "Geometry not a LineString"); } //check number of points rN = GEOSGeomGetNumPoints(geosGeometry); if (rN == -1) - throw(MAL, "geom.PointN", "GEOSGeomGetPointN failed becasue GEOSGeomGetNumPoints "); + throw(MAL, "geom.PointN", "GEOSGeomGetNumPoints failed"); if(rN <= *n || *n<0) { - *out = geos2wkb(NULL); + *out = wkb_nil; GEOSGeom_destroy(geosGeometry); - throw(MAL, "geom.PointN", "GEOSGeomGetPointN unable to retrieve point %d (not enough points)", *n); + throw(MAL, "geom.PointN", "Unable to retrieve point %d (not enough points)", *n); } *out = geos2wkb(GEOSGeomGetPointN(geosGeometry, *n)); @@ -664,6 +667,103 @@ str wkbPointN(wkb **out, wkb **geom, sho throw(MAL, "geom.PointN", "GEOSGeomGetPointN failed"); } +/* function to handle static geometry returned by GEOSGetExteriorRing */ +static const GEOSGeometry* handleConstExteriorRing(GEOSGeom* geosGeometry, wkb** geom) { + *geosGeometry = wkb2geos(*geom); + + if (!*geosGeometry) + return NULL; + + if (GEOSGeomTypeId(*geosGeometry) != GEOS_POLYGON) + return NULL; + + return GEOSGetExteriorRing(*geosGeometry); + +} + +/* Returns the exterior ring of the polygon*/ +str wkbExteriorRing(wkb **out, wkb **geom) { + GEOSGeom geosGeometry = NULL; + const GEOSGeometry* exteriorRingGeometry = handleConstExteriorRing(&geosGeometry, geom); + size_t wkbLen = 0; + unsigned char *w = NULL; + + if (!exteriorRingGeometry) { + *out = wkb_nil; + + if(!geosGeometry) { + throw(MAL, "geom.exteriorRing", "wkb2geos failed"); + } else { + GEOSGeom_destroy(geosGeometry); + throw(MAL, "geom.exteriorRing", "Geometry not a Polygon"); + } + } + w = GEOSGeomToWKB_buf(exteriorRingGeometry, &wkbLen); + GEOSGeom_destroy(geosGeometry); + + *out = GDKmalloc(wkb_size(wkbLen)); + if (!(*out)) { + *out = wkb_nil; + GEOSFree(w); + throw(MAL, "geom.exteriorRing", "GDKmalloc failed"); + } + + assert(wkbLen <= GDK_int_max); + (*out)->len = (int) wkbLen; + memcpy(&(*out)->data, w, wkbLen); + GEOSFree(w); + + return MAL_SUCCEED; +} + +/* function to handle static geometry returned by GEOSGetInteriorRingN */ +static const GEOSGeometry* handleConstInteriorRing(GEOSGeom* geosGeometry, wkb** geom, short ringNum) { + *geosGeometry = wkb2geos(*geom); + + if (!*geosGeometry) + return NULL; + + return GEOSGetInteriorRingN(*geosGeometry, ringNum); +} + + +/* Returns the n-th interior ring of a polygon */ +str wkbInteriorRingN(wkb **out, wkb **geom, short* ringNum) { + GEOSGeom geosGeometry = NULL; + const GEOSGeometry* interiorRingGeometry = handleConstInteriorRing(&geosGeometry, geom, *ringNum); + size_t wkbLen = 0; + unsigned char *w = NULL; + + if (interiorRingGeometry == NULL) + *out = wkb_nil; + + if(!geosGeometry) { + throw(MAL, "geom.interiorRingN", "wkb2geos failed"); + } + + w = GEOSGeomToWKB_buf(interiorRingGeometry, &wkbLen); + GEOSGeom_destroy(geosGeometry); + + *out = GDKmalloc(wkb_size(wkbLen)); + if (!(*out)) { + *out = wkb_nil; + GEOSFree(w); + throw(MAL, "geom.interiorRing", "GDKmalloc failed"); + } + + assert(wkbLen <= GDK_int_max); + (*out)->len = (int) wkbLen; + memcpy(&(*out)->data, w, wkbLen); + GEOSFree(w); + + return MAL_SUCCEED; +} + +/* Returns the number of interior rings in the first polygon of the provided geometry */ +str wkbNumInteriorRings(int* out, wkb** geom) { + return wkbBasicInt(out, geom, GEOSGetNumInteriorRings, "geom.NumInteriorRings"); +} + @@ -1174,7 +1274,7 @@ wkbConvexHull(wkb **out, wkb **geom) GEOSGeom geosGeometry = wkb2geos(*geom); if (!geosGeometry) { - *out = geos2wkb(NULL); + *out = wkb_nil; return MAL_SUCCEED; } @@ -1378,16 +1478,16 @@ static str if (!ga && gb) { GEOSGeom_destroy(gb); - *out = geos2wkb(NULL); + *out = wkb_nil; return MAL_SUCCEED; } if (ga && !gb) { GEOSGeom_destroy(ga); - *out = geos2wkb(NULL); + *out = wkb_nil; return MAL_SUCCEED; } if (!ga && !gb) { - *out = geos2wkb(NULL); + *out = wkb_nil; return MAL_SUCCEED; } @@ -1432,7 +1532,7 @@ wkbBuffer(wkb **out, wkb **geom, dbl *di GEOSGeom geosGeometry = wkb2geos(*geom); if (!geosGeometry) { - *out = geos2wkb(NULL); + *out = wkb_nil; return MAL_SUCCEED; } @@ -1454,7 +1554,7 @@ wkbCentroid(wkb **out, wkb **geom) GEOSGeom geosGeometry = wkb2geos(*geom); if (!geosGeometry) { - *out = geos2wkb(NULL); + *out = wkb_nil; return MAL_SUCCEED; } diff --git a/geom/monetdb5/geom.mal b/geom/monetdb5/geom.mal --- a/geom/monetdb5/geom.mal +++ b/geom/monetdb5/geom.mal @@ -170,9 +170,10 @@ command Envelope(w:wkb) :wkb address wkb comment "The minimum bounding box for this Geometry, returned as a Geometry. The polygon is defined by the corner points of the bounding box ((MINX,MINY),(MAXX,MINY),(MAXX,MAXY),(MINX,MAXY))."; command ExteriorRing(w:wkb) :wkb address wkbExteriorRing _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list