From: Olivier Courtin Date: Tue, 30 Mar 2010 12:32:24 +0000 (+0000) Subject: Add geography support to ST_AsGML with prefix namespace option. Update doc and unit... X-Git-Tag: 2.0.0alpha1~3082 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8936c39d153b4614176aac44c50ff791bf1ec2b1;p=postgis Add geography support to ST_AsGML with prefix namespace option. Update doc and unit tests. cf #460 git-svn-id: http://svn.osgeo.org/postgis/trunk@5471 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/doc/reference_output.xml b/doc/reference_output.xml index 3475feb56..7ba0225ab 100644 --- a/doc/reference_output.xml +++ b/doc/reference_output.xml @@ -421,6 +421,14 @@ st_asgeojson integer precision integer options + + text ST_AsGML + integer version + geometry g1 + integer precision + integer options + text namespace prefix + text ST_AsGML integer version @@ -431,10 +439,17 @@ st_asgeojson text ST_AsGML integer version - geometry g1 + geography g1 integer precision integer options - text prefix + + + text ST_AsGML + integer version + geography g1 + integer precision + integer options + text namespace prefix @@ -465,11 +480,9 @@ st_asgeojson - The 'prefix' argument may be used to specify a custom + 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 - - Availability: 1.3.2 Availability: 1.5.0 geography support was introduced. @@ -493,7 +506,6 @@ namespace prefix or no prefix (if empty). If null or omitted 'gml' prefix is use - See Also diff --git a/postgis/geography.sql.in.c b/postgis/geography.sql.in.c index 45f989e7d..7e15f4f65 100644 --- a/postgis/geography.sql.in.c +++ b/postgis/geography.sql.in.c @@ -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; diff --git a/postgis/geography_inout.c b/postgis/geography_inout.c index eb234925a..fd51b5758 100644 --- a/postgis/geography_inout.c +++ b/postgis/geography_inout.c @@ -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) diff --git a/regress/out_geography.sql b/regress/out_geography.sql index a82b15367..9e055fc85 100644 --- a/regress/out_geography.sql +++ b/regress/out_geography.sql @@ -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 diff --git a/regress/out_geography_expected b/regress/out_geography_expected index d7847dfb5..f7287c480 100644 --- a/regress/out_geography_expected +++ b/regress/out_geography_expected @@ -11,6 +11,10 @@ gml_deegree_01|1,21,2 gml_deegree_03|1 2 gml_deegree_04|2 1 +gml_prefix_01|1,2 +gml_prefix_02|1 2 +gml_prefix_03|1,2 +gml_prefix_04|1 2 ERROR: Only SRID SRID_DEFAULT is currently supported in geography. kml_srid_02|0,1 kml_empty_geom| diff --git a/regress/out_geometry.sql b/regress/out_geometry.sql index 49a4a79c6..909347e37 100644 --- a/regress/out_geometry.sql +++ b/regress/out_geometry.sql @@ -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 diff --git a/regress/out_geometry_expected b/regress/out_geometry_expected index 63da73ed5..1b04e2a71 100644 --- a/regress/out_geometry_expected +++ b/regress/out_geometry_expected @@ -13,18 +13,10 @@ gml_deegree_03|2 11 2 3 gml_deegree_05|1,2,3 gml_deegree_06|2 1 3 -gml_deegree_01_noprefix|1 2 -gml_deegree_01_customprefix|1 2 -gml_deegree_02_noprefix|1,2 -gml_deegree_02_customprefix|1,2 -gml_deegree_03_noprefix|2 1 -gml_deegree_03_customprefix|2 1 -gml_deegree_04_noprefix|1 2 3 -gml_deegree_04_customprefix|1 2 3 -gml_deegree_05_noprefix|1,2,3 -gml_deegree_05_customprefix|1,2,3 -gml_deegree_06_noprefix|2 1 3 -gml_deegree_06_customprefix|2 1 3 +gml_prefix_01|1,2 +gml_prefix_02|2 1 +gml_prefix_03|1,2 +gml_prefix_04|2 1 ERROR: GetProj4StringSPI: Cannot find SRID (10) in spatial_ref_sys ERROR: Input geometry has unknown (-1) SRID kml_empty_geom|