Estoy utilizando el siguiente código con el algoritmo de procesamiento "Aggregate" para encontrar polígonos vecinos de algunas características seleccionadas en una capa de polígonos:
from qgis.core import QgsProcessing
from qgis.core import QgsProcessingAlgorithm
from qgis.core import QgsProcessingMultiStepFeedback
from qgis.core import QgsProcessingParameterVectorLayer
from qgis.core import QgsProcessingParameterFeatureSink
import processing
class DissolveAdjacentPolygons(QgsProcessingAlgorithm):
def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterVectorLayer('Inputpolygonlayer', 'Input polygon layer', types=[QgsProcessing.TypeVectorPolygon], defaultValue=None))
self.addParameter(QgsProcessingParameterFeatureSink('Agg', 'Agg', type=QgsProcessing.TypeVectorAnyGeometry, createByDefault=True, supportsAppend=True, defaultValue=None))
self.addParameter(QgsProcessingParameterFeatureSink('Fixed', 'Fixed', type=QgsProcessing.TypeVectorAnyGeometry, createByDefault=True, supportsAppend=True, defaultValue=None))
def processAlgorithm(self, parameters, context, model_feedback):
# Use a multi-step feedback, so that individual child algorithm progress reports are adjusted for the
# overall progress through the model
feedback = QgsProcessingMultiStepFeedback(2, model_feedback)
results = {}
outputs = {}
# Fix geometries
alg_params = {
'INPUT': parameters['Inputpolygonlayer'],
'OUTPUT': parameters['Fixed']
}
outputs['FixGeometries'] = processing.run('native:fixgeometries', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
results['Fixed'] = outputs['FixGeometries']['OUTPUT']
feedback.setCurrentStep(1)
if feedback.isCanceled():
return {}
# Field calculator
alg_params = {
'FIELD_LENGTH': 250,
'FIELD_NAME': 'Z930',
'FIELD_PRECISION': 0,
'FIELD_TYPE': 2,
'FORMULA': 'aggregate(\r\n layer:= \'Layer_name\',\r\n aggregate:=\'concatenate\',\r\n expression:=to_string(\"ZIPCODE\"),\r\n concatenator:=\', \',\r\n filter:=intersects($geometry, geometry()),order_by:=$area\r\n )',
'INPUT': outputs['FixGeometries']['OUTPUT'],
'OUTPUT': parameters['Agg']
}
outputs['FieldCalculator'] = processing.run('native:fieldcalculator', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
results['Agg'] = outputs['FieldCalculator']['OUTPUT']
return results
def name(self):
return 'Dissolve adjacent polygons'
def displayName(self):
return 'Dissolve adjacent polygons'
def group(self):
return 'Dissolve'
def groupId(self):
return 'Dissolve'
def createInstance(self):
return DissolveAdjacentPolygons()
Esto funciona bien, agrega datos basados en el campo "ZIPCODE" en el campo "Z930", y ordena los resultados por área de características. El problema con la fórmula en el algoritmo de la calculadora de campos, es que el nombre de la capa (layer:= 'Layer_name') se refiere a una capa existente en la TOC, pero necesito encontrar una manera de relacionar este 'Layer_name' con la salida del algoritmo de la calculadora de campos. native:fixgeometries
utilizado anteriormente. ¿Cómo puedo hacerlo?