#include "utils/builtins.h"
#include "lwgeom.h"
+#include "profile.h"
#include "wktparse.h"
Datum relate_full(PG_FUNCTION_ARGS);
#undef DEBUG_POSTGIS2GEOS
#undef DEBUG_GEOS2POSTGIS
-/*
- * Define this to have profiling enabled
- */
-#define PROFILE
-
-#ifdef PROFILE
-#include <sys/time.h>
-#define PROF_P2G 0
-#define PROF_G2P 1
-#define PROF_GRUN 2
-struct timeval profstart, profstop;
-long proftime[3];
-long profipts, profopts;
-#define profstart(x) do { gettimeofday(&profstart, NULL); } while (0);
-#define profstop(x) do { gettimeofday(&profstop, NULL); \
- proftime[x] = ( profstop.tv_sec*1000000+profstop.tv_usec) - \
- ( profstart.tv_sec*1000000+profstart.tv_usec); \
- } while (0);
-#define profreport(x) do { \
- long int conv = proftime[PROF_P2G]+proftime[PROF_G2P]; \
- long int run = proftime[PROF_GRUN]; \
- long int tot = conv + run; \
- int convpercent = (((double)conv/(double)tot)*100); \
- int runpercent = (((double)run/(double)tot)*100); \
- elog(NOTICE, "PROF_DET: npts:%lu+%lu=%lu cnv:%lu+%lu run:%lu", \
- profipts, profopts, profipts+profopts, \
- proftime[PROF_P2G], proftime[PROF_G2P], \
- proftime[PROF_GRUN]); \
- elog(NOTICE, "PROF_SUM: pts %lu cnv %d%% run %d%%", \
- profipts+profopts, \
- convpercent, \
- runpercent); \
- } while (0);
-#endif
-
typedef struct Geometry Geometry;
extern const char * createGEOSPoint(POINT3D *pt);
PG_FUNCTION_INFO_V1(geomunion);
Datum geomunion(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
- int is3d = ( lwgeom_ndims(geom1->type) > 2 ) ||
- ( lwgeom_ndims(geom2->type) > 2 );
-
+ LWGEOM *geom1;
+ LWGEOM *geom2;
+ int is3d;
Geometry *g1,*g2,*g3;
LWGEOM *result;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
+ is3d = ( lwgeom_ndims(geom1->type) > 2 ) ||
+ ( lwgeom_ndims(geom2->type) > 2 );
+
initGEOS(MAXIMUM_ALIGNOF);
//elog(NOTICE,"in geomunion");
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
g1 = POSTGIS2GEOS(geom1);
g2 = POSTGIS2GEOS(geom2);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
//elog(NOTICE,"g1=%s",GEOSasText(g1));
//elog(NOTICE,"g2=%s",GEOSasText(g2));
//elog(NOTICE,"g3=%s",GEOSasText(g3));
+#ifndef PROFILE
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
+#endif
GEOSdeleteGeometry(g1);
GEOSdeleteGeometry(g2);
//elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
+#ifdef PROFILE
+ profstart(PROF_G2P);
+#endif
result = GEOS2POSTGIS(g3, is3d);
+#ifdef PROFILE
+ profstop(PROF_G2P);
+#endif
GEOSdeleteGeometry(g3);
}
//compressType(result); // convert multi* to single item if appropriate
+
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, result);
+#endif
+
PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(symdifference);
Datum symdifference(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
-
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2,*g3;
LWGEOM *result;
- int is3d = ( lwgeom_ndims(geom1->type) > 2 ) ||
+ int is3d;
+
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
+ is3d = ( lwgeom_ndims(geom1->type) > 2 ) ||
( lwgeom_ndims(geom2->type) > 2 );
- initGEOS(MAXIMUM_ALIGNOF);
+ initGEOS(MAXIMUM_ALIGNOF);
+
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1);
+ g2 = POSTGIS2GEOS(geom2);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
- g1 = POSTGIS2GEOS(geom1 );
- g2 = POSTGIS2GEOS(geom2 );
- g3 = GEOSSymDifference(g1,g2);
+#ifdef PROFILE
+ profstart(PROF_GRUN);
+#endif
+ g3 = GEOSSymDifference(g1,g2);
+#ifdef PROFILE
+ profstop(PROF_GRUN);
+#endif
if (g3 == NULL)
{
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
+
#ifdef PROFILE
- profstart(PROF_GRUN);
+ profstart(PROF_G2P);
#endif
result = GEOS2POSTGIS(g3, is3d);
#ifdef PROFILE
- profstop(PROF_GRUN);
+ profstop(PROF_G2P);
#endif
if (result == NULL)
PG_RETURN_NULL(); //never get here
}
+ GEOSdeleteGeometry(g1);
+ GEOSdeleteGeometry(g2);
+ GEOSdeleteGeometry(g3);
+ //compressType(result); // convert multi* to single item if appropriate
- GEOSdeleteGeometry(g1);
- GEOSdeleteGeometry(g2);
- GEOSdeleteGeometry(g3);
-
- //compressType(result); // convert multi* to single item if appropriate
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, result);
+#endif
- PG_RETURN_POINTER(result);
+ PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(boundary);
Datum boundary(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ LWGEOM *geom1;
+ Geometry *g1,*g3;
+ LWGEOM *result;
+
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+
+ initGEOS(MAXIMUM_ALIGNOF);
- Geometry *g1,*g3;
- LWGEOM *result;
- initGEOS(MAXIMUM_ALIGNOF);
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1 );
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
- g1 = POSTGIS2GEOS(geom1 );
#ifdef PROFILE
profstart(PROF_GRUN);
#endif
- g3 = GEOSBoundary(g1);
+ g3 = GEOSBoundary(g1);
#ifdef PROFILE
profstop(PROF_GRUN);
#endif
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
+#ifdef PROFILE
+ profstart(PROF_G2P);
+#endif
result = GEOS2POSTGIS(g3, lwgeom_ndims(geom1->type) > 2);
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+
if (result == NULL)
{
GEOSdeleteGeometry(g1);
- GEOSdeleteGeometry(g1);
- GEOSdeleteGeometry(g3);
+ GEOSdeleteGeometry(g1);
+ GEOSdeleteGeometry(g3);
+
+ //compressType(result); // convert multi* to single item if appropriate
- //compressType(result); // convert multi* to single item if appropriate
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, NULL, result);
+#endif
- PG_RETURN_POINTER(result);
+ PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(convexhull);
Datum convexhull(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- Geometry *g1,*g3;
- LWGEOM *result;
+ LWGEOM *geom1;
+ Geometry *g1,*g3;
+ LWGEOM *result;
- initGEOS(MAXIMUM_ALIGNOF);
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+
+ initGEOS(MAXIMUM_ALIGNOF);
- g1 = POSTGIS2GEOS(geom1 );
- g3 = GEOSConvexHull(g1);
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1 );
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
+#ifdef PROFILE
+ profstart(PROF_GRUN);
+#endif
+ g3 = GEOSConvexHull(g1);
+#ifdef PROFILE
+ profstop(PROF_GRUN);
+#endif
if (g3 == NULL)
{
GEOSdeleteGeometry(g3);
- //compressType(result); // convert multi* to single item if appropriate
+ //compressType(result); // convert multi* to single item if appropriate
- PG_RETURN_POINTER(result);
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, NULL, result);
+#endif
+
+ PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(buffer);
Datum buffer(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- double size = PG_GETARG_FLOAT8(1);
- Geometry *g1,*g3;
- LWGEOM *result;
+ LWGEOM *geom1;
+ double size;
+ Geometry *g1,*g3;
+ LWGEOM *result;
+
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
- initGEOS(MAXIMUM_ALIGNOF);
+ geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ size = PG_GETARG_FLOAT8(1);
- g1 = POSTGIS2GEOS(geom1 );
- g3 = GEOSBuffer(g1,size);
+ initGEOS(MAXIMUM_ALIGNOF);
+
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1 );
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
+#ifdef PROFILE
+ profstart(PROF_GRUN);
+#endif
+ g3 = GEOSBuffer(g1,size);
+#ifdef PROFILE
+ profstop(PROF_GRUN);
+#endif
if (g3 == NULL)
{
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
+#ifdef PROFILE
+ profstart(PROF_G2P);
+#endif
result = GEOS2POSTGIS(g3, lwgeom_ndims(geom1->type) > 2);
+#ifdef PROFILE
+ profstop(PROF_G2P);
+#endif
if (result == NULL)
{
GEOSdeleteGeometry(g1);
elog(ERROR,"GEOS buffer() threw an error (result postgis geometry formation)!");
PG_RETURN_NULL(); //never get here
}
- GEOSdeleteGeometry(g1);
- GEOSdeleteGeometry(g3);
+ GEOSdeleteGeometry(g1);
+ GEOSdeleteGeometry(g3);
+
+ //compressType(result); // convert multi* to single item if appropriate
- //compressType(result); // convert multi* to single item if appropriate
- PG_RETURN_POINTER(result);
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, NULL, result);
+#endif
+ PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(intersection);
Datum intersection(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2,*g3;
LWGEOM *result;
- int is3d = ( lwgeom_ndims(geom1->type) > 2 ) ||
+ int is3d;
+
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
+ is3d = ( lwgeom_ndims(geom1->type) > 2 ) ||
( lwgeom_ndims(geom2->type) > 2 );
initGEOS(MAXIMUM_ALIGNOF);
//elog(NOTICE,"intersection() START");
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
g1 = POSTGIS2GEOS(geom1);
g2 = POSTGIS2GEOS(geom2);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
//elog(NOTICE," constructed geometrys - calling geos");
#ifdef PROFILE
profstart(PROF_GRUN);
#endif
- g3 = GEOSIntersection(g1,g2);
+ g3 = GEOSIntersection(g1,g2);
#ifdef PROFILE
profstop(PROF_GRUN);
#endif
//elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
+#ifdef PROFILE
+ profstart(PROF_G2P);
+#endif
result = GEOS2POSTGIS(g3, is3d);
+#ifdef PROFILE
+ profstop(PROF_G2P);
+#endif
+
if (result == NULL)
{
GEOSdeleteGeometry(g1);
- GEOSdeleteGeometry(g1);
- GEOSdeleteGeometry(g2);
- GEOSdeleteGeometry(g3);
+ GEOSdeleteGeometry(g1);
+ GEOSdeleteGeometry(g2);
+ GEOSdeleteGeometry(g3);
+
+ //compressType(result); // convert multi* to single item if appropriate
- //compressType(result); // convert multi* to single item if appropriate
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, result);
+#endif
- PG_RETURN_POINTER(result);
+ PG_RETURN_POINTER(result);
}
//select difference('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))','POLYGON((5 5, 15 5, 15 7, 5 7, 5 5))');
PG_FUNCTION_INFO_V1(difference);
Datum difference(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
-
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2,*g3;
LWGEOM *result;
- int is3d = ( lwgeom_ndims(geom1->type) > 2 ) ||
+ int is3d;
+
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
+ is3d = ( lwgeom_ndims(geom1->type) > 2 ) ||
( lwgeom_ndims(geom2->type) > 2 );
initGEOS(MAXIMUM_ALIGNOF);
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
g1 = POSTGIS2GEOS(geom1);
g2 = POSTGIS2GEOS(geom2);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
+#ifdef PROFILE
+ profstart(PROF_G2P);
+#endif
result = GEOS2POSTGIS(g3, is3d);
+#ifdef PROFILE
+ profstop(PROF_G2P);
+#endif
if (result == NULL)
{
GEOSdeleteGeometry(g1);
////compressType(result); // convert multi* to single item if appropriate
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, result);
+#endif
+
PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(pointonsurface);
Datum pointonsurface(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
-
+ LWGEOM *geom1;
Geometry *g1,*g3;
LWGEOM *result;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+
initGEOS(MAXIMUM_ALIGNOF);
- g1 = POSTGIS2GEOS(geom1 );
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
PG_RETURN_NULL(); //never get here
}
-
-
-
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
+#ifdef PROFILE
+ profstart(PROF_G2P);
+#endif
result = GEOS2POSTGIS(g3, (lwgeom_ndims(geom1->type) > 2));
+#ifdef PROFILE
+ profstop(PROF_G2P);
+#endif
if (result == NULL)
{
GEOSdeleteGeometry(g1);
PG_RETURN_NULL(); //never get here
}
-
-
GEOSdeleteGeometry(g1);
GEOSdeleteGeometry(g3);
// convert multi* to single item if appropriate
//compressType(result);
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, NULL, result);
+#endif
+
PG_RETURN_POINTER(result);
}
LWGEOM *geom, *result;
Geometry *geosgeom, *geosresult;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
geom = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
initGEOS(MAXIMUM_ALIGNOF);
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
geosgeom = POSTGIS2GEOS(geom);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
PG_RETURN_NULL();
}
+#ifdef PROFILE
+ profstart(PROF_G2P);
+#endif
result = GEOS2POSTGIS(geosresult, (lwgeom_ndims(geom->type) > 2));
+#ifdef PROFILE
+ profstop(PROF_G2P);
+#endif
if (result == NULL)
{
GEOSdeleteGeometry(geosgeom);
GEOSdeleteGeometry(geosgeom);
GEOSdeleteGeometry(geosresult);
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom, NULL, result);
+#endif
+
PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(isvalid);
Datum isvalid(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ LWGEOM *geom1;
bool result;
Geometry *g1;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+
initGEOS(MAXIMUM_ALIGNOF);
- g1 = POSTGIS2GEOS(geom1 );
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
result = GEOSisvalid(g1);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P]=0; profopts=0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
}
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, NULL, NULL);
+#endif
+
PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(overlaps);
Datum overlaps(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2;
bool result;
const BOX2DFLOAT4 *box1, *box2;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
errorIfGeometryCollection(geom1,geom2);
/*
initGEOS(MAXIMUM_ALIGNOF);
- g1 = POSTGIS2GEOS(geom1 );
- g2 = POSTGIS2GEOS(geom2 );
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1);
+ g2 = POSTGIS2GEOS(geom2);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
result = GEOSrelateOverlaps(g1,g2);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts=0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
PG_RETURN_NULL(); //never get here
}
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, NULL);
+#endif
+
PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(contains);
Datum contains(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2;
bool result;
const BOX2DFLOAT4 *box1, *box2;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
errorIfGeometryCollection(geom1,geom2);
/*
initGEOS(MAXIMUM_ALIGNOF);
- g1 = POSTGIS2GEOS(geom1 );
- g2 = POSTGIS2GEOS(geom2 );
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1);
+ g2 = POSTGIS2GEOS(geom2);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
result = GEOSrelateContains(g1,g2);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts=0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
PG_RETURN_NULL(); //never get here
}
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, NULL);
+#endif
+
PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(within);
Datum within(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2;
bool result;
const BOX2DFLOAT4 *box1, *box2;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
errorIfGeometryCollection(geom1,geom2);
/*
initGEOS(MAXIMUM_ALIGNOF);
- g1 = POSTGIS2GEOS(geom1 );
- g2 = POSTGIS2GEOS(geom2 );
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1);
+ g2 = POSTGIS2GEOS(geom2);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
result = GEOSrelateWithin(g1,g2);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts=0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
PG_RETURN_NULL(); //never get here
}
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, NULL);
+#endif
+
PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(crosses);
Datum crosses(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2;
bool result;
const BOX2DFLOAT4 *box1, *box2;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
errorIfGeometryCollection(geom1,geom2);
/*
initGEOS(MAXIMUM_ALIGNOF);
- g1 = POSTGIS2GEOS(geom1 );
- g2 = POSTGIS2GEOS(geom2 );
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1);
+ g2 = POSTGIS2GEOS(geom2);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
result = GEOSrelateCrosses(g1,g2);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts=0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
PG_RETURN_NULL(); //never get here
}
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, NULL);
+#endif
+
PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(intersects);
Datum intersects(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2;
bool result;
const BOX2DFLOAT4 *box1, *box2;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
errorIfGeometryCollection(geom1,geom2);
/*
initGEOS(MAXIMUM_ALIGNOF);
- g1 = POSTGIS2GEOS(geom1 );
- g2 = POSTGIS2GEOS(geom2 );
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1 );
+ g2 = POSTGIS2GEOS(geom2 );
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
result = GEOSrelateIntersects(g1,g2);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts=0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
GEOSdeleteGeometry(g2);
PG_RETURN_NULL(); //never get here
}
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, NULL);
+#endif
+
PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(touches);
Datum touches(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2;
bool result;
const BOX2DFLOAT4 *box1, *box2;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
errorIfGeometryCollection(geom1,geom2);
/*
initGEOS(MAXIMUM_ALIGNOF);
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
g1 = POSTGIS2GEOS(geom1 );
g2 = POSTGIS2GEOS(geom2 );
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
result = GEOSrelateTouches(g1,g2);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts=0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
PG_RETURN_NULL(); //never get here
}
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, NULL);
+#endif
+
PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(disjoint);
Datum disjoint(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2;
bool result;
const BOX2DFLOAT4 *box1, *box2;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
errorIfGeometryCollection(geom1,geom2);
/*
initGEOS(MAXIMUM_ALIGNOF);
- g1 = POSTGIS2GEOS(geom1 );
- g2 = POSTGIS2GEOS(geom2 );
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1);
+ g2 = POSTGIS2GEOS(geom2);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
result = GEOSrelateDisjoint(g1,g2);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts=0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
GEOSdeleteGeometry(g2);
PG_RETURN_NULL(); //never get here
}
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, NULL);
+#endif
+
PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(relate_pattern);
Datum relate_pattern(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ LWGEOM *geom1;
+ LWGEOM *geom2;
char *patt;
bool result;
-
Geometry *g1,*g2;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
errorIfGeometryCollection(geom1,geom2);
+
initGEOS(MAXIMUM_ALIGNOF);
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
g1 = POSTGIS2GEOS(geom1);
g2 = POSTGIS2GEOS(geom2);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
patt = DatumGetCString(DirectFunctionCall1(textout,
PointerGetDatum(PG_GETARG_DATUM(2))));
result = GEOSrelatePattern(g1,g2,patt);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts=0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
GEOSdeleteGeometry(g2);
PG_RETURN_NULL(); //never get here
}
- PG_RETURN_BOOL(result);
-
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, NULL);
+#endif
+ PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(relate_full);
Datum relate_full(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
-
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2;
- char *relate_str;
+ char *relate_str;
int len;
char *result;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
//elog(NOTICE,"in relate_full()");
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
errorIfGeometryCollection(geom1,geom2);
//elog(NOTICE,"GEOS init()");
- g1 = POSTGIS2GEOS(geom1 );
- g2 = POSTGIS2GEOS(geom2 );
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1 );
+ g2 = POSTGIS2GEOS(geom2 );
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
//elog(NOTICE,"constructed geometries ");
-
-
-
-
-if ((g1==NULL) || (g2 == NULL))
- elog(NOTICE,"g1 or g2 are null");
+ if ((g1==NULL) || (g2 == NULL))
+ elog(NOTICE,"g1 or g2 are null");
//elog(NOTICE,GEOSasText(g1));
//elog(NOTICE,GEOSasText(g2));
#ifdef PROFILE
profstart(PROF_GRUN);
#endif
- relate_str = GEOSrelate(g1, g2);
+ relate_str = GEOSrelate(g1, g2);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts=0;
- profreport();
#endif
//elog(NOTICE,"finished relate()");
GEOSdeleteGeometry(g1);
GEOSdeleteGeometry(g2);
-
-
if (relate_str == NULL)
{
//free(relate_str);
PG_RETURN_NULL(); //never get here
}
-
len = strlen(relate_str) + 4;
result= palloc(len);
free(relate_str);
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, NULL);
+#endif
PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(geomequals);
Datum geomequals(PG_FUNCTION_ARGS)
{
- LWGEOM *geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
- LWGEOM *geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+ LWGEOM *geom1;
+ LWGEOM *geom2;
Geometry *g1,*g2;
bool result;
const BOX2DFLOAT4 *box1, *box2;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom1 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ geom2 = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
+
errorIfGeometryCollection(geom1,geom2);
/*
initGEOS(MAXIMUM_ALIGNOF);
- g1 = POSTGIS2GEOS(geom1 );
- g2 = POSTGIS2GEOS(geom2 );
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom1);
+ g2 = POSTGIS2GEOS(geom2);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
result = GEOSequals(g1,g2);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts=0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
GEOSdeleteGeometry(g2);
PG_RETURN_NULL(); //never get here
}
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom1, geom2, NULL);
+#endif
+
PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(issimple);
Datum issimple(PG_FUNCTION_ARGS)
{
- LWGEOM *geom = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
-
+ LWGEOM *geom;
Geometry *g1;
int result;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+
if (lwgeom_getnumgeometries(SERIALIZED_FORM(geom)) == 0)
PG_RETURN_BOOL(true);
//elog(NOTICE,"GEOS init()");
- g1 = POSTGIS2GEOS(geom );
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
+ g1 = POSTGIS2GEOS(geom);
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
result = GEOSisSimple(g1);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts=0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
PG_RETURN_NULL(); //never get here
}
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom, NULL, NULL);
+#endif
+
PG_RETURN_BOOL(result);
}
PG_FUNCTION_INFO_V1(isring);
Datum isring(PG_FUNCTION_ARGS)
{
- LWGEOM *geom = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
-
+ LWGEOM*geom;
Geometry *g1;
int result;
+#ifdef PROFILE
+ profstart(PROF_QRUN);
+#endif
+
+ geom = (LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+
if (lwgeom_getType(geom->type) != LINETYPE)
{
elog(ERROR,"isring() should only be called on a LINE");
//elog(NOTICE,"GEOS init()");
+#ifdef PROFILE
+ profstart(PROF_P2G);
+#endif
g1 = POSTGIS2GEOS(geom );
+#ifdef PROFILE
+ profstop(PROF_P2G);
+#endif
#ifdef PROFILE
profstart(PROF_GRUN);
result = GEOSisRing(g1);
#ifdef PROFILE
profstop(PROF_GRUN);
- proftime[PROF_G2P] = 0; profopts = 0;
- profreport();
#endif
GEOSdeleteGeometry(g1);
PG_RETURN_NULL(); //never get here
}
+#ifdef PROFILE
+ profstop(PROF_QRUN);
+ profreport(geom, NULL, NULL);
+#endif
+
PG_RETURN_BOOL(result);
}
{
LWGEOM *result;
LWGEOM_EXPLODED *oexp;
- int SRID = GEOSGetSRID(geom);
+ int SRID;
int wantbbox = 0; // might as well be 1 ...
int size;
-#ifdef PROFILE
- profstart(PROF_G2P);
-#endif
+ SRID = GEOSGetSRID(geom);
// Initialize exploded lwgeom
oexp = (LWGEOM_EXPLODED *)palloc(sizeof(LWGEOM_EXPLODED));
result->size = size;
lwexploded_serialize_buf(oexp, wantbbox, SERIALIZED_FORM(result), NULL);
-#ifdef PROFILE
- profstop(PROF_G2P);
- profopts = lwgeom_npoints_recursive(SERIALIZED_FORM(result));
- profreport();
-#endif
-
return result;
}
int ncollected;
Geometry *ret=NULL;
-#ifdef PROFILE
- profipts = lwgeom_npoints_recursive(SERIALIZED_FORM(geom));
- profstart(PROF_P2G);
-#endif
-
type = lwgeom_getType(geom->type);
switch (type)
if ( ret )
{
-#ifdef PROFILE
- profstop(PROF_P2G);
-#endif
return ret;
}
ret = PostGIS2GEOS_collection(collected, ncollected,
exploded->SRID, exploded->ndims > 2);
-#ifdef PROFILE
- profstop(PROF_P2G);
-#endif
-
return ret;
}