segfault при попытке перебрать объекты после удаления полей или слоев - PullRequest
0 голосов
/ 28 мая 2020

Я удаляю кучу полей из слоев в наборе данных.

Но я обнаружил, что после удаления некоторых полей я получаю segfault, если я пытаюсь перебирать функции после удаления полей

# 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())

Я могу GetFeatureCount, GetFieldCount все эти хорошие вещи, но я не могу перебирать функции после удаления полей, я получаю сообщение об ошибке

Процесс завершен с выходом код 139 (прерывается сигналом 11: SIGSEGV)

Может ли кто-нибудь помочь мне понять, почему я теряю возможность итерации после удаления полей?

1 Ответ

0 голосов
/ 28 мая 2020
• 1000 было бы неплохо просто скопировать слой, удалить несколько полей
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...