<paramdef><type>geography </type> <parameter>geom1</parameter></paramdef>
<paramdef><type>integer </type> <parameter>precision</parameter></paramdef>
</funcprototype>
+ <funcprototype>
+ <funcdef>text <function>ST_AsKML</function></funcdef>
+ <paramdef><type>integer </type> <parameter>version</parameter></paramdef>
+ <paramdef><type>geography </type> <parameter>geom1</parameter></paramdef>
+ <paramdef><type>integer </type> <parameter>precision</parameter></paramdef>
+ <paramdef><type>text </type> <parameter>namespace prefix</parameter></paramdef>
+ </funcprototype>
</funcsynopsis>
</refsynopsisdiv>
<para>Return the geometry as a Keyhole Markup Language (KML) element. There are several variants of this function.
maximum number of decimal places used in
- output (defaults to 15) and version default to 2.</para>
+ output (defaults to 15), version default to 2 and default namespace is no prefix.</para>
<para>Version 1: ST_AsKML(geom) / version=2 precision=15</para>
<para>Version 2: ST_AsKML(geom, max_sig_digits) / version=2 </para>
<para>Version 3: ST_AsKML(version, geom) / precision=15 </para>
<para>Version 4: ST_AsKML(version, geom, precision) </para>
+ <para>Version 5: ST_AsKML(version, geom, precision, namespace_prefix) </para>
<note>
<para>Requires PostGIS be compiled with Proj support. Use <xref linkend="PostGIS_Full_Version" /> to confirm you have proj support compiled in.</para>
<note>
<para>Availability: 1.2.2 - later variants that include version param came in 1.3.2</para>
</note>
+ <note>
+ <para>Availability: 2.0.0 - Add prefix namespace. Default is no prefix</para>
+ </note>
<note>
<para>AsKML output will not work with geometries that do not have an SRID</para>
char * h;
g = lwgeom_from_ewkt(in, PARSER_CHECK_NONE);
- h = lwgeom_to_kml2(lwgeom_serialize(g), precision);
+ h = lwgeom_to_kml2(lwgeom_serialize(g), precision, "");
if (strcmp(h, out))
fprintf(stderr, "\nIn: %s\nOut: %s\nTheo: %s\n", in, h, out);
char *h;
g = lwgeom_from_ewkt(in, PARSER_CHECK_NONE);
- h = lwgeom_to_kml2(lwgeom_serialize(g), 0);
+ h = lwgeom_to_kml2(lwgeom_serialize(g), 0, "");
if (strcmp(cu_error_msg, out))
fprintf(stderr, "\nIn: %s\nOut: %s\nTheo: %s\n",
}
+static void do_kml_test_prefix(char * in, char * out, int precision, const char *prefix)
+{
+ LWGEOM *g;
+ char * h;
+
+ g = lwgeom_from_ewkt(in, PARSER_CHECK_NONE);
+ h = lwgeom_to_kml2(lwgeom_serialize(g), precision, prefix);
+
+ if (strcmp(h, out))
+ fprintf(stderr, "\nPrefix: %s\nIn: %s\nOut: %s\nTheo: %s\n",
+ prefix, in, h, out);
+
+ CU_ASSERT_STRING_EQUAL(h, out);
+
+ lwgeom_free(g);
+ lwfree(h);
+}
+
+
static void out_kml_test_precision(void)
{
/* 0 precision, i.e a round */
"lwgeom_to_kml2: 'MultiSurface' geometry type not supported");
}
+static void out_kml_test_prefix(void)
+{
+ /* Linestring */
+ do_kml_test_prefix(
+ "LINESTRING(0 1,2 3,4 5)",
+ "<kml:LineString><kml:coordinates>0,1 2,3 4,5</kml:coordinates></kml:LineString>",
+ 0, "kml:");
+
+ /* Polygon */
+ do_kml_test_prefix(
+ "POLYGON((0 1,2 3,4 5,0 1))",
+ "<kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>0,1 2,3 4,5 0,1</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs></kml:Polygon>",
+ 0, "kml:");
+
+ /* Polygon - with internal ring */
+ do_kml_test_prefix(
+ "POLYGON((0 1,2 3,4 5,0 1),(6 7,8 9,10 11,6 7))",
+ "<kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>0,1 2,3 4,5 0,1</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs><kml:innerBoundaryIs><kml:LinearRing><kml:coordinates>6,7 8,9 10,11 6,7</kml:coordinates></kml:LinearRing></kml:innerBoundaryIs></kml:Polygon>",
+ 0, "kml:");
+
+ /* MultiPoint */
+ do_kml_test_prefix(
+ "MULTIPOINT(0 1,2 3)",
+ "<kml:MultiGeometry><kml:Point><kml:coordinates>0,1</kml:coordinates></kml:Point><kml:Point><kml:coordinates>2,3</kml:coordinates></kml:Point></kml:MultiGeometry>",
+ 0, "kml:");
+
+ /* MultiLine */
+ do_kml_test_prefix(
+ "MULTILINESTRING((0 1,2 3,4 5),(6 7,8 9,10 11))",
+ "<kml:MultiGeometry><kml:LineString><kml:coordinates>0,1 2,3 4,5</kml:coordinates></kml:LineString><kml:LineString><kml:coordinates>6,7 8,9 10,11</kml:coordinates></kml:LineString></kml:MultiGeometry>",
+ 0, "kml:");
+
+ /* MultiPolygon */
+ do_kml_test_prefix(
+ "MULTIPOLYGON(((0 1,2 3,4 5,0 1)),((6 7,8 9,10 11,6 7)))",
+ "<kml:MultiGeometry><kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>0,1 2,3 4,5 0,1</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs></kml:Polygon><kml:Polygon><kml:outerBoundaryIs><kml:LinearRing><kml:coordinates>6,7 8,9 10,11 6,7</kml:coordinates></kml:LinearRing></kml:outerBoundaryIs></kml:Polygon></kml:MultiGeometry>",
+ 0, "kml:");
+
+}
/*
** Used by test harness to register the tests in this file.
*/
PG_TEST(out_kml_test_precision),
PG_TEST(out_kml_test_dims),
PG_TEST(out_kml_test_geoms),
+ PG_TEST(out_kml_test_prefix),
CU_TEST_INFO_NULL
};
CU_SuiteInfo out_kml_suite = {"KML Out Suite", NULL, NULL, out_kml_tests};
extern char* lwgeom_to_gml2(uchar *geom, char *srs, int precision, const char *prefix);
extern char* lwgeom_to_gml3(uchar *geom, char *srs, int precision, int is_deegree, const char *prefix);
-extern char* lwgeom_to_kml2(uchar *geom, int precision);
+extern char* lwgeom_to_kml2(uchar *geom, int precision, const char *prefix);
extern char* lwgeom_to_geojson(uchar *geom, char *srs, int precision, int has_bbox);
extern char* lwgeom_to_svg(uchar *geom, int precision, int relative);
#include "liblwgeom.h"
#include <math.h> /* fabs */
-char *lwgeom_to_kml2(uchar *srl, int precision);
-
-static size_t askml2_point_size(LWPOINT *point, int precision);
-static char *askml2_point(LWPOINT *point, int precision);
-static size_t askml2_line_size(LWLINE *line, int precision);
-static char *askml2_line(LWLINE *line, int precision);
-static size_t askml2_poly_size(LWPOLY *poly, int precision);
-static char *askml2_poly(LWPOLY *poly, int precision);
-static size_t askml2_inspected_size(LWGEOM_INSPECTED *geom, int precision);
-static char *askml2_inspected(LWGEOM_INSPECTED *geom, int precision);
+char *lwgeom_to_kml2(uchar *srl, int precision, const char *prefix);
+
+static size_t askml2_point_size(LWPOINT *point, int precision, const char *prefix);
+static char *askml2_point(LWPOINT *point, int precision, const char *prefix);
+static size_t askml2_line_size(LWLINE *line, int precision, const char *prefix);
+static char *askml2_line(LWLINE *line, int precision, const char *prefix);
+static size_t askml2_poly_size(LWPOLY *poly, int precision, const char *prefix);
+static char *askml2_poly(LWPOLY *poly, int precision, const char *prefix);
+static size_t askml2_inspected_size(LWGEOM_INSPECTED *geom, int precision, const char *prefix);
+static char *askml2_inspected(LWGEOM_INSPECTED *geom, int precision, const char *prefix);
static size_t pointArray_toKML2(POINTARRAY *pa, char *buf, int precision);
static size_t pointArray_KMLsize(POINTARRAY *pa, int precision);
/* takes a GEOMETRY and returns a KML representation */
char *
-lwgeom_to_kml2(uchar *geom, int precision)
+lwgeom_to_kml2(uchar *geom, int precision, const char *prefix)
{
int type;
LWPOINT *point;
case POINTTYPE:
point = lwpoint_deserialize(geom);
- return askml2_point(point, precision);
+ return askml2_point(point, precision, prefix);
case LINETYPE:
line = lwline_deserialize(geom);
- return askml2_line(line, precision);
+ return askml2_line(line, precision, prefix);
case POLYGONTYPE:
poly = lwpoly_deserialize(geom);
- return askml2_poly(poly, precision);
+ return askml2_poly(poly, precision, prefix);
case MULTIPOINTTYPE:
case MULTILINETYPE:
case MULTIPOLYGONTYPE:
inspected = lwgeom_inspect(geom);
- return askml2_inspected(inspected, precision);
+ return askml2_inspected(inspected, precision, prefix);
default:
lwerror("lwgeom_to_kml2: '%s' geometry type not supported",
}
static size_t
-askml2_point_size(LWPOINT *point, int precision)
+askml2_point_size(LWPOINT *point, int precision, const char *prefix)
{
int size;
+ size_t prefixlen = strlen(prefix);
+
size = pointArray_KMLsize(point->point, precision);
size += sizeof("<point><coordinates>/") * 2;
+ size += prefixlen * 2 * 2;
return size;
}
static size_t
-askml2_point_buf(LWPOINT *point, char *output, int precision)
+askml2_point_buf(LWPOINT *point, char *output, int precision, const char *prefix)
{
char *ptr = output;
- ptr += sprintf(ptr, "<Point>");
- ptr += sprintf(ptr, "<coordinates>");
+ ptr += sprintf(ptr, "<%sPoint>", prefix);
+ ptr += sprintf(ptr, "<%scoordinates>", prefix);
ptr += pointArray_toKML2(point->point, ptr, precision);
- ptr += sprintf(ptr, "</coordinates></Point>");
+ ptr += sprintf(ptr, "</%scoordinates></%sPoint>", prefix, prefix);
return (ptr-output);
}
static char *
-askml2_point(LWPOINT *point, int precision)
+askml2_point(LWPOINT *point, int precision, const char *prefix)
{
char *output;
int size;
- size = askml2_point_size(point, precision);
+ size = askml2_point_size(point, precision, prefix);
output = lwalloc(size);
- askml2_point_buf(point, output, precision);
+ askml2_point_buf(point, output, precision, prefix);
return output;
}
static size_t
-askml2_line_size(LWLINE *line, int precision)
+askml2_line_size(LWLINE *line, int precision, const char * prefix)
{
int size;
+ size_t prefixlen = strlen(prefix);
+
size = pointArray_KMLsize(line->points, precision);
size += sizeof("<linestring><coordinates>/") * 2;
+ size += prefixlen * 2 * 2;
return size;
}
static size_t
-askml2_line_buf(LWLINE *line, char *output, int precision)
+askml2_line_buf(LWLINE *line, char *output, int precision, const char *prefix)
{
char *ptr=output;
- ptr += sprintf(ptr, "<LineString>");
- ptr += sprintf(ptr, "<coordinates>");
+ ptr += sprintf(ptr, "<%sLineString>", prefix);
+ ptr += sprintf(ptr, "<%scoordinates>", prefix);
ptr += pointArray_toKML2(line->points, ptr, precision);
- ptr += sprintf(ptr, "</coordinates></LineString>");
+ ptr += sprintf(ptr, "</%scoordinates></%sLineString>", prefix, prefix);
return (ptr-output);
}
static char *
-askml2_line(LWLINE *line, int precision)
+askml2_line(LWLINE *line, int precision, const char *prefix)
{
char *output;
int size;
- size = askml2_line_size(line, precision);
+ size = askml2_line_size(line, precision, prefix);
output = lwalloc(size);
- askml2_line_buf(line, output, precision);
+ askml2_line_buf(line, output, precision, prefix);
return output;
}
static size_t
-askml2_poly_size(LWPOLY *poly, int precision)
+askml2_poly_size(LWPOLY *poly, int precision, const char *prefix)
{
size_t size;
int i;
+ size_t prefixlen = strlen(prefix);
size = sizeof("<polygon></polygon>");
size += sizeof("<outerboundaryis><linearring><coordinates>/") * 2;
size += sizeof("<innerboundaryis><linearring><coordinates>/") * 2 *
poly->nrings;
+
+ size += prefixlen * (1 + 3 + (3 * poly->nrings)) * 2;
for (i=0; i<poly->nrings; i++)
size += pointArray_KMLsize(poly->rings[i], precision);
}
static size_t
-askml2_poly_buf(LWPOLY *poly, char *output, int precision)
+askml2_poly_buf(LWPOLY *poly, char *output, int precision, const char *prefix)
{
int i;
char *ptr=output;
- ptr += sprintf(ptr, "<Polygon>");
- ptr += sprintf(ptr, "<outerBoundaryIs><LinearRing><coordinates>");
+ ptr += sprintf(ptr, "<%sPolygon>", prefix);
+ ptr += sprintf(ptr, "<%souterBoundaryIs><%sLinearRing><%scoordinates>",
+ prefix, prefix, prefix);
ptr += pointArray_toKML2(poly->rings[0], ptr, precision);
- ptr += sprintf(ptr, "</coordinates></LinearRing></outerBoundaryIs>");
+ ptr += sprintf(ptr, "</%scoordinates></%sLinearRing></%souterBoundaryIs>",
+ prefix, prefix, prefix);
+
for (i=1; i<poly->nrings; i++)
{
- ptr += sprintf(ptr, "<innerBoundaryIs><LinearRing><coordinates>");
+ ptr += sprintf(ptr,
+ "<%sinnerBoundaryIs><%sLinearRing><%scoordinates>",
+ prefix, prefix, prefix);
+
ptr += pointArray_toKML2(poly->rings[i], ptr, precision);
- ptr += sprintf(ptr, "</coordinates></LinearRing></innerBoundaryIs>");
+
+ ptr += sprintf(ptr,
+ "</%scoordinates></%sLinearRing></%sinnerBoundaryIs>",
+ prefix, prefix, prefix);
}
- ptr += sprintf(ptr, "</Polygon>");
+ ptr += sprintf(ptr, "</%sPolygon>", prefix);
return (ptr-output);
}
static char *
-askml2_poly(LWPOLY *poly, int precision)
+askml2_poly(LWPOLY *poly, int precision, const char *prefix)
{
char *output;
int size;
- size = askml2_poly_size(poly, precision);
+ size = askml2_poly_size(poly, precision, prefix);
output = lwalloc(size);
- askml2_poly_buf(poly, output, precision);
+ askml2_poly_buf(poly, output, precision, prefix);
return output;
}
* Don't call this with single-geoms inspected.
*/
static size_t
-askml2_inspected_size(LWGEOM_INSPECTED *insp, int precision)
+askml2_inspected_size(LWGEOM_INSPECTED *insp, int precision, const char *prefix)
{
int i;
size_t size;
+ size_t prefixlen = strlen(prefix);
/* the longest possible multi version */
- size = sizeof("<MultiGeometry></MultiGeometry>");
+ size = sizeof("<MultiGeometry></MultiGeometry>") + prefixlen * 2;
for (i=0; i<insp->ngeometries; i++)
{
if ((point=lwgeom_getpoint_inspected(insp, i)))
{
- size += askml2_point_size(point, precision);
+ size += askml2_point_size(point, precision, prefix);
lwpoint_free(point);
}
else if ((line=lwgeom_getline_inspected(insp, i)))
{
- size += askml2_line_size(line, precision);
+ size += askml2_line_size(line, precision, prefix);
lwline_free(line);
}
else if ((poly=lwgeom_getpoly_inspected(insp, i)))
{
- size += askml2_poly_size(poly, precision);
+ size += askml2_poly_size(poly, precision, prefix);
lwpoly_free(poly);
}
else
{
subgeom = lwgeom_getsubgeometry_inspected(insp, i);
subinsp = lwgeom_inspect(subgeom);
- size += askml2_inspected_size(subinsp, precision);
+ size += askml2_inspected_size(subinsp, precision, prefix);
lwinspected_release(subinsp);
}
}
* Don't call this with single-geoms inspected!
*/
static size_t
-askml2_inspected_buf(LWGEOM_INSPECTED *insp, char *output, int precision)
+askml2_inspected_buf(LWGEOM_INSPECTED *insp, char *output, int precision, const char *prefix)
{
char *ptr, *kmltype;
int i;
kmltype = "MultiGeometry";
/* Open outmost tag */
- ptr += sprintf(ptr, "<%s>", kmltype);
+ ptr += sprintf(ptr, "<%s%s>", prefix, kmltype);
for (i=0; i<insp->ngeometries; i++)
{
if ((point=lwgeom_getpoint_inspected(insp, i)))
{
- ptr += askml2_point_buf(point, ptr, precision);
+ ptr += askml2_point_buf(point, ptr, precision, prefix);
lwpoint_free(point);
}
else if ((line=lwgeom_getline_inspected(insp, i)))
{
- ptr += askml2_line_buf(line, ptr, precision);
+ ptr += askml2_line_buf(line, ptr, precision, prefix);
lwline_free(line);
}
else if ((poly=lwgeom_getpoly_inspected(insp, i)))
{
- ptr += askml2_poly_buf(poly, ptr, precision);
+ ptr += askml2_poly_buf(poly, ptr, precision, prefix);
lwpoly_free(poly);
}
else
{
subgeom = lwgeom_getsubgeometry_inspected(insp, i);
subinsp = lwgeom_inspect(subgeom);
- ptr += askml2_inspected_buf(subinsp, ptr, precision);
+ ptr += askml2_inspected_buf(subinsp, ptr, precision, prefix);
lwinspected_release(subinsp);
}
}
/* Close outmost tag */
- ptr += sprintf(ptr, "</%s>", kmltype);
+ ptr += sprintf(ptr, "</%s%s>",prefix, kmltype);
return (ptr-output);
}
* Don't call this with single-geoms inspected!
*/
static char *
-askml2_inspected(LWGEOM_INSPECTED *insp, int precision)
+askml2_inspected(LWGEOM_INSPECTED *insp, int precision, const char *prefix)
{
char *kml;
size_t size;
- size = askml2_inspected_size(insp, precision);
+ size = askml2_inspected_size(insp, precision, prefix);
kml = lwalloc(size);
- askml2_inspected_buf(insp, kml, precision);
+ askml2_inspected_buf(insp, kml, precision, prefix);
return kml;
}
--
-- _ST_AsKML(version, geography, precision)
-CREATE OR REPLACE FUNCTION _ST_AsKML(int4, geography, int4)
+CREATE OR REPLACE FUNCTION _ST_AsKML(int4, geography, int4, text)
RETURNS text
AS 'MODULE_PATHNAME','geography_as_kml'
- LANGUAGE 'C' IMMUTABLE STRICT;
+ LANGUAGE 'C' IMMUTABLE;
-- AsKML(geography,precision) / version=2
CREATE OR REPLACE FUNCTION ST_AsKML(geography, int4)
RETURNS text
- AS 'SELECT _ST_AsKML(2, $1, $2)'
+ AS 'SELECT _ST_AsKML(2, $1, $2, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- AsKML(geography) / precision=15 version=2
CREATE OR REPLACE FUNCTION ST_AsKML(geography)
RETURNS text
- AS 'SELECT _ST_AsKML(2, $1, 15)'
+ AS 'SELECT _ST_AsKML(2, $1, 15, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
-- ST_AsKML(version, geography) / precision=15
CREATE OR REPLACE FUNCTION ST_AsKML(int4, geography)
RETURNS text
- AS 'SELECT _ST_AsKML($1, $2, 15)'
+ AS 'SELECT _ST_AsKML($1, $2, 15, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- ST_AsKML(version, geography, precision)
CREATE OR REPLACE FUNCTION ST_AsKML(int4, geography, int4)
RETURNS text
- AS 'SELECT _ST_AsKML($1, $2, $3)'
+ AS 'SELECT _ST_AsKML($1, $2, $3, null)'
+ LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+-- ST_AsKML(version, geography, precision, prefix)
+-- Availability: 2.0.0
+CREATE OR REPLACE FUNCTION ST_AsKML(int4, geography, int4, text)
+ RETURNS text
+ AS 'SELECT _ST_AsKML($1, $2, $3, $4)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
int len;
int version;
int precision = OUT_MAX_DOUBLE_PRECISION;
+ static const char *default_prefix = "";
+ char *prefixbuf;
+ const char* prefix = default_prefix;
+ text *prefix_text;
/* Get the version */
else if ( precision < 0 ) precision = 0;
}
- kml = lwgeom_to_kml2(lwgeom_serialize(lwgeom), precision);
+ /* retrieve prefix */
+ if (PG_NARGS() >3 && !PG_ARGISNULL(3))
+ {
+ prefix_text = PG_GETARG_TEXT_P(3);
+ 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;
+ }
+ }
+
+ kml = lwgeom_to_kml2(lwgeom_serialize(lwgeom), precision, prefix);
PG_FREE_IF_COPY(lwgeom, 1);
* $Id:$
*
* PostGIS - Export functions for PostgreSQL/PostGIS
- * Copyright 2009 Olivier Courtin <olivier.courtin@oslandia.com>
+ * Copyright 2009-2010 Olivier Courtin <olivier.courtin@oslandia.com>
*
* This is free software; you can redistribute and/or modify it under
* the terms of the GNU General Public Licence. See the COPYING file.
int len;
int version;
int precision = OUT_MAX_DOUBLE_PRECISION;
+ static const char* default_prefix = ""; /* default prefix */
+ char *prefixbuf;
+ const char* prefix = default_prefix;
+ text *prefix_text;
/* Get the version */
else if ( precision < 0 ) precision = 0;
}
- kml = lwgeom_to_kml2(SERIALIZED_FORM(geom), precision);
+ /* retrieve prefix */
+ if (PG_NARGS() >3 && !PG_ARGISNULL(3))
+ {
+ prefix_text = PG_GETARG_TEXT_P(3);
+ 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;
+ }
+ }
+
+ kml = lwgeom_to_kml2(SERIALIZED_FORM(geom), precision, prefix);
PG_FREE_IF_COPY(geom, 1);
-- KML OUTPUT
-----------------------------------------------------------------------
-- _ST_AsKML(version, geom, precision)
-CREATE OR REPLACE FUNCTION _ST_AsKML(int4, geometry, int4)
+CREATE OR REPLACE FUNCTION _ST_AsKML(int4, geometry, int4, text)
RETURNS TEXT
AS 'MODULE_PATHNAME','LWGEOM_asKML'
- LANGUAGE 'C' IMMUTABLE STRICT;
+ LANGUAGE 'C' IMMUTABLE;
-- AsKML(geom, precision) / version=2
-- Deprecation in 1.2.3
CREATE OR REPLACE FUNCTION AsKML(geometry, int4)
RETURNS TEXT
- AS 'SELECT _ST_AsKML(2, transform($1,4326), $2)'
+ AS 'SELECT _ST_AsKML(2, transform($1,4326), $2, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- Availability: 1.2.2
CREATE OR REPLACE FUNCTION ST_AsKML(geometry, int4)
RETURNS TEXT
- AS 'SELECT _ST_AsKML(2, ST_Transform($1,4326), $2)'
+ AS 'SELECT _ST_AsKML(2, ST_Transform($1,4326), $2, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- AsKML(geom) / precision=15 version=2
-- Deprecation in 1.2.3
CREATE OR REPLACE FUNCTION AsKML(geometry)
RETURNS TEXT
- AS 'SELECT _ST_AsKML(2, transform($1,4326), 15)'
+ AS 'SELECT _ST_AsKML(2, transform($1,4326), 15, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- AsKML(version, geom, precision)
-- Deprecation in 1.2.3
CREATE OR REPLACE FUNCTION AsKML(int4, geometry, int4)
RETURNS TEXT
- AS 'SELECT _ST_AsKML($1, transform($2,4326), $3)'
+ AS 'SELECT _ST_AsKML($1, transform($2,4326), $3, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- Availability: 1.2.2
CREATE OR REPLACE FUNCTION ST_AsKML(geometry)
RETURNS TEXT
- AS 'SELECT _ST_AsKML(2, ST_Transform($1,4326), 15)'
+ AS 'SELECT _ST_AsKML(2, ST_Transform($1,4326), 15, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- ST_AsKML(version, geom) / precision=15 version=2
-- Availability: 1.3.2
CREATE OR REPLACE FUNCTION ST_AsKML(int4, geometry)
RETURNS TEXT
- AS 'SELECT _ST_AsKML($1, ST_Transform($2,4326), 15)'
+ AS 'SELECT _ST_AsKML($1, ST_Transform($2,4326), 15, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
-- ST_AsKML(version, geom, precision)
-- Availability: 1.3.2
CREATE OR REPLACE FUNCTION ST_AsKML(int4, geometry, int4)
RETURNS TEXT
- AS 'SELECT _ST_AsKML($1, ST_Transform($2,4326), $3)'
+ AS 'SELECT _ST_AsKML($1, ST_Transform($2,4326), $3, null)'
LANGUAGE 'SQL' IMMUTABLE STRICT;
+-- ST_AsKML(version, geom, precision, text)
+-- Availability: 2.0.0
+CREATE OR REPLACE FUNCTION ST_AsKML(int4, geometry, int4, text)
+ RETURNS TEXT
+ AS 'SELECT _ST_AsKML($1, ST_Transform($2,4326), $3, $4)'
+ LANGUAGE 'SQL' IMMUTABLE STRICT;
+
+
-----------------------------------------------------------------------
-- GEOJSON OUTPUT
-- Availability: 1.3.4
SELECT 'kml_version_02', ST_AsKML(3, geography(GeomFromEWKT('SRID=4326;POINT(1 1)')));
SELECT 'kml_version_03', ST_AsKML(-4, geography(GeomFromEWKT('SRID=4326;POINT(1 1)')));
+-- Prefix
+SELECT 'kml_prefix_01', ST_AsKML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, '');
+SELECT 'kml_prefix_02', ST_AsKML(2, geography(GeomFromEWKT('SRID=4326;POINT(1 2)')), 0, 'kml');
+
-- Projected
-- National Astronomical Observatory of Colombia - Bogota, Colombia (Placemark)
SELECT 'kml_projection_01', ST_AsKML(geography(GeomFromEWKT('SRID=1021892;POINT(1000000 1000000)')), 3);
kml_version_01|<Point><coordinates>1,1</coordinates></Point>
ERROR: Only KML 2 is supported
ERROR: Only KML 2 is supported
+kml_prefix_01|<Point><coordinates>1,2</coordinates></Point>
+kml_prefix_02|<kml:Point><kml:coordinates>1,2</kml:coordinates></kml:Point>
ERROR: Only SRID SRID_DEFAULT is currently supported in geography.
svg_empty_geom|
svg_option_01|M 1 -1 L 4 -4 5 -7
SELECT 'kml_version_02', ST_AsKML(3, GeomFromEWKT('SRID=4326;POINT(1 1)'));
SELECT 'kml_version_03', ST_AsKML(-4, GeomFromEWKT('SRID=4326;POINT(1 1)'));
+-- Prefix
+SELECT 'kml_prefix_01', ST_AsKML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, '');
+SELECT 'kml_prefix_02', ST_AsKML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 'kml');
+
-- Projected
-- National Astronomical Observatory of Colombia - Bogota, Colombia (Placemark)
SELECT 'kml_projection_01', ST_AsKML(ST_GeomFromEWKT('SRID=1021892;POINT(1000000 1000000)'), 3);
kml_version_01|<Point><coordinates>1,1</coordinates></Point>
ERROR: Only KML 2 is supported
ERROR: Only KML 2 is supported
+kml_prefix_01|<Point><coordinates>1,2</coordinates></Point>
+kml_prefix_02|<kml:Point><kml:coordinates>1,2</kml:coordinates></kml:Point>
kml_projection_01|<Point><coordinates>-74.078,4.596</coordinates></Point>
svg_empty_geom|
svg_option_01|M 1 -1 L 4 -4 5 -7