From 834d3253436d30be211e8f2a3a8fe1a88ab11c9a Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 23 Mar 2010 19:35:26 +0000 Subject: [PATCH] Expose custom prefix arg for ST_asGML to SQL, add tests and dox git-svn-id: http://svn.osgeo.org/postgis/trunk@5459 b70326c6-7e19-0410-871a-916f4a2858ee --- doc/reference_output.xml | 16 ++++++++++++++-- postgis/lwgeom_export.c | 26 +++++++++++++++++++++++++- postgis/postgis.sql.in.c | 32 ++++++++++++++++++++------------ regress/out_geometry.sql | 18 ++++++++++++++++++ regress/out_geometry_expected | 12 ++++++++++++ 5 files changed, 89 insertions(+), 15 deletions(-) diff --git a/doc/reference_output.xml b/doc/reference_output.xml index 6069eefd8..0c710ad59 100644 --- a/doc/reference_output.xml +++ b/doc/reference_output.xml @@ -428,6 +428,14 @@ st_asgeojson integer precision integer options + + text ST_AsGML + integer version + geometry g1 + integer precision + integer options + text prefix + @@ -436,11 +444,11 @@ st_asgeojson 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). GML 2 refer to 2.1.2 version, GML 3 to 3.1.1 version - The last 'options' argument is a bitfield. It could be used to define CRS output type + 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: @@ -457,11 +465,15 @@ st_asgeojson + 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 + Availability: 1.3.2 Availability: 1.5.0 geography support was introduced. + Availability: 2.0.0 prefix support was introduced. &Z_support; diff --git a/postgis/lwgeom_export.c b/postgis/lwgeom_export.c index 69a13bd8c..a2a9de457 100644 --- a/postgis/lwgeom_export.c +++ b/postgis/lwgeom_export.c @@ -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); diff --git a/postgis/postgis.sql.in.c b/postgis/postgis.sql.in.c index 5c8a4debe..cdd646ff9 100644 --- a/postgis/postgis.sql.in.c +++ b/postgis/postgis.sql.in.c @@ -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; ----------------------------------------------------------------------- diff --git a/regress/out_geometry.sql b/regress/out_geometry.sql index 7454c3d2b..49a4a79c6 100644 --- a/regress/out_geometry.sql +++ b/regress/out_geometry.sql @@ -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 diff --git a/regress/out_geometry_expected b/regress/out_geometry_expected index a27ccf1c1..63da73ed5 100644 --- a/regress/out_geometry_expected +++ b/regress/out_geometry_expected @@ -13,6 +13,18 @@ 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 ERROR: GetProj4StringSPI: Cannot find SRID (10) in spatial_ref_sys ERROR: Input geometry has unknown (-1) SRID kml_empty_geom| -- 2.40.0