QGIS Grafik Modelleyici'de tekrarlanan görevleri basitleştirin


13

resim açıklamasını buraya girin

Yukarıda gösterilen modeli basitleştirmek için QGIS grafik modelleyicide kullanılabilen yineleyiciler var mı? Değilse, modeli basitleştirmenin daha iyi bir yolu var mı?

İlk sütun benim giriş katmanlarımı temsil eder, ikinci sütun kavşaktır, üçüncü sütun "kavşak" işleminden çıktıdır, dördüncü sütun "konuma göre birleştirme niteliği" işlemidir ve beşinci sütun birleştirme işleminin sonucudur.

Bir havza analizi için "kavşak" ve "yere göre özniteliği birleştir" işlemleri yapmak istiyorum. Amaç, farklı düzenlerin akışlarının toplam ve ortalama uzunluğu, akım oranları ve çatallanma oranı gibi Doğrusal Morfometrik parametreleri hesaplamaktır.

İlk adım, "düzen1 akışlarını" havza ile kesip sonra da "Düzen2 akışlarını" aynı havza ile kesmektir. Bir "order3 stream" şekil dosyası sağlanmışsa, bu yeni katmanın kesişimi gerçekleştirilmelidir. Bu nedenle sadece "order1 akışları" ve "order2 akışları" zorunludur, geri kalanı sağlanan havza katmanına bağlıdır. Örneğin, havza 4 numaralı bir havza ise gerekli akışlar "order4" akışına kadar çıkar.

Mevcut tüm giriş katmanları için kesişim tamamlandığında, kesişen akışların toplamını ve ortalamasını alma seçenekleri ile havzaya konum olarak birleştirilirler.

Görüntü doğru prosedürü göstermektedir. İşlemi modelleyicinin dışında yaparsam sonuçlar doğrudur. Modeli çalıştırdığımda bu hatayı alıyorum.

Msgstr "Order5_plus_wshed 'NoneType' nesnesinin yürütülmesinde hata 'dataProvider' özelliği yok".

Bu, isteğe bağlı parametrelerden biri için bir girdi sağlamadıysa oluşur (örn. Girişler, örneğin "order4 akışları") Ancak tüm girişleri sağlarsam ihtiyacım olan sonuçları alırım.

Bu yüzden, bu görevi kurmanın daha iyi bir yolu olup olmadığını sormak istiyorum.

Yanıtlar:


12

Görevinizi ayarlayacağım şekilde , modelleyiciden daha fazla esneklik sağlayan, ancak yine de kullanıcılarına benzer bir arayüz sağlayabilen özel bir komut dosyası oluşturmak olurdu . Şunlardan bir tane oluşturabilirsiniz:

İşleme Araç Kutusu> Komut Dosyaları> Araçlar> Yeni komut dosyası oluştur

Ardından aşağıdaki komut dosyasını kopyalayıp yapıştırın ve içine kaydedin C:/Users/You/.qgis2/processing/scripts.

Aşağıdaki komut dosyası, modelinizin yaptıklarını taklit etmeye çalışır. Komut dosyası son bir çözüm değildir (özellikle Konum araçları tarafından Kesişim ve Birleştirme özelliği için kullandığım paramatörler tanımladığınızdan farklı olabilir), ancak umarım bunu ihtiyacınıza göre komut dosyasını genişletmek ve geliştirmek için bir şablon olarak kullanabilirsiniz . Çalıştırmak için, kaydedildikten sonra İşleme Araç Kutusu'ndan seçmeniz yeterlidir .

Bence senaryo istediğini yapıyor:

  • İlk iki emir zorunlu olduğundan işlenecektir.

  • IF ifadeleri, sonraki siparişlerin yalnızca doğru olanın ondan önce gelmesi durumunda işlenmesini sağlamak için kullanılır (örneğin, sipariş4 yalnızca sipariş3 seçildiyse çalışır).

  • Ayrıca, Python Konsolunda hangi siparişlerin işlendiğini gösteren mesajlar yazdırılır .


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

Komut dosyasını çalıştırırken arayüzün bir ekran görüntüsü (modelinizi çalıştırdığınızda benzer görünmesi gerekir):

Çalışan komut dosyası

Unutulmaması gereken birkaç nokta:

  • Kırmızı kutu zorunlu parametreler içeriyor

  • Yeşil kutu isteğe bağlı parametreler içerir

  • Mavi kutu zorunlu parametre içeriyor

  • Kara kutu, sonuçları çıktılamak için isteğe bağlı parametreler içerir. Komut dosyası yalnızca ilişkili sipariş seçildiyse katman çıktısı verir (örn. Order5 için girdi seçilmez ancak çıktısı seçilirse, bir hata oluşur). Bu nedenle, kullanıcı girişleri ve ilgili çıkışları seçmelidir. Bu kasıtlı değildi ama kişisel olarak kullanıcıyı parametreleri dikkatlice kontrol etmeye zorlamanın iyi bir yolu olduğunu düşünüyorum.


Ben (birlikte QGIS 2.12.3 kullanılan İşleme sürüm 2.12.2 eklentisi).


2
Son zamanlarda yapılan bir QGIS podcast'inde işlemenin yaratıcısı vardı ve inşa edilme şekli nedeniyle şimdi doğrudan model oluşturucuya bir yineleyici ekleyemeyeceğinizi söyledi. Eklemek için kapsamlı bir yeniden yazma gerekir. Yani özel bir komut dosyası kesinlikle bunu şimdilik yapmanın yolu.
HeikkiVesanto

@Vesanto - Bu çok ilginç, dahil ettiğiniz için teşekkür ederim. Bu özel podcast'e bağlantınız var mı?
Joseph


1
@DennisTG - Özür dilerim dostum, yazımda QGIS 2.12.3 ( İşleme eklentisi sürüm 2.12.2 ile) kullandığımı söylemeliydim .
Joseph

1
@Joseph, benim için çalışıyor. Oldukça anlayışlı, yardımı takdir ediyorum.
DennisTG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.