diff --git a/pygeoif/factories.py b/pygeoif/factories.py index 380b0f4..dd78d13 100644 --- a/pygeoif/factories.py +++ b/pygeoif/factories.py @@ -56,9 +56,6 @@ ), flags=re.IGNORECASE, ) -gcre: Pattern[str] = re.compile( - r"POINT|LINESTRING|LINEARRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON", -) outer: Pattern[str] = re.compile(r"\((.+)\)") inner: Pattern[str] = re.compile(r"\([^)]*\)") mpre: Pattern[str] = re.compile(r"\(\((.+?)\)\)") @@ -280,13 +277,29 @@ def _multipolygon_from_wkt_coordinates(coordinates: str) -> MultiPolygon: return MultiPolygon(polygons) +def split_wkt_components(wkt: str) -> List[str]: + components = [] + start = 0 + open_count = 0 + + for i, char in enumerate(wkt): + if char == "(": + open_count += 1 + elif char == ")": + open_count -= 1 + elif char == "," and open_count == 0: + # Split only at commas outside parentheses + components.append(wkt[start:i].strip()) + start = i + 1 + + # Add the final component + components.append(wkt[start:].strip()) + return components + + def _multigeometry_from_wkt_coordinates(coordinates: str) -> GeometryCollection: - gc_types = gcre.findall(coordinates) - gc_coords = gcre.split(coordinates)[1:] - geometries: List[Geometry] = [] - for gc_type, gc_coord in zip(gc_types, gc_coords): - gc_wkt = gc_type + gc_coord[: gc_coord.rfind(")") + 1] - geometries.append(cast(Geometry, from_wkt(gc_wkt))) + components = split_wkt_components(coordinates) + geometries = (cast(Geometry, from_wkt(gc_wkt)) for gc_wkt in components) return GeometryCollection(geometries) diff --git a/tests/test_geometrycollection.py b/tests/test_geometrycollection.py index 377ff65..d7fafde 100644 --- a/tests/test_geometrycollection.py +++ b/tests/test_geometrycollection.py @@ -1,7 +1,5 @@ """Test Baseclass.""" -import pytest - from pygeoif import geometry from pygeoif.factories import from_wkt @@ -463,7 +461,6 @@ def test_multi_geometry_collection_wkt() -> None: assert from_wkt(str(gc)) == gc -@pytest.mark.xfail(reason="WKT parsing for nested GeometryCollections not implemented.") def test_nested_geometry_collections_wkt() -> None: multipoint = geometry.MultiPoint([(0, 0), (1, 1), (1, 2), (2, 2)]) gc1 = geometry.GeometryCollection([geometry.Point(0, 0), multipoint])