2 votos

SetFeature crea un bucle infinito al actualizar la característica sqlite usando OGR

Cuando se utiliza el controlador SQLite en python - la configuración de una característica después de cambiar el valor de un campo de atributo crea un bucle infinito en el primer registro. el mismo código funciona bien si sustituyo el controlador sqlite por un shapefile de esri. un poco de código para configurar el problema -

'''create a new database with a point feature containing 2 records'''
def mkptdb():
    drv=ogr.GetDriverByName('SQLite')
    if os.path.exists('test.sqlite'):
        os.remove('test.sqlite')
    ds=drv.CreateDataSource('test.sqlite',options=['SPATIALITE=yes'])
    lyr=ds.CreateLayer('test',None,ogr.wkbPoint25D)
    flddef=ogr.FieldDefn('Name',ogr.OFTString)
    flddef.SetWidth(32)
    lyr.CreateField(flddef)
    flddef=ogr.FieldDefn('newfld',ogr.OFTString)
    flddef.SetWidth(32)
    lyr.CreateField(flddef)

    feat=ogr.Feature(lyr.GetLayerDefn())
    feat.SetField('Name','george')
    pt=ogr.Geometry(ogr.wkbPoint)
    pt.AddPoint(150000,48375999)
    feat.SetGeometry(pt)
    lyr.CreateFeature(feat)

    feat=ogr.Feature(lyr.GetLayerDefn())
    feat.SetField('Name','fred')
    pt=ogr.Geometry(ogr.wkbPoint)
    pt.AddPoint(150050,48376005)
    feat.SetGeometry(pt)
    lyr.CreateFeature(feat)

    feat.Destroy()
    ds=None

'''function to update one of the existing fields - this is the part that loops forever'''
def updatePt():
    print 'updating...'
    drv=ogr.GetDriverByName('SQLite')
    ds=drv.Open('test.sqlite',True)
    lyr=ds.GetLayerByName('test')
    for feat in lyr:
        s=feat.GetField('name')
        print s
        feat.SetField('newfld','hi')
        lyr.SetFeature(feat) #continuous loop stops if this is commented out
        feat.Destroy()

como se indicó anteriormente - si comento la línea 'lyr.SetFeature(feat)' - el bucle infinito termina y la característica se incrementará como se esperaba. pero sin esa línea, el valor del campo no se actualiza.

¿pensamientos? python 2.7.6, gdal 1.10.1 (acabo de notar que podría haber una actualización aquí a 1.11.05, lo comprobaré). EDIT: actualizado a gdal 1.11.0 - mismo problema de bucle infinito.

1voto

znq Puntos 143

¿quizás no sea tanto una respuesta como una solución? No estoy seguro de lo que ocurre con GetNextFeature junto con SetFeature, pero no itera como se espera. (¿un error?) la siguiente solución parece funcionar - obteniendo primero una lista de todos los FID de las características - y luego usando GetFeature() en un nuevo bucle.

def updatePt():
    print 'updating...'
    drv=ogr.GetDriverByName('SQLite')
    ds=drv.Open('test.sqlite',True)
    lyr=ds.GetLayerByName('test')
    id=[]
    for f in lyr:
        id.append(f.GetFID())
    for i in id:
        feat=lyr.GetFeature(i)
        feat.SetField('newfld','last1')
        lyr.SetFeature(feat)
        print feat.GetField('name'),feat.GetField('newfld')

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X