2 votos

Hacer que las capas de polígonos tengan siempre campos de área en QGIS

Estoy haciendo triángulos de Delaunay de varias (más de 40) combinaciones de puntos y es muy tedioso sacar nuevos shapefiles para cada combinación sin tener ni siquiera el área de los triángulos por defecto, que es lo que más me interesa.

¿Existe algún modo de crear un campo de área por defecto para todos los polígonos nuevos y, además, puedo utilizar herramientas como la triangulación de Delaunay para añadir nuevos polígonos a un archivo shape sin tener que crear nuevos archivos shape cada vez?

6voto

chhh Puntos 1154

Para proponer otro método que no implica ninguna codificación: puedes crear un modelo. Probablemente sea más fácil de entender si no estás acostumbrado a Python. Sin embargo, puede exportar el Modelo creado de esta manera como un script de Python.

Ir a Menu Processing / Graphical Modeler… para crear un nuevo modelo.

  1. En la pestaña Entrada, seleccione Características vectoriales y asígnele un nombre, digamos Puntos de entrada.
  2. Ir a la algorithm tab Buscar y añadir Delaunay Triangulation y como capa de entrada, cambie el símbolo de la izquierda por Model Input (el símbolo con las tres ruedas dentadas) y seleccione la capa Input points de la 1, ver:

enter image description here

  1. De nuevo en el algorithm tab busque la calculadora de campos en rellene los campos según corresponda, véase la captura de pantalla. En la parte inferior, se ve la expresión utilizada $area - puede cambiarlo por cualquier expresión que desee utilizar, por ejemplo area($geometry) :

enter image description here

  1. Su Modelo ahora debería verse como en la siguiente captura de pantalla. Guárdelo en su proyecto o en algún lugar de su máquina:

enter image description here

  1. Ahora puede ejecutar el modelo en modo batch (como se describe en la solución por @MrXsquared), la elección de todos los puntos de capa que tiene como entrada. Se creará una nueva salida con triángulos delaunay, incluyendo un campo para el área.

Vea aquí una posibilidad para seleccionar automáticamente varios archivos a la vez: use autocompletar, defina un patrón de archivos (sólo *.gpkg si quiere seleccionar todos los archivos Geopackage de una carpeta), seleccione la carpeta, pulse buscar archivos y verá una vista previa de los archivos encontrados. Puedes añadirlos pulsando OK.

enter image description here

  1. Sólo para ver y comparar con la solución de @BERA, exporté mi modelo como script de Python - esto es lo que obtengo:

    """
    Model exported as python.
    Name : fi
    Group : 
    With QGIS : 31600
    """
    
    from qgis.core import QgsProcessing
    from qgis.core import QgsProcessingAlgorithm
    from qgis.core import QgsProcessingMultiStepFeedback
    from qgis.core import QgsProcessingParameterFeatureSource
    from qgis.core import QgsProcessingParameterFeatureSink
    import processing
    
    class Fi(QgsProcessingAlgorithm):
    
        def initAlgorithm(self, config=None):
            self.addParameter(QgsProcessingParameterFeatureSource('InputPoints', 'Input Points', types=[QgsProcessing.TypeVectorPoint], defaultValue=None))
            self.addParameter(QgsProcessingParameterFeatureSink('_out', '_out', 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 = {}
    
            # Delaunay-Triangulation
            alg_params = {
                'INPUT': parameters['InputPoints'],
                'OUTPUT': QgsProcessing.TEMPORARY_OUTPUT
            }
            outputs['Delaunaytriangulation'] = processing.run('qgis:delaunaytriangulation', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
    
            feedback.setCurrentStep(1)
            if feedback.isCanceled():
                return {}
    
            # Feldrechner
            alg_params = {
                'FIELD_LENGTH': 20,
                'FIELD_NAME': 'area',
                'FIELD_PRECISION': 10,
                'FIELD_TYPE': 0,
                'FORMULA': '$area',
                'INPUT': outputs['Delaunaytriangulation']['OUTPUT'],
                'OUTPUT': parameters['_out']
            }
            outputs['Feldrechner'] = processing.run('native:fieldcalculator', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
            results['_out'] = outputs['Feldrechner']['OUTPUT']
            return results
    
        def name(self):
            return 'fi'
    
        def displayName(self):
            return 'fi'
    
        def group(self):
            return ''
    
        def groupId(self):
            return ''
    
        def createInstance(self):
            return Fi()

5voto

Anton8000 Puntos 165

Puedes usar pyqgis. El siguiente script añadirá y calculará un campo llamado area . Si tiene muchas capas es posible modificar el código y procesarlas todas a la vez. Tendrá que volver a ejecutar el cálculo del área si edita/modifica los polígonos, por lo que no es totalmente automático.

lyr = QgsProject.instance().mapLayersByName('Delaunay triangulation')[0] #Change to match your layername
newFieldName = 'area' #Name of new field that is created and calculated

#Add a field. Skip this part if you are recalculating area
pr = lyr.dataProvider()
newfield = QgsField(name=newFieldName, type=6)
pr.addAttributes([newfield])
lyr.updateFields()

#Calculate area
fieldindex = lyr.fields().indexFromName(newFieldName) #Find index of new field
attrMap = {f.id() : {fieldindex : round(f.geometry().area(), 2)} for f in lyr.getFeatures()} #Dictionary of dictionaries: {feature id : {fieldindex : geometry area}, ... }
lyr.dataProvider().changeAttributeValues(attrMap) #Update all features/rows with area

enter image description here

5voto

matzeri Puntos 176

Por defecto no sé, debe ser al menos un poco más complicado si cabe supongo.

Pero puede ejecutar "Añadir atributos de geometría" como un proceso por lotes y aplicarlo a todos sus archivos. Inícielo desde la caja de herramientas de procesamiento y haga clic en "Ejecutar como lote":

enter image description here

Aquí puede añadir sus archivos / capas. Dependiendo de su versión de QGIS muy conveniente mediante la adición de carpetas enteras, archivos que comienzan con un carácter especial, todos los archivos abiertos, ...

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