]> granicus.if.org Git - postgis/commitdiff
cf #2318, add a optional additional version parameter in ST_ForceSFS, handle both...
authorOlivier Courtin <olivier.courtin@camptocamp.com>
Fri, 10 May 2013 17:17:18 +0000 (17:17 +0000)
committerOlivier Courtin <olivier.courtin@camptocamp.com>
Fri, 10 May 2013 17:17:18 +0000 (17:17 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@11409 b70326c6-7e19-0410-871a-916f4a2858ee

doc/reference_editor.xml
liblwgeom/cunit/cu_force_sfs.c
liblwgeom/liblwgeom.h.in
liblwgeom/lwgeom.c
postgis/lwgeom_functions_basic.c
postgis/postgis.sql.in

index df4dd33c1eb24cf9dbccb8f47c0740da37a43752..63ef413c041eee3f6372de2ddf3cb8ff8487a52a 100644 (file)
@@ -547,6 +547,11 @@ GEOMETRYCOLLECTION(
                        <funcdef>geometry <function>ST_ForceSFS</function></funcdef>
                        <paramdef><type>geometry </type> <parameter>geomA</parameter></paramdef>
                  </funcprototype>
+                 <funcprototype>
+                       <funcdef>geometry <function>ST_ForceSFS</function></funcdef>
+                       <paramdef><type>geometry </type> <parameter>geomA</parameter></paramdef>
+                       <paramdef><type>text </type> <parameter>version</parameter></paramdef>
+                 </funcprototype>
                </funcsynopsis>
          </refsynopsisdiv>
 
index 40e940584395406ddb68edc8338aa70f8944e50c..defdfdfe4bbde0062f2d4614b9ec906306dcb279 100644 (file)
@@ -24,7 +24,7 @@ static void do_geom_test(char * in, char * out)
        char *tmp;
 
        g = lwgeom_from_wkt(in, LW_PARSER_CHECK_NONE);
-       h = lwgeom_force_sfs(g);
+       h = lwgeom_force_sfs(g, 110);
        tmp = lwgeom_to_ewkt(h);
        if (strcmp(tmp, out))
                fprintf(stderr, "\nIn:   %s\nOut:  %s\nExp:  %s\n",
@@ -40,7 +40,7 @@ static void do_type_test(char * in, int type)
        LWGEOM *g, *h;
 
        g = lwgeom_from_wkt(in, LW_PARSER_CHECK_NONE);
-       h = lwgeom_force_sfs(g);
+       h = lwgeom_force_sfs(g, 110);
        if(h->type != type)
                fprintf(stderr, "\nIn:   %s\nOut:  %s\nExp:  %s\n", 
                        in, lwtype_name(h->type), lwtype_name(type));
index 886f6324698fd95136deef68d26f879880b22005..3fb60eebecfa3f77a23b928932aaa25965a1c334 100644 (file)
@@ -877,7 +877,7 @@ extern LWGEOM* lwgeom_simplify(const LWGEOM *igeom, double dist);
  * Force to use SFS 1.1 geometry type
  * (rather than SFS 1.2 and/or SQL/MM)
  */
-extern LWGEOM* lwgeom_force_sfs(LWGEOM *geom);
+extern LWGEOM* lwgeom_force_sfs(LWGEOM *geom, int version);
 
 
 /*--------------------------------------------------------
index 79ae7458f964655e12e7e1104ca8d349aa274d19..0bff0198dcba5d95ea1639554222daa53c0a4595 100644 (file)
@@ -706,13 +706,39 @@ lwgeom_force_dims(const LWGEOM *geom, int hasz, int hasm)
 }
 
 LWGEOM*
-lwgeom_force_sfs(LWGEOM *geom)
+lwgeom_force_sfs(LWGEOM *geom, int version)
 {      
        LWCOLLECTION *col;
        int i;
        LWGEOM *g;
 
+       /* SFS 1.2 version */
+       if (version == 120)
+       {
+               switch(geom->type)
+               {
+                       /* SQL/MM types */
+                       case CIRCSTRINGTYPE:
+                       case COMPOUNDTYPE:
+                       case CURVEPOLYTYPE:
+                       case MULTICURVETYPE:
+                       case MULTISURFACETYPE:
+                               return lwgeom_segmentize(geom, 32);
+
+                       case COLLECTIONTYPE:
+                               col = (LWCOLLECTION*)geom;
+                               for ( i = 0; i < col->ngeoms; i++ ) 
+                                       col->geoms[i] = lwgeom_force_sfs((LWGEOM*)col->geoms[i], version);
+
+                               return lwcollection_as_lwgeom((LWCOLLECTION*)geom);
+
+                       default:
+                               return (LWGEOM *)geom;
+               }
+       }
+       
 
+       /* SFS 1.1 version */
        switch(geom->type)
        {
                /* SQL/MM types */
@@ -748,7 +774,7 @@ lwgeom_force_sfs(LWGEOM *geom)
                case COLLECTIONTYPE:
                        col = (LWCOLLECTION*)geom;
                        for ( i = 0; i < col->ngeoms; i++ ) 
-                               col->geoms[i] = lwgeom_force_sfs((LWGEOM*)col->geoms[i]);
+                               col->geoms[i] = lwgeom_force_sfs((LWGEOM*)col->geoms[i], version);
 
                        return lwcollection_as_lwgeom((LWCOLLECTION*)geom);
                
index a2f4a636d8485e9322f5d1933fcead323ce1c779..a9de2a1f62db634cd68a5bd2a97d8d947630a7dc 100644 (file)
@@ -517,11 +517,24 @@ Datum LWGEOM_force_sfs(PG_FUNCTION_ARGS)
        GSERIALIZED *result;
        LWGEOM *lwgeom;
        LWGEOM *ogeom;
+       text * ver;
+       int version = 110; /* default version is SFS 1.1 */
 
        POSTGIS_DEBUG(2, "LWGEOM_force_sfs called");
 
+        /* If user specified version, respect it */
+        if ( (PG_NARGS()>1) && (!PG_ARGISNULL(1)) )
+        {
+                ver = PG_GETARG_TEXT_P(1);
+
+                if  ( ! strncmp(VARDATA(ver), "1.2", 3))
+                {
+                        version = 120;
+                }
+        }
+
        lwgeom = lwgeom_from_gserialized(geom);
-       ogeom = lwgeom_force_sfs(lwgeom);
+       ogeom = lwgeom_force_sfs(lwgeom, version);
 
        result = geometry_serialize(ogeom);
 
index 415d087ef71432f601366d9114ae8e0cbb83fae9..06313e3d4edaca92065cb2d6cb9e8f4e0fb49a14 100644 (file)
@@ -1283,6 +1283,12 @@ CREATE OR REPLACE FUNCTION ST_ForceSFS(geometry)
        AS 'MODULE_PATHNAME', 'LWGEOM_force_sfs'
        LANGUAGE 'c' IMMUTABLE STRICT;
 
+-- Availability: 2.1.0
+CREATE OR REPLACE FUNCTION ST_ForceSFS(geometry, version text)
+       RETURNS geometry
+       AS 'MODULE_PATHNAME', 'LWGEOM_force_sfs'
+       LANGUAGE 'c' IMMUTABLE STRICT;
+
 -- Availability: 1.2.2
 CREATE OR REPLACE FUNCTION ST_Expand(box3d,float8)
        RETURNS box3d