Sederhanakan tugas berulang di QGIS Graphical Modeler


13

masukkan deskripsi gambar di sini

Apakah ada iterator yang dapat digunakan dalam pemodel grafis QGIS untuk menyederhanakan model yang ditunjukkan di atas. Jika tidak, apakah ada cara yang lebih baik untuk menyederhanakan model?

Kolom pertama merupakan lapisan input saya, kolom kedua adalah persimpangan, kolom ketiga adalah output dari operasi "persimpangan", kolom keempat adalah operasi "atribut gabungan menurut lokasi" dan kolom kelima adalah hasil dari operasi gabungan.

Saya ingin melakukan operasi "persimpangan" dan "menggabungkan atribut menurut lokasi" untuk analisis DAS. Tujuannya adalah menghitung parameter Morfometrik Linier seperti total dan panjang rata-rata aliran dari berbagai pesanan, rasio aliran, dan rasio bifurkasi.

Langkah pertama adalah memotong "aliran order1" dengan DAS, dan kemudian memotong "aliran Order2" dengan DAS yang sama. Jika ada shapefile "order3 stream" yang disediakan maka persimpangan untuk layer baru ini harus dilakukan. Oleh karena itu hanya "stream order1" dan "stream order2" adalah wajib, sisanya tergantung pada lapisan DAS yang disediakan. Sebagai contoh jika DAS adalah urutan 4 DAS maka aliran yang diperlukan adalah hingga "aliran order4".

Setelah persimpangan selesai untuk semua lapisan input yang tersedia, mereka kemudian bergabung dengan lokasi ke DAS dengan opsi untuk mendapatkan jumlah dan rata-rata dari aliran yang berpotongan.

Gambar menunjukkan prosedur yang benar. Jika saya melakukan operasi di luar pemodel hasilnya hasilnya benar. Ketika saya menjalankan model saya mendapatkan kesalahan ini.

"Kesalahan saat mengeksekusi algoritma Order5_plus_wshed objek 'NoneType' tidak memiliki atribut 'dataProvider'".

Ini terjadi jika saya belum memberikan input untuk salah satu parameter opsional (yaitu input mis. "Order4 stream") Namun jika saya memberikan semua input saya mendapatkan hasil yang saya butuhkan.

Jadi, saya ingin bertanya apakah ada cara yang lebih baik untuk mengatur tugas ini.

Jawaban:


12

Cara saya mengatur tugas Anda adalah dengan membuat skrip khusus yang memberikan fleksibilitas lebih besar daripada pemodel tetapi masih dapat menyediakan antarmuka yang mirip dengan penggunanya. Anda dapat membuatnya dari:

Memproses Kotak Alat> Skrip> Alat> Buat skrip baru

Kemudian salin / tempel skrip di bawah ini dan simpan ke C:/Users/You/.qgis2/processing/scripts.

Skrip di bawah ini mencoba meniru apa yang dilakukan model Anda. Skrip ini bukan solusi akhir (terutama karena paramater yang saya gunakan untuk atribut titik - temu dan gabung dengan alat lokasi mungkin berbeda dari yang Anda tetapkan) tetapi mudah-mudahan Anda bisa menggunakannya sebagai templat untuk memperluas dan meningkatkan skrip yang sesuai dengan kebutuhan Anda . Untuk menjalankannya, cukup pilih dari Toolbox Pemrosesan setelah disimpan.

Saya pikir skrip melakukan apa yang Anda minta:

  • Dua pesanan pertama adalah wajib sehingga akan diproses.

  • IF pernyataan digunakan untuk memastikan bahwa setiap pesanan yang berhasil hanya akan diproses jika yang benar mendahuluinya (misalnya order4 hanya akan berjalan jika order3 telah dipilih).

  • Selain itu, pesan dicetak di Konsol Python yang menunjukkan pesanan mana yang sedang diproses.


##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 bawah ini adalah tangkapan layar antarmuka saat menjalankan skrip (yang seharusnya terlihat mirip dengan ketika Anda menjalankan model Anda):

Menjalankan skrip

Beberapa hal yang perlu diperhatikan:

  • Kotak merah berisi parameter wajib

  • Kotak hijau berisi parameter opsional

  • Kotak biru berisi parameter wajib

  • Kotak hitam berisi parameter opsional untuk hasil keluaran. Script hanya akan menampilkan layer jika urutan terkait dipilih (misalnya jika input untuk order5 tidak dipilih tetapi output untuk itu, kesalahan akan terjadi). Oleh karena itu, pengguna harus memilih input dan output yang relevan. Ini tidak disengaja tetapi secara pribadi saya pikir ini adalah cara yang baik untuk memaksa pengguna memeriksa parameter dengan cermat.


Saya menggunakan QGIS 2.12.3 (dengan Memproses plugin versi 2.12.2).


2
Pada podcast QGIS baru-baru ini mereka memiliki pencipta pemrosesan, dan dia mengatakan bahwa karena cara itu dibangun Anda tidak dapat menambahkan iterator langsung di pembangun model sekarang. Ini akan membutuhkan penulisan ulang yang luas untuk ditambahkan. Jadi skrip khusus jelas merupakan cara untuk melakukannya untuk saat ini.
HeikkiVesanto

@ Vesanto - Itu sangat menarik, terima kasih sudah memasukkan itu. Apakah Anda memiliki tautan ke podcast khusus ini?
Joseph


1
@DennisTG - Sobat, saya seharusnya menyebutkan di posting saya bahwa saya menggunakan QGIS 2.12.3 (dengan Memproses plugin versi 2.12.2).
Joseph

1
@ Joseph, itu bekerja untuk saya. Cukup berwawasan luas, saya menghargai bantuannya.
DennisTG
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.