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

koji higuchi koji51guchi at gmail.com
Fri Nov 2 02:36:49 UTC 2018


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.

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
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstreetmap.org/pipermail/dev/attachments/20181102/0c3e0972/attachment.html>


More information about the dev mailing list