6 votos

Construyendo un script de QGIS 3.10 sin una capa de salida

Así que he leído sobre los scripts de procesamiento que se pueden hacer en QGIS 3. Sin embargo, parece que no hay forma de modificar directamente una capa y en su lugar tengo que tener una capa de salida, lo cual no quiero.

Si revisas en https://github.com/qgis/QGIS-Enhancement-Proposals/issues/134, dicen que

es mejor tener al menos uno de salida siempre definido para evitar algoritmos de caja negra si no se configura ninguno. Si no se define una salida, lanzará una excepción.

El problema que tengo con eso es porque el módulo en el que estoy trabajando ahora solo agrega campos y cambia valores en la tabla de atributos. La capa de salida que crearía necesitaría ser eliminada inmediatamente después porque no habría nada en ella.

Todo lo que quiero es la capa de entrada y hacer mis cambios dentro de esa capa, la salida es un obstáculo. Si de hecho no hay forma de no tener una salida me gustaría saber si hay una forma de que la salida sea solo un registro, por ejemplo, o algo así de esa manera al menos podría ser de alguna utilidad.

6voto

nitinsavant Puntos 6

Debes usar QgsProcessingParameterVectorLayer como entrada en el método initAlgorithm y usar self.parameterAsVectorLayer para obtener la referencia de la capa en el método processAlgorithm. Luego puedes usar los métodos y propiedades de la clase QgsVectorLayer.

Este es un script de ejemplo que obtiene una capa vectorial especificada, agrega/popula un campo y devuelve la capa en sí misma.

from PyQt5.QtCore import QCoreApplication
from qgis.core import (QgsField,
                       QgsProcessingAlgorithm,
                       QgsProcessingParameterVectorLayer)

class TestAlgorithm(QgsProcessingAlgorithm):
    INPUT = 'INPUT'

    def initAlgorithm(self, config=None):
        self.addParameter(QgsProcessingParameterVectorLayer(self.INPUT, self.tr('Capa de entrada')))

    def processAlgorithm(self, parameters, context, feedback):
        input_layer = self.parameterAsVectorLayer(parameters, self.INPUT, context)

        ### PROCESO ###
        input_layer.startEditing()
        input_layer.addAttribute(QgsField("Campo_Prueba", 10, len=50)) # 10: Tipo Cadena
        for feature in input_layer.getFeatures():
            feature["Campo_Prueba"] = "PRUEBA"
            input_layer.updateFeature(feature)
        input_layer.commitChanges()
        ###############

        return {"SALIDA": input_layer.id()}

    def tr(self, string):
        return QCoreApplication.translate('Processing', string)

    def createInstance(self):
        return TestAlgorithm()

    def name(self):
        return 'prueba'

    def displayName(self):
        return self.tr('Prueba')

    def group(self):
        return self.tr('Scripts de Ejemplo')

    def groupId(self):
        return 'scripts_ejemplo'

    def shortHelpString(self):
        return self.tr('')

No estoy seguro si este es el mejor enfoque.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X