From cf87477af91dbb7df3daf15be0209d8369e24960 Mon Sep 17 00:00:00 2001 From: Eric Massip Date: Sat, 8 Apr 2023 11:16:14 +0100 Subject: [PATCH] Added support for nested multigeometries with test coverage --- fastkml/geometry.py | 5 +++++ tests/oldunit_test.py | 47 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/fastkml/geometry.py b/fastkml/geometry.py index 62b0c5ab..3e337f95 100644 --- a/fastkml/geometry.py +++ b/fastkml/geometry.py @@ -406,6 +406,11 @@ def _get_multigeometry(self, element: Element) -> Optional[MultiGeometryType]: # MultiGeometry geoms: List[Union[AnyGeometryType, None]] = [] if element.tag == f"{self.ns}MultiGeometry": + multigeometries = element.findall(f"{self.ns}MultiGeometry") + for multigeometry in multigeometries: + geom = Geometry(ns=self.ns) + geom.from_element(multigeometry) + geoms.append(geom.geometry) points = element.findall(f"{self.ns}Point") for point in points: self._get_geometry_spec(point) diff --git a/tests/oldunit_test.py b/tests/oldunit_test.py index 5bc4fbd5..f0aa9582 100644 --- a/tests/oldunit_test.py +++ b/tests/oldunit_test.py @@ -1867,6 +1867,53 @@ def test_geometrycollection(self): assert len(g.geometry) == 2 assert g.geometry.geom_type == "GeometryCollection" + def test_nested_multigeometry(self): + doc = """ + + + + + + -122.366278,37.818844,0 -122.365248,37.819267,0 -122.365640,37.819875,0 -122.366278,37.818844,0 + + + + + + -122.365,37.819,0 + + + + + -122.365278,37.819000,0 -122.365248,37.819267,0 + + + + + + + -122.365248,37.819267,0 -122.365640,37.819875,0 -122.366278,37.818844,0 -122.365248,37.819267,0 + + + + + + + + """ + + k = kml.KML() + k.from_string(doc) + placemark = list(list(k.features())[0].features())[0] + + first_multigeometry = placemark.geometry + assert len(list(first_multigeometry.geoms)) == 3 + + second_multigeometry = [ + g for g in first_multigeometry.geoms if g.geom_type == "GeometryCollection" + ][0] + assert len(list(second_multigeometry.geoms)) == 2 + class TestGetGxGeometry: def test_track(self):