4 votos

La capa de salida del script de procesamiento de PyQGIS 3 está vacía

He creado un script de procesamiento en QGIS 3, y aunque mi capa de salida tiene muestra un recuento de características mayor que cero cuando se utiliza el comando de retroalimentación, la capa de características resultante que aparece en QGIS no tiene características. ¿Qué estoy haciendo mal?

# -*- coding: utf-8 -*-
##source_layer=vector
##output_layer=output vector

from PyQt5.QtCore import QCoreApplication
from qgis.core import (QgsProcessing,
                       QgsFeatureSink,
                       QgsProcessingException,
                       QgsProcessingAlgorithm,
                       QgsProcessingParameterFeatureSource,
                       QgsProcessingParameterFeatureSink)
import processing

class ExampleProcessingAlgorithm(QgsProcessingAlgorithm):

    INPUT = 'INPUT'
    OUTPUT = 'OUTPUT'

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

    def createInstance(self):
        return ExampleProcessingAlgorithm()

    def name(self):
        return 'myscript'

    def displayName(self):
        return self.tr('My Script')

    def group(self):
        return self.tr('Example scripts')

    def groupId(self):
        return 'examplescripts'

    def shortHelpString(self):
        return self.tr("Example algorithm short description")

    def initAlgorithm(self, config=None):
        self.addParameter(
            QgsProcessingParameterFeatureSource(
                self.INPUT,
                self.tr('Input layer'),
                [QgsProcessing.TypeVectorAnyGeometry]
            )
        )

        self.addParameter(
            QgsProcessingParameterFeatureSink(
                self.OUTPUT,
                self.tr('Output layer')
            )
        )

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

        if source is None:
            raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))

        (sink, dest_id) = self.parameterAsSink(
            parameters,
            self.OUTPUT,
            context,
            source.fields(),
            source.wkbType(),
            source.sourceCrs()
        )

        feedback.pushInfo('CRS is {}'.format(source.sourceCrs().authid()))

        if sink is None:
            raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))

        sink=processing.run("native:buffer", {
            'INPUT': source,
            'DISTANCE': -4.0,
            'SEGMENTS': 5,
            'END_CAP_STYLE': 0,
            'JOIN_STYLE': 0,
            'MITER_LIMIT': 2,
            'DISSOLVE': False,
            'OUTPUT': 'memory:'
        }, context=context, feedback=feedback)['OUTPUT']

        feedback.pushInfo('sink output number of features is {}'.format(sink.featureCount()))

        results = {}
        results[self.OUTPUT] = sink
        return results

Posteriormente, he probado a cambiar la última sección por:

    bufferedLayer=processing.run("native:buffer", {
        'INPUT': source,
        'DISTANCE': -4.0,
        'SEGMENTS': 5,
        'END_CAP_STYLE': 0,
        'JOIN_STYLE': 0,
        'MITER_LIMIT': 2,
        'DISSOLVE': False,
        'OUTPUT': parameters['OUTPUT']
    }, context=context, feedback=feedback)['OUTPUT']
    feedback.pushInfo('sink output number of features is {}'.format(bufferedLayer.featureCount()))

    return {self.OUTPUT: bufferedLayer}

La función abajo da el da un error cuando se ejecuta. Aquí está el registro de salida de la función:

Algoritmo de procesamiento
Algoritmo 'My Script' empezando
Parámetros de entrada:
{'INPUT':'C:/GIS/VBS/map_nsc_geotypical_ne_europe/map_nsc_geotypical_ne_europe_shared/source/multimap/tiles_3x3/mapframes/gce_3x3_001_001.shp', 'OUTPUT' : 'memory:' }
CRS es EPSG:32634
Resultados: {'OUTPUT': 'output_7cd8f3b7_6e2b_457b_be6b_da9c71439756'} El número de características de salida del fregadero es 1 La ejecución se ha completado en 0,03 segundos Resultados: {'OUTPUT': }

Carga de las capas resultantes
The following layers were not correctly generated.<ul><li>output_7cd8f3b7_6e2b_457b_be6b_da9c71439756</li></ul>You can check the 'Log Messages Panel' in QGIS main window to find more information about the execution of the algorithm.

He intentado seguir la sugerencia de Jochen de utilizar una salida en lugar de un parámetro. Al hacer esto la ventana del script cambia de esta manera: enter image description here a esto, ya no tiene la opción de especificar la capa de salida: enter image description here

La ejecución del script también hace que QGIS se bloquee :/

7voto

DBM Puntos 51

Después de investigar un poco he encontrado que el problema clave parece ser que primero se define sink

(sink, dest_id) = self.parameterAsSink( ...

y posteriormente sobrescribirlo con el resultado de processing.run...

sink=processing.run("native:buffer", { ...

He probado lo siguiente, que me ha funcionado:

#create a temporary layer as a processing result
lyr = processing.run("native:buffer", {
        'INPUT': source,
        'DISTANCE': 40,
        'SEGMENTS': 5,
        'END_CAP_STYLE': 0,
        'JOIN_STYLE': 0,
        'MITER_LIMIT': 2,
        'DISSOLVE': False,
        'OUTPUT': 'memory:'
    }, context=context, feedback=feedback)['OUTPUT']

    feedback.pushInfo('sink output number of features is {}'.format(lyr.featureCount()))

# and then copy the content of the temporary processing result into the output sink    
for f in lyr.getFeatures():
    sink.addFeature(f)

Tenga en cuenta que cuando se define el sumidero de salida de la siguiente manera

(sink, dest_id) = self.parameterAsSink(
        parameters,
        self.OUTPUT,
        context,
        source.fields(),
        source.wkbType(),
        source.sourceCrs()
    )

se limita al tipo de geometría de la capa de origen ( source.wkbType() ), lo que puede causar problemas (crash) cuando se trata de amortiguar, por ejemplo, una capa de puntos.

Pero con las ligeras alteraciones mencionadas tu script funciona:

enter image description here

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