override CFLAGS += -DUSE_STATS
endif
-OBJS=lwgeom_pg.o lwgeom_debug.o liblwgeom.o lwgeom.o lwpoint.o lwline.o lwpoly.o lwmpoint.o lwmline.o lwmpoly.o lwcollection.o lwgeom_spheroid.o lwgeom_api.o lwgeom_ogc.o lwgeom_functions_analytic.o lwgeom_geos.o lwgeom_inout.o lwgeom_estimate.o lwgeom_functions_basic.o lwgeom_gist.o lwgeom_btree.o lwgeom_transform.o stringBuffer.o lwgeom_box.o lwgeom_box3d.o lwgeom_box2dfloat4.o lwgeom_chip.o lex.yy.o wktparse.tab.o lwgparse.o wktunparse.o lwgeom_svg.o lwgeom_gml.o $(GEOS_WRAPPER)
+SA_OBJS=ptarray.o lwgeom_api.o lwgeom.o lwpoint.o lwline.o lwpoly.o lwmpoint.o lwmline.o lwmpoly.o lwcollection.o $(GEOS_WRAPPER) wktunparse.o lwgparse.o wktparse.tab.o lex.yy.o
+OBJS=$(SA_OBJS) liblwgeom.o lwgeom_pg.o lwgeom_debug.o lwgeom_spheroid.o lwgeom_ogc.o lwgeom_functions_analytic.o lwgeom_geos.o lwgeom_inout.o lwgeom_estimate.o lwgeom_functions_basic.o lwgeom_gist.o lwgeom_btree.o lwgeom_transform.o stringBuffer.o lwgeom_box.o lwgeom_box3d.o lwgeom_box2dfloat4.o lwgeom_chip.o lwgeom_svg.o lwgeom_gml.o
OTHERS=y.output lex.yy.c wktparse.tab.c wktparse.tab.h lwpostgis.sql
clean distclean maintainer-clean: clean-lib
rm -f $(OBJS)
rm -f $(OTHERS)
+ rm -f liblwgeom_sa.o
+ rm -f liblwgeom_sa.so
+ rm -f test
+liblwgeom_sa.o: liblwgeom.c
+ $(CC) -DSTANDALONE -o $@ -c $<
+
+liblwgeom_sa.so: $(SA_OBJS) liblwgeom_sa.o
+ $(CC) -shared -o $@ $^
+
+liblwgeom_sa.a: $(SA_OBJS) liblwgeom_sa.o
+ $(AR) -rc $@ $^
+
+
+test: liblwgeom_sa.so liblwgeom_sa.a test.c
+ #$(CC) -o test -L. -llwgeom_sa $(SHLIB_LINK) test.c
+ $(CC) -Wall -g -o test test.c liblwgeom_sa.a
#include <stdlib.h>
#include <stdarg.h>
-#include "lwgeom_pg.h"
-#include "liblwgeom.h"
-
#define CONTEXT_PG 0
#define CONTEXT_SA 1
+#ifdef STANDALONE
+#define DEFAULT_CONTEXT CONTEXT_SA
+#else
#define DEFAULT_CONTEXT CONTEXT_PG
+#endif
/* Global variables */
#if DEFAULT_CONTEXT == CONTEXT_SA
-lwallocator lwalloc = default_allocator;
-lwreallocator lwrealloc = default_reallocator;
-lwfreeor lwfree = default_freeor;
+#include "liblwgeom.h"
+lwallocator lwalloc_var = default_allocator;
+lwreallocator lwrealloc_var = default_reallocator;
+lwfreeor lwfree_var = default_freeor;
lwreporter lwerror = default_errorreporter;
lwreporter lwnotice = default_noticereporter;
#else
-lwallocator lwalloc = pg_alloc;
-lwreallocator lwrealloc = pg_realloc;
-lwfreeor lwfree = pg_free;
+#include "lwgeom_pg.h"
+#include "liblwgeom.h"
+
+lwallocator lwalloc_var = pg_alloc;
+lwreallocator lwrealloc_var = pg_realloc;
+lwfreeor lwfree_var = pg_free;
lwreporter lwerror = pg_error;
lwreporter lwnotice = pg_notice;
#endif
fprintf(stderr, "%s\n", msg);
va_end(ap);
free(msg);
+ exit(1);
}
const char *
{
return lwgeomTypeName[type];
}
+
+void *
+lwalloc(size_t size)
+{
+ return lwalloc_var(size);
+}
+
+void *
+lwrealloc(void *mem, size_t size)
+{
+ return lwrealloc_var(mem, size);
+}
+
+void
+lwfree(void *mem)
+{
+ return lwfree_var(mem);
+}
void default_noticereporter(const char *fmt, ...);
/* globals */
-extern lwreallocator lwrealloc;
-extern lwallocator lwalloc;
-extern lwfreeor lwfree;
+extern lwreallocator lwrealloc_var;
+extern lwallocator lwalloc_var;
+extern lwfreeor lwfree_var;
extern lwreporter lwerror;
extern lwreporter lwnotice;
// construct a new point. point will NOT be copied
// use SRID=-1 for unknown SRID (will have 8bit type's S = 0)
-extern LWPOINT *lwpoint_construct(char hasZ, char hasM, int SRID, char wantbbox, POINTARRAY *point);
+extern LWPOINT *lwpoint_construct(int SRID, char wantbbox, POINTARRAY *point);
// given the LWPOINT serialized form (or a pointer into a muli* one)
// construct a proper LWPOINT.
// construct a new LWLINE. points will *NOT* be copied
// use SRID=-1 for unknown SRID (will have 8bit type's S = 0)
-extern LWLINE *lwline_construct(char hasz, char hasm, int SRID, char wantbbox, POINTARRAY *points);
+extern LWLINE *lwline_construct(int SRID, char wantbbox, POINTARRAY *points);
// given the LWGEOM serialized form (or a pointer into a muli* one)
// construct a proper LWLINE.
// construct a new LWPOLY. arrays (points/points per ring) will NOT be copied
// use SRID=-1 for unknown SRID (will have 8bit type's S = 0)
-extern LWPOLY *lwpoly_construct(char hasz, char hasm, int SRID, char wantbbox, int nrings, POINTARRAY **points);
+extern LWPOLY *lwpoly_construct(int SRID, char wantbbox, unsigned int nrings, POINTARRAY **points);
// given the LWPOLY serialized form (or a pointer into a muli* one)
// construct a proper LWPOLY.
extern void printLWPOLY(LWPOLY *poly);
extern void printBYTES(unsigned char *a, int n);
extern void printMULTI(char *serialized);
-extern void deparse_hex(unsigned char str, unsigned char *result);
extern void printType(unsigned char str);
extern LWPOLY *lwpoly_clone(const LWPOLY *lwgeom);
extern LWCOLLECTION *lwcollection_clone(const LWCOLLECTION *lwgeom);
-extern LWCOLLECTION *lwcollection_construct(int type, char hasz, char hasm, uint32 SRID, char hasbbox, int ngeoms, LWGEOM **geoms);
+extern LWCOLLECTION *lwcollection_construct(unsigned int type, int SRID, char hasbbox, unsigned int ngeoms, LWGEOM **geoms);
// Return a char string with ASCII versionf of type flags
extern const char *lwgeom_typeflags(unsigned char type);
+// Construct an empty pointarray
+extern POINTARRAY *ptarray_construct(char hasz, char hasm, unsigned int npoints);
+extern POINTARRAY *ptarray_construct2d(uint32 npoints, POINT2D const* const* pts);
+
+extern int32 lwgeom_nrings_recursive(char *serialized);
+extern void dump_lwexploded(LWGEOM_EXPLODED *exploded);
+extern void ptarray_reverse(POINTARRAY *pa);
+
+extern unsigned char parse_hex(char *str);
+extern void deparse_hex(unsigned char str, unsigned char *result);
+extern char *parse_lwgeom_wkt(char *wkt_input);
+extern char * lwgeom_to_wkt(LWGEOM *lwgeom);
+
+extern void *lwalloc(size_t size);
+extern void *lwrealloc(void *mem, size_t size);
+extern void lwfree(void *mem);
+
#endif // !defined _LIBLWGEOM_H
//#define DEBUG_CALLS 1
+#define CHECK_LWGEOM_ZM 1
+
+LWCOLLECTION *
+lwcollection_construct(unsigned int type, int SRID, char hasbbox,
+ unsigned int ngeoms, LWGEOM **geoms)
+{
+ LWCOLLECTION *ret;
+ int hasz, hasm;
+#ifdef CHECK_LWGEOM_ZM
+ char zm;
+ unsigned int i;
+#endif
+
+ hasz = 0;
+ hasm = 0;
+ if ( ngeoms > 0 )
+ {
+ hasz = TYPE_HASZ(geoms[0]->type);
+ hasm = TYPE_HASM(geoms[0]->type);
+ }
+
+#ifdef CHECK_LWGEOM_ZM
+ zm = TYPE_GETZM(geoms[0]->type);
+ for (i=1; i<ngeoms; i++)
+ {
+ if ( zm != TYPE_GETZM(geoms[i]->type) )
+ lwerror("lwcollection_construct: mixed dimension geometries");
+ }
+#endif
+
+ ret = lwalloc(sizeof(LWCOLLECTION));
+ ret->type = lwgeom_makeType_full(hasz, hasm, (SRID!=-1),
+ type, hasbbox);
+ ret->SRID = SRID;
+ ret->ngeoms = ngeoms;
+ ret->geoms = geoms;
+ return ret;
+}
+
+
LWCOLLECTION *
lwcollection_deserialize(char *srl)
{
return 1;
}
-LWCOLLECTION *
-lwcollection_construct(int type, char hasz, char hasm, uint32 SRID, char hasbbox,
- int ngeoms, LWGEOM **geoms)
-{
- LWCOLLECTION *ret;
- ret = lwalloc(sizeof(LWCOLLECTION));
- ret->type = lwgeom_makeType_full(hasz, hasm, (SRID!=-1),
- type, hasbbox);
- ret->SRID = SRID;
- ret->ngeoms = ngeoms;
- ret->geoms = geoms;
- return ret;
-}
-
// Clone LWCOLLECTION object. POINTARRAY are not copied.
LWCOLLECTION *
lwcollection_clone(const LWCOLLECTION *g)
}
col = lwcollection_construct(COLLECTIONTYPE,
- TYPE_HASZ(to->type), TYPE_HASM(to->type),
to->SRID,
( TYPE_HASBBOX(what->type) || TYPE_HASBBOX(to->type) ),
to->ngeoms+1, geoms);
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
+#include "wktparse.h"
-#include "lwgeom_pg.h"
+//#include "lwgeom_pg.h"
#include "liblwgeom.h"
//#define DEBUG_CALLS 1
}
}
+/*
+ * Return an alloced string
+ */
+char *
+lwgeom_to_wkt(LWGEOM *lwgeom)
+{
+ char *serialized = lwgeom_serialize(lwgeom);
+ if ( ! serialized ) {
+ lwerror("Error serializing geom %p", lwgeom);
+ }
+ char *ret = unparse_WKT(serialized, lwalloc, lwfree);
+ lwfree(serialized);
+ return ret;
+}
+
-typedef struct LWGEOM_T LWGEOM;
+/*****************************************************************
+ * MEMORY MANAGEMENT
+ ****************************************************************/
+void *lwalloc(size_t size);
+void *lwrealloc(void *mem, size_t size);
+void lwfree(void *mem);
-// Serialization / deserialization
-extern LWGEOM *lwgeom_deserialize(char *serializedform);
-extern char *lwgeom_serialize(LWGEOM *lwgeom);
-extern char *lwgeom_serialize_size(LWGEOM *lwgeom);
-extern void lwgeom_serialize_buf(LWGEOM *lwgeom, char *buf);
+/*****************************************************************
+ * POINT
+ ****************************************************************/
-extern void lwgeom_reverse(LWGEOM *lwgeom);
-extern void lwgeom_forceRHR(LWGEOM *lwgeom);
+typedef struct { double x; double y; } POINT2D;
+typedef struct { double x; double y; double m; } POINT3DM;
+typedef struct { double x; double y; double z; } POINT3DZ;
+typedef struct { double x; double y; double z; double m; } POINT4D;
+
+/*****************************************************************
+ * POINTARRAY
+ ****************************************************************/
+
+typedef struct POINTARRAY_T *POINTARRAY;
+
+// Constructs a POINTARRAY copying given 2d points
+POINTARRAY ptarray_construct2d(unsigned int npoints, POINT2D ** pts);
+
+/*****************************************************************
+ * LWGEOM
+ ****************************************************************/
+
+typedef struct LWGEOM_T *LWGEOM;
+
+// Conversions
+extern char *lwgeom_to_wkt(LWGEOM lwgeom);
+
+// Construction
+extern LWGEOM lwpoint_construct(int SRID, char wantbbox, POINTARRAY pa);
+
+// Spatial functions
+extern void lwgeom_reverse(LWGEOM lwgeom);
+extern void lwgeom_forceRHR(LWGEOM lwgeom);
#ifdef DEBUG_EXPLODED
void checkexplodedsize(char *srl, LWGEOM_EXPLODED *exploded, int alloced, char wantbbox);
#endif
+extern char *parse_lwg(const char* geometry, lwallocator allocfunc, lwreporter errfunc);
//*********************************************************************
// BOX routines
//lwnotice("Flags: %s - returning %p", flags, flags);
return flags;
}
+
+//given a string with at least 2 chars in it, convert them to
+// a byte value. No error checking done!
+unsigned char
+parse_hex(char *str)
+{
+ //do this a little brute force to make it faster
+
+ unsigned char result_high = 0;
+ unsigned char result_low = 0;
+
+ switch (str[0])
+ {
+ case '0' :
+ result_high = 0;
+ break;
+ case '1' :
+ result_high = 1;
+ break;
+ case '2' :
+ result_high = 2;
+ break;
+ case '3' :
+ result_high = 3;
+ break;
+ case '4' :
+ result_high = 4;
+ break;
+ case '5' :
+ result_high = 5;
+ break;
+ case '6' :
+ result_high = 6;
+ break;
+ case '7' :
+ result_high = 7;
+ break;
+ case '8' :
+ result_high = 8;
+ break;
+ case '9' :
+ result_high = 9;
+ break;
+ case 'A' :
+ result_high = 10;
+ break;
+ case 'B' :
+ result_high = 11;
+ break;
+ case 'C' :
+ result_high = 12;
+ break;
+ case 'D' :
+ result_high = 13;
+ break;
+ case 'E' :
+ result_high = 14;
+ break;
+ case 'F' :
+ result_high = 15;
+ break;
+ }
+ switch (str[1])
+ {
+ case '0' :
+ result_low = 0;
+ break;
+ case '1' :
+ result_low = 1;
+ break;
+ case '2' :
+ result_low = 2;
+ break;
+ case '3' :
+ result_low = 3;
+ break;
+ case '4' :
+ result_low = 4;
+ break;
+ case '5' :
+ result_low = 5;
+ break;
+ case '6' :
+ result_low = 6;
+ break;
+ case '7' :
+ result_low = 7;
+ break;
+ case '8' :
+ result_low = 8;
+ break;
+ case '9' :
+ result_low = 9;
+ break;
+ case 'A' :
+ result_low = 10;
+ break;
+ case 'B' :
+ result_low = 11;
+ break;
+ case 'C' :
+ result_low = 12;
+ break;
+ case 'D' :
+ result_low = 13;
+ break;
+ case 'E' :
+ result_low = 14;
+ break;
+ case 'F' :
+ result_low = 15;
+ break;
+ }
+ return (unsigned char) ((result_high<<4) + result_low);
+}
+
+
+//given one byte, populate result with two byte representing
+// the hex number
+// ie deparse_hex( 255, mystr)
+// -> mystr[0] = 'F' and mystr[1] = 'F'
+// no error checking done
+void
+deparse_hex(unsigned char str, unsigned char *result)
+{
+ int input_high;
+ int input_low;
+
+ input_high = (str>>4);
+ input_low = (str & 0x0F);
+
+ switch (input_high)
+ {
+ case 0:
+ result[0] = '0';
+ break;
+ case 1:
+ result[0] = '1';
+ break;
+ case 2:
+ result[0] = '2';
+ break;
+ case 3:
+ result[0] = '3';
+ break;
+ case 4:
+ result[0] = '4';
+ break;
+ case 5:
+ result[0] = '5';
+ break;
+ case 6:
+ result[0] = '6';
+ break;
+ case 7:
+ result[0] = '7';
+ break;
+ case 8:
+ result[0] = '8';
+ break;
+ case 9:
+ result[0] = '9';
+ break;
+ case 10:
+ result[0] = 'A';
+ break;
+ case 11:
+ result[0] = 'B';
+ break;
+ case 12:
+ result[0] = 'C';
+ break;
+ case 13:
+ result[0] = 'D';
+ break;
+ case 14:
+ result[0] = 'E';
+ break;
+ case 15:
+ result[0] = 'F';
+ break;
+ }
+
+ switch (input_low)
+ {
+ case 0:
+ result[1] = '0';
+ break;
+ case 1:
+ result[1] = '1';
+ break;
+ case 2:
+ result[1] = '2';
+ break;
+ case 3:
+ result[1] = '3';
+ break;
+ case 4:
+ result[1] = '4';
+ break;
+ case 5:
+ result[1] = '5';
+ break;
+ case 6:
+ result[1] = '6';
+ break;
+ case 7:
+ result[1] = '7';
+ break;
+ case 8:
+ result[1] = '8';
+ break;
+ case 9:
+ result[1] = '9';
+ break;
+ case 10:
+ result[1] = 'A';
+ break;
+ case 11:
+ result[1] = 'B';
+ break;
+ case 12:
+ result[1] = 'C';
+ break;
+ case 13:
+ result[1] = 'D';
+ break;
+ case 14:
+ result[1] = 'E';
+ break;
+ case 15:
+ result[1] = 'F';
+ break;
+ }
+}
+
+char *
+parse_lwgeom_wkt(char *wkt_input)
+{
+ char *serialized_form = parse_lwg((const char *)wkt_input,
+ lwalloc, lwerror);
+
+
+#ifdef DEBUG
+ lwnotice("parse_lwgeom_wkt with %s",wkt_input);
+#endif
+
+ if (serialized_form == NULL)
+ {
+ lwerror("parse_WKT:: couldnt parse!");
+ return NULL;
+ }
+
+ return serialized_form;
+
+}
pa[0]->npoints = 5;
// Construct polygon
- poly = lwpoly_construct(0, 0, -1, wantbbox, 1, pa);
+ poly = lwpoly_construct(-1, wantbbox, 1, pa);
// Serialize polygon
ser = lwpoly_serialize(poly);
pa[0]->npoints = 5;
// Construct polygon
- poly = lwpoly_construct(0, 0, -1, wantbbox, 1, pa);
+ poly = lwpoly_construct(-1, wantbbox, 1, pa);
// Serialize polygon
ser = lwpoly_serialize(poly);
pa[0]->npoints = 5;
// Construct polygon
- poly = lwpoly_construct(0, 0, chip->SRID, wantbbox, 1, pa);
+ poly = lwpoly_construct(chip->SRID, wantbbox, 1, pa);
// Serialize polygon
ser = lwpoly_serialize(poly);
ipts = iline->points;
opts = DP_simplify2d(ipts, dist);
- oline = lwline_construct(
- TYPE_HASZ(ipts->dims),
- TYPE_HASM(ipts->dims),
- iline->SRID,
- TYPE_HASBBOX(iline->type), opts);
+ oline = lwline_construct(iline->SRID, TYPE_HASBBOX(iline->type), opts);
return oline;
}
TYPE_HASZ(line->type),
TYPE_HASM(line->type),
1);
- point = lwpoint_construct(
- TYPE_HASZ(line->type),
- TYPE_HASM(line->type),
- line->SRID, 0, opa);
+ point = lwpoint_construct(line->SRID, 0, opa);
srl = lwpoint_serialize(point);
pfree_point(point);
PG_RETURN_POINTER(PG_LWGEOM_construct(srl, line->SRID, 0));
TYPE_HASZ(line->type),
TYPE_HASM(line->type),
1);
- point = lwpoint_construct(
- TYPE_HASZ(line->type),
- TYPE_HASM(line->type),
- line->SRID, 0, opa);
+ point = lwpoint_construct(line->SRID, 0, opa);
srl = lwpoint_serialize(point);
pfree_point(point);
PG_RETURN_POINTER(PG_LWGEOM_construct(srl, line->SRID, 0));
TYPE_HASZ(line->type),
TYPE_HASM(line->type),
1);
- point = lwpoint_construct(
- TYPE_HASZ(line->type),
- TYPE_HASM(line->type),
- line->SRID, 0, opa);
+ point = lwpoint_construct(line->SRID, 0, opa);
srl = lwpoint_serialize(point);
pfree_point(point);
PG_RETURN_POINTER(PG_LWGEOM_construct(srl, line->SRID, 0));
Datum LWGEOM_noop(PG_FUNCTION_ARGS);
Datum LWGEOM_zmflag(PG_FUNCTION_ARGS);
-// internal
-int32 lwgeom_nrings_recursive(char *serialized);
-void dump_lwexploded(LWGEOM_EXPLODED *exploded);
-void ptarray_reverse(POINTARRAY *pa);
-
/*------------------------------------------------------------------*/
}
-void
-ptarray_reverse(POINTARRAY *pa)
-{
- POINT4D pbuf;
- uint32 i;
- int ptsize = pointArray_ptsize(pa);
- int last = pa->npoints-1;
- int mid = last/2;
-
- for (i=0; i<=mid; i++)
- {
- char *from, *to;
- from = getPoint(pa, i);
- to = getPoint(pa, (last-i));
- memcpy((char *)&pbuf, to, ptsize);
- memcpy(to, from, ptsize);
- memcpy(from, (char *)&pbuf, ptsize);
- }
-
-}
-
-void
-lwline_reverse(LWLINE *line)
-{
- ptarray_reverse(line->points);
-}
-
-void
-lwpoly_reverse(LWPOLY *poly)
-{
- int i;
-
- for (i=0; i<poly->nrings; i++)
- ptarray_reverse(poly->rings[i]);
-}
-
-void
-lwpoly_forceRHR(LWPOLY *poly)
-{
- int i;
-
- if ( ptarray_isccw(poly->rings[0]) )
- {
- ptarray_reverse(poly->rings[0]);
- }
-
- for (i=1; i<poly->nrings; i++)
- {
- if ( ! ptarray_isccw(poly->rings[i]) )
- {
- ptarray_reverse(poly->rings[i]);
- }
- }
-}
-
/*------------------------------------------------------------------*/
//find the size of geometry
TYPE_SETZM(pa[0]->dims, 0, 0);
pa[0]->npoints = 5;
- // Construct polygon
- poly = lwpoly_construct(0, 0, SRID, lwgeom_hasBBOX(geom->type), 1, pa);
+ // Construct polygon
+ poly = lwpoly_construct(SRID, lwgeom_hasBBOX(geom->type), 1, pa);
// Serialize polygon
ser = lwpoly_serialize(poly);
TYPE_SETZM(pa[0]->dims, 0, 0);
pa[0]->npoints = 5;
- // Construct polygon 2d
- poly = lwpoly_construct(
- 0, 0,
- SRID, lwgeom_hasBBOX(geom->type), 1, pa);
+ // Construct polygon
+ poly = lwpoly_construct(SRID, lwgeom_hasBBOX(geom->type), 1, pa);
// Serialize polygon
ser = lwpoly_serialize(poly);
pa = pointArray_construct((char *)¢, 1, 0, 1);
// Construct LWPOINT
- point = lwpoint_construct(1, 0, SRID, wantbbox, pa);
+ point = lwpoint_construct(SRID, wantbbox, pa);
// Serialize LWPOINT
srl = lwpoint_serialize(point);
GEOSdeleteChar( (char*) pts);
// Construct LWPOINT
- point = lwpoint_construct(
- TYPE_HASZ(pa->dims),
- TYPE_HASM(pa->dims),
- -1, 0, pa);
+ point = lwpoint_construct(-1, 0, pa);
return point;
}
GEOSdeleteChar( (char*) pts);
// Construct LWPOINT
- line = lwline_construct(
- TYPE_HASZ(pa->dims),
- TYPE_HASM(pa->dims),
- -1, 0, pa);
+ line = lwline_construct(-1, 0, pa);
return line;
}
}
// Construct LWPOLY
- poly = lwpoly_construct(
- TYPE_HASZ(pa->dims),
- TYPE_HASM(pa->dims),
- -1, 0, nrings+1, rings);
+ poly = lwpoly_construct(-1, 0, nrings+1, rings);
return poly;
}
#endif
}
- ret = lwcollection_construct(type,
- want3d, 0,
- SRID,
- wantbbox, ngeoms, geoms);
+ ret = lwcollection_construct(type, SRID, wantbbox, ngeoms, geoms);
return ret;
}
geom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
#ifdef DEBUG_CONVERTER
- elog(NOTICE, "GEOSnoop: IN: %s", unparse_WKT((char *)geom, malloc, free));
+ elog(NOTICE, "GEOSnoop: IN: %s", unparse_WKT(SERIALIZED_FORM(geom), malloc, free));
#endif
geosgeom = POSTGIS2GEOS(geom);
GEOSdeleteGeometry(geosgeom);
#ifdef DEBUG_CONVERTER
- elog(NOTICE, "GEOSnoop: OUT: %s", unparse_WKT((char *)result, malloc, free));
+ elog(NOTICE, "GEOSnoop: OUT: %s", unparse_WKT(SERIALIZED_FORM(result), malloc, free));
#endif
PG_RETURN_POINTER(result);
extern "C" Geometry *GEOSGetCentroid(Geometry *g1);
-extern "C" void NOTICE_MESSAGE(char *msg);
+extern "C" void lwnotice(char *msg);
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete cl;
return NULL;
}
#ifdef DEBUG_POSTGIS2GEOS
char buf[256];
sprintf(buf, "PostGIS2GEOS_point got lwpoint[%p]", lwpoint);
- NOTICE_MESSAGE(buf);
+ lwnotice(buf);
#endif
if ( lwpoint == NULL )
{
- NOTICE_MESSAGE("PostGIS2GEOS_point got a NULL lwpoint");
+ lwnotice("PostGIS2GEOS_point got a NULL lwpoint");
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
#ifdef DEBUG_POSTGIS2GEOS
char buf[256];
sprintf(buf, "PostGIS2GEOS_line got lwline[%p]", lwline);
- NOTICE_MESSAGE(buf);
+ lwnotice(buf);
#endif
try{
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
#ifdef DEBUG_POSTGIS2GEOS
char buf[256];
sprintf(buf, "PostGIS2GEOS_poly got lwpoly[%p]", lwpoly);
- NOTICE_MESSAGE(buf);
+ lwnotice(buf);
#endif
try
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
char buf[256];
sprintf(buf, "PostGIS2GEOS_collection: requested type %d, ngeoms: %d",
type, ngeoms);
- NOTICE_MESSAGE(buf);
+ lwnotice(buf);
#endif
try
g = geomFactory->createMultiPolygon(subGeos);
break;
default:
- NOTICE_MESSAGE("Unsupported type request for PostGIS2GEOS_collection");
+ lwnotice("Unsupported type request for PostGIS2GEOS_collection");
g = NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 2;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return -1;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
//return NULL;
}
}
catch (GEOSException *ge) // ???
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
//return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 0;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 0;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 0;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 0;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return NULL;
}
}
catch (GEOSException *ge)
{
- NOTICE_MESSAGE((char *)ge->toString().c_str());
+ lwnotice((char *)ge->toString().c_str());
delete ge;
return 0;
}
in = (char*)PG_DETOAST_DATUM(entry->key);
#ifdef DEBUG_GIST4
- elog(NOTICE,"GIST: gist_lwgeom_compress detoasted entry->key: %s", unparse_WKT(in, malloc, free));
+ elog(NOTICE,"GIST: gist_lwgeom_compress detoasted entry->key: %s", unparse_WKT(SERIALIZED_FORM(in), malloc, free));
#endif
if (in == NULL)
void elog_ERROR(const char* string);
-extern unsigned char parse_hex(char *str);
-extern void deparse_hex(unsigned char str, unsigned char *result);
-extern char *parse_lwgeom_wkt(char *wkt_input);
-
// needed for OGC conformance
Datum LWGEOMFromWKB(PG_FUNCTION_ARGS);
Datum WKBFromLWGEOM(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(LWGEOM_out);
Datum LWGEOM_out(PG_FUNCTION_ARGS)
{
- char *lwgeom;
+ PG_LWGEOM *lwgeom;
char *result;
init_pg_func();
- lwgeom = (char *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- result = unparse_WKB(lwgeom,lwalloc,lwfree);
+ lwgeom = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ result = unparse_WKB(SERIALIZED_FORM(lwgeom),lwalloc,lwfree);
PG_RETURN_CSTRING(result);
}
int SRID = -1;
char sridText[100];
char *loc;
- char *lwgeom;
+ PG_LWGEOM *lwgeom;
int t;
wkb_input = (WellKnownBinary *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
elog(NOTICE,"LWGEOMFromWKB :: '%s'", wkb_srid_hexized);
#endif
- lwgeom = parse_lwgeom_wkt(wkb_srid_hexized);
+ lwgeom = (PG_LWGEOM *)parse_lwgeom_wkt(wkb_srid_hexized);
pfree(wkb_srid_hexized);
#ifdef DEBUG
- elog(NOTICE, "LWGEOMFromWKB returning %s", unparse_WKB(lwgeom, pg_alloc, pg_free));
+ elog(NOTICE, "LWGEOMFromWKB returning %s", unparse_WKB(SERIALIZED_FORM(lwgeom), pg_alloc, pg_free));
#endif
PG_RETURN_POINTER(lwgeom);
PG_FUNCTION_INFO_V1(WKBFromLWGEOM);
Datum WKBFromLWGEOM(PG_FUNCTION_ARGS)
{
- char *lwgeom_input; // SRID=#;<hexized wkb>
+ PG_LWGEOM *lwgeom_input; // SRID=#;<hexized wkb>
char *hexized_wkb_srid;
char *hexized_wkb; // hexized_wkb_srid w/o srid
char *result; //wkb
init_pg_func();
- lwgeom_input = (char *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- hexized_wkb_srid = unparse_WKB(lwgeom_input, lwalloc, lwfree);
+ lwgeom_input = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ hexized_wkb_srid = unparse_WKB(SERIALIZED_FORM(lwgeom_input), lwalloc, lwfree);
//elog(NOTICE, "in WKBFromLWGEOM with WKB = '%s'", hexized_wkb_srid);
-
-
-
-
-//given one byte, populate result with two byte representing
-// the hex number
-// ie deparse_hex( 255, mystr)
-// -> mystr[0] = 'F' and mystr[1] = 'F'
-// no error checking done
-void deparse_hex(unsigned char str, unsigned char *result)
-{
- int input_high;
- int input_low;
-
- input_high = (str>>4);
- input_low = (str & 0x0F);
-
- switch (input_high)
- {
- case 0:
- result[0] = '0';
- break;
- case 1:
- result[0] = '1';
- break;
- case 2:
- result[0] = '2';
- break;
- case 3:
- result[0] = '3';
- break;
- case 4:
- result[0] = '4';
- break;
- case 5:
- result[0] = '5';
- break;
- case 6:
- result[0] = '6';
- break;
- case 7:
- result[0] = '7';
- break;
- case 8:
- result[0] = '8';
- break;
- case 9:
- result[0] = '9';
- break;
- case 10:
- result[0] = 'A';
- break;
- case 11:
- result[0] = 'B';
- break;
- case 12:
- result[0] = 'C';
- break;
- case 13:
- result[0] = 'D';
- break;
- case 14:
- result[0] = 'E';
- break;
- case 15:
- result[0] = 'F';
- break;
- }
-
- switch (input_low)
- {
- case 0:
- result[1] = '0';
- break;
- case 1:
- result[1] = '1';
- break;
- case 2:
- result[1] = '2';
- break;
- case 3:
- result[1] = '3';
- break;
- case 4:
- result[1] = '4';
- break;
- case 5:
- result[1] = '5';
- break;
- case 6:
- result[1] = '6';
- break;
- case 7:
- result[1] = '7';
- break;
- case 8:
- result[1] = '8';
- break;
- case 9:
- result[1] = '9';
- break;
- case 10:
- result[1] = 'A';
- break;
- case 11:
- result[1] = 'B';
- break;
- case 12:
- result[1] = 'C';
- break;
- case 13:
- result[1] = 'D';
- break;
- case 14:
- result[1] = 'E';
- break;
- case 15:
- result[1] = 'F';
- break;
- }
-}
-
-//given a string with at least 2 chars in it, convert them to
-// a byte value. No error checking done!
-unsigned char parse_hex(char *str)
-{
- //do this a little brute force to make it faster
-
- unsigned char result_high = 0;
- unsigned char result_low = 0;
-
- switch (str[0])
- {
- case '0' :
- result_high = 0;
- break;
- case '1' :
- result_high = 1;
- break;
- case '2' :
- result_high = 2;
- break;
- case '3' :
- result_high = 3;
- break;
- case '4' :
- result_high = 4;
- break;
- case '5' :
- result_high = 5;
- break;
- case '6' :
- result_high = 6;
- break;
- case '7' :
- result_high = 7;
- break;
- case '8' :
- result_high = 8;
- break;
- case '9' :
- result_high = 9;
- break;
- case 'A' :
- result_high = 10;
- break;
- case 'B' :
- result_high = 11;
- break;
- case 'C' :
- result_high = 12;
- break;
- case 'D' :
- result_high = 13;
- break;
- case 'E' :
- result_high = 14;
- break;
- case 'F' :
- result_high = 15;
- break;
- }
- switch (str[1])
- {
- case '0' :
- result_low = 0;
- break;
- case '1' :
- result_low = 1;
- break;
- case '2' :
- result_low = 2;
- break;
- case '3' :
- result_low = 3;
- break;
- case '4' :
- result_low = 4;
- break;
- case '5' :
- result_low = 5;
- break;
- case '6' :
- result_low = 6;
- break;
- case '7' :
- result_low = 7;
- break;
- case '8' :
- result_low = 8;
- break;
- case '9' :
- result_low = 9;
- break;
- case 'A' :
- result_low = 10;
- break;
- case 'B' :
- result_low = 11;
- break;
- case 'C' :
- result_low = 12;
- break;
- case 'D' :
- result_low = 13;
- break;
- case 'E' :
- result_low = 14;
- break;
- case 'F' :
- result_low = 15;
- break;
- }
- return (unsigned char) ((result_high<<4) + result_low);
-}
-
// puts a bbox inside the geometry
PG_FUNCTION_INFO_V1(LWGEOM_addBBOX);
Datum LWGEOM_addBBOX(PG_FUNCTION_ARGS)
}
-char *parse_lwgeom_wkt(char *wkt_input)
-{
- char *serialized_form = parse_lwg((const char *)wkt_input,(allocator)pg_alloc, (report_error)elog_ERROR);
-
-
-#ifdef DEBUG
- elog(NOTICE,"parse_lwgeom_wkt with %s",wkt_input);
-#endif
-
- if (serialized_form == NULL)
- elog(ERROR,"parse_WKT:: couldnt parse!");
-
- return serialized_form;
-
-}
-
#if USE_VERSION > 73
/*
* This function must advance the StringInfo.cursor pointer
{
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
bytea *wkb;
- char *result;
+ PG_LWGEOM *result;
#ifdef DEBUG
elog(NOTICE, "LWGEOM_recv start");
#endif
/* Call slow LWGEOMFromWKB function... */
- result = DatumGetPointer(DirectFunctionCall1(LWGEOMFromWKB,
+ result = (PG_LWGEOM *)DatumGetPointer(DirectFunctionCall1(LWGEOMFromWKB,
PointerGetDatum(wkb)));
#ifdef DEBUG
#endif
#ifdef DEBUG
- elog(NOTICE, "LWGEOMFromWKB returned %s", unparse_WKB(result,pg_alloc,pg_free));
+ elog(NOTICE, "LWGEOMFromWKB returned %s", unparse_WKB(SERIALIZED_FORM(result),pg_alloc,pg_free));
#endif
extring = poly->rings[0];
// This is a LWLINE constructed by exterior ring POINTARRAY
- line = lwline_construct(
- TYPE_HASZ(poly->type),
- TYPE_HASM(poly->type),
- poly->SRID,
- lwgeom_hasBBOX(geom->type), extring);
+ line = lwline_construct(poly->SRID, lwgeom_hasBBOX(geom->type), extring);
// Now we serialized it (copying data)
serializedline = lwline_serialize(line);
ring = poly->rings[wanted_index+1];
// This is a LWLINE constructed by exterior ring POINTARRAY
- line = lwline_construct(
- TYPE_HASZ(poly->type),
- TYPE_HASM(poly->type),
- poly->SRID,
- lwgeom_hasBBOX(geom->type), ring);
+ line = lwline_construct(poly->SRID, lwgeom_hasBBOX(geom->type), ring);
// Now we serialized it (copying data)
serializedline = lwline_serialize(line);
TYPE_HASZ(line->type), TYPE_HASM(line->type), 1);
// Construct an LWPOINT
- point = lwpoint_construct(TYPE_HASZ(line->type), TYPE_HASM(line->type),
- lwgeom_getSRID(geom), lwgeom_hasBBOX(geom->type), pts);
+ point = lwpoint_construct(lwgeom_getSRID(geom), lwgeom_hasBBOX(geom->type), pts);
// Serialized the point
serializedpoint = lwpoint_serialize(point);
TYPE_HASM(line->type), 1);
// Construct an LWPOINT
- point = lwpoint_construct(
- TYPE_HASZ(line->type),
- TYPE_HASM(line->type),
- lwgeom_getSRID(geom),
- lwgeom_hasBBOX(geom->type), pts);
+ point = lwpoint_construct(lwgeom_getSRID(geom), lwgeom_hasBBOX(geom->type), pts);
// Serialized the point
serializedpoint = lwpoint_serialize(point);
TYPE_HASM(line->type), 1);
// Construct an LWPOINT
- point = lwpoint_construct(
- TYPE_HASZ(line->type),
- TYPE_HASM(line->type),
- lwgeom_getSRID(geom),
- lwgeom_hasBBOX(geom->type), pts);
+ point = lwpoint_construct(lwgeom_getSRID(geom), lwgeom_hasBBOX(geom->type), pts);
// Serialized the point
serializedpoint = lwpoint_serialize(point);
PG_FUNCTION_INFO_V1(LWGEOM_asText);
Datum LWGEOM_asText(PG_FUNCTION_ARGS)
{
- char *lwgeom;
+ PG_LWGEOM *lwgeom;
char *result_cstring;
int len;
char *result,*loc_wkt;
init_pg_func();
- lwgeom = (char *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- result_cstring = unparse_WKT(lwgeom,lwalloc,lwfree);
+ lwgeom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ result_cstring = unparse_WKT(SERIALIZED_FORM(lwgeom),lwalloc,lwfree);
semicolonLoc = strchr(result_cstring,';');
void
init_pg_func()
{
- lwalloc = pg_alloc;
- lwrealloc = pg_realloc;
- lwfree = pg_free;
+ lwalloc_var = pg_alloc;
+ lwrealloc_var = pg_realloc;
+ lwfree_var = pg_free;
lwerror = pg_error;
lwnotice = pg_notice;
}
+
// construct a new LWLINE. points will *NOT* be copied
// use SRID=-1 for unknown SRID (will have 8bit type's S = 0)
LWLINE *
-lwline_construct(char hasz, char hasm, int SRID, char wantbbox, POINTARRAY *points)
+lwline_construct(int SRID, char wantbbox, POINTARRAY *points)
{
LWLINE *result;
- result = (LWLINE*) lwalloc( sizeof(LWLINE));
+ result = (LWLINE*) lwalloc(sizeof(LWLINE));
- result->type = lwgeom_makeType_full(hasz, hasm, (SRID!=-1), LINETYPE,
+ result->type = lwgeom_makeType_full(
+ TYPE_HASZ(points->dims),
+ TYPE_HASM(points->dims),
+ (SRID!=-1), LINETYPE,
wantbbox);
result->SRID = SRID;
result->points = points;
else newtype = COLLECTIONTYPE;
col = lwcollection_construct(newtype,
- TYPE_HASZ(to->type),
- TYPE_HASM(to->type),
to->SRID,
( TYPE_HASBBOX(what->type) || TYPE_HASBBOX(to->type) ),
2, geoms);
return (LWGEOM *)col;
}
+
+void
+lwline_reverse(LWLINE *line)
+{
+ ptarray_reverse(line->points);
+}
else newtype = COLLECTIONTYPE;
col = lwcollection_construct(newtype,
- TYPE_HASZ(to->type),
- TYPE_HASM(to->type),
to->SRID,
( TYPE_HASBBOX(what->type) || TYPE_HASBBOX(to->type) ),
to->ngeoms+1, geoms);
else newtype = COLLECTIONTYPE;
col = lwcollection_construct(newtype,
- TYPE_HASZ(to->type), TYPE_HASM(to->type),
to->SRID,
( TYPE_HASBBOX(what->type) || TYPE_HASBBOX(to->type) ),
to->ngeoms+1, geoms);
else newtype = COLLECTIONTYPE;
col = lwcollection_construct(newtype,
- TYPE_HASZ(to->type),
- TYPE_HASM(to->type),
to->SRID,
( TYPE_HASBBOX(what->type) || TYPE_HASBBOX(to->type) ),
to->ngeoms+1, geoms);
// construct a new point. point will not be copied
// use SRID=-1 for unknown SRID (will have 8bit type's S = 0)
LWPOINT *
-lwpoint_construct(char hasZ, char hasM, int SRID, char wantbbox, POINTARRAY *point)
+lwpoint_construct(int SRID, char wantbbox, POINTARRAY *point)
{
LWPOINT *result ;
return NULL; // error
result = lwalloc(sizeof(LWPOINT));
- result->type = lwgeom_makeType_full(hasZ, hasM, (SRID!=-1),
+ result->type = lwgeom_makeType_full(TYPE_HASZ(point->dims), TYPE_HASM(point->dims), (SRID!=-1),
POINTTYPE, wantbbox);
result->SRID = SRID;
result->point = point;
else newtype = COLLECTIONTYPE;
col = lwcollection_construct(newtype,
- TYPE_HASZ(to->type),
- TYPE_HASM(to->type),
to->SRID,
( TYPE_HASBBOX(what->type) || TYPE_HASBBOX(to->type) ),
2, geoms);
//#define DEBUG_CALLS 1
+#define CHECK_POLY_RINGS_ZM 1
+
// construct a new LWPOLY. arrays (points/points per ring) will NOT be copied
// use SRID=-1 for unknown SRID (will have 8bit type's S = 0)
LWPOLY *
-lwpoly_construct(char hasz, char hasm, int SRID, char wantbbox, int nrings, POINTARRAY **points)
+lwpoly_construct(int SRID, char wantbbox, unsigned int nrings, POINTARRAY **points)
{
LWPOLY *result;
+ int hasz, hasm;
+#ifdef CHECK_POLY_RINGS_ZM
+ char zm;
+ unsigned int i;
+#endif
+
+ if ( nrings < 1 ) lwerror("lwpoly_construct: need at least 1 ring");
+
+ hasz = TYPE_HASZ(points[0]->dims);
+ hasm = TYPE_HASM(points[0]->dims);
+
+#ifdef CHECK_POLY_RINGS_ZM
+ zm = TYPE_GETZM(points[0]->dims);
+ for (i=1; i<nrings; i++)
+ {
+ if ( zm != TYPE_GETZM(points[i]->dims) )
+ lwerror("lwpoly_construct: mixed dimensioned rings");
+ }
+#endif
result = (LWPOLY*) lwalloc(sizeof(LWPOLY));
result->type = lwgeom_makeType_full(hasz, hasm, (SRID!=-1), POLYGONTYPE,
else newtype = COLLECTIONTYPE;
col = lwcollection_construct(newtype,
- TYPE_HASZ(to->type),
- TYPE_HASM(to->type),
to->SRID,
( TYPE_HASBBOX(what->type) || TYPE_HASBBOX(to->type) ),
2, geoms);
return (LWGEOM *)col;
}
+
+void
+lwpoly_forceRHR(LWPOLY *poly)
+{
+ int i;
+
+ if ( ptarray_isccw(poly->rings[0]) )
+ {
+ ptarray_reverse(poly->rings[0]);
+ }
+
+ for (i=1; i<poly->nrings; i++)
+ {
+ if ( ! ptarray_isccw(poly->rings[i]) )
+ {
+ ptarray_reverse(poly->rings[i]);
+ }
+ }
+}
+
+
+void
+lwpoly_reverse(LWPOLY *poly)
+{
+ int i;
+
+ for (i=0; i<poly->nrings; i++)
+ ptarray_reverse(poly->rings[i]);
+}
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+
+#include "liblwgeom.h"
+
+POINTARRAY *
+ptarray_construct(char hasz, char hasm, unsigned int npoints)
+{
+ unsigned char dims = 0;
+ size_t size;
+ char *ptlist;
+ POINTARRAY *pa;
+
+ TYPE_SETZM(dims, hasz?1:0, hasm?1:0);
+ size = TYPE_NDIMS(dims)*npoints;
+ ptlist = (char *)lwalloc(size);
+ pa = lwalloc(sizeof(POINTARRAY));
+ pa->dims = dims;
+ pa->serialized_pointlist = ptlist;
+ pa->npoints = npoints;
+
+ return pa;
+
+}
+
+POINTARRAY *
+ptarray_construct2d(uint32 npoints, POINT2D const* const* pts)
+{
+ POINTARRAY *pa = ptarray_construct(0, 0, npoints);
+ uint32 i;
+
+ for (i=0; i<npoints; i++)
+ {
+ POINT2D *pap = (POINT2D *)getPoint(pa, i);
+ pap->x = pts[i]->x;
+ pap->y = pts[i]->y;
+ }
+
+ return pa;
+}
+
+void
+ptarray_reverse(POINTARRAY *pa)
+{
+ POINT4D pbuf;
+ uint32 i;
+ int ptsize = pointArray_ptsize(pa);
+ int last = pa->npoints-1;
+ int mid = last/2;
+
+ for (i=0; i<=mid; i++)
+ {
+ char *from, *to;
+ from = getPoint(pa, i);
+ to = getPoint(pa, (last-i));
+ memcpy((char *)&pbuf, to, ptsize);
+ memcpy(to, from, ptsize);
+ memcpy(from, (char *)&pbuf, ptsize);
+ }
+
+}
--- /dev/null
+#include <stdio.h>
+#include "lwgeom.h"
+
+int main()
+{
+ POINT2D *pts2d[10];
+ POINT3DM *pts3dm[10];
+ POINT3DZ *pts3dz[10];
+ POINT4D *pts4d[10];
+ unsigned int npoints;
+ POINTARRAY pa;
+ LWGEOM point, line, poly;
+
+ // Construct a point2d
+ pts2d[0] = lwalloc(sizeof(POINT2D));
+ pts2d[0]->x = 10;
+ pts2d[0]->y = 20;
+
+ // Construct a pointarray2d
+ pa = ptarray_construct2d(1, pts2d);
+
+ // Construct a point LWGEOM
+ point = lwpoint_construct(-1, 0, pa);
+
+ // Print WKT
+ printf("WKT: %s\n", lwgeom_to_wkt(point));
+
+ return 1;
+}
byte* parse_lwg(const char* wkt,allocator allocfunc,report_error errfunc);
byte* parse_lwgi(const char* wkt,allocator allocfunc,report_error errfunc);
-char* unparse_WKT(byte* lw_geom,allocator alloc,freeor free);
-char* unparse_WKB(byte* lw_geom,allocator alloc,freeor free);
+char* unparse_WKT(byte* serialized, allocator alloc,freeor free);
+char* unparse_WKB(byte* serialized, allocator alloc,freeor free);
}
char *
-unparse_WKT(byte* lw_geom, allocator alloc, freeor free)
+unparse_WKT(byte* serialized, allocator alloc, freeor free)
{
- if (lw_geom==NULL)
+ if (serialized==NULL)
return NULL;
local_malloc=alloc;
out_start = out_pos = alloc(len);
lwgi=0;
- output_wkt(lw_geom+4, 0);
+ output_wkt(serialized, 0);
return out_start;
}
}
char *
-unparse_WKB(byte* lw_geom,allocator alloc,freeor free)
+unparse_WKB(byte* serialized, allocator alloc, freeor free)
{
#ifdef DEBUG
- lwnotice("unparse_WKB(%p,...) called", lw_geom);
+ lwnotice("unparse_WKB(%p,...) called", serialized);
#endif
- if (lw_geom==NULL)
+ if (serialized==NULL)
return NULL;
local_malloc=alloc;
out_start = out_pos = alloc(len);
lwgi=0;
- output_wkb(lw_geom+4);
+ output_wkb(serialized);
ensure(1);
*out_pos=0;