【问题标题】:segfault when trying to itterate through features after Deleting fields ogr layers删除字段 ogr 层后尝试迭代特征时出现段错误
【发布时间】:2020-05-28 13:31:46
【问题描述】:

我正在从数据集中的图层中删除一堆字段。

但是我发现,一旦我删除了一些字段,如果我在删除字段后尝试迭代功能,就会出现段错误

# If I comment out this for loop that deletes fields everything is fine
    for layer in ds:
        layer_fields = _get_layer_fields(layer)
        for field in layer_fields:
            if field in list_of_fields_to_delete:
                layer.DeleteField(layer.FindFieldIndex(field, True))

# This prints successfully showing the fields have been deleted
    for layer in ds:
        print(layer.GetFeatureCount())
        print(_get_layer_fields(layer))

# but if I do delete feilds it will segfault when I try to iterate over features
    for layer in ds:
        for feature in layer:
            pass

# Here's the function were calling for list of fields
def _get_layer_fields(layer):
    layerDefinition = layer.GetLayerDefn()

    layer_fields = []

    if layerDefinition.GetFieldCount():
        for i in range(layerDefinition.GetFieldCount()):
            layer_fields.append(layerDefinition.GetFieldDefn(i).GetName())

我可以GetFeatureCountGetFieldCount 提供所有这些好东西,但是一旦我删除了字段,我就无法迭代这些功能,我得到一个错误

进程以退出代码 139 结束(被信号 11:SIGSEGV 中断)

谁能帮我理解为什么我在删除字段后失去了迭代的能力?

【问题讨论】:

  • 是不是因为我的特征无效,它们可能不再匹配图层定义?如果是这样,我的问题变成了如何从具有特征的图层中删除字段?

标签: python segmentation-fault layer ogr


【解决方案1】:

似乎一旦图层具有特征,我就无法删除字段,为了解决这个问题,我之前在将图层复制到 mem 数据集时删除了属性,我根据我的目的调整了下面的代码。

更多的代码,最好只是复制图层,删除一些字段

def main( field_name_target ):
    # Get the input Layer
    inShapefile = "~/DATA/SHAPES/KC_ADMIN/parcel_address/parcel_address.shp"
    inDriver = ogr.GetDriverByName("ESRI Shapefile")
    inDataSource = inDriver.Open(inShapefile, 0)
    inLayer = inDataSource.GetLayer()
    inLayer.SetAttributeFilter("minor = 'HYDR'")

    # Create the output LayerS
    outShapefile = os.path.join( os.path.split( inShapefile )[0], "ogr_api_filter.shp" )
    outDriver = ogr.GetDriverByName("ESRI Shapefile")

    # Remove output shapefile if it already exists
    if os.path.exists(outShapefile):
        outDriver.DeleteDataSource(outShapefile)

    # Create the output shapefile
    outDataSource = outDriver.CreateDataSource(outShapefile)
    out_lyr_name = os.path.splitext( os.path.split( outShapefile )[1] )[0]
    outLayer = outDataSource.CreateLayer( out_lyr_name, geom_type=ogr.wkbMultiPolygon )

    # Add input Layer Fields to the output Layer if it is the one we want
    inLayerDefn = inLayer.GetLayerDefn()
    for i in range(0, inLayerDefn.GetFieldCount()):
        fieldDefn = inLayerDefn.GetFieldDefn(i)
        fieldName = fieldDefn.GetName()
        if fieldName not in field_name_target:
            continue
        outLayer.CreateField(fieldDefn)

    # Get the output Layer's Feature Definition
    outLayerDefn = outLayer.GetLayerDefn()

    # Add features to the ouput Layer
    for inFeature in inLayer:
        # Create output Feature
        outFeature = ogr.Feature(outLayerDefn)

        # Add field values from input Layer
        for i in range(0, outLayerDefn.GetFieldCount()):
            fieldDefn = outLayerDefn.GetFieldDefn(i)
            fieldName = fieldDefn.GetName()
            if fieldName not in field_name_target:
                continue

            outFeature.SetField(outLayerDefn.GetFieldDefn(i).GetNameRef(),
                inFeature.GetField(i))

        # Set geometry as centroid
        geom = inFeature.GetGeometryRef()
        outFeature.SetGeometry(geom.Clone())
        # Add new feature to output Layer
        outLayer.CreateFeature(outFeature)
        outFeature = None

    # Save and close DataSources
    inDataSource = None
    outDataSource = None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多