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 <[email protected]> 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 <[email protected]> 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 <[email protected]> >> 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 <[email protected]> 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 [email protected] https://lists.openstreetmap.org/listinfo/dev

