Changeset: 11d01d5f39ce for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=11d01d5f39ce Modified Files: geom/monetdb5/geom.c geom/monetdb5/geom.mal geom/sql/40_geom.sql Branch: geo Log Message:
The following function created ST_PointFromText(wkt string, srid SMALLINT) ST_LineFromText(wkt string, srid SMALLINT) ST_PolygonFromText(wkt string, srid SMALLINT) ST_MPointFromText(wkt string, srid SMALLINT) ST_MLineFromText(wkt string, srid SMALLINT) ST_MPolyFromText(wkt string, srid SMALLINT) diffs (truncated from 2206 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 @@ -46,107 +46,117 @@ int TYPE_mbr; -geom_export wkb *wkbNULL(void); geom_export bat *geom_prelude(void); geom_export void geom_epilogue(void); + +geom_export wkb *wkbNULL(void); geom_export mbr *mbrNULL(void); -geom_export int mbrFROMSTR(char *src, int *len, mbr **atom); -geom_export int mbrTOSTR(char **dst, int *len, mbr *atom); -geom_export BUN mbrHASH(mbr *atom); -geom_export int mbrCOMP(mbr *l, mbr *r); -geom_export mbr *mbrREAD(mbr *a, stream *s, size_t cnt); -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 int wkbTOSTR(char **dst, int *len, wkb *atom); + geom_export int wkbFROMSTR(char *src, int *len, wkb **atom); -geom_export str wkbFromString(wkb **w, str *wkt); -geom_export str wkbFromWKB(wkb **w, wkb **src); geom_export str wkbFromText(wkb **w, str *wkt, int *tpe); -geom_export BUN wkbHASH(wkb *w); -geom_export int wkbCOMP(wkb *l, wkb *r); -geom_export wkb *wkbNULL(void); -geom_export str wkbIsnil(bit *r, wkb **v); -geom_export str wkbAsText(str *r, wkb **w); -geom_export void wkbDEL(Heap *h, var_t *index); -geom_export wkb *wkbREAD(wkb *a, stream *s, size_t cnt); -geom_export int wkbWRITE(wkb *a, stream *s, size_t cnt); -geom_export int wkbLENGTH(wkb *p); -geom_export void wkbHEAP(Heap *heap, size_t capacity); -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 wkbgetcoordX(double *out, wkb **geom); -geom_export str wkbgetcoordY(double *out, wkb **geom); -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 wkbDimension(int *out, wkb **geom); -geom_export str wkbGeometryTypeId(int *out, wkb **geom); -geom_export str wkbSRID(int *out, wkb **geom); -geom_export str wkbIsEmpty(bit *out, wkb **geom); -geom_export str wkbIsSimple(bit *out, wkb **geom); -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); -geom_export str wkbIntersect(bit *out, wkb **a, wkb **b); -geom_export str wkbTouches(bit *out, wkb **a, wkb **b); -geom_export str wkbCrosses(bit *out, wkb **a, wkb **b); -geom_export str wkbWithin(bit *out, wkb **a, wkb **b); -geom_export str wkbContains(bit *out, wkb **a, wkb **b); -geom_export str wkbOverlaps(bit *out, wkb **a, wkb **b); -geom_export str wkbRelate(bit *out, wkb **a, wkb **b, str *pattern); -geom_export str wkbArea(dbl *out, wkb **a); -geom_export str wkbLength(dbl *out, wkb **a); -geom_export str wkbDistance(dbl *out, wkb **a, wkb **b); -geom_export str wkbIntersection(wkb **out, wkb **a, wkb **b); -geom_export str wkbUnion(wkb **out, wkb **a, wkb **b); -geom_export str wkbDifference(wkb **out, wkb **a, wkb **b); -geom_export str wkbSymDifference(wkb **out, wkb **a, wkb **b); -geom_export str wkbBuffer(wkb **out, wkb **geom, dbl *distance); -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); -bat * -geom_prelude(void) -{ + +//geom_export int mbrFROMSTR(char *src, int *len, mbr **atom); +//geom_export int mbrTOSTR(char **dst, int *len, mbr *atom); +//geom_export BUN mbrHASH(mbr *atom); +//geom_export int mbrCOMP(mbr *l, mbr *r); +//geom_export mbr *mbrREAD(mbr *a, stream *s, size_t cnt); +//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 int wkbTOSTR(char **dst, int *len, wkb *atom); +//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); +//geom_export str wkbIsnil(bit *r, wkb **v); +//geom_export str wkbAsText(str *r, wkb **w); +//geom_export void wkbDEL(Heap *h, var_t *index); +//geom_export wkb *wkbREAD(wkb *a, stream *s, size_t cnt); +//geom_export int wkbWRITE(wkb *a, stream *s, size_t cnt); +//geom_export int wkbLENGTH(wkb *p); +//geom_export void wkbHEAP(Heap *heap, size_t capacity); +//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 wkbgetcoordX(double *out, wkb **geom); +//geom_export str wkbgetcoordY(double *out, wkb **geom); +//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 wkbDimension(int *out, wkb **geom); +//geom_export str wkbGeometryTypeId(int *out, wkb **geom); +//geom_export str wkbSRID(int *out, wkb **geom); +//geom_export str wkbIsEmpty(bit *out, wkb **geom); +//geom_export str wkbIsSimple(bit *out, wkb **geom); +//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); +//geom_export str wkbIntersect(bit *out, wkb **a, wkb **b); +//geom_export str wkbTouches(bit *out, wkb **a, wkb **b); +//geom_export str wkbCrosses(bit *out, wkb **a, wkb **b); +//geom_export str wkbWithin(bit *out, wkb **a, wkb **b); +//geom_export str wkbContains(bit *out, wkb **a, wkb **b); +//geom_export str wkbOverlaps(bit *out, wkb **a, wkb **b); +//geom_export str wkbRelate(bit *out, wkb **a, wkb **b, str *pattern); +//geom_export str wkbArea(dbl *out, wkb **a); +//geom_export str wkbLength(dbl *out, wkb **a); +//geom_export str wkbDistance(dbl *out, wkb **a, wkb **b); +//geom_export str wkbIntersection(wkb **out, wkb **a, wkb **b); +//geom_export str wkbUnion(wkb **out, wkb **a, wkb **b); +//geom_export str wkbDifference(wkb **out, wkb **a, wkb **b); +//geom_export str wkbSymDifference(wkb **out, wkb **a, wkb **b); +//geom_export str wkbBuffer(wkb **out, wkb **geom, dbl *distance); +//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); + + +/* initialise the geos library */ +bat* geom_prelude(void) { libgeom_init(); TYPE_mbr = malAtomSize(sizeof(mbr), sizeof(oid), "mbr"); return NULL; } -void -geom_epilogue(void) -{ +/* close the geos library */ +void geom_epilogue(void) { libgeom_exit(); } /* * Implementation of fixed-sized atom mbr. */ -static int -mbr_isnil(mbr *m) +/* check if given mbr is null + * it is null if any of its coordinates is null */ +//static int mbr_isnil(mbr *m) { +// if (!m || m->xmin == flt_nil || m->ymin == flt_nil || +// m->xmax == flt_nil || m->ymax == flt_nil) +// return 1; +// return 0; +//} + +/* + * Implementation of variable-sized atom wkb. + */ +static var_t wkb_size(size_t len) { - if (!m || m->xmin == flt_nil || m->ymin == flt_nil || - m->xmax == flt_nil || m->ymax == flt_nil) - return 1; - return 0; + if (len == ~(size_t) 0) + len = 0; + assert(sizeof(wkb) - 1 + len <= VAR_MAX); + return (var_t) (sizeof(wkb) - 1 + len); } /* NULL: generic nil mbr. */ /* returns a pointer to a nil-mbr. */ - -mbr * -mbrNULL(void) -{ +mbr* mbrNULL(void) { static mbr mbrNIL; mbrNIL.xmin = flt_nil; mbrNIL.ymin = flt_nil; @@ -155,228 +165,18 @@ mbrNULL(void) return (&mbrNIL); } -/* FROMSTR: parse string to mbr. */ -/* return number of parsed characters. */ +/* returns pointer to a null wkb */ +wkb* wkbNULL(void) { + static wkb nullval; -int -mbrFROMSTR(char *src, int *len, mbr **atom) -{ - int nil = 0; - int nchars = 0; /* The number of characters parsed; the return value. */ - GEOSGeom geosMbr = NULL; /* The geometry object that is parsed from the src string. */ - - if (strcmp(src, str_nil) == 0) - nil = 1; - - if (!nil && (geosMbr = GEOSGeomFromWKT(src)) == NULL) - return 0; - - if (*len < (int) sizeof(mbr)) { - if (*atom) - GDKfree(*atom); - *atom = GDKmalloc(*len = sizeof(mbr)); - } - if (nil) { - nchars = 3; - **atom = *mbrNULL(); - } else if (getMbrGeos(*atom, geosMbr)) { - size_t l = strlen(src); - assert(l <= GDK_int_max); - nchars = (int) l; - } - if (geosMbr) - GEOSGeom_destroy(geosMbr); - return nchars; + nullval.len = ~(int) 0; + return (&nullval); } -#define MBR_WKTLEN 256 - -/* TOSTR: print atom in a string. */ -/* return length of resulting string. */ - -int -mbrTOSTR(char **dst, int *len, mbr *atom) -{ - static char tempWkt[MBR_WKTLEN]; - size_t dstStrLen = 3; - - if (!mbr_isnil(atom)) { - snprintf(tempWkt, MBR_WKTLEN, "BOX (%f %f, %f %f)", - atom->xmin, atom->ymin, atom->xmax, atom->ymax); - dstStrLen = strlen(tempWkt) + 2; - assert(dstStrLen < GDK_int_max); - } - - if (*len < (int) dstStrLen + 1) { - if (*dst) - GDKfree(*dst); - *dst = GDKmalloc(*len = (int) dstStrLen + 1); - } - - if (dstStrLen > 3) - snprintf(*dst, *len, "\"%s\"", tempWkt); - else - strcpy(*dst, "nil"); - return (int) dstStrLen; -} - -/* HASH: compute a hash value. */ -/* returns a positive integer hash value */ - -BUN -mbrHASH(mbr *atom) -{ - return (BUN) (((int) atom->xmin * (int)atom->ymin) *((int) atom->xmax * (int)atom->ymax)); -} - -/* COMP: compare two mbrs. */ -/* returns int <0 if l<r, 0 if l==r, >0 else */ - -int -mbrCOMP(mbr *l, mbr *r) -{ - /* simple lexicographical ordering on (x,y) */ - int res; - if (l->xmin == r->xmin) - res = (l->ymin < r->ymin) ? -1 : (l->ymin == r->ymin) ? 0 : 1; - else - res = (l->xmin < r->xmin) ? -1 : 1; - if (res == 0) { - if (l->xmax == r->xmax) - res = (l->ymax < r->ymax) ? -1 : (l->ymax == r->ymax) ? 0 : 1; - else - res = (l->xmax < r->xmax) ? -1 : 1; - } - return res; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list