<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>
<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>
<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>
LWGEOM *lwgeom;
int xml_size;
char *xml;
+ int root_srid;
bool hasz=true;
- int root_srid=0;
xmlNodePtr xmlroot=NULL;
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);
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();
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);
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 */
}
+/**
+ * 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)
*/
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);
\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
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>'));