【问题标题】:Segmentation fault (core dumped) on SetField/SetFeature in ogrogr 中的 SetField/SetFeature 上的分段错误(核心转储)
【发布时间】:2012-06-29 18:15:39
【问题描述】:

过去 2 天我一直在尝试完成一个 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 的了解还不够,无法为您提供更多信息。 请帮忙。 雅克

【问题讨论】:

    标签: python coredump shapefile gdal ogr


    【解决方案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保存/关闭

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 2013-11-28
      • 1970-01-01
      • 2015-06-25
      • 2021-06-03
      相关资源
      最近更新 更多