[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