From: Sandro Santilli Date: Wed, 22 Dec 2004 10:32:27 +0000 (+0000) Subject: GeomFromWKB() and GeometryFromText() issue a warning if provided formats X-Git-Tag: pgis_1_0_0RC1~127 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4d962ce2f592842e773a71a8ae9cf9776842c4b1;p=postgis GeomFromWKB() and GeometryFromText() issue a warning if provided formats are not OGC-strict. Introduced GeomFromEWKT() and GeomFromEWKB() for extended formats. git-svn-id: http://svn.osgeo.org/postgis/trunk@1177 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/lwgeom/lwgeom_functions_basic.c b/lwgeom/lwgeom_functions_basic.c index b8c24d62e..2a24c169d 100644 --- a/lwgeom/lwgeom_functions_basic.c +++ b/lwgeom/lwgeom_functions_basic.c @@ -13,6 +13,7 @@ #include "liblwgeom.h" #include "lwgeom_pg.h" #include "profile.h" +#include "wktparse.h" //#define DEBUG 1 @@ -51,6 +52,7 @@ Datum LWGEOM_makeline_garray(PG_FUNCTION_ARGS); Datum LWGEOM_makeline(PG_FUNCTION_ARGS); Datum LWGEOM_line_from_mpoint(PG_FUNCTION_ARGS); Datum LWGEOM_addpoint(PG_FUNCTION_ARGS); +Datum LWGEOM_asEWKT(PG_FUNCTION_ARGS); /*------------------------------------------------------------------*/ @@ -2547,7 +2549,6 @@ PG_FUNCTION_INFO_V1(LWGEOM_asEWKT); Datum LWGEOM_asEWKT(PG_FUNCTION_ARGS) { PG_LWGEOM *lwgeom; - PG_LWGEOM *ogclwgeom; char *result_cstring; int len; char *result,*loc_wkt; diff --git a/lwgeom/lwgeom_ogc.c b/lwgeom/lwgeom_ogc.c index 1314eb79d..34d9a7f5b 100644 --- a/lwgeom/lwgeom_ogc.c +++ b/lwgeom/lwgeom_ogc.c @@ -59,6 +59,8 @@ Datum LWGEOM_asText(PG_FUNCTION_ARGS); Datum LWGEOM_asBinary(PG_FUNCTION_ARGS); // ---- GeometryFromText(text, integer) Datum LWGEOM_from_text(PG_FUNCTION_ARGS); +// ---- GeomFromWKB(bytea, integer) +Datum LWGEOM_from_WKB(PG_FUNCTION_ARGS); // ---- IsClosed(geometry) Datum LWGEOM_isclosed_linestring(PG_FUNCTION_ARGS); @@ -716,6 +718,43 @@ Datum LWGEOM_from_text(PG_FUNCTION_ARGS) int32 SRID; PG_LWGEOM *result = NULL; + if ( lwgeom_getSRID(geom) != -1 || TYPE_GETZM(geom->type) != 0 ) + { + elog(WARNING, "OGC WKT expected, EWKT provided - use GeomFromEWKT() for this"); + } + + // read user-requested SRID if any + if ( PG_NARGS() > 1 ) + { + SRID = PG_GETARG_INT32(1); + if ( SRID != lwgeom_getSRID(geom) ) + { + result = lwgeom_setSRID(geom, SRID); + pfree(geom); + } + } + if ( ! result ) result = geom; + + PG_RETURN_POINTER(result); +} + +//given wkb and SRID, return a geometry +PG_FUNCTION_INFO_V1(LWGEOM_from_WKB); +Datum LWGEOM_from_WKB(PG_FUNCTION_ARGS) +{ + PG_LWGEOM *geom; + int32 SRID; + PG_LWGEOM *result = NULL; + + geom = (PG_LWGEOM *)DatumGetPointer(DirectFunctionCall1( + LWGEOMFromWKB, PG_GETARG_DATUM(0))); + + if ( lwgeom_getSRID(geom) != -1 || TYPE_GETZM(geom->type) != 0 ) + { + elog(WARNING, "OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this"); + } + + // read user-requested SRID if any if ( PG_NARGS() > 1 ) { @@ -726,10 +765,12 @@ Datum LWGEOM_from_text(PG_FUNCTION_ARGS) pfree(geom); } } + if ( ! result ) result = geom; PG_RETURN_POINTER(result); } + //convert LWGEOM to wkt (in TEXT format) PG_FUNCTION_INFO_V1(LWGEOM_asText); Datum LWGEOM_asText(PG_FUNCTION_ARGS) diff --git a/lwgeom/lwpostgis.sql.in b/lwgeom/lwpostgis.sql.in index 5f48a1da8..6ed5cab2b 100644 --- a/lwgeom/lwpostgis.sql.in +++ b/lwgeom/lwpostgis.sql.in @@ -1289,7 +1289,7 @@ ELSE NULL END CREATEFUNCTION GeomFromWKB(bytea) RETURNS geometry - AS '@MODULE_FILENAME@','LWGEOMFromWKB' + AS '@MODULE_FILENAME@','LWGEOM_from_WKB' LANGUAGE 'C' WITH (isstrict,iscachable); CREATEFUNCTION GeomFromWKB(bytea, int) @@ -1718,6 +1718,16 @@ CREATEFUNCTION AsEWKB(geometry,text) AS '@MODULE_FILENAME@','WKBFromLWGEOM' LANGUAGE 'C' WITH (isstrict,iscachable); +CREATEFUNCTION GeomFromEWKB(bytea) + RETURNS geometry + AS '@MODULE_FILENAME@','LWGEOMFromWKB' + LANGUAGE 'C' WITH (isstrict,iscachable); + +CREATEFUNCTION GeomFromEWKT(text) + RETURNS geometry + AS '@MODULE_FILENAME@','parse_WKT_lwgeom' + LANGUAGE 'C' WITH (isstrict,iscachable); + ------------------------------------------------------------------------ -- CONSTRUCTORS ------------------------------------------------------------------------