Simplifique las tareas repetitivas en QGIS Graphical Modeler

13

ingrese la descripción de la imagen aquí

¿Existen iteradores que se puedan usar en el modelador gráfico QGIS para simplificar el modelo que se muestra arriba? Si no, ¿hay alguna forma mejor de simplificar el modelo?

La primera columna representa mis capas de entrada, la segunda columna es la intersección, la tercera columna es la salida de la operación "intersección", la cuarta columna es la operación "atributo de unión por ubicación" y la quinta columna es el resultado de la operación de unión.

Me gustaría realizar operaciones de "intersección" y "unir atributo por ubicación" para un análisis de cuencas hidrográficas. El objetivo es calcular parámetros morfométricos lineales como la longitud total y media de flujos de diferentes órdenes, relaciones de flujo y relación de bifurcación.

El primer paso es intersectar las "corrientes de Order1" con la cuenca hidrográfica, y luego intersectar las "corrientes de Order2" con la misma cuenca hidrográfica. Si se proporciona un archivo de forma "stream de order3", entonces se debe realizar la intersección para esta nueva capa. Por lo tanto, solo las "corrientes de orden1" y las "corrientes de orden2" son obligatorias, el resto depende de la capa de cuenca proporcionada. Por ejemplo, si la cuenca hidrográfica es una cuenca hidrográfica de orden 4, entonces las corrientes requeridas son hasta "corrientes de orden 4".

Una vez que se completa la intersección para todas las capas de entrada disponibles, se unen por ubicación a la cuenca con las opciones para obtener la suma y la media de las corrientes intersectadas.

La imagen muestra el procedimiento correcto. Si hago la operación fuera del modelador, los resultados son correctos. Cuando ejecuto el modelo me sale este error.

"Error al ejecutar el algoritmo Order5_plus_wshed 'NoneType' El objeto no tiene el atributo 'dataProvider'".

Esto ocurre si no he proporcionado una entrada para uno de los parámetros opcionales (es decir, las entradas, por ejemplo, "streams de order4"). Sin embargo, si proporciono todas las entradas obtengo los resultados que necesito.

Por lo tanto, me gustaría preguntar si hay una mejor manera de configurar esta tarea.

DennisTG
fuente

Respuestas:

12

La forma en que configuraría su tarea sería crear un script personalizado que brinde una mayor flexibilidad que el modelador, pero que aún pueda proporcionar una interfaz similar a sus usuarios. Puedes crear uno desde:

Caja de herramientas de procesamiento> Scripts> Herramientas> Crear nuevo script

Luego copie / pegue el script a continuación y guárdelo C:/Users/You/.qgis2/processing/scripts.

El siguiente script intenta emular lo que hace su modelo. El script no es una solución final (especialmente porque los parámetros que utilicé para el atributo Intersection and Join por ubicación pueden diferir de lo que definiste), pero espero que puedas usarlo como plantilla para expandir y mejorar el script para satisfacer tus necesidades. . Para ejecutarlo, simplemente selecciónelo de la Caja de herramientas de procesamiento después de que se haya guardado.

Creo que el guión hace lo que pediste:

  • Los dos primeros pedidos son obligatorios, por lo que se procesarán.

  • IF Las declaraciones se utilizan para garantizar que las órdenes subsiguientes solo se procesarán si la correcta la precede (por ejemplo, order4 solo se ejecutará si se ha seleccionado order3).

  • Además, los mensajes se imprimen en la Consola Python que muestran qué pedidos se están procesando.


##Example model=name
##Order1=vector
##Order2=vector
##Order3=optional vector
##Order4=optional vector
##Order5=optional vector
##Watershed=vector
##Order2_Wshed=output vector
##Order3_Wshed=output vector
##Order4_Wshed=output vector
##Order5_Wshed=output vector

order1 = processing.getObject(Order1)
order2 = processing.getObject(Order2)
order3 = processing.getObject(Order3)
order4 = processing.getObject(Order4)
order5 = processing.getObject(Order5)
watershed = processing.getObject(Watershed)

if Order3 is None:
    print 'Processing Order1 and Order2'
else:
    print 'Processing Order1, Order2 and Order3'
    if Order4 is not None:
        print 'Processing Order1, Order2, Order3 and Order4'
        if Order5 is not None:
            print 'Processing Order1, Order2, Order3, Order4 and Order5'

output_1a = processing.runalg("qgis:intersection", order1, watershed, None)
output_1b = processing.runalg("qgis:joinattributesbylocation", output_1a['OUTPUT'], watershed, u'intersects', 0, 0, '', 0, None)
output_2a = processing.runalg("qgis:intersection", order2, watershed, None)
output_2b = processing.runalg("qgis:joinattributesbylocation", output_2a['OUTPUT'], output_1b['OUTPUT'], u'intersects', 0, 0, '', 0, Order2_Wshed)

if Order3 is None:
    pass
else:
    output_3a = processing.runalg("qgis:intersection", order3, watershed, None)
    output_3b = processing.runalg("qgis:joinattributesbylocation", output_3a['OUTPUT'], output_2b['OUTPUT'], u'intersects', 0, 0, '', 0, Order3_Wshed)
    if Order4 is None:
        pass
    else:
        output_4a = processing.runalg("qgis:intersection", order4, watershed, None)
        output_4b = processing.runalg("qgis:joinattributesbylocation", output_4a['OUTPUT'], output_3b['OUTPUT'], u'intersects', 0, 0, '', 0, Order4_Wshed)
        if Order5 is None:
            pass
        else:
            output_5a = processing.runalg("qgis:intersection", order5, watershed, None)
            output_5b = processing.runalg("qgis:joinattributesbylocation", output_5a['OUTPUT'], output_4b['OUTPUT'], u'intersects', 0, 1, 'sum, mean', 0, Order5_Wshed)

A continuación se muestra una captura de pantalla de la interfaz cuando se ejecuta el script (que debería ser similar a cuando ejecuta su modelo):

Ejecución de script

Pocas cosas a tener en cuenta:

  • El cuadro rojo contiene parámetros obligatorios

  • El recuadro verde contiene parámetros opcionales.

  • El cuadro azul contiene parámetros obligatorios

  • El cuadro negro contiene parámetros opcionales para generar resultados. La secuencia de comandos solo generará capas si se selecciona el orden asociado (por ejemplo, si la entrada para order5 no está seleccionada pero la salida sí, se producirá un error). Por lo tanto, el usuario debe seleccionar las entradas y las salidas relevantes. Esto no fue intencional, pero personalmente creo que es una buena manera de obligar al usuario a verificar los parámetros cuidadosamente.


Usé QGIS 2.12.3 (con el complemento de procesamiento versión 2.12.2).

José
fuente
2
En un reciente podcast de QGIS tenían al creador del procesamiento, y él dijo que debido a la forma en que fue construido no se podía agregar un iterador directamente en el generador de modelos ahora. Se requeriría una amplia reescritura para agregar. Entonces, un script personalizado es definitivamente la forma de hacerlo por ahora.
HeikkiVesanto
@Vesanto - Eso es muy interesante, gracias por incluir eso. ¿Tienes un enlace a este podcast en particular?
Joseph
1
@DennisTG - Disculpas amigo, debería haber mencionado en mi publicación que usé QGIS 2.12.3 (con el complemento de procesamiento versión 2.12.2).
Joseph
1
@ Joseph, funciona para mí. Muy perspicaz, agradezco la ayuda.
DennisTG