<paramdef><type>integer </type> <parameter>precision</parameter></paramdef>
<paramdef><type>integer </type> <parameter>options</parameter></paramdef>
</funcprototype>
+ <funcprototype>
+ <funcdef>text <function>ST_AsGML</function></funcdef>
+ <paramdef><type>integer </type> <parameter>version</parameter></paramdef>
+ <paramdef><type>geometry </type> <parameter>g1</parameter></paramdef>
+ <paramdef><type>integer </type> <parameter>precision</parameter></paramdef>
+ <paramdef><type>integer </type> <parameter>options</parameter></paramdef>
+ <paramdef><type>text </type> <parameter>prefix</parameter></paramdef>
+ </funcprototype>
</funcsynopsis>
</refsynopsisdiv>
<para>Return the geometry as a Geography Markup Language (GML) element. The version parameter,
if specified, may be either 2 or 3. If no version parameter is
- specified then the default is assumed to be 2. The third argument
+ specified then the default is assumed to be 2. The precision argument
may be used to reduce the maximum number of decimal places
used in output (defaults to 15).</para>
<para>GML 2 refer to 2.1.2 version, GML 3 to 3.1.1 version</para>
- <para>The last 'options' argument is a bitfield. It could be used to define CRS output type
+ <para>The 'options' argument is a bitfield. It could be used to define CRS output type
in GML output, and to declare data as lat/lon:
<itemizedlist>
<listitem>
</itemizedlist>
</para>
+ <para>The 'prefix' argument may be used to specify a custom
+namespace prefix or no prefix (if empty). If null or omitted 'gml' prefix is used</para>
+
<!-- TODO: Itemize defaults for each function -->
<note>
<para>Availability: 1.3.2</para>
<para>Availability: 1.5.0 geography support was introduced.</para>
+ <para>Availability: 2.0.0 prefix support was introduced.</para>
</note>
<para>&Z_support;</para>
int option = 0;
int is_deegree = 0;
int precision = OUT_MAX_DOUBLE_PRECISION;
- const char* prefix = "gml:"; /* default prefix */
+ static const char* default_prefix = "gml:"; /* default prefix */
+ char *prefixbuf;
+ const char* prefix = default_prefix;
+ text *prefix_text;
/* Get the version */
version = PG_GETARG_INT32(0);
if (PG_NARGS() >3 && !PG_ARGISNULL(3))
option = PG_GETARG_INT32(3);
+ /* retrieve prefix */
+ if (PG_NARGS() >4 && !PG_ARGISNULL(4))
+ {
+ prefix_text = PG_GETARG_TEXT_P(4);
+ if ( VARSIZE(prefix_text)-VARHDRSZ == 0 )
+ {
+ prefix = "";
+ }
+ else
+ {
+ /* +2 is one for the ':' and one for term null */
+ prefixbuf = palloc(VARSIZE(prefix_text)-VARHDRSZ+2);
+ memcpy(prefixbuf, VARDATA(prefix_text),
+ VARSIZE(prefix_text)-VARHDRSZ);
+ /* add colon and null terminate */
+ prefixbuf[VARSIZE(prefix_text)-VARHDRSZ] = ':';
+ prefixbuf[VARSIZE(prefix_text)-VARHDRSZ+1] = '\0';
+ prefix = prefixbuf;
+ }
+ }
+
SRID = lwgeom_getsrid(SERIALIZED_FORM(geom));
if (SRID == -1) srs = NULL;
else if (option & 1) srs = getSRSbySRID(SRID, false);
-----------------------------------------------------------------------
-- GML OUTPUT
-----------------------------------------------------------------------
--- _ST_AsGML(version, geom, precision, option)
-CREATE OR REPLACE FUNCTION _ST_AsGML(int4, geometry, int4, int4)
+-- _ST_AsGML(version, geom, precision, option, prefix)
+CREATE OR REPLACE FUNCTION _ST_AsGML(int4, geometry, int4, int4, text)
RETURNS TEXT
AS 'MODULE_PATHNAME','LWGEOM_asGML'
- LANGUAGE 'C' IMMUTABLE STRICT;
+ LANGUAGE 'C' IMMUTABLE;
-- AsGML(geom, precision) / version=2
-- Deprecation in 1.2.3
CREATE OR REPLACE FUNCTION AsGML(geometry, int4)
RETURNS TEXT
- AS 'SELECT _ST_AsGML(2, $1, $2, 0)'
+ AS 'SELECT _ST_AsGML(2, $1, $2, 0, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- Availability: 1.2.2
CREATE OR REPLACE FUNCTION ST_AsGML(geometry, int4)
RETURNS TEXT
- AS 'SELECT _ST_AsGML(2, $1, $2, 0)'
+ AS 'SELECT _ST_AsGML(2, $1, $2, 0, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- AsGML(geom) / precision=15 version=2
-- Deprecation in 1.2.3
CREATE OR REPLACE FUNCTION AsGML(geometry)
RETURNS TEXT
- AS 'SELECT _ST_AsGML(2, $1, 15, 0)'
+ AS 'SELECT _ST_AsGML(2, $1, 15, 0, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- Availability: 1.2.2
CREATE OR REPLACE FUNCTION ST_AsGML(geometry)
RETURNS TEXT
- AS 'SELECT _ST_AsGML(2, $1, 15, 0)'
+ AS 'SELECT _ST_AsGML(2, $1, 15, 0, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
--- ST_AsGML(version, geom) / precision=15 version=2
+-- ST_AsGML(version, geom) / precision=15
-- Availability: 1.3.2
CREATE OR REPLACE FUNCTION ST_AsGML(int4, geometry)
RETURNS TEXT
- AS 'SELECT _ST_AsGML($1, $2, 15, 0)'
+ AS 'SELECT _ST_AsGML($1, $2, 15, 0, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- ST_AsGML(version, geom, precision)
-- Availability: 1.3.2
CREATE OR REPLACE FUNCTION ST_AsGML(int4, geometry, int4)
RETURNS TEXT
- AS 'SELECT _ST_AsGML($1, $2, $3, 0)'
+ AS 'SELECT _ST_AsGML($1, $2, $3, 0, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- ST_AsGML (geom, precision, option) / version=2
-- Availability: 1.4.0
CREATE OR REPLACE FUNCTION ST_AsGML(geometry, int4, int4)
RETURNS TEXT
- AS 'SELECT _ST_AsGML(2, $1, $2, $3)'
+ AS 'SELECT _ST_AsGML(2, $1, $2, $3, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- ST_AsGML(version, geom, precision, option)
-- Availability: 1.4.0
CREATE OR REPLACE FUNCTION ST_AsGML(int4, geometry, int4, int4)
RETURNS TEXT
- AS 'SELECT _ST_AsGML($1, $2, $3, $4)'
+ AS 'SELECT _ST_AsGML($1, $2, $3, $4, null)'
+ LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+
+-- ST_AsGML(version, geom, precision, option, prefix)
+-- Availability: 2.0.0
+CREATE OR REPLACE FUNCTION ST_AsGML(int4, geometry, int4, int4, text)
+ RETURNS TEXT
+ AS 'SELECT _ST_AsGML($1, $2, $3, $4, $5)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-----------------------------------------------------------------------
SELECT 'gml_deegree_05', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16);
SELECT 'gml_deegree_06', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16);
+-- Prefix
+SELECT 'gml_deegree_01_noprefix', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 0, '');
+SELECT 'gml_deegree_01_customprefix', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 0, 'custom');
+
+SELECT 'gml_deegree_02_noprefix', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, '');
+SELECT 'gml_deegree_02_customprefix', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, 'custom');
+
+SELECT 'gml_deegree_03_noprefix', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, '');
+SELECT 'gml_deegree_03_customprefix', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, 'custom');
+
+SELECT 'gml_deegree_04_noprefix', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 0, '');
+SELECT 'gml_deegree_04_customprefix', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 0, 'custom');
+
+SELECT 'gml_deegree_05_noprefix', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16, '');
+SELECT 'gml_deegree_05_customprefix', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16, 'custom');
+
+SELECT 'gml_deegree_06_noprefix', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16, '');
+SELECT 'gml_deegree_06_customprefix', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16, 'custom');
--
-- KML
gml_deegree_04|<gml:Point srsName="EPSG:4326"><gml:pos srsDimension="3">1 2 3</gml:pos></gml:Point>
gml_deegree_05|<gml:Point srsName="EPSG:4326"><gml:coordinates>1,2,3</gml:coordinates></gml:Point>
gml_deegree_06|<gml:Point srsName="EPSG:4326"><gml:pos srsDimension="3">2 1 3</gml:pos></gml:Point>
+gml_deegree_01_noprefix|<Point srsName="EPSG:4326"><pos srsDimension="2">1 2</pos></Point>
+gml_deegree_01_customprefix|<custom:Point srsName="EPSG:4326"><custom:pos srsDimension="2">1 2</custom:pos></custom:Point>
+gml_deegree_02_noprefix|<Point srsName="EPSG:4326"><coordinates>1,2</coordinates></Point>
+gml_deegree_02_customprefix|<custom:Point srsName="EPSG:4326"><custom:coordinates>1,2</custom:coordinates></custom:Point>
+gml_deegree_03_noprefix|<Point srsName="EPSG:4326"><pos srsDimension="2">2 1</pos></Point>
+gml_deegree_03_customprefix|<custom:Point srsName="EPSG:4326"><custom:pos srsDimension="2">2 1</custom:pos></custom:Point>
+gml_deegree_04_noprefix|<Point srsName="EPSG:4326"><pos srsDimension="3">1 2 3</pos></Point>
+gml_deegree_04_customprefix|<custom:Point srsName="EPSG:4326"><custom:pos srsDimension="3">1 2 3</custom:pos></custom:Point>
+gml_deegree_05_noprefix|<Point srsName="EPSG:4326"><coordinates>1,2,3</coordinates></Point>
+gml_deegree_05_customprefix|<custom:Point srsName="EPSG:4326"><custom:coordinates>1,2,3</custom:coordinates></custom:Point>
+gml_deegree_06_noprefix|<Point srsName="EPSG:4326"><pos srsDimension="3">2 1 3</pos></Point>
+gml_deegree_06_customprefix|<custom:Point srsName="EPSG:4326"><custom:pos srsDimension="3">2 1 3</custom:pos></custom:Point>
ERROR: GetProj4StringSPI: Cannot find SRID (10) in spatial_ref_sys
ERROR: Input geometry has unknown (-1) SRID
kml_empty_geom|