]> granicus.if.org Git - postgis/commitdiff
GeomFromWKB() and GeometryFromText() issue a warning if provided formats
authorSandro Santilli <strk@keybit.net>
Wed, 22 Dec 2004 10:32:27 +0000 (10:32 +0000)
committerSandro Santilli <strk@keybit.net>
Wed, 22 Dec 2004 10:32:27 +0000 (10:32 +0000)
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

lwgeom/lwgeom_functions_basic.c
lwgeom/lwgeom_ogc.c
lwgeom/lwpostgis.sql.in

index b8c24d62e291809d8442d6c1b2ce7137f41eaafd..2a24c169d1e58e2208719cff34b126d1e9e5ae6e 100644 (file)
@@ -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;
index 1314eb79d68f490dca4dd564ab348e15dd9adfab..34d9a7f5bd976973fcfb61ce55b92bdbbc508f76 100644 (file)
@@ -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)
index 5f48a1da8b4ff702da1ff932d10984dd196854d3..6ed5cab2bdd29a695caeb602644638c971ec317b 100644 (file)
@@ -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
 ------------------------------------------------------------------------