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

