[OSM-dev] RuntimeError: need at least two points for linestring (way_id=619453148)
koji higuchi
koji51guchi at gmail.com
Thu Nov 1 10:59:02 UTC 2018
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/20181101/82169333/attachment.html>
More information about the dev
mailing list