Recursos de geração de plug-in de processamento QGIS com atributos

Oct 22 2020

Estou escrevendo um plugin de processamento QGIS que cria uma camada de feição de ponto. Consigo adicionar pontos à camada de feição muito bem, mas os atributos que adiciono não aparecem na Tabela de Atributos depois que executo o plug-in. A Tabela de Atributos mostra os campos corretos, mas estão todos vazios. Como eu preencho a tabela de atributos do meu plugin de processamento?

Alguns trechos para dar uma ideia do que tenho agora (do meu 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, :]))

Respostas

1 PKing Oct 22 2020 at 04:24

Eu acredito que o corvus está correto, ao definir os atributos depois de adicionar o recurso você está atualizando a variável feat, não a cópia do que foi adicionado ao coletor

Eu tentaria algo como:

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

Meu professor entrou em contato com um colega que sugeriu que o problema era com o tipo de dados. Alterei o código de atribuição para este e resolveu o 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)