From: Sandro Santilli Date: Mon, 1 Oct 2012 09:28:46 +0000 (+0000) Subject: Accept array properties in GML input multi-geom input (#1928) X-Git-Tag: 2.1.0beta2~603 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3d25e2ea856af5eb8a6a2eb86f98d016c12f369f;p=postgis Accept array properties in GML input multi-geom input (#1928) Patch by Kashif Rasul and Shoaib Burq / SpacialDB git-svn-id: http://svn.osgeo.org/postgis/trunk@10354 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/postgis/lwgeom_in_gml.c b/postgis/lwgeom_in_gml.c index f40e814ea..2ad9b61ff 100644 --- a/postgis/lwgeom_in_gml.c +++ b/postgis/lwgeom_in_gml.c @@ -1487,7 +1487,7 @@ static LWGEOM* parse_gml_tin(xmlNodePtr xnode, bool *hasz, int *root_srid) static LWGEOM* parse_gml_mpoint(xmlNodePtr xnode, bool *hasz, int *root_srid) { gmlSrs srs; - xmlNodePtr xa; + xmlNodePtr xa, xb; LWGEOM *geom = NULL; if (is_xlink(xnode)) xnode = get_xlink_node(xnode); @@ -1506,10 +1506,21 @@ static LWGEOM* parse_gml_mpoint(xmlNodePtr xnode, bool *hasz, int *root_srid) /* MultiPoint/pointMember */ if (xa->type != XML_ELEMENT_NODE) continue; if (!is_gml_namespace(xa, false)) continue; - if (strcmp((char *) xa->name, "pointMember")) continue; - if (xa->children != NULL) - geom = (LWGEOM*)lwmpoint_add_lwpoint((LWMPOINT*)geom, - (LWPOINT*)parse_gml(xa->children, hasz, root_srid)); + if (!strcmp((char *) xa->name, "pointMembers")) + { + for (xb = xa->children ; xb != NULL ; xb = xb->next) + { + if (xb != NULL) + geom = (LWGEOM*)lwmpoint_add_lwpoint((LWMPOINT*)geom, + (LWPOINT*)parse_gml(xb, hasz, root_srid)); + } + } + else if (!strcmp((char *) xa->name, "pointMember")) + { + if (xa->children != NULL) + geom = (LWGEOM*)lwmpoint_add_lwpoint((LWMPOINT*)geom, + (LWPOINT*)parse_gml(xa->children, hasz, root_srid)); + } } return geom; @@ -1557,7 +1568,7 @@ static LWGEOM* parse_gml_mline(xmlNodePtr xnode, bool *hasz, int *root_srid) static LWGEOM* parse_gml_mcurve(xmlNodePtr xnode, bool *hasz, int *root_srid) { gmlSrs srs; - xmlNodePtr xa; + xmlNodePtr xa, xb; LWGEOM *geom = NULL; if (is_xlink(xnode)) xnode = get_xlink_node(xnode); @@ -1577,10 +1588,21 @@ static LWGEOM* parse_gml_mcurve(xmlNodePtr xnode, bool *hasz, int *root_srid) /* MultiCurve/curveMember */ if (xa->type != XML_ELEMENT_NODE) continue; if (!is_gml_namespace(xa, false)) continue; - if (strcmp((char *) xa->name, "curveMember")) continue; - if (xa->children != NULL) - geom = (LWGEOM*)lwmline_add_lwline((LWMLINE*)geom, - (LWLINE*)parse_gml(xa->children, hasz, root_srid)); + if (!strcmp((char *) xa->name, "curveMembers")) + { + for (xb = xa->children ; xb != NULL ; xb = xb->next) + { + if (xb != NULL) + geom = (LWGEOM*)lwmline_add_lwline((LWMLINE*)geom, + (LWLINE*)parse_gml(xb, hasz, root_srid)); + } + } + else if (!strcmp((char *) xa->name, "curveMember")) + { + if (xa->children != NULL) + geom = (LWGEOM*)lwmline_add_lwline((LWMLINE*)geom, + (LWLINE*)parse_gml(xa->children, hasz, root_srid)); + } } return geom; @@ -1628,7 +1650,7 @@ static LWGEOM* parse_gml_mpoly(xmlNodePtr xnode, bool *hasz, int *root_srid) static LWGEOM* parse_gml_msurface(xmlNodePtr xnode, bool *hasz, int *root_srid) { gmlSrs srs; - xmlNodePtr xa; + xmlNodePtr xa, xb; LWGEOM *geom = NULL; if (is_xlink(xnode)) xnode = get_xlink_node(xnode); @@ -1647,10 +1669,21 @@ static LWGEOM* parse_gml_msurface(xmlNodePtr xnode, bool *hasz, int *root_srid) /* MultiSurface/surfaceMember */ if (xa->type != XML_ELEMENT_NODE) continue; if (!is_gml_namespace(xa, false)) continue; - if (strcmp((char *) xa->name, "surfaceMember")) continue; - if (xa->children != NULL) - geom = (LWGEOM*)lwmpoly_add_lwpoly((LWMPOLY*)geom, - (LWPOLY*)parse_gml(xa->children, hasz, root_srid)); + if (!strcmp((char *) xa->name, "surfaceMembers")) + { + for (xb = xa->children ; xb != NULL ; xb = xb->next) + { + if (xb != NULL) + geom = (LWGEOM*)lwmpoly_add_lwpoly((LWMPOLY*)geom, + (LWPOLY*)parse_gml(xb, hasz, root_srid)); + } + } + else if (!strcmp((char *) xa->name, "surfaceMember")) + { + if (xa->children != NULL) + geom = (LWGEOM*)lwmpoly_add_lwpoly((LWMPOLY*)geom, + (LWPOLY*)parse_gml(xa->children, hasz, root_srid)); + } } return geom; diff --git a/regress/in_gml.sql b/regress/in_gml.sql index 799b8b0ff..a37ce9594 100644 --- a/regress/in_gml.sql +++ b/regress/in_gml.sql @@ -326,7 +326,14 @@ SELECT 'mpoint_6', ST_AsEWKT(ST_GeomFromGML(' -- Mixed srsName SELECT 'mpoint_7', ST_AsEWKT(ST_GeomFromGML('1,2400000,5000000')); +-- 1 point in pointMembers +SELECT 'mpoint_8', ST_AsEWKT(ST_GeomFromGML('1,2')); +-- 2 points in pointMembers +SELECT 'mpoint_9', ST_AsEWKT(ST_GeomFromGML('1,23,4')); + +-- Empty pointMembers +SELECT 'mpoint_10', ST_AsEWKT(ST_GeomFromGML('')); -- @@ -357,8 +364,6 @@ SELECT 'mline_8', ST_AsEWKT(ST_GeomFromGML('1,2 3,4400000,5000000 400010,5000010')); - - -- -- MultiCurve -- @@ -386,6 +391,13 @@ SELECT 'mcurve_8', ST_AsEWKT(ST_GeomFromGML('1,2 3,4400000,5000000 400010,5000010')); +-- 1 curve in curveMembers +SELECT 'mcurve_10', ST_AsEWKT(ST_GeomFromGML('1 2 3 4')); + +-- 2 curves in curveMembers +SELECT 'mcurve_11', ST_AsEWKT(ST_GeomFromGML('1 2 3 45 6 7 8')); + +SELECT 'mcurve_12', ST_AsEWKT(ST_GeomFromGML('')); -- @@ -446,6 +458,14 @@ SELECT 'msurface_8', ST_AsEWKT(ST_GeomFromGML('1,2 3,4 5,6 1,2400000,5000000 400010,5000010 400020,5000020 400000,5000000400100,5000100 400110,5000110 400120,5000120 400100,5000100')); +-- 1 surface in surfaceMembers +SELECT 'msurface_10', ST_AsEWKT(ST_GeomFromGML('1 2 3 4 5 6 1 2')); + +-- 2 surfaces in surfaceMembers +SELECT 'msurface_11', ST_AsEWKT(ST_GeomFromGML('1 2 3 4 5 6 1 27 8 9 10 11 12 7 8')); + +-- Empty surfaceMembers +SELECT 'msurface_12', ST_AsEWKT(ST_GeomFromGML('')); -- diff --git a/regress/in_gml_expected b/regress/in_gml_expected index 8eb33c921..60b0442cd 100644 --- a/regress/in_gml_expected +++ b/regress/in_gml_expected @@ -95,6 +95,9 @@ mpoint_4|MULTIPOINT EMPTY mpoint_5|MULTIPOINT EMPTY mpoint_6|MULTIPOINT(1 2,3 4) mpoint_7|SRID=27582;MULTIPOINT(1 2,400000 7000000) +mpoint_8|MULTIPOINT(1 2) +mpoint_9|MULTIPOINT(1 2,3 4) +mpoint_10|MULTIPOINT EMPTY mline_1|MULTILINESTRING((1 2,3 4)) mline_2|MULTILINESTRING((1 2,3 4),(5 6,7 8)) mline_3|SRID=4326;MULTILINESTRING((1 2,3 4)) @@ -113,6 +116,9 @@ mcurve_6|MULTILINESTRING((1 2,3 4),(5 6,7 8)) mcurve_7|MULTILINESTRING((1 2,4 5),(7 8,9 10)) mcurve_8|MULTILINESTRING((1 2,3 4),(5 6,8 9)) mcurve_9|SRID=27582;MULTILINESTRING((1 2,3 4),(400000 7000000,400010 7000010)) +mcurve_10|MULTILINESTRING((1 2,3 4)) +mcurve_11|MULTILINESTRING((1 2,3 4),(5 6,7 8)) +mcurve_12|MULTILINESTRING EMPTY mpoly_1|MULTIPOLYGON(((1 2,3 4,5 6,1 2))) mpoly_2|MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8))) mpoly_3|SRID=4326;MULTIPOLYGON(((1 2,3 4,5 6,1 2))) @@ -131,6 +137,9 @@ msurface_6|MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8))) msurface_7|MULTIPOLYGON(((1 2,4 5,7 8,1 2)),((10 11,12 13,14 15,10 11))) msurface_8|MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,10 11,13 14,7 8))) msurface_9|SRID=27582;MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((400000 7000000,400010 7000010,400020 7000020,400000 7000000),(400100 7000100,400110 7000110,400120 7000120,400100 7000100))) +msurface_10|MULTIPOLYGON(((1 2,3 4,5 6,1 2))) +msurface_11|MULTIPOLYGON(((1 2,3 4,5 6,1 2)),((7 8,9 10,11 12,7 8))) +msurface_12|MULTIPOLYGON EMPTY polyhedralsurface_1|POLYHEDRALSURFACE(((1 2 3,4 5 6,7 8 9,1 2 3))) polyhedralsurface_2|SRID=4326;POLYHEDRALSURFACE(((1 2 3,4 5 6,7 8 9,1 2 3))) ERROR: invalid GML representation