在Python中使用OGR CreateField()时出现段错误(segfault)

4 投票
1 回答
1510 浏览
提问于 2025-04-16 07:31

在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

这是我这边出错了,还是底层的C语言有问题,我没有处理好呢?

可能两者都有。GDAL/OGR的绑定确实有时候会出现崩溃,特别是当一些对象超出作用域被垃圾回收时。虽然这是一个已知的bug,但短时间内可能不会修复。

你可以尝试找个方法来绕过这个问题。我在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)

如果这样能解决你的问题,请告诉我。

撰写回答