Feld hinzufügen und Ausdruck mit PyQGIS berechnen?

10

Ich möchte PyQGIS verwenden, um ein neues Feld hinzuzufügen und die Werte für jedes Feature zu berechnen. Ähnlich wie bei der Option "Feldrechner".

Mein 'Feldrechner'-Ausdruck lautet zum Beispiel: y(start_point($geometry))

from PyQt4.QtCore import QVariant
from qgis.core import QgsField, QgsExpression, QgsFeature
vl = iface.activeLayer()

vl.startEditing()

#step 1
myField = QgsField( 'myNewColumn', QVariant.Float )
vl.addAttribute( myField )
idx = vl.fieldNameIndex( 'myNewColumn' )

#step 2
e = QgsExpression( 'y(start_point($geometry))' )
e.prepare( vl.pendingFields() )

for f in vl.getFeatures():
    f[idx] = e.evaluate( f )
    vl.updateFeature( f )

vl.commitChanges()

Dies ist der Fehler, den ich bekomme:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/var/folders/0r/q6nxg6w54fv4l7c8gksb2t500000gn/T/tmp9dosIe.py", line 30, in <module>
    f[idx] = e.evaluate( f )
KeyError: '-1'
OHTO
quelle

Antworten:

11

Der Fehler, den Sie erhalten, besagt, dass der Feldindex lautet -1, sodass Ihr neues Feld nicht in Ihrer Attributtabelle gefunden wurde.

Das kann passieren, weil:

  1. Sie müssen QVariant.Doubleanstelle von verwenden QVariant.Float.
  2. Sie haben das neue Feld nicht an den Layer-Anbieter übergeben, bevor Sie nach Ihrem neuen Spaltenindex gefragt haben.
  3. Sie fragen nach dem Index von, myNewColumnaber Ihr Provider kann nur 10 Zeichen für Feldnamen speichern, sodass er gespeichert wurde myNewColum(fehlendes Finale n). (Ist mir gerade passiert, als ich die Antwort ausprobiert habe)

Versuchen Sie stattdessen Folgendes:

#step 1
myField = QgsField( 'newColumn', QVariant.Double )
vl.dataProvider().addAttributes([myField])
vl.updateFields()
idx = vl.fieldNameIndex( 'newColumn' )

Sollte idxjetzt anders sein als -1, können Sie es überprüfen:

if idx != -1:
    print "Field found!"

Übrigens können Sie den #step 1Code aus dem Bearbeitungsblock ausführen.

Germán Carrillo
quelle
1
Nach einigen grundlegenden Tests denke ich, dass es die Zeichenbeschränkung des Feldnamens ist. Natürlich 'x coord' an einen QVariant senden. Es ist auch keine gute Idee, aber kein Fehler, nur schlechte Programmierung. Double sollte da sein. danke
OHTO
Um ehrlich zu sein, ist es das erste Mal, dass ich vor einem solchen Problem stehe. Wie immer gibt Ihnen das zeilenweise Testen Hinweise darauf, was möglicherweise passiert.
Germán Carrillo