在ogr中的SetField / SetFeature上的分段错误(核心转储)

时间:2012-06-29 18:15:39

标签: python coredump shapefile gdal ogr

过去两天我一直试图让python脚本完成  使用属性创建289995点的shapefile。要点可以  已创建,但脚本未完成属性。代码运行  正确到循环: for j, p in enumerate(wCoords):(参见下面的代码 - 第二个循环)   过了一会儿,分段故障发生了。  我试图添加一个if语句来暂停某些进程  间隔,看看我是否可以在循环周期中找到它的位置  发生。循环无故障循环直到1000次循环,但直到  10,000没有反馈就停止了,看起来就像一个无限循环。  该程序是创建树点,然后附加树高  属性到点。代码如下:

def save_shp(wCoords):
     print 'saving shapefile...'
     driver = ogr.GetDriverByName('ESRI Shapefile')
     if os.path.exists('tree_points.shp'):
         driver.DeleteDataSource('tree_points.shp')
     ds = driver.CreateDataSource('tree_points.shp')
     layer = ds.CreateLayer('trees', geom_type=ogr.wkbPoint)
     layerDefn = layer.GetLayerDefn()
     point = ogr.Geometry(ogr.wkbPoint)

     for i, p in enumerate(wCoords):
         point.AddPoint(p[0],p[1])
         featureIndex = i
         feature = ogr.Feature(layerDefn)
         feature.SetGeometry(point)
         feature.SetFID(featureIndex)
         layer.CreateFeature(feature)

     fieldDefn = ogr.FieldDefn('tree_hts', ogr.OFTReal)
     layer.CreateField(fieldDefn)
     i = feature.GetFieldIndex('tree_hts')#???

     for j, p in enumerate(wCoords):

         feature_n = layer.GetFeature(j)
         feature_n.SetField(i, p[2])#???
         layer.SetFeature(feature_n)

     try:
         ds.Destroy()
     except:
         print 'still core dumping!'

我不太了解gdal / ogr给你的信息比这更多。  请帮忙。  雅克

1 个答案:

答案 0 :(得分:1)

一些快速提示:

  • 使用与shapefile前缀相同的图层名称:ds.CreateLayer('tree_points', ogr.wkbPoint)
  • 在添加任何数据之前进行layer.CreateField(fieldDefn)通话
  • 遍历您的功能一次,同时创建几何图形和要素对象
  • 在for循环中,您需要创建一个新的几何对象,并指向索引0:

    point = ogr.Geometry(ogr.wkbPoint)
    point.SetPoint_2D(0, p[0], p[1])
    
  • 您不需要ds.Destroy();使用ds = None
  • 保存/关闭