Ошибка сегментации (segfault) при использовании OGR CreateField () в Python - PullRequest
4 голосов
/ 24 ноября 2010

Получение ошибки при запуске этого очень короткого скрипта в Ubuntu.

from osgeo import ogr, osr

shpfile = 'Census_County_TIGER00_IN.shp'

def cust_field(field):
    '''cust_field(shpfile, field) creates a field definition, which, by calling cust_field(), can be used to create a field using the CreateField() function.
    cust_field() DOES NOT create a field -- it simply creates a "model" for a field, that can then be called later. It's weird, but that's GDAL/OGR, as far as I can tell.'''
    fieldDefn = ogr.FieldDefn(field, ogr.OFTInteger)
    fieldDefn.SetWidth(14)
    fieldDefn.SetPrecision(6)
    return fieldDefn

ds = ogr.Open(shpfile, 1)
lyr = ds.GetLayerByIndex(0)
field = cust_field("Test")
lyr.CreateField(field)

Все работает гладко до той последней строки, когда iPython, обычная оболочка Python и командная строка IDLE все сбрасывают в ошибку сегментации. Это ошибка с моей стороны или проблема с базовым C, к которой я не обращаюсь должным образом?

1 Ответ

5 голосов
/ 24 ноября 2010

Это ошибка с моей стороны или проблема с базовым C, что я не правильно адресуете?

Это, вероятно, оба. Привязки GDAL / OGR do иногда имеют тенденцию к сегрегации, когда объекты выходят из области видимости и собирают мусор . Хотя это известная ошибка, вряд ли она будет исправлена ​​в ближайшее время.

Скорее всего, вы можете найти способ обойти это. Я не могу воспроизвести этот segfault с другим шейп-файлом в Windows XP и следующей версией GDAL / OGR:

 >>> gdal.VersionInfo('') 
 'GDAL 1.6.0, released 2008/12/04'

Вы можете временно попытаться рефакторировать функцию cust_field в теле скрипта следующим образом:

from osgeo import ogr, osr

shpfile = 'Census_County_TIGER00_IN.shp'

ds = ogr.Open(shpfile, 1)
lyr = ds.GetLayerByIndex(0)
fieldDefn = ogr.FieldDefn("Test", ogr.OFTInteger)
fieldDefn.SetWidth(14)
fieldDefn.SetPrecision(6)

lyr.CreateField(fieldDefn)

Дайте мне знать, если это решит вашу проблему.

...