[OSM-dev] RuntimeError: need at least two points for linestring (way_id=619453148)

Sarah Hoffmann lonvia at denofr.de
Sun Nov 4 10:11:00 UTC 2018


Hi,

On Fri, Nov 02, 2018 at 11:36:49AM +0900, koji higuchi wrote:
> Hi Sarah,
> It stopped working with the following error, though I used try and
> exception:
> 
> Traceback (most recent call last):
>   File "D:\test.py", line 47, in <module>
>     ShapeConverter().apply_file(fi, locations=True)
> RuntimeError: Read failed: The data is invalid.

This means that one of your input files is broken.
You need to find out which one and repair it.

Sarah

> 
> Please help me.
> 
> On Thu, Nov 1, 2018 at 7:59 PM koji higuchi <koji51guchi at gmail.com> wrote:
> 
> > Hi Sarah,
> > Your answer was great and it helped me to correct my code.
> > I think that it's okay to use class and definition.
> > Thank you very much for your help.
> >
> > Best regards
> > Koji
> >
> >
> > On Thu, Nov 1, 2018 at 7:07 PM koji higuchi <koji51guchi at gmail.com> wrote:
> >
> >> Hi Sarah,
> >> Thank you so much for your help!
> >> Writing speed for GPKG format with fiona has been very slow.
> >> I wanted to extract one by one ids and write geom and tag using
> >> ogr/python.
> >> Could you help me how to extract geom and tag of each id in a for loop
> >> without using class and definitions?
> >>
> >> On Thu, Nov 1, 2018 at 6:07 PM Sarah Hoffmann <lonvia at denofr.de> wrote:
> >>
> >>> Hi,
> >>>
> >>> On Thu, Nov 01, 2018 at 12:13:40PM +0900, koji higuchi wrote:
> >>> > *I tried to extract data from .osm.pbf file and write to shapefile as
> >>> > follows:*
> >>> >
> >>> > import os, osmium, fiona
> >>> >
> >>> > fi = 'europe-latest.osm.pbf'
> >>> > fo = 'europe-latest.shp'
> >>> >
> >>> > drv = 'ESRI Shapefile'
> >>> >
> >>> > crs = {'no_defs': True, 'ellps': 'WGS84', 'datum': 'WGS84', 'proj':
> >>> > 'longlat'}
> >>> >
> >>> >  schema = {'geometry': 'LineString',
> >>> >                    'properties': {'id': 'float', 'name' : 'str',
> >>> 'kind' :
> >>> > 'str'}}
> >>> >
> >>> > outfile = fiona.open(fo, 'w', driver=drv, crs=crs, schema=schema)
> >>> >
> >>> > geomfab = osmium.geom.GeoJSONFactory()
> >>> >
> >>> > class ShapeConverter(osmium.SimpleHandler):
> >>> >       def way(self, w):
> >>> >            if 'place' in w.tags:
> >>> >                rec = {'geometry' : eval(geomfab.create_linestring(w)),
> >>> >                       'properties' : {'id' : float(w.id),
> >>> >                                      'name' : w.tags.get('name'),
> >>> >                                        'kind' : w.tags['place']}}
> >>> >                outfile.write(rec)
> >>> >
> >>> > ShapeConverter().apply_file(fi, locations=True)
> >>> >
> >>> > I got the following error after extracting several contents:
> >>> >
> >>> >  rec = {'geometry' : eval(geomfab.create_linestring(w)),
> >>> > RuntimeError: need at least two points for linestring
> >>> (way_id=619453148)
> >>> >
> >>> > How could I skip that erroneous id and extract data for other working
> >>> ids?
> >>>
> >>> You need to do this manually yourself in the handler. I recommend
> >>> simply catching the exception as there are some other error
> >>> conditions besides too few points:
> >>>
> >>> def way(self, w):
> >>>         if 'place' in w.tags:
> >>>                 try:
> >>>                         geom = geomfab.create_linestring(w)
> >>>                 except:
> >>>                         print("Skipping way with bad geometry")
> >>>                         return
> >>>
> >>>           rec = {'geometry' : eval(geom),
> >>>            'properties' : {'id' : float(w.id),
> >>>            'name' : w.tags.get('name'),
> >>>            'kind' : w.tags['place']}}
> >>>     outfile.write(rec)
> >>>
> >>> Kind regards
> >>>
> >>> Sarah
> >>>
> >>



More information about the dev mailing list