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

koji higuchi koji51guchi at gmail.com
Fri Nov 2 02:44:17 UTC 2018


Here is full code I was working with:
https://drive.google.com/open?id=1NclLve4I5C05DqiOAWZQHhuyVk4ilx0g

On Fri, Nov 2, 2018 at 11:36 AM koji higuchi <koji51guchi at gmail.com> 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.
>
> 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/b6b5dc62/attachment.html>


More information about the dev mailing list