QGIS Processing Plugin Generieren von Features mit Attributen
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
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)
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)