]> granicus.if.org Git - postgis/commitdiff
Use lwgeom_homogenize in in_kml stuff. Related to #375
authorOlivier Courtin <olivier.courtin@camptocamp.com>
Sat, 20 Feb 2010 18:26:59 +0000 (18:26 +0000)
committerOlivier Courtin <olivier.courtin@camptocamp.com>
Sat, 20 Feb 2010 18:26:59 +0000 (18:26 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@5266 b70326c6-7e19-0410-871a-916f4a2858ee

postgis/lwgeom_in_kml.c
regress/in_kml.sql
regress/in_kml_expected

index bed57be0a1d1ad5e792ce672005a70ab6c0ea7ae..76ca2826ffe444ad24f717f3d672b422bdc89cdf 100644 (file)
@@ -2,7 +2,7 @@
  * $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
@@ -39,7 +39,6 @@
 /*
 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
 */
@@ -59,9 +58,9 @@ PG_FUNCTION_INFO_V1(geom_from_kml);
 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;
@@ -90,6 +89,14 @@ Datum geom_from_kml(PG_FUNCTION_ARGS)
        }
 
        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);
index 6c3803c506121b7ad7edc359ebe5bd606d99e25b..c660a3c626a50123f3f608a81484403372f2c6c5 100644 (file)
@@ -262,30 +262,22 @@ SELECT 'kml_5', ST_AsEWKT(ST_GeomFromKML(ST_AsKML(ST_AsEWKT('SRID=4326;POLYGON((
 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)))'))));
 
 
 --
index f06094695b363a8697a14b46950327b5eb7a2f56..f1670b7acc2e64879338b167b6317255156a3ee2 100644 (file)
@@ -27,7 +27,7 @@ ERROR:  invalid KML representation
 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)
@@ -57,6 +57,12 @@ kml_3|SRID=4326;LINESTRING(1 2,3 4)
 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)