QGIS Processing Plugin Generieren von Features mit Attributen

Oct 22 2020

Ich schreibe ein QGIS-Verarbeitungs-Plugin, das einen Punkt-Feature-Layer erstellt. Ich kann dem Feature-Layer problemlos Punkte hinzufügen, aber die Attribute, die ich hinzufüge, werden nach dem Ausführen des Plugins nicht in der Attributtabelle angezeigt. Die Attributtabelle zeigt die richtigen Felder, aber sie sind alle leer. Wie fülle ich die Attributtabelle aus meinem Verarbeitungs-Plugin aus?

Einige Ausschnitte, um Ihnen eine Vorstellung davon zu geben, was ich jetzt habe (von meiner processAlgorithmMethode):

field_name = self.parameterAsString(parameters, self.FIELD_NAME_INPUT, context)
attrs = ['row', 'col', field_name]
out_fields = QgsFields()
# x and y indexes
out_fields.append(QgsField(name=attrs[0], type=QVariant.Int))
out_fields.append(QgsField(name=attrs[1], type=QVariant.Int))
out_fields.append(QgsField(name=attrs[2], type=QVariant.Double))

(self._sink, dest_id) = self.parameterAsSink(
       parameters,
       self.OUTPUT,
       context,
       fields=out_fields,
       geometryType=QgsWkbTypes.Point,
       crs=self._bound_box.crs())


attr_vals = np.array([[*coords, randint(1, 5)] for coords in self._defined_points])
# set output field values
for i in range(attr_vals.shape[0]):
    coords = tuple(attr_vals[i, 0:2])
    pin = self._defined_points[coords]
    feat = QgsFeature(id=i
    # this bit works fine
    feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(*pin.geoCoords()))) 
    self._sink.addFeature(feat)
    # the place where I'm trying to assign the attributes
    feat.setAttributes(list(attr_vals[i, :]))

Antworten

1 PKing Oct 22 2020 at 04:24

Ich glaube, Corvus ist korrekt, indem Sie die Attribute festlegen, nachdem Sie die Funktion hinzugefügt haben, aktualisieren Sie die Variable feat, nicht die Kopie derjenigen, die der Senke hinzugefügt wurde

Ich würde so etwas versuchen wie:

feat = QgsFeature()
feat.setGeometry(...
feat.setAttributes(...
self._sink.addFeature(feat)
1 JoshuaEvans Oct 22 2020 at 23:14

Mein Professor nahm Kontakt mit einem Kollegen auf, der vorschlug, dass das Problem mit dem Datentyp zusammenhängt. Ich habe den Zuweisungscode in diesen geändert und das Problem wurde behoben:

attr_vals = np.array([[*coords, QVariant(randint(1, 5))] for coords in self._defined_points])
# set output field values
for i in range(attr_vals.shape[0]):  # if you're concerned, the order here does NOT matter
    coords = tuple(attr_vals[i, 0:2])
    pin = self._defined_points[coords]
    feat = QgsFeature(id=i)
            
    feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(*pin.geoCoords())))
    feat.setAttributes(list(attr_vals[i, :]))
    self._sink.addFeature(feat)