Simplifique tarefas repetitivas no QGIS Graphical Modeler

13

insira a descrição da imagem aqui

Existem iteradores que podem ser usados ​​no modelador gráfico do QGIS para simplificar o modelo mostrado acima. Caso contrário, existe alguma maneira melhor de simplificar o modelo?

A primeira coluna representa minhas camadas de entrada, a segunda coluna é a interseção, a terceira coluna é a saída da operação "interseção", a quarta coluna é a operação "juntar atributo por local" e a quinta coluna é o resultado da operação de junção.

Eu gostaria de realizar operações de "interseção" e "juntar atributo por local" para uma análise de bacia hidrográfica. O objetivo é calcular parâmetros morfométricos lineares, como o comprimento total e médio de fluxos de diferentes ordens, taxas de fluxo e taxa de bifurcação.

O primeiro passo é interceptar "fluxos de ordem1" com a bacia hidrográfica e, em seguida, interceptar os "fluxos de ordem2" com a mesma bacia. Se houver um shapefile "order3 stream" fornecido, a interseção para essa nova camada deverá ser realizada. Portanto, apenas "fluxos de pedidos1" e "fluxos de pedidos2" são obrigatórios, o restante depende da camada de bacia hidrográfica fornecida. Por exemplo, se a bacia hidrográfica é uma bacia hidrográfica de ordem 4, os fluxos necessários são de "ordem4 fluxos".

Depois que a interseção é concluída para todas as camadas de entrada disponíveis, elas são unidas por local na bacia hidrográfica com as opções para obter a soma e a média dos fluxos cruzados.

A imagem mostra o procedimento correto. Se eu fizer a operação fora do modelador, os resultados estão corretos. Quando executo o modelo, recebo esse erro.

"Erro ao executar o objeto 'NoneType' do algoritmo Order5_plus_wshed não tem atributo 'dataProvider'".

Isso ocorre se eu não tiver fornecido uma entrada para um dos parâmetros opcionais (por exemplo, as entradas, por exemplo, "order4 streams"). No entanto, se eu fornecer todas as entradas, obtenho os resultados necessários.

Então, gostaria de perguntar se existe uma maneira melhor de configurar esta tarefa.

DennisTG
fonte

Respostas:

12

A maneira como eu configuraria sua tarefa seria criar um script personalizado que ofereça maior flexibilidade do que o modelador, mas ainda possa fornecer uma interface semelhante aos seus usuários. Você pode criar um de:

Caixa de ferramentas de processamento> Scripts> Ferramentas> Criar novo script

Em seguida, copie / cole o script abaixo e salve-o no C:/Users/You/.qgis2/processing/scripts.

O script abaixo tenta emular o que o seu modelo faz. O script não é uma solução final (especialmente porque os paramaters que eu usei para o atributo Intersection and Join por ferramentas de localização podem diferir do que você definiu), mas espero que você possa usá-lo como modelo para expandir e aprimorar o script para atender às suas necessidades . Para executá-lo, basta selecioná-lo na caixa de ferramentas de processamento após ser salvo.

Eu acho que o script faz o que você pediu:

  • Os dois primeiros pedidos são obrigatórios, portanto serão processados.

  • IF As instruções são usadas para garantir que quaisquer pedidos subsequentes sejam processados ​​apenas se o correto os preceder (por exemplo, o order4 será executado apenas se o order3 tiver sido selecionado).

  • Além disso, as mensagens são impressas no Python Console, mostrando quais pedidos estão sendo processados.


##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)

Abaixo está uma captura de tela da interface ao executar o script (que deve ser semelhante a quando você executa seu modelo):

Script em execução

Algumas coisas a serem observadas:

  • A caixa vermelha contém parâmetros obrigatórios

  • A caixa verde contém parâmetros opcionais

  • Caixa azul contém parâmetro obrigatório

  • A caixa preta contém parâmetros opcionais para gerar resultados. O script só produzirá camadas se a ordem associada for selecionada (por exemplo, se a entrada da ordem5 não estiver selecionada, mas a saída for, um erro ocorrerá). Portanto, o usuário deve selecionar as entradas e as saídas relevantes. Isso não foi intencional, mas pessoalmente acho que é uma boa maneira de forçar o usuário a verificar os parâmetros cuidadosamente.


Eu usei o QGIS 2.12.3 (com o plugin Processing versão 2.12.2).

Joseph
fonte
2
Em um podcast recente do QGIS, eles criaram o processamento e ele disse que, devido à maneira como foi construído, não era possível adicionar um iterador diretamente no construtor de modelos agora. Seria necessário uma reescrita extensa para adicionar. Portanto, um script personalizado é definitivamente a maneira de fazê-lo por enquanto.
HeikkiVesanto 26/01
@ Vesanto - Isso é muito interessante, obrigado por incluir isso. Você tem um link para este podcast em particular?
Joseph
1
@DennisTG - Desculpa amigo, eu deveria ter mencionado no meu post que usei o QGIS 2.12.3 (com o plugin de processamento versão 2.12.2).
Joseph
1
@ Joseph, funciona para mim. Bastante perspicaz, agradeço a ajuda.
DennisTG