]> granicus.if.org Git - postgis/commitdiff
GML for empty geometries should be NULL (#1377)
authorPaul Ramsey <pramsey@cleverelephant.ca>
Mon, 30 Jan 2012 00:37:45 +0000 (00:37 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Mon, 30 Jan 2012 00:37:45 +0000 (00:37 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@8966 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/cunit/cu_out_gml.c
liblwgeom/lwout_gml.c
postgis/geography_inout.c
postgis/lwgeom_export.c
postgis/lwgeom_in_gml.c
regress/empty_expected
regress/tickets.sql
regress/tickets_expected

index 706e01b1606533005d16162ffccf8a2db256ff56..f53261d393ecbdb86269271faf68b04414254f4f 100644 (file)
@@ -721,19 +721,6 @@ static void out_gml_test_geoms_prefix(void)
            "<custom:MultiGeometry><custom:geometryMember><custom:Point><custom:pos srsDimension=\"2\">0 1</custom:pos></custom:Point></custom:geometryMember><custom:geometryMember><custom:Curve><custom:segments><custom:LineStringSegment><custom:posList srsDimension=\"2\">2 3 4 5</custom:posList></custom:LineStringSegment></custom:segments></custom:Curve></custom:geometryMember></custom:MultiGeometry>",
            NULL, 0, 0, "custom:");
 
-
-       /* GML2 - Empty GeometryCollection */
-       do_gml2_test_prefix(
-           "GEOMETRYCOLLECTION EMPTY",
-           "<custom:MultiGeometry/>",
-           NULL, 0, "custom:");
-
-       /* GML3 - Empty GeometryCollection */
-       do_gml3_test_prefix(
-           "GEOMETRYCOLLECTION EMPTY",
-           "<custom:MultiGeometry/>",
-           NULL, 0, 0, "custom:");
-
        /* GML2 - Nested GeometryCollection */
        do_gml2_test_prefix(
            "GEOMETRYCOLLECTION(POINT(0 1),GEOMETRYCOLLECTION(LINESTRING(2 3,4 5)))",
@@ -855,19 +842,6 @@ static void out_gml_test_geoms_prefix(void)
            "<MultiGeometry><geometryMember><Point><pos srsDimension=\"2\">0 1</pos></Point></geometryMember><geometryMember><Curve><segments><LineStringSegment><posList srsDimension=\"2\">2 3 4 5</posList></LineStringSegment></segments></Curve></geometryMember></MultiGeometry>",
            NULL, 0, 0, "");
 
-
-       /* GML2 - Empty GeometryCollection */
-       do_gml2_test_prefix(
-           "GEOMETRYCOLLECTION EMPTY",
-           "<MultiGeometry/>",
-           NULL, 0, "");
-
-       /* GML3 - Empty GeometryCollection */
-       do_gml3_test_prefix(
-           "GEOMETRYCOLLECTION EMPTY",
-           "<MultiGeometry/>",
-           NULL, 0, 0, "");
-
        /* GML2 - Nested GeometryCollection */
        do_gml2_test_prefix(
            "GEOMETRYCOLLECTION(POINT(0 1),GEOMETRYCOLLECTION(LINESTRING(2 3,4 5)))",
@@ -1103,54 +1077,6 @@ static void out_gml3_extent(void)
 
 }
 
-
-static void out_gml_test_empty(void)
-{
-       /* POINT EMPTY, GML2 */
-       do_gml2_test("POINT EMPTY", "<gml:Point/>", NULL, 0);
-
-       /* POINT EMPTY, GML3 */
-       do_gml3_test("POINT EMPTY", "<gml:Point/>", NULL, 0, 0);
-
-       /* LINESTRING EMPTY, GML2 */
-       do_gml2_test("LINESTRING EMPTY", "<gml:LineString/>", NULL, 0);
-
-       /* LINESTRING EMPTY, GML3 */
-       do_gml3_test("LINESTRING EMPTY", "<gml:Curve/>", NULL, 0, 0);
-
-       /* POLYGON EMPTY, GML2 */
-       do_gml2_test("POLYGON EMPTY", "<gml:Polygon/>", NULL, 0);
-
-       /* POLYGON EMPTY, GML3 */
-       do_gml3_test("POLYGON EMPTY", "<gml:Polygon/>", NULL, 0, 0);
-
-       /* MULTIPOINT EMPTY, GML2 */
-       do_gml2_test("MULTIPOINT EMPTY", "<gml:MultiPoint/>", NULL, 0);
-
-       /* MULTIPOINT EMPTY, GML3 */
-       do_gml3_test("MULTIPOINT EMPTY", "<gml:MultiPoint/>", NULL, 0, 0);
-
-       /* MULTILINESTRING EMPTY, GML2 */
-       do_gml2_test("MULTILINESTRING EMPTY", "<gml:MultiLineString/>", NULL, 0);
-
-       /* MULTILINESTRING EMPTY, GML3 */
-       do_gml3_test("MULTILINESTRING EMPTY", "<gml:MultiCurve/>", NULL, 0, 0);
-
-       /* MULTIPOLYGON EMPTY, GML2 */
-       do_gml2_test("MULTIPOLYGON EMPTY", "<gml:MultiPolygon/>", NULL, 0);
-
-       /* MULTIPOLYGON EMPTY, GML3 */
-       do_gml3_test("MULTIPOLYGON EMPTY", "<gml:MultiSurface/>", NULL, 0, 0);
-
-       /* GEOMETRYCOLLECTION EMPTY, GML2 */
-       do_gml2_test("GEOMETRYCOLLECTION EMPTY", "<gml:MultiGeometry/>", NULL, 0);
-
-       /* GEOMETRYCOLLECTION EMPTY, GML3 */
-       do_gml3_test("GEOMETRYCOLLECTION EMPTY", "<gml:MultiGeometry/>", NULL, 0, 0);
-
-}
-
-
 /*
 ** Used by test harness to register the tests in this file.
 */
@@ -1165,7 +1091,6 @@ CU_TestInfo out_gml_tests[] =
        PG_TEST(out_gml_test_geoms_nodims),
        PG_TEST(out_gml2_extent),
        PG_TEST(out_gml3_extent),
-       PG_TEST(out_gml_test_empty),
        CU_TEST_INFO_NULL
 };
 CU_SuiteInfo out_gml_suite = {"out_gml",  NULL,  NULL, out_gml_tests};
index da6a834e989bfb8197e1b9ac7e50a1842629221a..04e5fe3a57f32eb5abb9d4ecad3f995746fec699 100644 (file)
@@ -212,6 +212,10 @@ lwgeom_to_gml2(const LWGEOM *geom, const char *srs, int precision, const char* p
 {
        int type = geom->type;
 
+       /* Return null for empty (#1377) */
+       if ( lwgeom_is_empty(geom) )
+               return NULL;
+
        switch (type)
        {
        case POINTTYPE:
@@ -703,6 +707,10 @@ lwgeom_to_gml3(const LWGEOM *geom, const char *srs, int precision, int opts, con
 {
        int type = geom->type;
 
+       /* Return null for empty (#1377) */
+       if ( lwgeom_is_empty(geom) )
+               return NULL;
+
        switch (type)
        {
        case POINTTYPE:
index cd0bfea855893ed9938b8739fd7803d1a1160250..f710dc41627a8e7df7252fb059538e9b43c19f17 100644 (file)
@@ -279,6 +279,11 @@ Datum geography_as_gml(PG_FUNCTION_ARGS)
     lwgeom_free(lwgeom);
        PG_FREE_IF_COPY(g, 1);
 
+       /* Return null on null */
+       if ( ! gml ) 
+               PG_RETURN_NULL();
+
+       /* Turn string result into text for return */
        result = cstring2text(gml);
        lwfree(gml);
 
index 2829b64dec447a4ce2145a781aef16dfaa123ccf..f64f0c83e1a9371dcfe564fd9335a260b9dfa8d1 100644 (file)
@@ -234,11 +234,11 @@ Datum LWGEOM_asGML(PG_FUNCTION_ARGS)
 \r
        lwgeom = lwgeom_from_gserialized(geom);\r
 \r
-        if (version == 2 && lwopts & LW_GML_EXTENT)\r
+       if (version == 2 && lwopts & LW_GML_EXTENT)\r
                gml = lwgeom_extent_to_gml2(lwgeom, srs, precision, prefix);\r
        else if (version == 2)\r
                gml = lwgeom_to_gml2(lwgeom, srs, precision, prefix);\r
-        else if (version == 3 && lwopts & LW_GML_EXTENT)\r
+       else if (version == 3 && lwopts & LW_GML_EXTENT)\r
                gml = lwgeom_extent_to_gml3(lwgeom, srs, precision, lwopts, prefix);\r
        else if (version == 3) \r
                gml = lwgeom_to_gml3(lwgeom, srs, precision, lwopts, prefix);\r
@@ -246,9 +246,12 @@ Datum LWGEOM_asGML(PG_FUNCTION_ARGS)
        lwgeom_free(lwgeom);\r
        PG_FREE_IF_COPY(geom, 1);\r
 \r
+       /* Return null on null */\r
+       if ( ! gml )\r
+               PG_RETURN_NULL();\r
+\r
        result = cstring2text(gml);\r
        lwfree(gml);\r
-\r
        PG_RETURN_TEXT_P(result);\r
 }\r
 \r
index a116698a77bb4ffbac94a98a3fe537d930342a97..3c6fc9c615efc784dc7050722adbd7424ebaa7d6 100644 (file)
@@ -1473,6 +1473,10 @@ static LWGEOM* parse_gml_tin(xmlNodePtr xnode, bool *hasz, int *root_srid)
 
        if (is_xlink(xnode)) xnode = get_xlink_node(xnode);
 
+       parse_gml_srs(xnode, &srs);
+       if (*root_srid == SRID_UNKNOWN && srs.srid != SRID_UNKNOWN)
+               *root_srid = srs.srid;
+
        geom = (LWGEOM *)lwcollection_construct_empty(TINTYPE, *root_srid, 1, 0);
 
        if (xnode->children == NULL) 
@@ -1519,6 +1523,10 @@ static LWGEOM* parse_gml_mpoint(xmlNodePtr xnode, bool *hasz, int *root_srid)
 
        if (is_xlink(xnode)) xnode = get_xlink_node(xnode);
 
+       parse_gml_srs(xnode, &srs);
+       if (*root_srid == SRID_UNKNOWN && srs.srid != SRID_UNKNOWN)
+               *root_srid = srs.srid;
+
        geom = (LWGEOM *)lwcollection_construct_empty(MULTIPOINTTYPE, *root_srid, 1, 0);
 
        if (xnode->children == NULL) 
@@ -1550,6 +1558,10 @@ static LWGEOM* parse_gml_mline(xmlNodePtr xnode, bool *hasz, int *root_srid)
 
        if (is_xlink(xnode)) xnode = get_xlink_node(xnode);
 
+       parse_gml_srs(xnode, &srs);
+       if (*root_srid == SRID_UNKNOWN && srs.srid != SRID_UNKNOWN)
+               *root_srid = srs.srid;
+
        geom = (LWGEOM *)lwcollection_construct_empty(MULTILINETYPE, *root_srid, 1, 0);
 
        if (xnode->children == NULL) 
@@ -1581,6 +1593,10 @@ static LWGEOM* parse_gml_mcurve(xmlNodePtr xnode, bool *hasz, int *root_srid)
 
        if (is_xlink(xnode)) xnode = get_xlink_node(xnode);
 
+       parse_gml_srs(xnode, &srs);
+       if (*root_srid == SRID_UNKNOWN && srs.srid != SRID_UNKNOWN)
+               *root_srid = srs.srid;
+
        geom = (LWGEOM *)lwcollection_construct_empty(MULTILINETYPE, *root_srid, 1, 0);
 
        if (xnode->children == NULL) 
@@ -1613,6 +1629,10 @@ static LWGEOM* parse_gml_mpoly(xmlNodePtr xnode, bool *hasz, int *root_srid)
 
        if (is_xlink(xnode)) xnode = get_xlink_node(xnode);
 
+       parse_gml_srs(xnode, &srs);
+       if (*root_srid == SRID_UNKNOWN && srs.srid != SRID_UNKNOWN)
+               *root_srid = srs.srid;
+
        geom = (LWGEOM *)lwcollection_construct_empty(MULTIPOLYGONTYPE, *root_srid, 1, 0);
 
        if (xnode->children == NULL) 
@@ -1644,6 +1664,10 @@ static LWGEOM* parse_gml_msurface(xmlNodePtr xnode, bool *hasz, int *root_srid)
 
        if (is_xlink(xnode)) xnode = get_xlink_node(xnode);
 
+       parse_gml_srs(xnode, &srs);
+       if (*root_srid == SRID_UNKNOWN && srs.srid != SRID_UNKNOWN)
+               *root_srid = srs.srid;
+
        geom = (LWGEOM *)lwcollection_construct_empty(MULTIPOLYGONTYPE, *root_srid, 1, 0);
 
        if (xnode->children == NULL) 
@@ -1677,6 +1701,10 @@ static LWGEOM* parse_gml_psurface(xmlNodePtr xnode, bool *hasz, int *root_srid)
 
        if (is_xlink(xnode)) xnode = get_xlink_node(xnode);
 
+       parse_gml_srs(xnode, &srs);
+       if (*root_srid == SRID_UNKNOWN && srs.srid != SRID_UNKNOWN)
+               *root_srid = srs.srid;
+
        geom = (LWGEOM *)lwcollection_construct_empty(POLYHEDRALSURFACETYPE, *root_srid, 1, 0);
 
        if (xnode->children == NULL) 
@@ -1721,6 +1749,10 @@ static LWGEOM* parse_gml_coll(xmlNodePtr xnode, bool *hasz, int *root_srid)
 
        if (is_xlink(xnode)) xnode = get_xlink_node(xnode);
 
+       parse_gml_srs(xnode, &srs);
+       if (*root_srid == SRID_UNKNOWN && srs.srid != SRID_UNKNOWN)
+               *root_srid = srs.srid;
+
        geom = (LWGEOM *)lwcollection_construct_empty(COLLECTIONTYPE, *root_srid, 1, 0);
 
        if (xnode->children == NULL) 
index cf8d4f431ea7755f79a42edb03f1c780861ce7f4..53f4e8b477fa8ce89bd1db03cd1bc393d95e706c 100644 (file)
@@ -5,24 +5,24 @@ T2.1|SRID=4326;POLYGON EMPTY
 T2.2|SRID=4326;POLYGON EMPTY
 T2.3|SRID=4326;POLYGON EMPTY
 T2.4|4326|POLYGON
-T3.1|<gml:Point/>
-T3.2|<gml:LineString/>
-T3.3|<gml:Polygon/>
-T3.4|<gml:MultiPolygon/>
-T3.5|<gml:MultiLineString/>
-T3.6|<gml:MultiGeometry/>
-T3.7|<gml:Point/>
-T3.8|<gml:Curve/>
-T3.9|<gml:Polygon/>
-T3.10|<gml:MultiSurface/>
-T3.11|<gml:MultiCurve/>
-T3.12|<gml:MultiGeometry/>
-T3.13|<gml:Point/>
-T3.14|<gml:Curve/>
-T3.15|<gml:Polygon/>
-T3.16|<gml:MultiSurface/>
-T3.17|<gml:MultiCurve/>
-T3.18|<gml:MultiGeometry/>
+T3.1|
+T3.2|
+T3.3|
+T3.4|
+T3.5|
+T3.6|
+T3.7|
+T3.8|
+T3.9|
+T3.10|
+T3.11|
+T3.12|
+T3.13|
+T3.14|
+T3.15|
+T3.16|
+T3.17|
+T3.18|
 ST_Buffer(empty, tolerance) == empty|010300000000000000
 ST_Union(geometry, empty) == geometry|0103000000010000000400000000000000000000000000000000000000000000000000244000000000000000000000000000001440000000000000144000000000000000000000000000000000
 ST_Union(empty, empty) == empty|010300000000000000
index 2dd4d00c09064d8f10333b8a2807ecc33f243e33..8c5396883a668e0ab2983b1d5711e4e2f449ac57 100644 (file)
@@ -330,6 +330,16 @@ SELECT '#677',round(ST_Distance_Spheroid(ST_GeomFromEWKT('MULTIPOLYGON(((-10 40,
 -- #680 --
 SELECT '#680', encode(ST_AsBinary(geography(foo1.the_geom)),'hex') As result FROM ((SELECT ST_SetSRID(ST_MakePointM(i,j,m),4326) As the_geom FROM generate_series(-10,50,10) As i CROSS JOIN generate_series(50,70, 20) AS j CROSS JOIN generate_series(1,2) As m ORDER BY i, j, i*j*m)) As foo1 LIMIT 1;
 
+-- #681 --
+SELECT '#681a', ST_AsGML(ST_GeomFromText('POINT EMPTY', 4326));
+SELECT '#681b', ST_AsGML(ST_GeomFromText('POLYGON EMPTY', 4326));
+SELECT '#681c', ST_AsGML(ST_GeomFromText('LINESTRING EMPTY', 4326));
+SELECT '#681d', ST_AsGML(ST_GeomFromText('MULTIPOINT EMPTY', 4326));
+SELECT '#681e', ST_AsGML(ST_GeomFromText('MULTILINESTRING EMPTY', 4326));
+SELECT '#681f', ST_AsGML(ST_GeomFromText('MULTIPOLYGON EMPTY', 4326));
+SELECT '#681g', ST_AsGML(ST_GeomFromText('GEOMETRYCOLLECTION EMPTY', 4326));
+
+
 -- #682 --
 SELECT '#682', ST_Buffer(ST_GeomFromText('POLYGON EMPTY',4326) , 0.5);
 
index 223d681ed1d2954f08da5e5965b79178b84dbfab..57a99e62889322cfa6c12b477ba5c26165ab7364 100644 (file)
@@ -99,6 +99,13 @@ NOTICE:  IllegalArgumentException: Invalid number of points in LinearRing found
 #667|SRID=4326;CURVEPOLYGON(CIRCULARSTRING(30 40,-49.2314112161292 32.1963871193548,30 40))
 #677|1121395
 #680|01d107000000000000000024c000000000000049400000000000000040
+#681a|
+#681b|
+#681c|
+#681d|
+#681e|
+#681f|
+#681g|
 #682|0103000020E610000000000000
 #683|0103000020E610000000000000
 #684|0103000020E610000000000000