Changeset: e6ccf552b9c1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e6ccf552b9c1
Modified Files:
        geom/monetdb5/geom.c
        geom/monetdb5/geom.mal
        geom/sql/40_geom.sql
Branch: geo
Log Message:

some more functions on geometry accessors implememted


diffs (truncated from 528 to 300 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -62,6 +62,8 @@ geom_export void geom_epilogue(void);
 geom_export wkb *wkbNULL(void);
 geom_export mbr *mbrNULL(void);
 
+geom_export wkb *geos2wkb(GEOSGeom geosGeometry);
+
 geom_export int mbrFROMSTR(char *src, int *len, mbr **atom);
 geom_export int mbrTOSTR(char **dst, int *len, mbr *atom);
 geom_export int wkbFROMSTR(char *src, int srid, int *len, wkb **atom);
@@ -74,13 +76,19 @@ geom_export str geomMakePoint3D(wkb**, d
 geom_export str geomMakePoint4D(wkb**, double*, double*, double*, double*);
 geom_export str geomMakePointM(wkb**, double*, double*, double*);
 
-geom_export str wkbGeometryType(char** out, wkb** geom);
-geom_export str wkbCoordDim(int *out, wkb **geom);
-geom_export str wkbDimension(int *out, wkb **geom);
-geom_export str wkbSRID(int *out, wkb **geom);
+geom_export str wkbGeometryType(char**, wkb**);
+geom_export str wkbBoundary(wkb**, wkb**);
+geom_export str wkbCoordDim(int* , wkb**);
+geom_export str wkbDimension(int*, wkb**);
+geom_export str wkbSRID(int*, wkb**);
 geom_export str wkbGetCoordX(double*, wkb**);
 geom_export str wkbGetCoordY(double*, wkb**);
 geom_export str wkbGetCoordZ(double*, wkb**);
+geom_export str wkbStartPoint(wkb **out, wkb **geom);
+geom_export str wkbEndPoint(wkb **out, wkb **geom);
+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 wkbIsEmpty(bit *out, wkb **geom);
 geom_export str wkbIsSimple(bit *out, wkb **geom);
@@ -449,8 +457,8 @@ str geomMakePointM(wkb** out, double* x,
        return geomMakePoint(out, geosGeometry);
 }
 
-
-static str wkbbasic(int *out, wkb **geom, int (*func)(const GEOSGeometry *), 
const char *name) {
+/* common code for functions that return integer */
+static str wkbBasicInt(int *out, wkb **geom, int (*func)(const GEOSGeometry 
*), const char *name) {
        GEOSGeom geosGeometry = wkb2geos(*geom);
 
        if (!geosGeometry) {
@@ -474,7 +482,7 @@ str wkbGeometryType(char** out, wkb** ge
        int typeId = 0;
        str ret = MAL_SUCCEED;
 
-       ret = wkbbasic(&typeId, geom, GEOSGeomTypeId, "geom.GeometryType");
+       ret = wkbBasicInt(&typeId, geom, GEOSGeomTypeId, "geom.GeometryType");
        typeId = ((typeId+1) << 2);
        geoGetType(out, &typeId);
        
@@ -485,18 +493,18 @@ str wkbGeometryType(char** out, wkb** ge
 /* geos does not know the number of dimensions as long as a wkb has been 
created 
  * more precisely it descards all dimensions but x and y*/
 str wkbCoordDim(int *out, wkb **geom) {
-       return wkbbasic(out, geom, GEOSGeom_getCoordinateDimension, 
"geom.CoordDim");
+       return wkbBasicInt(out, geom, GEOSGeom_getCoordinateDimension, 
"geom.CoordDim");
 }
 
 /* returns the inherent dimension of the geometry, e.g 0 for point */
 str wkbDimension(int *out, wkb **geom) {
-       return wkbbasic(out, geom, GEOSGeom_getDimensions, "geom.Dimensions");
+       return wkbBasicInt(out, geom, GEOSGeom_getDimensions, 
"geom.Dimensions");
 }
 
 /* returns the srid of the geometry */
 /* there is no srid information on the wkb representation of the wkb*/
 str wkbSRID(int *out, wkb **geom) {
-       return wkbbasic(out, geom, GEOSGetSRID, "geom.SRID");
+       return wkbBasicInt(out, geom, GEOSGetSRID, "geom.SRID");
 }
 
 
@@ -525,9 +533,6 @@ static str wkbGetCoord(double *out, wkb 
        /* gcs shouldn't be freed, it's internal to the GEOSGeom */
        GEOSGeom_destroy(geosGeometry);
 
-//     if (ret == 0)
-//             throw(MAL, name, "GEOSCoordSeq_get%s failed", name + 5);
-
        return MAL_SUCCEED;
 }
 
@@ -545,8 +550,125 @@ str wkbGetCoordZ(double *out, wkb **geom
        return wkbGetCoord(out, geom, 2, "geom.Z");
 }
 
-str
-wkbIsEmpty(bit *out, wkb **geom)
+
+/*common code for functions that return geometry */
+static str wkbBasic(wkb **out, wkb **geom, GEOSGeometry* (*func)(const 
GEOSGeometry *), const char *name) {
+       GEOSGeom geosGeometry = wkb2geos(*geom);
+
+       if (!geosGeometry) {
+               *out = geos2wkb(NULL);
+               throw(MAL, name, "wkb2geos failed");
+       }
+
+       *out = geos2wkb((*func)(geosGeometry));
+
+       GEOSGeom_destroy(geosGeometry);
+
+       return MAL_SUCCEED;
+}
+
+str wkbBoundary(wkb **out, wkb **geom) {
+       return wkbBasic(out, geom, GEOSBoundary, "geom.Boundary");
+}
+
+str wkbEnvelope(wkb **out, wkb **geom) {
+       return wkbBasic(out, geom, GEOSEnvelope, "geom.Envelope");
+}
+
+/* Returns the first or last point of a linestring */
+static str wkbBorderPoint(wkb **out, wkb **geom, GEOSGeometry* (*func)(const 
GEOSGeometry *), const char *name) {
+       GEOSGeom geosGeometry = wkb2geos(*geom);
+
+       if (!geosGeometry) {
+               *out = geos2wkb(NULL);
+               throw(MAL, name, "wkb2geos failed");
+       }
+
+       if (GEOSGeomTypeId(geosGeometry) != GEOS_LINESTRING) {
+               *out = geos2wkb(NULL);
+               throw(MAL, name, "GEOSGeomGet%s failed. Geometry not a 
LineString", name + 5);
+       }
+
+       *out = geos2wkb((*func)(geosGeometry));
+
+       GEOSGeom_destroy(geosGeometry);
+
+       return MAL_SUCCEED;
+}
+
+/* Returns the first point in a linestring */
+str wkbStartPoint(wkb **out, wkb **geom) {
+       return wkbBorderPoint(out, geom, GEOSGeomGetStartPoint, 
"geom.StartPoint");
+}
+
+/* Returns the last point in a linestring */
+str wkbEndPoint(wkb **out, wkb **geom) {
+       return wkbBorderPoint(out, geom, GEOSGeomGetEndPoint, "geom.EndPoint");
+}
+
+/* Returns the number of points in the linestring */
+str wkbNumPoints(int *out, wkb **geom) {
+       GEOSGeom geosGeometry = wkb2geos(*geom);
+
+       if (!geosGeometry) {
+               *out = int_nil;
+               return MAL_SUCCEED;
+       }
+
+       if (GEOSGeomTypeId(geosGeometry) != GEOS_LINESTRING) {
+               *out = int_nil;
+               throw(MAL, "geom.NumPoints", "failed. Geometry not a 
LineString");
+       }
+
+       *out = GEOSGeomGetNumPoints(geosGeometry);
+       GEOSGeom_destroy(geosGeometry);
+
+       if (*out == -1)
+               throw(MAL, "geom.NumPoints", "failed");
+
+       return MAL_SUCCEED;
+}
+
+/* Returns the n-th point of the geometry */
+str wkbPointN(wkb **out, wkb **geom, short *n) {
+       short rN = -1;
+       GEOSGeom geosGeometry = wkb2geos(*geom);
+
+       if (!geosGeometry) {
+               *out = geos2wkb(NULL);
+               return MAL_SUCCEED;
+       }
+
+       if (GEOSGeomTypeId(geosGeometry) != GEOS_LINESTRING) {
+               *out = geos2wkb(NULL);
+               throw(MAL, "geom.PointN", "GEOSGeomGetPointN failed. Geometry 
not a LineString");
+       }
+
+       //check number of points
+       rN = GEOSGeomGetNumPoints(geosGeometry);
+       if (rN == -1)
+               throw(MAL, "geom.PointN", "GEOSGeomGetPointN failed becasue 
GEOSGeomGetNumPoints ");    
+
+       if(rN <= *n || *n<0) {
+               *out = geos2wkb(NULL);
+               GEOSGeom_destroy(geosGeometry);
+               throw(MAL, "geom.PointN", "GEOSGeomGetPointN unable to retrieve 
point %d (not enough points)", *n);
+       }
+
+       *out = geos2wkb(GEOSGeomGetPointN(geosGeometry, *n));
+       GEOSGeom_destroy(geosGeometry);
+
+       if (*out != NULL)
+               return MAL_SUCCEED;
+
+       throw(MAL, "geom.PointN", "GEOSGeomGetPointN failed");
+}
+
+
+
+
+
+str wkbIsEmpty(bit *out, wkb **geom)
 {
        GEOSGeom geosGeometry = wkb2geos(*geom);
 
@@ -606,14 +728,14 @@ geom_export void wkbHEAP(Heap *heap, siz
 geom_export var_t wkbPUT(Heap *h, var_t *bun, wkb *val);
 geom_export str ordinatesMBR(mbr **res, flt *minX, flt *minY, flt *maxX, flt 
*maxY);
 geom_export str wkbMBR(mbr **res, wkb **geom);
-geom_export wkb *geos2wkb(GEOSGeom geosGeometry);
+
 
 geom_export str wkbcreatepoint(wkb **out, dbl *x, dbl *y);
 geom_export str wkbcreatepoint_bat(int *out, int *x, int *y);
 geom_export str mbroverlaps(bit *out, mbr **b1, mbr **b2);
 
-geom_export str wkbEnvelope(wkb **out, wkb **geom);
-geom_export str wkbBoundary(wkb **out, wkb **geom);
+
+
 geom_export str wkbConvexHull(wkb **out, wkb **geom);
 geom_export str wkbEquals(bit *out, wkb **a, wkb **b);
 geom_export str wkbDisjoint(bit *out, wkb **a, wkb **b);
@@ -635,10 +757,8 @@ geom_export str wkbBuffer(wkb **out, wkb
 
 
 geom_export str wkbCentroid(wkb **out, wkb **geom);
-geom_export str wkbStartPoint(wkb **out, wkb **geom);
-geom_export str wkbEndPoint(wkb **out, wkb **geom);
-geom_export str wkbNumPoints(int *out, wkb **geom);
-geom_export str wkbPointN(wkb **out, wkb **geom, short *n);
+
+
 
 
 /* HASH: compute a hash value. */
@@ -1044,45 +1164,9 @@ mbroverlaps(bit *out, mbr **b1, mbr **b2
 
 
 
-str
-wkbEnvelope(wkb **out, wkb **geom)
-{
-       GEOSGeom geosGeometry = wkb2geos(*geom);
 
-       if (!geosGeometry) {
-               *out = geos2wkb(NULL);
-               return MAL_SUCCEED;
-       }
 
-       *out = geos2wkb(GEOSEnvelope(geosGeometry));
 
-       GEOSGeom_destroy(geosGeometry);
-
-       if (GDKerrbuf && GDKerrbuf[0])
-               throw(MAL, "geom.Envelope", "GEOSEnvelope failed");
-       return MAL_SUCCEED;
-
-}
-
-str
-wkbBoundary(wkb **out, wkb **geom)
-{
-       GEOSGeom geosGeometry = wkb2geos(*geom);
-
-       if (!geosGeometry) {
-               *out = geos2wkb(NULL);
-               return MAL_SUCCEED;
-       }
-
-       *out = geos2wkb(GEOSBoundary(geosGeometry));
-
-       GEOSGeom_destroy(geosGeometry);
-
-       if (GDKerrbuf && GDKerrbuf[0])
-               throw(MAL, "geom.Boundary", "GEOSBoundary failed");
-       return MAL_SUCCEED;
-
-}
 
 str
 wkbConvexHull(wkb **out, wkb **geom)
@@ -1384,101 +1468,6 @@ wkbCentroid(wkb **out, wkb **geom)
 
 }
 
-static str
-wkbBorderPoint(wkb **out, wkb **geom, GEOSGeometry* (*func)(const GEOSGeometry 
*), const char *name)
-{
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to