]> granicus.if.org Git - postgis/commitdiff
Expose custom prefix arg for ST_asGML to SQL, add tests and dox
authorSandro Santilli <strk@keybit.net>
Tue, 23 Mar 2010 19:35:26 +0000 (19:35 +0000)
committerSandro Santilli <strk@keybit.net>
Tue, 23 Mar 2010 19:35:26 +0000 (19:35 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@5459 b70326c6-7e19-0410-871a-916f4a2858ee

doc/reference_output.xml
postgis/lwgeom_export.c
postgis/postgis.sql.in.c
regress/out_geometry.sql
regress/out_geometry_expected

index 6069eefd8b902ef63226327c7bc8d4a27091b15d..0c710ad59e9834ba9c62e3baf2454052b916ec2f 100644 (file)
@@ -428,6 +428,14 @@ st_asgeojson
                                <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>
 
@@ -436,11 +444,11 @@ st_asgeojson
 
                <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>
@@ -457,11 +465,15 @@ st_asgeojson
                                                  </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>
index 69a13bd8c2e65f322e5537c4e903b79c28db3803..a2a9de4576389ad60ae78673843a335e2ba6af5f 100644 (file)
@@ -107,7 +107,10 @@ Datum LWGEOM_asGML(PG_FUNCTION_ARGS)
        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);
@@ -134,6 +137,27 @@ Datum LWGEOM_asGML(PG_FUNCTION_ARGS)
        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);
index 5c8a4debee56ff46b279be0a0d6af2f67f7909b6..cdd646ff979cb2ad5aceedcc8132ff7eaeb94a9e 100644 (file)
@@ -4661,64 +4661,72 @@ CREATE OR REPLACE FUNCTION ST_AsSVG(geometry)
 -----------------------------------------------------------------------
 -- 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;
 
 -----------------------------------------------------------------------
index 7454c3d2b4b6dc2e67d71e2c16609ea8a579f4c7..49a4a79c69bd3be9abc4f06f77446b081de57202 100644 (file)
@@ -36,6 +36,24 @@ SELECT 'gml_deegree_04', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0,
 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
index a27ccf1c14ded650c2e3734ffd6a99a01ea0f520..63da73ed5127e929d196ea5e47cc55acf0c1e3fa 100644 (file)
@@ -13,6 +13,18 @@ gml_deegree_03|<gml:Point srsName="EPSG:4326"><gml:pos srsDimension="2">2 1</gml
 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|