cleder / fastkml

Fast 🌍️ KML processing for python

Home Page:https://fastkml.readthedocs.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Use Pygeoif 1.0

cleder opened this issue · comments

Pygeoif has breaking changes from version 0.7 to 1.0.

Hello! I would like to work on this. Should it use the beta version of pygeoif? Like migrate to using 1.0 interface with pygeoif>=1.0 constraint, and pip (as far as I remember) will pick beta versions for now, and when stable version is released it will pick it up?
EDIT: actually installing pygeoif only worked with --pre flag

I am having many test failures related to geometry objects not being iterable. Is it a bug in pygeoif or is it intended to be so? Not sure yet how to proceed because currently pygeoif objects' properties are used to guess their type for serialization

_________________________________________________________________________ KmlFromStringTestCase.test_multilinestrings _________________________________________________________________________

self = <fastkml.test_main.KmlFromStringTestCase testMethod=test_multilinestrings>

    def test_multilinestrings(self):
        doc = """<kml xmlns="http://www.opengis.net/kml/2.2">
        <Placemark>
          <name>Dnipro (Dnieper)</name>
          <MultiGeometry>
          <LineString><coordinates>33.54,46.831,0 33.606,46.869,0 33.662,46.957,0 33.739,47.05,0 33.859,47.149,0 33.976,47.307,0 33.998,47.411,0 34.155,47.49,0 34.448,47.542,0 34.712,47.553,0 34.946,47.521,0 35.088,47.528,0 35.138,47.573,0 35.149,47.657,0 35.106,47.842,0 </coordinates></LineString>
          <LineString><coordinates>33.194,49.094,0 32.884,49.225,0 32.603,49.302,0 31.886,49.555,0 </coordinates></LineString>
          <LineString><coordinates>31.44,50,0 31.48,49.933,0 31.486,49.871,0 31.467,49.754,0 </coordinates></LineString>
          <LineString><coordinates>30.508,51.217,0 30.478,50.904,0 30.479,50.749,0 30.515,50.597,0 </coordinates></LineString>
          </MultiGeometry>
        </Placemark> </kml>"""
    
        k = kml.KML()
>       k.from_string(doc)

fastkml/test_main.py:734: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
fastkml/kml.py:112: in from_string
    feature.from_element(placemark)
fastkml/kml.py:1081: in from_element
    geom.from_element(multigeometry)
fastkml/geometry.py:416: in from_element
    mgeom = self._get_multigeometry(element)
fastkml/geometry.py:405: in _get_multigeometry
    return MultiLineString(geoms)
/home/alex/envs/github/fastkml/lib/python3.8/site-packages/pygeoif/geometry.py:733: in __init__
    self._geoms = tuple(LineString(line) for line in lines)
/home/alex/envs/github/fastkml/lib/python3.8/site-packages/pygeoif/geometry.py:733: in <genexpr>
    self._geoms = tuple(LineString(line) for line in lines)
/home/alex/envs/github/fastkml/lib/python3.8/site-packages/pygeoif/geometry.py:282: in __init__
    self._geoms = self._set_geoms(coordinates)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

coordinates = LineString(((33.54, 46.831, 0.0), (33.606, 46.869, 0.0), (33.662, 46.957, 0.0), (33.739, 47.05, 0.0), (33.859, 47.149,...0), (34.946, 47.521, 0.0), (35.088, 47.528, 0.0), (35.138, 47.573, 0.0), (35.149, 47.657, 0.0), (35.106, 47.842, 0.0)))

    @staticmethod
    def _set_geoms(coordinates: LineType) -> Tuple[Point, ...]:
        geoms = []
        last_len = None
>       for coord in coordinates:
E       TypeError: 'LineString' object is not iterable

/home/alex/envs/github/fastkml/lib/python3.8/site-packages/pygeoif/geometry.py:352: TypeError

This is intended to be so.
pygeoif has stricter requirements for the inputs, and there are @classmethods available to emulate the old behaviour.

So do you think I should use the class factories for that? Because the code heavily relies on geometry types to serialize/serialize correctly

Instead of return MultiLineString(geoms) it would be return MultiLineString.from_linestrings(geoms)