Complemento de procesamiento QGIS que genera funciones con atributos
Estoy escribiendo un complemento de procesamiento QGIS que crea una capa de características puntuales. Puedo agregar puntos a la capa de entidades sin problemas, pero los atributos que agrego no aparecen en la Tabla de atributos después de ejecutar el complemento. La tabla de atributos muestra los campos correctos, pero todos están vacíos. ¿Cómo completo la tabla de atributos de mi complemento de procesamiento?
Algunos fragmentos para darte una idea de lo que tengo ahora (de mi processAlgorithmmétodo):
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, :]))
Respuestas
Creo que corvus es correcto, al establecer los atributos después de haber agregado la función, está actualizando la variable dote, no la copia de lo que se agregó al fregadero.
Probaría algo como:
feat = QgsFeature()
feat.setGeometry(...
feat.setAttributes(...
self._sink.addFeature(feat)
Mi profesor se puso en contacto con un colega que sugirió que el problema estaba en el tipo de datos. Cambié el código de asignación a esto y resolvió el problema:
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)