]> granicus.if.org Git - postgis/commitdiff
Add geography support to ST_AsGML with prefix namespace option. Update doc and unit...
authorOlivier Courtin <olivier.courtin@camptocamp.com>
Tue, 30 Mar 2010 12:32:24 +0000 (12:32 +0000)
committerOlivier Courtin <olivier.courtin@camptocamp.com>
Tue, 30 Mar 2010 12:32:24 +0000 (12:32 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@5471 b70326c6-7e19-0410-871a-916f4a2858ee

doc/reference_output.xml
postgis/geography.sql.in.c
postgis/geography_inout.c
regress/out_geography.sql
regress/out_geography_expected
regress/out_geometry.sql
regress/out_geometry_expected

index 3475feb56fead3d6637d7b59ed129c52a8474549..7ba0225abcf9f89215dda6720d45e9f5795265e4 100644 (file)
@@ -421,6 +421,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>namespace prefix</parameter></paramdef>
+                       </funcprototype>
                        <funcprototype>
                                <funcdef>text <function>ST_AsGML</function></funcdef>
                                <paramdef><type>integer </type> <parameter>version</parameter></paramdef>
@@ -431,10 +439,17 @@ st_asgeojson
                        <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>geography </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>
+                       <funcprototype>
+                               <funcdef>text <function>ST_AsGML</function></funcdef>
+                               <paramdef><type>integer </type> <parameter>version</parameter></paramdef>
+                               <paramdef><type>geography </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>namespace prefix</parameter></paramdef>
                        </funcprototype>
                </funcsynopsis>
          </refsynopsisdiv>
@@ -465,11 +480,9 @@ st_asgeojson
                                                  </itemizedlist>
                                                </para>
 
-               <para>The 'prefix' argument may be used to specify a custom
+               <para>The 'namespace 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>
@@ -493,7 +506,6 @@ namespace prefix or no prefix (if empty). If null or omitted 'gml' prefix is use
                        </programlisting>
 
          </refsection>
-           <!-- Optionally add a "See Also" section -->
   <refsection>
     <title>See Also</title>
 
index 45f989e7d12fbb8a4dc65c67b56aa4c86cf70e6e..7e15f4f6514406f13d48bf1fb1c5524f589efcf8 100644 (file)
@@ -397,22 +397,22 @@ CREATE OR REPLACE FUNCTION ST_AsSVG(text)
 --
 
 -- _ST_AsGML(version, geography, precision, option)
-CREATE OR REPLACE FUNCTION _ST_AsGML(int4, geography, int4, int4)
+CREATE OR REPLACE FUNCTION _ST_AsGML(int4, geography, int4, int4, text)
        RETURNS text
        AS 'MODULE_PATHNAME','geography_as_gml'
-       LANGUAGE 'C' IMMUTABLE STRICT;
+       LANGUAGE 'C' IMMUTABLE;
 
 -- ST_AsGML(geography, precision) / version=2 options=0
 CREATE OR REPLACE FUNCTION ST_AsGML(geography, int4)
        RETURNS text
-       AS 'SELECT _ST_AsGML(2, $1, $2, 0)'
+       AS 'SELECT _ST_AsGML(2, $1, $2, 0, null)'
        LANGUAGE 'SQL' IMMUTABLE STRICT;
 
 -- ST_AsGML(geography) / precision=15 version=2 options=0
 CREATE OR REPLACE FUNCTION ST_AsGML(geography)
        RETURNS text
-       AS 'SELECT _ST_AsGML(2, $1, 15, 0)'
-       LANGUAGE 'SQL' IMMUTABLE STRICT;
+       AS 'SELECT _ST_AsGML(2, $1, 15, 0, null)'
+       LANGUAGE 'SQL' IMMUTABLE;
 
 -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 -- TODO Remove in 2.0
@@ -424,25 +424,31 @@ CREATE OR REPLACE FUNCTION ST_AsGML(text)
 -- ST_AsGML(version, geography) / precision=15 version=2 options=0
 CREATE OR REPLACE FUNCTION ST_AsGML(int4, geography)
        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, geography, precision) / options = 0
 CREATE OR REPLACE FUNCTION ST_AsGML(int4, geography, 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 (geography, precision, option) / version=2
 CREATE OR REPLACE FUNCTION ST_AsGML(geography, 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, geography, precision, option)
 CREATE OR REPLACE FUNCTION ST_AsGML(int4, geography, 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, geography, precision, option, prefix)
+CREATE OR REPLACE FUNCTION ST_AsGML(int4, geography, int4, int4, text)
+       RETURNS text
+       AS 'SELECT _ST_AsGML($1, $2, $3, $4, $5)'
        LANGUAGE 'SQL' IMMUTABLE STRICT;
 
 
index eb234925a7a00d7f1ab454555d04b662a72b8cf5..fd51b575821189a0056f5f295ad2c859996c70da 100644 (file)
@@ -510,7 +510,11 @@ Datum geography_as_gml(PG_FUNCTION_ARGS)
        int precision = OUT_MAX_DOUBLE_PRECISION;
        int option=0;
        int is_deegree=0;
-       const char *prefix = "gml:";
+       static const char *default_prefix = "gml:";
+       char *prefixbuf;
+        const char* prefix = default_prefix;
+        text *prefix_text;
+
 
        /* Get the version */
        version = PG_GETARG_INT32(0);
@@ -540,6 +544,28 @@ Datum geography_as_gml(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;
+                }
+        }
+
        if (option & 1) srs = getSRSbySRID(SRID, false);
        else srs = getSRSbySRID(SRID, true);
        if (!srs)
index a82b153676cb7d5ab4a9b84c360c5fda82f56826..9e055fc85cd1678a85e2b79ff502714923cbc718 100644 (file)
@@ -34,6 +34,12 @@ SELECT 'gml_deegree_02', ST_AsGML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 2
 SELECT 'gml_deegree_03', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0);
 SELECT 'gml_deegree_04', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 1);
 
+-- Prefix
+SELECT 'gml_prefix_01', ST_AsGML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, '');
+SELECT 'gml_prefix_02', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, '');
+SELECT 'gml_prefix_03', ST_AsGML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, 'foo');
+SELECT 'gml_prefix_04', ST_AsGML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 0, 'foo');
+
 
 --
 -- KML
index d7847dfb5c835c34047dda23e70915185e056506..f7287c480f4772fb3df1e56f893cbb03557721b3 100644 (file)
@@ -11,6 +11,10 @@ gml_deegree_01|<gml:Point srsName="EPSG:4326"><gml:coordinates>1,2</gml:coordina
 gml_deegree_02|<gml:Point srsName="urn:ogc:def:crs:EPSG:4326"><gml:coordinates>1,2</gml:coordinates></gml:Point>
 gml_deegree_03|<gml:Point srsName="EPSG:4326"><gml:pos srsDimension="2">1 2</gml:pos></gml:Point>
 gml_deegree_04|<gml:Point srsName="urn:ogc:def:crs:EPSG:4326"><gml:pos srsDimension="2">2 1</gml:pos></gml:Point>
+gml_prefix_01|<Point srsName="EPSG:4326"><coordinates>1,2</coordinates></Point>
+gml_prefix_02|<Point srsName="EPSG:4326"><pos srsDimension="2">1 2</pos></Point>
+gml_prefix_03|<foo:Point srsName="EPSG:4326"><foo:coordinates>1,2</foo:coordinates></foo:Point>
+gml_prefix_04|<foo:Point srsName="EPSG:4326"><foo:pos srsDimension="2">1 2</foo:pos></foo:Point>
 ERROR:  Only SRID SRID_DEFAULT is currently supported in geography.
 kml_srid_02|<Point><coordinates>0,1</coordinates></Point>
 kml_empty_geom|
index 49a4a79c69bd3be9abc4f06f77446b081de57202..909347e37bd5fa42d3ffd7c2cb25785cee136239 100644 (file)
@@ -37,23 +37,10 @@ SELECT 'gml_deegree_05', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0,
 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');
+SELECT 'gml_prefix_01', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, '');
+SELECT 'gml_prefix_02', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, '');
+SELECT 'gml_prefix_03', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, 'foo');
+SELECT 'gml_prefix_04', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16, 'foo');
 
 --
 -- KML
index 63da73ed5127e929d196ea5e47cc55acf0c1e3fa..1b04e2a7134d19be8a208c4a108f9bd1c8452251 100644 (file)
@@ -13,18 +13,10 @@ 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>
+gml_prefix_01|<Point srsName="EPSG:4326"><coordinates>1,2</coordinates></Point>
+gml_prefix_02|<Point srsName="EPSG:4326"><pos srsDimension="2">2 1</pos></Point>
+gml_prefix_03|<foo:Point srsName="EPSG:4326"><foo:coordinates>1,2</foo:coordinates></foo:Point>
+gml_prefix_04|<foo:Point srsName="EPSG:4326"><foo:pos srsDimension="2">2 1</foo:pos></foo:Point>
 ERROR:  GetProj4StringSPI: Cannot find SRID (10) in spatial_ref_sys
 ERROR:  Input geometry has unknown (-1) SRID
 kml_empty_geom|