Análisis de datos osm.pbf usando el módulo de GDAL / OGR python

Estoy intentando extraer datos de un archivo OSM.PBF usando el módulo GDAL / OGR de python.

Actualmente mi código se ve así:

import gdal, ogr osm = ogr.Open('file.osm.pbf') ## Select multipolygon from the layer layer = osm.GetLayer(3) # Create list to store pubs pubs = [] for feat in layer: if feat.GetField('amenity') == 'pub': pubs.append(feat) 

Si bien este pequeño código funciona bien con los archivos small.pbf (15mb). Sin embargo, al analizar archivos de más de 50 mb, aparece el siguiente error:

  ERROR 1: Too many features have accumulated in points layer. Use OGR_INTERLEAVED_READING=YES MODE 

Cuando enciendo este modo con:

 gdal.SetConfigOption('OGR_INTERLEAVED_READING', 'YES') 

ogr ya no devuelve ninguna característica, incluso al analizar archivos pequeños.

¿Alguien sabe qué está pasando aquí?

Gracias a la respuesta de Scai, pude averiguarlo.

El patrón de lectura especial requerido para la lectura intercalada que se menciona en gdal.org/1.11/ogr/drv_osm.html se traduce en un ejemplo de trabajo de python que se puede encontrar a continuación.

Este es un ejemplo de cómo extraer todas las características en un archivo .osm.pbf que tiene la etiqueta ‘amenity = pub’

 import gdal, ogr gdal.SetConfigOption('OGR_INTERLEAVED_READING', 'YES') osm = ogr.Open('file.osm.pbf') # Grab available layers in file nLayerCount = osm.GetLayerCount() thereIsDataInLayer = True pubs = [] while thereIsDataInLayer: thereIsDataInLayer = False # Cycle through available layers for iLayer in xrange(nLayerCount): lyr=osm.GetLayer(iLayer) # Get first feature from layer feat = lyr.GetNextFeature() while (feat is not None): thereIsDataInLayer = True #Do something with feature, in this case store them in a list if feat.GetField('amenity') == 'pub': pubs.append(feat) #The destroy method is necessary for interleaved reading feat.Destroy() feat = lyr.GetNextFeature() 

Por lo que yo entiendo, se necesita un bucle while en lugar de un bucle for porque cuando se usa el método de lectura intercalada, es imposible obtener la cuenta de una colección.

Se agradecería mucho más aclaración sobre por qué este código funciona como lo hace.