Semplifica le attività ripetitive in QGIS Graphical Modeler


13

inserisci qui la descrizione dell'immagine

Esistono iteratori che possono essere utilizzati nel modellatore grafico QGIS per semplificare il modello mostrato sopra. In caso contrario, esiste un modo migliore per semplificare il modello?

La prima colonna rappresenta i miei livelli di input, la seconda colonna è l'intersezione, la terza colonna è l'output dell'operazione "intersezione", la quarta colonna è l'operazione "attributo di unione per posizione" e la quinta colonna è il risultato dell'operazione di unione.

Vorrei effettuare operazioni di "intersezione" e "unisci attributo per posizione" per un'analisi dello spartiacque. L'obiettivo è calcolare i parametri morfometrici lineari come la lunghezza totale e media dei flussi di diversi ordini, rapporti di flusso e rapporto di biforcazione.

Il primo passo è intersecare i "flussi Order1" con lo spartiacque, quindi intersecare i "flussi Order2" con lo stesso spartiacque. Se viene fornito un file di forma "order3 stream", è necessario eseguire l'intersezione per questo nuovo livello. Pertanto, solo "stream order1" e "stream order2" sono obbligatori, il resto dipende dal livello spartiacque fornito. Ad esempio, se lo spartiacque è uno spartiacque di ordine 4, i flussi richiesti sono fino a "stream di ordine4".

Una volta completata l'intersezione per tutti i livelli di input disponibili, vengono quindi uniti per posizione allo spartiacque con le opzioni per ottenere la somma e la media dei flussi intersecati.

L'immagine mostra la procedura corretta. Se eseguo l'operazione al di fuori del modellatore, i risultati sono corretti. Quando eseguo il modello ottengo questo errore.

"Errore nell'esecuzione dell'algoritmo Order5_plus_wshed L'oggetto 'NoneType' non ha attributo 'dataProvider'".

Ciò si verifica se non ho fornito un input per uno dei parametri opzionali (ovvero gli input, ad esempio "stream order4"). Tuttavia, se fornisco tutti gli input, ottengo i risultati di cui ho bisogno.

Quindi, vorrei chiedere se esiste un modo migliore per impostare questo compito.

Risposte:


12

Il modo in cui imposterei il tuo compito sarebbe quello di creare uno script personalizzato che offra maggiore flessibilità rispetto al modellatore ma possa comunque fornire un'interfaccia simile ai suoi utenti. Puoi crearne uno da:

Casella degli strumenti di elaborazione> Script> Strumenti> Crea nuovo script

Quindi copia / incolla lo script seguente e salvalo in C:/Users/You/.qgis2/processing/scripts.

Lo script seguente tenta di emulare ciò che fa il tuo modello. Lo script non è una soluzione finale (soprattutto perché i parametri che ho usato per l' attributo Intersezione e Unisci in base agli strumenti di localizzazione possono differire da ciò che hai definito) ma si spera che tu possa usarlo come modello per espandere e migliorare lo script in base alle tue esigenze . Per eseguirlo, basta selezionarlo dalla Casella degli strumenti di elaborazione dopo che è stato salvato.

Penso che la sceneggiatura faccia quello che hai chiesto:

  • I primi due ordini sono obbligatori, quindi verranno elaborati.

  • IF le dichiarazioni vengono utilizzate per garantire che gli ordini successivi vengano elaborati solo se è preceduto da quello corretto (ad es. order4 verrà eseguito solo se order3 è stato selezionato).

  • Inoltre, i messaggi vengono stampati nella Console Python che mostra quali ordini vengono elaborati.


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

Di seguito è riportato uno screenshot dell'interfaccia quando si esegue lo script (che dovrebbe essere simile a quando si esegue il modello):

Esecuzione di script

Poche cose da notare:

  • La casella rossa contiene parametri obbligatori

  • La casella verde contiene parametri opzionali

  • La casella blu contiene un parametro obbligatorio

  • La scatola nera contiene parametri opzionali per l'output dei risultati. Lo script genererà i livelli solo se è selezionato l'ordine associato (ad es. Se l'input per order5 non è selezionato ma l'output è, si verificherà un errore). Pertanto, l'utente deve selezionare gli ingressi e le uscite pertinenti. Questo non era intenzionale, ma personalmente penso che sia un buon modo per forzare l'utente a controllare attentamente i parametri.


Ho usato QGIS 2.12.3 (con il plug-in di elaborazione versione 2.12.2).


2
Su un recente podcast di QGIS avevano il creatore dell'elaborazione, e ha detto che a causa del modo in cui è stato costruito non è possibile aggiungere un iteratore direttamente nel generatore di modelli ora. Richiederebbe un'estesa riscrittura per aggiungere. Quindi uno script personalizzato è sicuramente il modo di farlo per ora.
Heikki Vesanto,

@Vesanto - È molto interessante, grazie per averlo incluso. Hai un link a questo particolare podcast?
Joseph,


1
@DennisTG - Amico delle scuse, avrei dovuto menzionare nel mio post che ho usato QGIS 2.12.3 (con il plug-in di elaborazione versione 2.12.2).
Joseph,

1
@Joseph, funziona per me. Piuttosto perspicace, apprezzo l'aiuto.
DennisTG,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.