mirror of
https://git.osgeo.org/gitea/postgis/postgis
synced 2024-10-25 09:32:46 +00:00
SRID checks and enforce for all GEOS operations.
Z value handled so to show it only when available. git-svn-id: http://svn.osgeo.org/postgis/trunk@1096 b70326c6-7e19-0410-871a-916f4a2858ee
This commit is contained in:
parent
a7cae3c0a4
commit
67869cd7cc
|
@ -83,7 +83,9 @@ extern char GEOSisSimple(Geometry *g1);
|
||||||
extern char GEOSisRing(Geometry *g1);
|
extern char GEOSisRing(Geometry *g1);
|
||||||
extern Geometry *GEOSpointonSurface(Geometry *g1);
|
extern Geometry *GEOSpointonSurface(Geometry *g1);
|
||||||
extern Geometry *GEOSGetCentroid(Geometry *g);
|
extern Geometry *GEOSGetCentroid(Geometry *g);
|
||||||
|
extern bool GEOSHasZ(Geometry *g1);
|
||||||
|
|
||||||
|
extern void GEOSSetSRID(Geometry *g, int SRID);
|
||||||
extern void GEOSdeleteChar(char *a);
|
extern void GEOSdeleteChar(char *a);
|
||||||
extern void GEOSdeleteGeometry(Geometry *a);
|
extern void GEOSdeleteGeometry(Geometry *a);
|
||||||
|
|
||||||
|
@ -154,6 +156,7 @@ Datum unite_garray(PG_FUNCTION_ARGS)
|
||||||
int nelems, i;
|
int nelems, i;
|
||||||
PG_LWGEOM **geoms, *result, *pgis_geom;
|
PG_LWGEOM **geoms, *result, *pgis_geom;
|
||||||
Geometry *g1, *g2, *geos_result;
|
Geometry *g1, *g2, *geos_result;
|
||||||
|
int SRID;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
static int call=1;
|
static int call=1;
|
||||||
#endif
|
#endif
|
||||||
|
@ -186,11 +189,17 @@ Datum unite_garray(PG_FUNCTION_ARGS)
|
||||||
initGEOS(MAXIMUM_ALIGNOF);
|
initGEOS(MAXIMUM_ALIGNOF);
|
||||||
|
|
||||||
if ( TYPE_NDIMS(geoms[0]->type) > 2 ) is3d = 1;
|
if ( TYPE_NDIMS(geoms[0]->type) > 2 ) is3d = 1;
|
||||||
|
SRID = lwgeom_getSRID(geoms[0]);
|
||||||
geos_result = POSTGIS2GEOS(geoms[0]);
|
geos_result = POSTGIS2GEOS(geoms[0]);
|
||||||
pfree(geoms[0]);
|
pfree(geoms[0]);
|
||||||
for (i=1; i<nelems; i++)
|
for (i=1; i<nelems; i++)
|
||||||
{
|
{
|
||||||
pgis_geom = geoms[i];
|
pgis_geom = geoms[i];
|
||||||
|
if ( SRID != lwgeom_getSRID(pgis_geom) )
|
||||||
|
{
|
||||||
|
elog(ERROR, "geomunion: operation on mixed SRID geometries");
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
g1 = POSTGIS2GEOS(pgis_geom);
|
g1 = POSTGIS2GEOS(pgis_geom);
|
||||||
/*
|
/*
|
||||||
|
@ -217,6 +226,7 @@ Datum unite_garray(PG_FUNCTION_ARGS)
|
||||||
geos_result = g2;
|
geos_result = g2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GEOSSetSRID(geos_result, SRID);
|
||||||
result = GEOS2POSTGIS(geos_result, is3d);
|
result = GEOS2POSTGIS(geos_result, is3d);
|
||||||
GEOSdeleteGeometry(geos_result);
|
GEOSdeleteGeometry(geos_result);
|
||||||
if ( result == NULL )
|
if ( result == NULL )
|
||||||
|
@ -239,6 +249,7 @@ Datum geomunion(PG_FUNCTION_ARGS)
|
||||||
PG_LWGEOM *geom1;
|
PG_LWGEOM *geom1;
|
||||||
PG_LWGEOM *geom2;
|
PG_LWGEOM *geom2;
|
||||||
int is3d;
|
int is3d;
|
||||||
|
int SRID;
|
||||||
Geometry *g1,*g2,*g3;
|
Geometry *g1,*g2,*g3;
|
||||||
PG_LWGEOM *result;
|
PG_LWGEOM *result;
|
||||||
|
|
||||||
|
@ -252,6 +263,13 @@ Datum geomunion(PG_FUNCTION_ARGS)
|
||||||
is3d = ( TYPE_NDIMS(geom1->type) > 2 ) ||
|
is3d = ( TYPE_NDIMS(geom1->type) > 2 ) ||
|
||||||
( TYPE_NDIMS(geom2->type) > 2 );
|
( TYPE_NDIMS(geom2->type) > 2 );
|
||||||
|
|
||||||
|
SRID = lwgeom_getSRID(geom1);
|
||||||
|
if ( SRID != lwgeom_getSRID(geom2) )
|
||||||
|
{
|
||||||
|
elog(ERROR, "Operation on two geometries with different SRIDs");
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
initGEOS(MAXIMUM_ALIGNOF);
|
initGEOS(MAXIMUM_ALIGNOF);
|
||||||
//elog(NOTICE,"in geomunion");
|
//elog(NOTICE,"in geomunion");
|
||||||
|
|
||||||
|
@ -295,6 +313,9 @@ Datum geomunion(PG_FUNCTION_ARGS)
|
||||||
PG_RETURN_NULL(); //never get here
|
PG_RETURN_NULL(); //never get here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GEOSSetSRID(g3, SRID);
|
||||||
|
|
||||||
//elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
//elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
|
@ -333,6 +354,7 @@ Datum symdifference(PG_FUNCTION_ARGS)
|
||||||
Geometry *g1,*g2,*g3;
|
Geometry *g1,*g2,*g3;
|
||||||
PG_LWGEOM *result;
|
PG_LWGEOM *result;
|
||||||
int is3d;
|
int is3d;
|
||||||
|
int SRID;
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_QRUN);
|
profstart(PROF_QRUN);
|
||||||
|
@ -344,6 +366,13 @@ Datum symdifference(PG_FUNCTION_ARGS)
|
||||||
is3d = ( TYPE_NDIMS(geom1->type) > 2 ) ||
|
is3d = ( TYPE_NDIMS(geom1->type) > 2 ) ||
|
||||||
( TYPE_NDIMS(geom2->type) > 2 );
|
( TYPE_NDIMS(geom2->type) > 2 );
|
||||||
|
|
||||||
|
SRID = lwgeom_getSRID(geom1);
|
||||||
|
if ( SRID != lwgeom_getSRID(geom2) )
|
||||||
|
{
|
||||||
|
elog(ERROR, "Operation on two geometries with different SRIDs");
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
initGEOS(MAXIMUM_ALIGNOF);
|
initGEOS(MAXIMUM_ALIGNOF);
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
|
@ -379,6 +408,7 @@ Datum symdifference(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
||||||
|
|
||||||
|
GEOSSetSRID(g3, SRID);
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_G2P);
|
profstart(PROF_G2P);
|
||||||
|
@ -418,6 +448,7 @@ Datum boundary(PG_FUNCTION_ARGS)
|
||||||
PG_LWGEOM *geom1;
|
PG_LWGEOM *geom1;
|
||||||
Geometry *g1,*g3;
|
Geometry *g1,*g3;
|
||||||
PG_LWGEOM *result;
|
PG_LWGEOM *result;
|
||||||
|
int SRID;
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_QRUN);
|
profstart(PROF_QRUN);
|
||||||
|
@ -425,6 +456,8 @@ Datum boundary(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
geom1 = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
|
geom1 = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
|
||||||
|
|
||||||
|
SRID = lwgeom_getSRID(geom1);
|
||||||
|
|
||||||
initGEOS(MAXIMUM_ALIGNOF);
|
initGEOS(MAXIMUM_ALIGNOF);
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
|
@ -452,6 +485,8 @@ Datum boundary(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
||||||
|
|
||||||
|
GEOSSetSRID(g3, SRID);
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_G2P);
|
profstart(PROF_G2P);
|
||||||
#endif
|
#endif
|
||||||
|
@ -487,22 +522,24 @@ Datum boundary(PG_FUNCTION_ARGS)
|
||||||
PG_FUNCTION_INFO_V1(convexhull);
|
PG_FUNCTION_INFO_V1(convexhull);
|
||||||
Datum convexhull(PG_FUNCTION_ARGS)
|
Datum convexhull(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
PG_LWGEOM *geom1;
|
PG_LWGEOM *geom1;
|
||||||
Geometry *g1,*g3;
|
Geometry *g1, *g3;
|
||||||
PG_LWGEOM *result;
|
PG_LWGEOM *result;
|
||||||
|
int SRID;
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_QRUN);
|
profstart(PROF_QRUN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
geom1 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
|
geom1 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
|
||||||
|
SRID = lwgeom_getSRID(geom1);
|
||||||
|
|
||||||
initGEOS(MAXIMUM_ALIGNOF);
|
initGEOS(MAXIMUM_ALIGNOF);
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_P2G1);
|
profstart(PROF_P2G1);
|
||||||
#endif
|
#endif
|
||||||
g1 = POSTGIS2GEOS(geom1 );
|
g1 = POSTGIS2GEOS(geom1);
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstop(PROF_P2G1);
|
profstop(PROF_P2G1);
|
||||||
#endif
|
#endif
|
||||||
|
@ -523,8 +560,8 @@ Datum convexhull(PG_FUNCTION_ARGS)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
//elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
||||||
|
GEOSSetSRID(g3, SRID);
|
||||||
result = GEOS2POSTGIS(g3, TYPE_NDIMS(geom1->type) > 2);
|
result = GEOS2POSTGIS(g3, TYPE_NDIMS(geom1->type) > 2);
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
{
|
{
|
||||||
|
@ -533,8 +570,8 @@ Datum convexhull(PG_FUNCTION_ARGS)
|
||||||
elog(ERROR,"GEOS convexhull() threw an error (result postgis geometry formation)!");
|
elog(ERROR,"GEOS convexhull() threw an error (result postgis geometry formation)!");
|
||||||
PG_RETURN_NULL(); //never get here
|
PG_RETURN_NULL(); //never get here
|
||||||
}
|
}
|
||||||
GEOSdeleteGeometry(g1);
|
GEOSdeleteGeometry(g1);
|
||||||
GEOSdeleteGeometry(g3);
|
GEOSdeleteGeometry(g3);
|
||||||
|
|
||||||
|
|
||||||
//compressType(result); // convert multi* to single item if appropriate
|
//compressType(result); // convert multi* to single item if appropriate
|
||||||
|
@ -593,6 +630,8 @@ Datum buffer(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
||||||
|
|
||||||
|
GEOSSetSRID(g3, lwgeom_getSRID(geom1));
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_G2P);
|
profstart(PROF_G2P);
|
||||||
#endif
|
#endif
|
||||||
|
@ -629,6 +668,7 @@ Datum intersection(PG_FUNCTION_ARGS)
|
||||||
Geometry *g1,*g2,*g3;
|
Geometry *g1,*g2,*g3;
|
||||||
PG_LWGEOM *result;
|
PG_LWGEOM *result;
|
||||||
int is3d;
|
int is3d;
|
||||||
|
int SRID;
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_QRUN);
|
profstart(PROF_QRUN);
|
||||||
|
@ -640,6 +680,13 @@ Datum intersection(PG_FUNCTION_ARGS)
|
||||||
is3d = ( TYPE_NDIMS(geom1->type) > 2 ) ||
|
is3d = ( TYPE_NDIMS(geom1->type) > 2 ) ||
|
||||||
( TYPE_NDIMS(geom2->type) > 2 );
|
( TYPE_NDIMS(geom2->type) > 2 );
|
||||||
|
|
||||||
|
SRID = lwgeom_getSRID(geom1);
|
||||||
|
if ( SRID != lwgeom_getSRID(geom2) )
|
||||||
|
{
|
||||||
|
elog(ERROR, "Operation on two geometries with different SRIDs");
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
initGEOS(MAXIMUM_ALIGNOF);
|
initGEOS(MAXIMUM_ALIGNOF);
|
||||||
|
|
||||||
//elog(NOTICE,"intersection() START");
|
//elog(NOTICE,"intersection() START");
|
||||||
|
@ -651,6 +698,7 @@ Datum intersection(PG_FUNCTION_ARGS)
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstop(PROF_P2G1);
|
profstop(PROF_P2G1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_P2G2);
|
profstart(PROF_P2G2);
|
||||||
#endif
|
#endif
|
||||||
|
@ -693,6 +741,7 @@ Datum intersection(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
|
|
||||||
//elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
//elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
||||||
|
GEOSSetSRID(g3, SRID);
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_G2P);
|
profstart(PROF_G2P);
|
||||||
|
@ -736,6 +785,7 @@ Datum difference(PG_FUNCTION_ARGS)
|
||||||
Geometry *g1,*g2,*g3;
|
Geometry *g1,*g2,*g3;
|
||||||
PG_LWGEOM *result;
|
PG_LWGEOM *result;
|
||||||
int is3d;
|
int is3d;
|
||||||
|
int SRID;
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_QRUN);
|
profstart(PROF_QRUN);
|
||||||
|
@ -747,6 +797,13 @@ Datum difference(PG_FUNCTION_ARGS)
|
||||||
is3d = ( TYPE_NDIMS(geom1->type) > 2 ) ||
|
is3d = ( TYPE_NDIMS(geom1->type) > 2 ) ||
|
||||||
( TYPE_NDIMS(geom2->type) > 2 );
|
( TYPE_NDIMS(geom2->type) > 2 );
|
||||||
|
|
||||||
|
SRID = lwgeom_getSRID(geom1);
|
||||||
|
if ( SRID != lwgeom_getSRID(geom2) )
|
||||||
|
{
|
||||||
|
elog(ERROR, "Operation on two geometries with different SRIDs");
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
initGEOS(MAXIMUM_ALIGNOF);
|
initGEOS(MAXIMUM_ALIGNOF);
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
|
@ -782,6 +839,8 @@ Datum difference(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
||||||
|
|
||||||
|
GEOSSetSRID(g3, SRID);
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_G2P);
|
profstart(PROF_G2P);
|
||||||
#endif
|
#endif
|
||||||
|
@ -854,6 +913,7 @@ Datum pointonsurface(PG_FUNCTION_ARGS)
|
||||||
|
|
||||||
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
// elog(NOTICE,"result: %s", GEOSasText(g3) ) ;
|
||||||
|
|
||||||
|
GEOSSetSRID(g3, lwgeom_getSRID(geom1));
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_G2P);
|
profstart(PROF_G2P);
|
||||||
#endif
|
#endif
|
||||||
|
@ -920,6 +980,8 @@ Datum centroid(PG_FUNCTION_ARGS)
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GEOSSetSRID(geosresult, lwgeom_getSRID(geom));
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
profstart(PROF_G2P);
|
profstart(PROF_G2P);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1888,6 +1950,7 @@ lwpoint_from_geometry(Geometry *g, char want3d)
|
||||||
LWPOINT *point;
|
LWPOINT *point;
|
||||||
POINT3D *pts;
|
POINT3D *pts;
|
||||||
size_t ptsize = want3d ? sizeof(POINT3DZ) : sizeof(POINT2D);
|
size_t ptsize = want3d ? sizeof(POINT3DZ) : sizeof(POINT2D);
|
||||||
|
int SRID = GEOSGetSRID(g);
|
||||||
|
|
||||||
#ifdef DEBUG_GEOS2POSTGIS
|
#ifdef DEBUG_GEOS2POSTGIS
|
||||||
elog(NOTICE, "lwpoint_from_geometry: point size %d", ptsize);
|
elog(NOTICE, "lwpoint_from_geometry: point size %d", ptsize);
|
||||||
|
@ -1905,7 +1968,7 @@ lwpoint_from_geometry(Geometry *g, char want3d)
|
||||||
GEOSdeleteChar( (char*) pts);
|
GEOSdeleteChar( (char*) pts);
|
||||||
|
|
||||||
// Construct LWPOINT
|
// Construct LWPOINT
|
||||||
point = lwpoint_construct(-1, NULL, pa);
|
point = lwpoint_construct(SRID, NULL, pa);
|
||||||
|
|
||||||
return point;
|
return point;
|
||||||
}
|
}
|
||||||
|
@ -1920,6 +1983,7 @@ lwline_from_geometry(Geometry *g, char want3d)
|
||||||
POINT3D *pts, *ip, *op;
|
POINT3D *pts, *ip, *op;
|
||||||
int ptsize = want3d ? sizeof(POINT3D) : sizeof(POINT2D);
|
int ptsize = want3d ? sizeof(POINT3D) : sizeof(POINT2D);
|
||||||
int i;
|
int i;
|
||||||
|
int SRID = GEOSGetSRID(g);
|
||||||
|
|
||||||
#ifdef DEBUG_GEOS2POSTGIS
|
#ifdef DEBUG_GEOS2POSTGIS
|
||||||
elog(NOTICE, "lwline_from_geometry: point size %d", ptsize);
|
elog(NOTICE, "lwline_from_geometry: point size %d", ptsize);
|
||||||
|
@ -1945,7 +2009,7 @@ lwline_from_geometry(Geometry *g, char want3d)
|
||||||
GEOSdeleteChar( (char*) pts);
|
GEOSdeleteChar( (char*) pts);
|
||||||
|
|
||||||
// Construct LWPOINT
|
// Construct LWPOINT
|
||||||
line = lwline_construct(-1, NULL, pa);
|
line = lwline_construct(SRID, NULL, pa);
|
||||||
|
|
||||||
return line;
|
return line;
|
||||||
}
|
}
|
||||||
|
@ -1963,6 +2027,7 @@ lwpoly_from_geometry(Geometry *g, char want3d)
|
||||||
POINT3D *pts, *ip, *op;
|
POINT3D *pts, *ip, *op;
|
||||||
int ptoff=0; // point offset inside POINT3D *
|
int ptoff=0; // point offset inside POINT3D *
|
||||||
int ptsize = sizeof(double)*ndims;
|
int ptsize = sizeof(double)*ndims;
|
||||||
|
int SRID = GEOSGetSRID(g);
|
||||||
|
|
||||||
#ifdef DEBUG_GEOS2POSTGIS
|
#ifdef DEBUG_GEOS2POSTGIS
|
||||||
elog(NOTICE, "lwpoly_from_geometry: point size %d", ptsize);
|
elog(NOTICE, "lwpoly_from_geometry: point size %d", ptsize);
|
||||||
|
@ -2011,7 +2076,7 @@ lwpoly_from_geometry(Geometry *g, char want3d)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct LWPOLY
|
// Construct LWPOLY
|
||||||
poly = lwpoly_construct(-1, NULL, nrings+1, rings);
|
poly = lwpoly_construct(SRID, NULL, nrings+1, rings);
|
||||||
|
|
||||||
return poly;
|
return poly;
|
||||||
}
|
}
|
||||||
|
@ -2058,6 +2123,16 @@ LWGEOM *
|
||||||
lwgeom_from_geometry(Geometry *geom, char want3d)
|
lwgeom_from_geometry(Geometry *geom, char want3d)
|
||||||
{
|
{
|
||||||
int type = GEOSGeometryTypeId(geom) ;
|
int type = GEOSGeometryTypeId(geom) ;
|
||||||
|
bool hasZ = GEOSHasZ(geom);
|
||||||
|
|
||||||
|
if ( ! hasZ )
|
||||||
|
{
|
||||||
|
if ( want3d )
|
||||||
|
{
|
||||||
|
//elog(NOTICE, "Geometry has no Z, won't provide one");
|
||||||
|
want3d = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_GEOS2POSTGIS
|
#ifdef DEBUG_GEOS2POSTGIS
|
||||||
lwnotice("lwgeom_from_geometry: it's a %s", lwgeom_typename(type));
|
lwnotice("lwgeom_from_geometry: it's a %s", lwgeom_typename(type));
|
||||||
|
@ -2252,6 +2327,7 @@ Datum GEOS_polygonize_garray(PG_FUNCTION_ARGS)
|
||||||
PG_LWGEOM **geoms, *result;
|
PG_LWGEOM **geoms, *result;
|
||||||
Geometry *geos_result;
|
Geometry *geos_result;
|
||||||
Geometry **vgeoms;
|
Geometry **vgeoms;
|
||||||
|
int SRID;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
static int call=1;
|
static int call=1;
|
||||||
#endif
|
#endif
|
||||||
|
@ -2285,6 +2361,18 @@ Datum GEOS_polygonize_garray(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
//if ( TYPE_NDIMS(geoms[i]->type) > 2 ) is3d = 1;
|
//if ( TYPE_NDIMS(geoms[i]->type) > 2 ) is3d = 1;
|
||||||
vgeoms[i] = POSTGIS2GEOS(geoms[i]);
|
vgeoms[i] = POSTGIS2GEOS(geoms[i]);
|
||||||
|
if ( ! i )
|
||||||
|
{
|
||||||
|
SRID = lwgeom_getSRID(geoms[i]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( SRID != lwgeom_getSRID(geoms[i]) );
|
||||||
|
{
|
||||||
|
elog(ERROR, "polygonize: operation on mixed SRID geometries");
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -2298,6 +2386,7 @@ Datum GEOS_polygonize_garray(PG_FUNCTION_ARGS)
|
||||||
//pfree(vgeoms);
|
//pfree(vgeoms);
|
||||||
if ( ! geos_result ) PG_RETURN_NULL();
|
if ( ! geos_result ) PG_RETURN_NULL();
|
||||||
|
|
||||||
|
GEOSSetSRID(geos_result, SRID);
|
||||||
result = GEOS2POSTGIS(geos_result, is3d);
|
result = GEOS2POSTGIS(geos_result, is3d);
|
||||||
GEOSdeleteGeometry(geos_result);
|
GEOSdeleteGeometry(geos_result);
|
||||||
if ( result == NULL )
|
if ( result == NULL )
|
||||||
|
|
Loading…
Reference in a new issue