* $Id:$
*
* PostGIS - Spatial Types for PostgreSQL
- * http://postgis.refractions.net
+
* Copyright 2009 Oslandia
*
* This is free software; you can redistribute and/or modify it under
/*
TODO:
- OGC:LonLat84_5773 explicit support (rather than EPSG:4326)
- - Don't return a GEOMETRYCOLLECTION if a MULTI one is enough
- altitudeModeGroup relativeToGround Z Altitude
computation upon Geoid
*/
Datum geom_from_kml(PG_FUNCTION_ARGS)
{
PG_LWGEOM *geom, *geom2d;
+ LWGEOM *lwgeom, *hlwgeom;
xmlDocPtr xmldoc;
text *xml_input;
- LWGEOM *lwgeom;
int xml_size;
uchar *srl;
char *xml;
}
lwgeom = parse_kml(xmlroot, &hasz);
+
+ /* Homogenize geometry result if needed */
+ if (TYPE_GETTYPE(lwgeom->type) == COLLECTIONTYPE) {
+ hlwgeom = lwgeom_homogenize(lwgeom);
+ lwgeom_release(lwgeom);
+ lwgeom = hlwgeom;
+ }
+
lwgeom->bbox = lwgeom_compute_box2d(lwgeom);
geom = pglwgeom_serialize(lwgeom);
lwgeom_release(lwgeom);
SELECT 'kml_6', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;POLYGON((1 2 3,4 5 6,7 8 9,1 2 3))'))));
-- Multipoint
---SELECT 'kml_7', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOINT(1 2)'))));
+SELECT 'kml_7', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOINT(1 2,3 4)'))));
-- Multipoint - 3D
---SELECT 'kml_8', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOINT(1 2 3)'))));
+SELECT 'kml_8', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOINT(1 2 3,4 5 6)'))));
-- Multilinestring
---SELECT 'kml_9', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTILINESTRING((1 2,3 4))'))));
+SELECT 'kml_9', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTILINESTRING((1 2,3 4),(5 6,7 8))'))));
-- Multilinestring - 3D
---SELECT 'kml_10', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTILINESTRING((1 2 3,4 5 6))'))));
+SELECT 'kml_10', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTILINESTRING((1 2 3,4 5 6),(7 8 9,10 11 12))'))));
-- Multipolygon
---SELECT 'kml_11', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOLYGON(((1 2,3 4,5 6,1 2)))'))));
+SELECT 'kml_11', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8)))'))));
-- Multipolygon - 3D
---SELECT 'kml_12', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOLYGON(((1 2 3,4 5 6,7 8 9,1 2 3)))'))));
-
--- Collection
---SELECT 'kml_13', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;GEOMETRYCOLLECTION(POINT(1 2))'))));
-
--- Collection - 3D
---SELECT 'kml_14', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;GEOMETRYCOLLECTION(POINT(1 2 3))'))));
-
-
+SELECT 'kml_12', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;MULTIPOLYGON(((1 2 3,4 5 6,7 8 9,1 2 3)),((10 11 12,13 14 15,16 17 18,10 11 12)))'))));
--
polygon_15|SRID=4326;POLYGON((1 2,3 4,5 6,1 2),(7 8,9 10,11 12,7 8),(13 14,15 16,17 18,13 14))
multi_7|SRID=4326;GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(3 4,5 6),POLYGON((7 8,9 10,11 12,7 8)))
multi_8|SRID=4326;GEOMETRYCOLLECTION EMPTY
-multi_9|SRID=4326;GEOMETRYCOLLECTION(POINT(1 2),GEOMETRYCOLLECTION(LINESTRING(3 4,5 6),POLYGON((7 8,9 10,11 12,7 8))))
+multi_9|SRID=4326;GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(3 4,5 6),POLYGON((7 8,9 10,11 12,7 8)))
multi_10|SRID=4326;GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(3 4,5 6),POLYGON((7 8,9 10,11 12,7 8)))
ns_1|SRID=4326;POINT(1 2)
ns_2|SRID=4326;POINT(1 2)
kml_4|SRID=4326;LINESTRING(1 2 3,4 5 6)
kml_5|SRID=4326;POLYGON((1 2,3 4,5 6,1 2))
kml_6|SRID=4326;POLYGON((1 2 3,4 5 6,7 8 9,1 2 3))
+kml_7|SRID=4326;MULTIPOINT(1 2,3 4)
+kml_8|SRID=4326;MULTIPOINT(1 2 3,4 5 6)
+kml_9|SRID=4326;MULTILINESTRING((1 2,3 4),(5 6,7 8))
+kml_10|SRID=4326;MULTILINESTRING((1 2 3,4 5 6),(7 8 9,10 11 12))
+kml_11|SRID=4326;MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8)))
+kml_12|SRID=4326;MULTIPOLYGON(((1 2 3,4 5 6,7 8 9,1 2 3)),((10 11 12,13 14 15,16 17 18,10 11 12)))
double_1|SRID=4326;POINT(1 1234567890)
double_2|SRID=4326;POINT(1 -1)
double_3|SRID=4326;POINT(1 1)