]> granicus.if.org Git - postgis/commitdiff
Add an srid default value as second optional parameter for ST_GeomFromGML. Related...
authorOlivier Courtin <olivier.courtin@camptocamp.com>
Fri, 29 Apr 2011 17:44:00 +0000 (17:44 +0000)
committerOlivier Courtin <olivier.courtin@camptocamp.com>
Fri, 29 Apr 2011 17:44:00 +0000 (17:44 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@7071 b70326c6-7e19-0410-871a-916f4a2858ee

doc/reference_constructor.xml
postgis/lwgeom_in_gml.c
postgis/postgis.sql.in.c
regress/in_gml.sql

index a794792004677a3a7ceaf813b4bdcb0945090f94..9fdc3a36ed95b123f8ca3b3979675d6fc82d6607 100644 (file)
@@ -452,6 +452,11 @@ SELECT ST_GeomFromEWKT('POLYHEDRALSURFACE(
                        <funcdef>geometry <function>ST_GeomFromGML</function></funcdef>
                        <paramdef><type>text </type> <parameter>geomgml</parameter></paramdef>
                  </funcprototype>
+                 <funcprototype>
+                       <funcdef>geometry <function>ST_GeomFromGML</function></funcdef>
+                       <paramdef><type>text </type> <parameter>geomgml</parameter></paramdef>
+                       <paramdef><type>integer </type> <parameter>srid</parameter></paramdef>
+                 </funcprototype>
                </funcsynopsis>
          </refsynopsisdiv>
 
@@ -477,6 +482,7 @@ SELECT ST_GeomFromEWKT('POLYHEDRALSURFACE(
 
                <para>Availability: 1.5</para>
                <para>Enhanced: 2.0.0 support for Polyhedral surfaces and TIN was introduced.</para>
+               <para>Enhanced: 2.0.0 default srid optional parameter added.</para>
                <para>&Z_support;</para>
                <para>&P_support;</para>
                <para>&T_support;</para>
@@ -639,12 +645,19 @@ SELECT ST_GeomFromEWKT('POLYHEDRALSURFACE(
                                <funcdef>geometry <function>ST_GMLToSQL</function></funcdef>
                                <paramdef><type>text </type> <parameter>geomgml</parameter></paramdef>
                        </funcprototype>
+                       <funcprototype>
+                               <funcdef>geometry <function>ST_GMLToSQL</function></funcdef>
+                               <paramdef><type>text </type> <parameter>geomgml</parameter></paramdef>
+                               <paramdef><type>integer </type> <parameter>srid</parameter></paramdef>
+                       </funcprototype>
                        </funcsynopsis>
                </refsynopsisdiv>
                  <refsection>
                        <title>Description</title>
                        <para>&sqlmm_compliant; SQL-MM 3: 5.1.50 (except for curves support).</para>
                        <para>Availability: 1.5</para>
+                       <para>Enhanced: 2.0.0 support for Polyhedral surfaces and TIN was introduced.</para>
+                       <para>Enhanced: 2.0.0 default srid optional parameter added.</para>
                  </refsection>
                  <refsection>
                        <title>See Also</title>
index 91e995b3eae60ec87e46830db09c9d8c86cab9f8..2924974a0791669f38af4dfc76c52af2ffcbeda0 100644 (file)
@@ -81,8 +81,8 @@ Datum geom_from_gml(PG_FUNCTION_ARGS)
        LWGEOM *lwgeom;
        int xml_size;
        char *xml;
+       int root_srid;
        bool hasz=true;
-       int root_srid=0;
        xmlNodePtr xmlroot=NULL;
 
 
@@ -92,6 +92,8 @@ Datum geom_from_gml(PG_FUNCTION_ARGS)
        xml = text2cstring(xml_input);
        xml_size = VARSIZE(xml_input) - VARHDRSZ;
 
+       root_srid = PG_GETARG_INT32(1);
+
        /* Begin to Parse XML doc */
        xmlInitParser();
        xmldoc = xmlParseMemory(xml, xml_size);
@@ -102,8 +104,10 @@ Datum geom_from_gml(PG_FUNCTION_ARGS)
                lwerror("invalid GML representation");
        }
 
+
        lwgeom = parse_gml(xmlroot, &hasz, &root_srid);
        lwgeom_add_bbox(lwgeom);
+        if (root_srid && lwgeom->srid == -1) lwgeom->srid = root_srid;
 
        xmlFreeDoc(xmldoc);
        xmlCleanupParser();
@@ -303,8 +307,8 @@ static POINTARRAY* gml_reproject_pa(POINTARRAY *pa, int srid_in, int srid_out)
        projPJ in_pj, out_pj;
        char *text_in, *text_out;
 
-       if (srid_in == -1 || srid_out == -1)
-               lwerror("invalid GML representation");
+       if (srid_in == 0 || srid_in == -1) return pa; /* nothing to do */
+       if (srid_out == 0 || srid_out == -1) lwerror("invalid GML representation");
 
        text_in = GetProj4StringSPI(srid_in);
        text_out = GetProj4StringSPI(srid_out);
@@ -428,11 +432,6 @@ static gmlSrs* parse_gml_srs(xmlNodePtr xnode)
                sep = '#';
                latlon = false;
        }
-       else if (!strncmp((char *) srsname, "http://www.epsg.org/", 20))
-       {
-               sep = '/';
-               latlon = false;
-       }
        else lwerror("unknown spatial reference system");
 
        /* retrieve the last ':' or '#' char */
@@ -1123,6 +1122,45 @@ static LWGEOM* parse_gml_curve(xmlNodePtr xnode, bool *hasz, int *root_srid)
 }
 
 
+/**
+ * Parse GML LinearRing (3.1.1)
+ */
+static LWGEOM* parse_gml_linearring(xmlNodePtr xnode, bool *hasz, int *root_srid)
+{
+       gmlSrs *srs;
+       LWGEOM *geom;
+       POINTARRAY **ppa = NULL;
+
+       if (is_xlink(xnode)) xnode = get_xlink_node(xnode);
+       srs = parse_gml_srs(xnode);
+
+       ppa = (POINTARRAY**) lwalloc(sizeof(POINTARRAY*));
+       ppa[0] = parse_gml_data(xnode->children, hasz, root_srid);
+
+       if (ppa[0]->npoints < 4
+            || (!*hasz && !ptarray_isclosed2d(ppa[0]))
+            ||  (*hasz && !ptarray_isclosed3d(ppa[0])))
+           lwerror("invalid GML representation");
+
+       if (srs->reverse_axis) ppa[0] = ptarray_flip_coordinates(ppa[0]);
+       
+
+       if (!*root_srid)
+       {
+               *root_srid = srs->srid;
+               geom = (LWGEOM *) lwpoly_construct(*root_srid, NULL, 1, ppa);
+       }
+       else
+       {
+               if (srs->srid != *root_srid) gml_reproject_pa(ppa[0], srs->srid, *root_srid);
+               geom = (LWGEOM *) lwpoly_construct(-1, NULL, 1, ppa);
+       }
+       lwfree(srs);
+
+       return geom;
+}
+
+
 /**
  * Parse GML Polygon (2.1.2, 3.1.1)
  */
@@ -1812,6 +1850,9 @@ static LWGEOM* parse_gml(xmlNodePtr xnode, bool *hasz, int *root_srid)
        if (!strcmp((char *) xa->name, "Curve"))
                return parse_gml_curve(xa, hasz, root_srid);
 
+       if (!strcmp((char *) xa->name, "LinearRing"))
+               return parse_gml_linearring(xa, hasz, root_srid);
+
        if (!strcmp((char *) xa->name, "Polygon"))
                return parse_gml_polygon(xa, hasz, root_srid);
 
index bddaa24caa93175589f2dcae0f485d811b99dcca..20c4663ff91e28d6401bcbc6aaf7d290a2dfa9e1 100644 (file)
@@ -3741,18 +3741,37 @@ CREATE OR REPLACE FUNCTION ST_Equals(geometry,geometry)
 \r
 -----------------------------------------------------------------------\r
 -- GML & KML INPUT\r
--- Availability: 1.5.0\r
 -----------------------------------------------------------------------\r
+CREATE OR REPLACE FUNCTION _ST_GeomFromGML(text, int4)\r
+        RETURNS geometry\r
+        AS 'MODULE_PATHNAME','geom_from_gml'\r
+        LANGUAGE 'C' IMMUTABLE;\r
+\r
+-- Availability: 2.0.0\r
+CREATE OR REPLACE FUNCTION ST_GeomFromGML(text, int4)\r
+        RETURNS geometry\r
+        AS 'MODULE_PATHNAME','geom_from_gml'\r
+        LANGUAGE 'C' IMMUTABLE STRICT;\r
+\r
+-- Availability: 1.5.0\r
 CREATE OR REPLACE FUNCTION ST_GeomFromGML(text)\r
-       RETURNS geometry\r
-       AS 'MODULE_PATHNAME','geom_from_gml'\r
-       LANGUAGE 'C' IMMUTABLE STRICT;\r
+        RETURNS geometry\r
+        AS 'SELECT _ST_GeomFromGML($1, 0)'\r
+        LANGUAGE 'SQL' IMMUTABLE STRICT;\r
 \r
+-- Availability: 1.5.0\r
 CREATE OR REPLACE FUNCTION ST_GMLToSQL(text)\r
-       RETURNS geometry\r
-       AS 'MODULE_PATHNAME','geom_from_gml'\r
-       LANGUAGE 'C' IMMUTABLE STRICT;\r
+        RETURNS geometry\r
+        AS 'SELECT _ST_GeomFromGML($1, 0)'\r
+        LANGUAGE 'SQL' IMMUTABLE STRICT;\r
 \r
+-- Availability: 2.0.0\r
+CREATE OR REPLACE FUNCTION ST_GMLToSQL(text, int4)\r
+        RETURNS geometry\r
+        AS 'MODULE_PATHNAME','geom_from_gml'\r
+        LANGUAGE 'C' IMMUTABLE STRICT;\r
+\r
+-- Availability: 1.5.0\r
 CREATE OR REPLACE FUNCTION ST_GeomFromKML(text)\r
        RETURNS geometry\r
        AS 'MODULE_PATHNAME','geom_from_kml'\r
index e7db24df0dd4ee7df7001a4edb7700dcc6f9348c..7f22bb1ce80dc1e97aa860e712b87ab6a2311a05 100644 (file)
@@ -603,7 +603,9 @@ SELECT 'srs_4', ST_AsEWKT(ST_GeomFromGML('<gml:Point srsName="urn:ogc:def:crs:EP
 SELECT 'srs_5', ST_AsEWKT(ST_GeomFromGML('<gml:Point srsName="urn:ogc:def:crs:EPSG:6.6:4326"><gml:pos>1 2</gml:pos></gml:Point>'));
 SELECT 'srs_6', ST_AsEWKT(ST_GeomFromGML('<gml:Point srsName="urn:x-ogc:def:crs:EPSG:6.6:4326"><gml:pos>1 2</gml:pos></gml:Point>'));
 SELECT 'srs_7', ST_AsEWKT(ST_GeomFromGML('<gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326"><gml:pos>1 2</gml:pos></gml:Point>'));
-SELECT 'srs_8', ST_AsEWKT(ST_GeomFromGML('<gml:Point srsName="http://www.epsg.org/6.11.2/4326"><gml:pos>1 2</gml:pos></gml:Point>'));
+
+-- Use default srsName
+SELECT 'srs_8', ST_AsEWKT(ST_GeomFromGML('<gml:Point><gml:pos>1 2</gml:pos></gml:Point>', 4326));
 
 -- ERROR not a valid pattern
 SELECT 'srs_9', ST_AsEWKT(ST_GeomFromGML('<gml:Point srsName="a:wrong:pattern:4326"><gml:pos>1 2</gml:pos></gml:Point>'));