2 votos

PyQGIS: Función agregada utilizada con la calculadora de campo

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?

0voto

Nick Puntos 68

Utilice @layer en lugar de \'Layer_name\' en la expresión.

@layer es el nombre de la variable de la capa actual que la aplicación Field Calculator se aplica sobre.

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