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 <koji51gu...@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 <koji51gu...@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 <lon...@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 >>> >>
_______________________________________________ dev mailing list dev@openstreetmap.org https://lists.openstreetmap.org/listinfo/dev