2016-02-16 2 views
3

Я пытаюсь извлечь данные из файла OSM.PBF, используя модуль python GDAL/OGR.Анализ данных osm.pbf с использованием модуля python GDAL/OGR

В настоящее время мой код выглядит следующим образом:

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) 

Хотя это немного кода хорошо с small.pbf файлов (15Mb) работает. Однако, при разборе файлов размером более 50 МБ, я получаю следующее сообщение об ошибке:

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

При включении этого режима с:

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

OGR не возвращает никаких функций вообще больше, даже при разборе небольшой файлы.

Кто-нибудь знает, что здесь происходит?

+0

В соответствии с http://gdal.org/1.11/ogr/drv_osm.html чередование также требует специального шаблона чтения. Вот пример python для этого специального шаблона чтения: https://lists.osgeo.org/pipermail/gdal-dev/2014-April/038633.html Я никогда не использовал GDAL/OGR, поэтому не знаю подробностей. Если он работает, не стесняйтесь публиковать более полезный ответ с примером кода. – scai

ответ

4

Благодаря ответу Скай я смог понять это.

Специальный шаблон чтения, необходимый для чтения с чередованием, упомянутый в gdal.org/1.11/ogr/drv_osm.html, переведен в рабочий пример python, который можно найти ниже.

Это пример того, как извлечь все функции в файле .osm.pbf, которые имеют метку «удобства = паб»

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() 

Насколько я понимаю, какое-то время петли требуется вместо цикла for, потому что при использовании метода чередований чтения невозможно получить элемент коллекции.

Подробнее о том, почему этот фрагмент кода работает так, как будто он будет очень благодарен.

Смежные вопросы