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: a esto, ya no tiene la opción de especificar la capa de salida:
La ejecución del script también hace que QGIS se bloquee :/