]> granicus.if.org Git - postgis/commitdiff
Add a new option for ST_AsGML related to axis order, and lat lon inversion in GML...
authorOlivier Courtin <olivier.courtin@camptocamp.com>
Tue, 28 Apr 2009 19:13:26 +0000 (19:13 +0000)
committerOlivier Courtin <olivier.courtin@camptocamp.com>
Tue, 28 Apr 2009 19:13:26 +0000 (19:13 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@4039 b70326c6-7e19-0410-871a-916f4a2858ee

doc/reference.xml
postgis/lwgeom_gml.c
regress/gml.sql
regress/gml_expected

index 697f5d7868b5fb8a2887220aa65234c1456ea378..fc1a695b0047eb4a1df91d5f354d925b007f4394 100644 (file)
@@ -7392,15 +7392,19 @@ st_asgeojson
                        may be used to reduce the maximum number of decimal places
                        used in output (defaults to 15).</para>
                <para>GML 2 refer to 2.1.2 version, GML 3 to 3.1.1 version</para>
-                               <para>The last 'options' argument could be used to define Crs output type
-                                               in GML output:
+               <para>The last 'options' argument is a bitfield. It could be used to define CRS output type
+                                       in GML output, and to declare data as lat/lon:
                                                  <itemizedlist>
                                                                <listitem>
-                                                                 <para>1: GML Short CRS (e.g EPSG:4326), default value</para>
+                                                                 <para>0: GML Short CRS (e.g EPSG:4326), default value</para>
                                                                </listitem>
 
                                                                <listitem>
-                                                                 <para>2: GML Long CRS (e.g urn:ogc:def:crs:EPSG:4326)</para>
+                                                                 <para>1: GML Long CRS (e.g urn:ogc:def:crs:EPSG:4326)</para>
+                                                               </listitem>
+
+                                                               <listitem>
+                                                                 <para>16: Declare that datas are lat/lon (e.g srid=4326). Default is to assume that data are planars. This option is usefull for GML 3.1.1 output only, related to axis order.</para>
                                                                </listitem>
                                                  </itemizedlist>
                                                </para>
@@ -7422,11 +7426,16 @@ st_asgeojson
          <refsection>
                <title>Examples</title>
                <programlisting><![CDATA[SELECT ST_AsGML(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));
-
                st_asgml
                --------
-               <gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0,0 0,1 1,1 1,0 0,0</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>]]>
-               </programlisting>
+               <gml:Polygon srsName="EPSG:4326"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0,0 0,1 1,1 1,0 0,0</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>]]>
+               </programlisting>
+               <programlisting><![CDATA[SELECT ST_AsGML(3, ST_GeomFromText('POINT(5.234234233242 6.34534534534)',4326), 5, 17);
+               st_asgml                                                    
+               --------
+               <gml:Point srsName="urn:ogc:def:crs:EPSG:4326"><gml:pos>6.34535 5.23423</gml:pos></gml:Point>]]>
+               </programlisting>
+
          </refsection>
        </refentry>
 
index 920d5dfb7a3460a6e408a638dc5d6a87f40fdd39..dcac6215534d530b722a1b00d95f2f9512c7caae 100644 (file)
@@ -35,17 +35,17 @@ static size_t asgml2_inspected_size(LWGEOM_INSPECTED *geom, char *srs, int preci
 static char *asgml2_inspected(LWGEOM_INSPECTED *geom, char *srs, int precision);
 static size_t pointArray_toGML2(POINTARRAY *pa, char *buf, int precision);
 
-char *geometry_to_gml3(uchar *srl, char *srs, int precision);
+char *geometry_to_gml3(uchar *srl, char *srs, int precision, bool is_deegree);
 
 static size_t asgml3_point_size(LWPOINT *point, char *srs, int precision);
-static char *asgml3_point(LWPOINT *point, char *srs, int precision);
+static char *asgml3_point(LWPOINT *point, char *srs, int precision, bool is_deegree);
 static size_t asgml3_line_size(LWLINE *line, char *srs, int precision);
-static char *asgml3_line(LWLINE *line, char *srs, int precision);
+static char *asgml3_line(LWLINE *line, char *srs, int precision, bool is_deegree);
 static size_t asgml3_poly_size(LWPOLY *poly, char *srs, int precision);
-static char *asgml3_poly(LWPOLY *poly, char *srs, int precision);
+static char *asgml3_poly(LWPOLY *poly, char *srs, int precision, bool is_deegree);
 static size_t asgml3_inspected_size(LWGEOM_INSPECTED *geom, char *srs, int precision);
-static char *asgml3_inspected(LWGEOM_INSPECTED *geom, char *srs, int precision);
-static size_t pointArray_toGML3(POINTARRAY *pa, char *buf, int precision);
+static char *asgml3_inspected(LWGEOM_INSPECTED *geom, char *srs, int precision, bool is_deegree);
+static size_t pointArray_toGML3(POINTARRAY *pa, char *buf, int precision, bool is_deegree);
 
 static size_t pointArray_GMLsize(POINTARRAY *pa, int precision);
 static char *getSRSbySRID(int SRID, bool short_crs);
@@ -71,7 +71,7 @@ Datum LWGEOM_asGML(PG_FUNCTION_ARGS)
        int SRID;
        int precision = MAX_DOUBLE_PRECISION;
        int option=0;
-
+       bool is_deegree = false;
 
        /* Get the version */
        version = PG_GETARG_INT32(0);
@@ -102,10 +102,12 @@ Datum LWGEOM_asGML(PG_FUNCTION_ARGS)
        else if (option & 1) srs = getSRSbySRID(SRID, false);
        else srs = getSRSbySRID(SRID, true);
 
+       if (option & 16) is_deegree = true;
+
        if (version == 2)
          gml = geometry_to_gml2(SERIALIZED_FORM(geom), srs, precision);
        else
-         gml = geometry_to_gml3(SERIALIZED_FORM(geom), srs, precision);
+         gml = geometry_to_gml3(SERIALIZED_FORM(geom), srs, precision, is_deegree);
        
        PG_FREE_IF_COPY(geom, 1);
 
@@ -141,7 +143,6 @@ geometry_to_gml2(uchar *geom, char *srs, int precision)
 
        switch (type)
        {
-
                case POINTTYPE:
                        point = lwpoint_deserialize(geom);
                        return asgml2_point(point, srs, precision);
@@ -490,7 +491,7 @@ pointArray_toGML2(POINTARRAY *pa, char *output, int precision)
 
 /* takes a GEOMETRY and returns a GML representation */
 char *
-geometry_to_gml3(uchar *geom, char *srs, int precision)
+geometry_to_gml3(uchar *geom, char *srs, int precision, bool is_deegree)
 {
        int type;
        LWPOINT *point;
@@ -502,23 +503,21 @@ geometry_to_gml3(uchar *geom, char *srs, int precision)
 
        switch (type)
        {
-
                case POINTTYPE:
                        point = lwpoint_deserialize(geom);
-                       return asgml3_point(point, srs, precision);
+                       return asgml3_point(point, srs, precision, is_deegree);
 
                case LINETYPE:
                        line = lwline_deserialize(geom);
-                       return asgml3_line(line, srs, precision);
+                       return asgml3_line(line, srs, precision, is_deegree);
 
                case POLYGONTYPE:
                        poly = lwpoly_deserialize(geom);
-                       return asgml3_poly(poly, srs, precision);
+                       return asgml3_poly(poly, srs, precision, is_deegree);
 
                default:
                        inspected = lwgeom_inspect(geom);
-                       return asgml3_inspected(inspected, srs, precision);
-
+                       return asgml3_inspected(inspected, srs, precision, is_deegree);
        }
 }
 
@@ -533,7 +532,7 @@ asgml3_point_size(LWPOINT *point, char *srs, int precision)
 }
 
 static size_t
-asgml3_point_buf(LWPOINT *point, char *srs, char *output, int precision)
+asgml3_point_buf(LWPOINT *point, char *srs, char *output, int precision, bool is_deegree)
 {
        char *ptr = output;
 
@@ -543,21 +542,21 @@ asgml3_point_buf(LWPOINT *point, char *srs, char *output, int precision)
                ptr += sprintf(ptr, "<gml:Point>");
        }
        ptr += sprintf(ptr, "<gml:pos>");
-       ptr += pointArray_toGML3(point->point, ptr, precision);
+       ptr += pointArray_toGML3(point->point, ptr, precision, is_deegree);
        ptr += sprintf(ptr, "</gml:pos></gml:Point>");
 
        return (ptr-output);
 }
 
 static char *
-asgml3_point(LWPOINT *point, char *srs, int precision)
+asgml3_point(LWPOINT *point, char *srs, int precision, bool is_deegree)
 {
        char *output;
        int size;
        
        size = asgml3_point_size(point, srs, precision);
        output = palloc(size);
-       asgml3_point_buf(point, srs, output, precision);
+       asgml3_point_buf(point, srs, output, precision, is_deegree);
        return output;
 }
 
@@ -573,7 +572,7 @@ asgml3_line_size(LWLINE *line, char *srs, int precision)
 }
 
 static size_t
-asgml3_line_buf(LWLINE *line, char *srs, char *output, int precision)
+asgml3_line_buf(LWLINE *line, char *srs, char *output, int precision, bool is_deegree)
 {
        char *ptr=output;
 
@@ -585,7 +584,7 @@ asgml3_line_buf(LWLINE *line, char *srs, char *output, int precision)
        ptr += sprintf(ptr, "<gml:segments>");
        ptr += sprintf(ptr, "<gml:LineStringSegment>");
        ptr += sprintf(ptr, "<gml:posList>");
-       ptr += pointArray_toGML3(line->points, ptr, precision);
+       ptr += pointArray_toGML3(line->points, ptr, precision, is_deegree);
        ptr += sprintf(ptr, "</gml:posList></gml:LineStringSegment>");
        ptr += sprintf(ptr, "</gml:segments>");
        ptr += sprintf(ptr, "</gml:Curve>");
@@ -594,14 +593,14 @@ asgml3_line_buf(LWLINE *line, char *srs, char *output, int precision)
 }
 
 static char *
-asgml3_line(LWLINE *line, char *srs, int precision)
+asgml3_line(LWLINE *line, char *srs, int precision, bool is_deegree)
 {
        char *output;
        int size;
 
        size = asgml3_line_size(line, srs, precision);
        output = palloc(size);
-       asgml3_line_buf(line, srs, output, precision);
+       asgml3_line_buf(line, srs, output, precision, is_deegree);
        return output;
 }
 
@@ -631,7 +630,7 @@ asgml3_poly_size(LWPOLY *poly, char *srs, int precision)
 }
 
 static size_t
-asgml3_poly_buf(LWPOLY *poly, char *srs, char *output, int precision)
+asgml3_poly_buf(LWPOLY *poly, char *srs, char *output, int precision, bool is_deegree)
 {
        int i;
        char *ptr=output;
@@ -642,12 +641,12 @@ asgml3_poly_buf(LWPOLY *poly, char *srs, char *output, int precision)
                ptr += sprintf(ptr, "<gml:Polygon>");
        }
        ptr += sprintf(ptr, "<gml:exterior><gml:LinearRing><gml:posList>");
-       ptr += pointArray_toGML3(poly->rings[0], ptr, precision);
+       ptr += pointArray_toGML3(poly->rings[0], ptr, precision, is_deegree);
        ptr += sprintf(ptr, "</gml:posList></gml:LinearRing></gml:exterior>");
        for (i=1; i<poly->nrings; i++)
        {
                ptr += sprintf(ptr, "<gml:interior><gml:LinearRing><gml:posList>");
-               ptr += pointArray_toGML3(poly->rings[i], ptr, precision);
+               ptr += pointArray_toGML3(poly->rings[i], ptr, precision, is_deegree);
                ptr += sprintf(ptr, "</gml:posList></gml:LinearRing></gml:interior>");
        }
        ptr += sprintf(ptr, "</gml:Polygon>");
@@ -656,14 +655,14 @@ asgml3_poly_buf(LWPOLY *poly, char *srs, char *output, int precision)
 }
 
 static char *
-asgml3_poly(LWPOLY *poly, char *srs, int precision)
+asgml3_poly(LWPOLY *poly, char *srs, int precision, bool is_deegree)
 {
        char *output;
        int size;
 
        size = asgml3_poly_size(poly, srs, precision);
        output = palloc(size);
-       asgml3_poly_buf(poly, srs, output, precision);
+       asgml3_poly_buf(poly, srs, output, precision, is_deegree);
        return output;
 }
 
@@ -725,7 +724,7 @@ asgml3_inspected_size(LWGEOM_INSPECTED *insp, char *srs, int precision)
  * Don't call this with single-geoms inspected!
  */
 static size_t
-asgml3_inspected_buf(LWGEOM_INSPECTED *insp, char *srs, char *output, int precision)
+asgml3_inspected_buf(LWGEOM_INSPECTED *insp, char *srs, char *output, int precision, bool is_deegree)
 {
        int type = lwgeom_getType(insp->serialized_form[0]);
        char *ptr, *gmltype;
@@ -756,21 +755,21 @@ asgml3_inspected_buf(LWGEOM_INSPECTED *insp, char *srs, char *output, int precis
                if ((point=lwgeom_getpoint_inspected(insp, i)))
                {
                  ptr += sprintf(ptr, "<gml:pointMember>");
-                       ptr += asgml3_point_buf(point, 0, ptr, precision);
+                       ptr += asgml3_point_buf(point, 0, ptr, precision, is_deegree);
                        lwpoint_release(point);
                        ptr += sprintf(ptr, "</gml:pointMember>");
                }
                else if ((line=lwgeom_getline_inspected(insp, i)))
                {
                  ptr += sprintf(ptr, "<gml:curveMember>");
-                       ptr += asgml3_line_buf(line, 0, ptr, precision);
+                       ptr += asgml3_line_buf(line, 0, ptr, precision, is_deegree);
                        lwline_release(line);
                        ptr += sprintf(ptr, "</gml:curveMember>");
                }
                else if ((poly=lwgeom_getpoly_inspected(insp, i)))
                {
                  ptr += sprintf(ptr, "<gml:surfaceMember>");
-                       ptr += asgml3_poly_buf(poly, 0, ptr, precision);
+                       ptr += asgml3_poly_buf(poly, 0, ptr, precision, is_deegree);
                        lwpoly_release(poly);
                        ptr += sprintf(ptr, "</gml:surfaceMember>");
                }
@@ -778,7 +777,7 @@ asgml3_inspected_buf(LWGEOM_INSPECTED *insp, char *srs, char *output, int precis
                {
                        subgeom = lwgeom_getsubgeometry_inspected(insp, i);
                        subinsp = lwgeom_inspect(subgeom);
-                       ptr += asgml3_inspected_buf(subinsp, 0, ptr, precision);
+                       ptr += asgml3_inspected_buf(subinsp, 0, ptr, precision, is_deegree);
                        lwinspected_release(subinsp);
                }
        }
@@ -793,20 +792,22 @@ asgml3_inspected_buf(LWGEOM_INSPECTED *insp, char *srs, char *output, int precis
  * Don't call this with single-geoms inspected!
  */
 static char *
-asgml3_inspected(LWGEOM_INSPECTED *insp, char *srs, int precision)
+asgml3_inspected(LWGEOM_INSPECTED *insp, char *srs, int precision, bool is_deegree)
 {
        char *gml;
        size_t size;
 
        size = asgml3_inspected_size(insp, srs, precision);
        gml = palloc(size);
-       asgml3_inspected_buf(insp, srs, gml, precision);
+       asgml3_inspected_buf(insp, srs, gml, precision, is_deegree);
        return gml;
 }
 
-/* In GML3, inside <posList> or <pos>, coordinates are separated by a space separator*/
+/* In GML3, inside <posList> or <pos>, coordinates are separated by a space separator
+ * In GML3 also, lat/lon are reversed for geocentric data
+ */
 static size_t
-pointArray_toGML3(POINTARRAY *pa, char *output, int precision)
+pointArray_toGML3(POINTARRAY *pa, char *output, int precision, bool is_deegree)
 {
        int i;
        char *ptr;
@@ -827,7 +828,10 @@ pointArray_toGML3(POINTARRAY *pa, char *output, int precision)
                        sprintf(y, "%.*f", precision, pt.y);
                        trim_trailing_zeros(y);
                        if ( i ) ptr += sprintf(ptr, " ");
-                       ptr += sprintf(ptr, "%s %s", x, y);
+                       if (is_deegree)
+                               ptr += sprintf(ptr, "%s %s", y, x);
+                       else 
+                               ptr += sprintf(ptr, "%s %s", x, y);
                }
        }
        else 
@@ -843,7 +847,10 @@ pointArray_toGML3(POINTARRAY *pa, char *output, int precision)
                        sprintf(z, "%.*f", precision, pt.z);
                        trim_trailing_zeros(z);
                        if ( i ) ptr += sprintf(ptr, " ");
-                       ptr += sprintf(ptr, "%s %s %s", x, y, z);
+                       if (is_deegree)
+                               ptr += sprintf(ptr, "%s %s %s", y, x, z);
+                       else
+                               ptr += sprintf(ptr, "%s %s %s", x, y, z);
                }
        }
 
index 7f33ec8a27d2da12b7f8652e192c33e35a81d3cc..8b85fc20d8b816e3be67ebf75cc4e68461d8b4ac 100644 (file)
@@ -32,7 +32,33 @@ SELECT 'version_04', ST_AsGML(-4, GeomFromEWKT('SRID=4326;POINT(1 1)'));
 -- Option
 SELECT 'option_01', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 1)'), 0, 0);
 SELECT 'option_02', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 1)'), 0, 1);
-  
+
+-- Deegree data 
+SELECT 'deegree_01', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 0);
+SELECT 'deegree_02', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16);
+SELECT 'deegree_03', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2)'), 0, 16);
+SELECT 'deegree_04', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 0);
+SELECT 'deegree_05', ST_AsGML(2, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16);
+SELECT 'deegree_06', ST_AsGML(3, GeomFromEWKT('SRID=4326;POINT(1 2 3)'), 0, 16);
+SELECT 'deegree_07', ST_AsGML(3, GeomFromEWKT('SRID=4326;LINESTRING(1 2, 2 3, 4 5)'), 0, 0);
+SELECT 'deegree_08', ST_AsGML(2, GeomFromEWKT('SRID=4326;LINESTRING(1 2, 2 3, 4 5)'), 0, 16);
+SELECT 'deegree_09', ST_AsGML(3, GeomFromEWKT('SRID=4326;LINESTRING(1 2, 2 3, 4 5)'), 0, 16);
+SELECT 'deegree_10', ST_AsGML(3, GeomFromEWKT('SRID=4326;POLYGON((1 2, 2 3, 4 5, 3 2, 1 2))'), 0, 0);
+SELECT 'deegree_11', ST_AsGML(2, GeomFromEWKT('SRID=4326;POLYGON((1 2, 2 3, 4 5, 3 2, 1 2))'), 0, 16);
+SELECT 'deegree_12', ST_AsGML(3, GeomFromEWKT('SRID=4326;POLYGON((1 2, 2 3, 4 5, 3 2, 1 2))'), 0, 16);
+SELECT 'deegree_13', ST_AsGML(3, GeomFromEWKT('SRID=4326;MULTIPOINT(1 2, 2 3, 4 5)'), 0, 0);
+SELECT 'deegree_14', ST_AsGML(2, GeomFromEWKT('SRID=4326;MULTIPOINT(1 2, 2 3, 4 5)'), 0, 16);
+SELECT 'deegree_15', ST_AsGML(3, GeomFromEWKT('SRID=4326;MULTIPOINT(1 2, 2 3, 4 5)'), 0, 16);
+SELECT 'deegree_16', ST_AsGML(3, GeomFromEWKT('SRID=4326;MULTILINESTRING((1 2, 2 3, 4 5))'), 0, 0);
+SELECT 'deegree_17', ST_AsGML(2, GeomFromEWKT('SRID=4326;MULTILINESTRING((1 2, 2 3, 4 5))'), 0, 16);
+SELECT 'deegree_18', ST_AsGML(3, GeomFromEWKT('SRID=4326;MULTILINESTRING((1 2, 2 3, 4 5))'), 0, 16);
+SELECT 'deegree_19', ST_AsGML(3, GeomFromEWKT('SRID=4326;MULTIPOLYGON(((1 2, 2 3, 4 5, 3 2, 1 2)))'), 0, 0);
+SELECT 'deegree_20', ST_AsGML(2, GeomFromEWKT('SRID=4326;MULTIPOLYGON(((1 2, 2 3, 4 5, 3 2, 1 2)))'), 0, 16);
+SELECT 'deegree_21', ST_AsGML(3, GeomFromEWKT('SRID=4326;MULTIPOLYGON(((1 2, 2 3, 4 5, 3 2, 1 2)))'), 0, 16);
+SELECT 'deegree_22', ST_AsGML(3, GeomFromEWKT('SRID=4326;GEOMETRYCOLLECTION(MULTIPOLYGON(((1 2, 2 3, 4 5, 3 2, 1 2))), MULTILINESTRING((1 2, 2 3, 4 5)), MULTIPOINT(1 2, 3 4))'), 0, 0);
+SELECT 'deegree_23', ST_AsGML(2, GeomFromEWKT('SRID=4326;GEOMETRYCOLLECTION(MULTIPOLYGON(((1 2, 2 3, 4 5, 3 2, 1 2))), MULTILINESTRING((1 2, 2 3, 4 5)), MULTIPOINT(1 2, 3 4))'), 0, 16);
+SELECT 'deegree_24', ST_AsGML(3, GeomFromEWKT('SRID=4326;GEOMETRYCOLLECTION(MULTIPOLYGON(((1 2, 2 3, 4 5, 3 2, 1 2))), MULTILINESTRING((1 2, 2 3, 4 5)), MULTIPOINT(1 2, 3 4))'), 0, 16);
+
 --
 -- Line
 --
index c0ce2da65343df88e39098dd92f9fc70c2868cdd..124657462cfbfa2abd0fa8beecc7930c9ed8c1a5 100644 (file)
@@ -10,6 +10,30 @@ ERROR:  Only GML 2 and GML 3 are supported
 ERROR:  Only GML 2 and GML 3 are supported
 option_01|<gml:Point srsName="EPSG:4326"><gml:coordinates>1,1</gml:coordinates></gml:Point>
 option_02|<gml:Point srsName="urn:ogc:def:crs:EPSG:4326"><gml:pos>1 1</gml:pos></gml:Point>
+deegree_01|<gml:Point srsName="EPSG:4326"><gml:pos>1 2</gml:pos></gml:Point>
+deegree_02|<gml:Point srsName="EPSG:4326"><gml:coordinates>1,2</gml:coordinates></gml:Point>
+deegree_03|<gml:Point srsName="EPSG:4326"><gml:pos>2 1</gml:pos></gml:Point>
+deegree_04|<gml:Point srsName="EPSG:4326"><gml:pos>1 2 3</gml:pos></gml:Point>
+deegree_05|<gml:Point srsName="EPSG:4326"><gml:coordinates>1,2,3</gml:coordinates></gml:Point>
+deegree_06|<gml:Point srsName="EPSG:4326"><gml:pos>2 1 3</gml:pos></gml:Point>
+deegree_07|<gml:Curve srsName="EPSG:4326"><gml:segments><gml:LineStringSegment><gml:posList>1 2 2 3 4 5</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve>
+deegree_08|<gml:LineString srsName="EPSG:4326"><gml:coordinates>1,2 2,3 4,5</gml:coordinates></gml:LineString>
+deegree_09|<gml:Curve srsName="EPSG:4326"><gml:segments><gml:LineStringSegment><gml:posList>2 1 3 2 5 4</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve>
+deegree_10|<gml:Polygon srsName="EPSG:4326"><gml:exterior><gml:LinearRing><gml:posList>1 2 2 3 4 5 3 2 1 2</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>
+deegree_11|<gml:Polygon srsName="EPSG:4326"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>1,2 2,3 4,5 3,2 1,2</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>
+deegree_12|<gml:Polygon srsName="EPSG:4326"><gml:exterior><gml:LinearRing><gml:posList>2 1 3 2 5 4 2 3 2 1</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon>
+deegree_13|<gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:pos>1 2</gml:pos></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:pos>2 3</gml:pos></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:pos>4 5</gml:pos></gml:Point></gml:pointMember></gml:MultiPoint>
+deegree_14|<gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:coordinates>1,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>2,3</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>4,5</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint>
+deegree_15|<gml:MultiPoint srsName="EPSG:4326"><gml:pointMember><gml:Point><gml:pos>2 1</gml:pos></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:pos>3 2</gml:pos></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:pos>5 4</gml:pos></gml:Point></gml:pointMember></gml:MultiPoint>
+deegree_16|<gml:MultiCurve srsName="EPSG:4326"><gml:curveMember><gml:Curve><gml:segments><gml:LineStringSegment><gml:posList>1 2 2 3 4 5</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve></gml:curveMember></gml:MultiCurve>
+deegree_17|<gml:MultiLineString srsName="EPSG:4326"><gml:lineStringMember><gml:LineString><gml:coordinates>1,2 2,3 4,5</gml:coordinates></gml:LineString></gml:lineStringMember></gml:MultiLineString>
+deegree_18|<gml:MultiCurve srsName="EPSG:4326"><gml:curveMember><gml:Curve><gml:segments><gml:LineStringSegment><gml:posList>2 1 3 2 5 4</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve></gml:curveMember></gml:MultiCurve>
+deegree_19|<gml:MultiSurface srsName="EPSG:4326"><gml:surfaceMember><gml:Polygon><gml:exterior><gml:LinearRing><gml:posList>1 2 2 3 4 5 3 2 1 2</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></gml:surfaceMember></gml:MultiSurface>
+deegree_20|<gml:MultiPolygon srsName="EPSG:4326"><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>1,2 2,3 4,5 3,2 1,2</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon>
+deegree_21|<gml:MultiSurface srsName="EPSG:4326"><gml:surfaceMember><gml:Polygon><gml:exterior><gml:LinearRing><gml:posList>2 1 3 2 5 4 2 3 2 1</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></gml:surfaceMember></gml:MultiSurface>
+deegree_22|<gml:MultiGeometry srsName="EPSG:4326"><gml:MultiSurface><gml:surfaceMember><gml:Polygon><gml:exterior><gml:LinearRing><gml:posList>1 2 2 3 4 5 3 2 1 2</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></gml:surfaceMember></gml:MultiSurface><gml:MultiCurve><gml:curveMember><gml:Curve><gml:segments><gml:LineStringSegment><gml:posList>1 2 2 3 4 5</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve></gml:curveMember></gml:MultiCurve><gml:MultiPoint><gml:pointMember><gml:Point><gml:pos>1 2</gml:pos></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:pos>3 4</gml:pos></gml:Point></gml:pointMember></gml:MultiPoint></gml:MultiGeometry>
+deegree_23|<gml:MultiGeometry srsName="EPSG:4326"><gml:MultiPolygon><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>1,2 2,3 4,5 3,2 1,2</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon><gml:MultiLineString><gml:lineStringMember><gml:LineString><gml:coordinates>1,2 2,3 4,5</gml:coordinates></gml:LineString></gml:lineStringMember></gml:MultiLineString><gml:MultiPoint><gml:pointMember><gml:Point><gml:coordinates>1,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>3,4</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint></gml:MultiGeometry>
+deegree_24|<gml:MultiGeometry srsName="EPSG:4326"><gml:MultiSurface><gml:surfaceMember><gml:Polygon><gml:exterior><gml:LinearRing><gml:posList>2 1 3 2 5 4 2 3 2 1</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></gml:surfaceMember></gml:MultiSurface><gml:MultiCurve><gml:curveMember><gml:Curve><gml:segments><gml:LineStringSegment><gml:posList>2 1 3 2 5 4</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve></gml:curveMember></gml:MultiCurve><gml:MultiPoint><gml:pointMember><gml:Point><gml:pos>2 1</gml:pos></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:pos>4 3</gml:pos></gml:Point></gml:pointMember></gml:MultiPoint></gml:MultiGeometry>
 line_01|<gml:LineString><gml:coordinates>3429562.6,5799490.68 3429750.99,5799199.87 3429825.45,5799078.39 3429901.8,5798961.45 3429995.54,5798822.93 3430072.89,5798719.46 3430216,5798558.95 3430272.08,5798489.33 3430393.87,5798328.51 3430463.53,5798251.11 3430532.22,5798190.16 3430591.24,5798149.53 3430667.67,5798108.9 3430723.78,5798088.58 3430797.33,5798067.95 3430857.34,5798056.34 3430912.52,5798051.5 3430961.89,5798048.59 3431052.88,5798053.43 3431159.36,5798059.24 3431218.41,5798061.18 3431366.56,5798056.09 3431474.07,5798044.47 3431568.02,5798028.97 3431644.53,5798012.51</gml:coordinates></gml:LineString>
 line_02|<gml:Curve><gml:segments><gml:LineStringSegment><gml:posList>3429562.6 5799490.68 3429750.99 5799199.87 3429825.45 5799078.39 3429901.8 5798961.45 3429995.54 5798822.93 3430072.89 5798719.46 3430216 5798558.95 3430272.08 5798489.33 3430393.87 5798328.51 3430463.53 5798251.11 3430532.22 5798190.16 3430591.24 5798149.53 3430667.67 5798108.9 3430723.78 5798088.58 3430797.33 5798067.95 3430857.34 5798056.34 3430912.52 5798051.5 3430961.89 5798048.59 3431052.88 5798053.43 3431159.36 5798059.24 3431218.41 5798061.18 3431366.56 5798056.09 3431474.07 5798044.47 3431568.02 5798028.97 3431644.53 5798012.51</gml:posList></gml:LineStringSegment></gml:segments></gml:Curve>
 line_03|<gml:LineString><gml:coordinates>3429563,5799491 3429751,5799200 3429825,5799078 3429902,5798961 3429996,5798823 3430073,5798719 3430216,5798559 3430272,5798489 3430394,5798329 3430464,5798251 3430532,5798190 3430591,5798150 3430668,5798109 3430724,5798089 3430797,5798068 3430857,5798056 3430913,5798052 3430962,5798049 3431053,5798053 3431159,5798059 3431218,5798061 3431367,5798056 3431474,5798044 3431568,5798029 3431645,5798013</gml:coordinates></gml:LineString>