ลดความซับซ้อนของงานซ้ำ ๆ ใน QGIS Graphical Modeler


13

ป้อนคำอธิบายรูปภาพที่นี่

มีตัววนซ้ำที่สามารถใช้ในตัวสร้างภาพกราฟิก QGIS เพื่อทำให้โมเดลที่แสดงด้านบนง่ายขึ้นหรือไม่ ถ้าไม่มีวิธีใดที่ดีกว่าในการลดความซับซ้อนของโมเดล?

คอลัมน์แรกหมายถึงเลเยอร์อินพุตของฉันคอลัมน์ที่สองคือจุดตัดคอลัมน์ที่สามคือผลลัพธ์จากการดำเนินการ "สี่แยก" คอลัมน์ที่สี่คือการดำเนินการ "เข้าร่วมแอตทริบิวต์ตามสถานที่ตั้ง" และคอลัมน์ที่ห้าคือผลลัพธ์ของการดำเนินการเข้าร่วม

ฉันต้องการดำเนินการ "ทางแยก" และ "เข้าร่วมแอตทริบิวต์ตามสถานที่" สำหรับการวิเคราะห์ลุ่มน้ำ จุดมุ่งหมายคือการคำนวณพารามิเตอร์ Linear Morphometric เช่นความยาวทั้งหมดและความยาวเฉลี่ยของสตรีมของคำสั่งซื้อที่แตกต่างกันอัตราส่วนสตรีมและอัตราส่วนแฉก

ขั้นตอนแรกคือการตัด "ลำธาร order1" กับต้นน้ำแล้วตัดกัน "ลำธาร Order2" ที่มีต้นน้ำเดียวกัน หากมีไฟล์ "order3 สตรีม" ให้ไว้การแยกสำหรับเลเยอร์ใหม่นี้ควรดำเนินการ ดังนั้นเฉพาะ "order1 สตรีม" และ "สตรีม order2" เท่านั้นที่จำเป็นส่วนที่เหลือจะขึ้นอยู่กับเลเยอร์ลุ่มน้ำที่มีให้ ตัวอย่างเช่นหากลุ่มน้ำเป็นลำดับที่ 4 ลุ่มน้ำแล้วลำธารที่ต้องการคือเกิน "order4 ลำธาร"

เมื่อการแยกเสร็จสมบูรณ์สำหรับเลเยอร์อินพุตที่มีอยู่ทั้งหมดพวกเขาจะเข้าร่วมตามตำแหน่งไปยังลุ่มน้ำด้วยตัวเลือกเพื่อรับผลรวมและค่าเฉลี่ยของสตรีมที่ตัดกัน

ภาพแสดงขั้นตอนที่ถูกต้อง ถ้าฉันทำงานนอกตัวสร้างโมเดลผลลัพธ์จะถูกต้อง เมื่อฉันรันโมเดลฉันพบข้อผิดพลาดนี้

"ข้อผิดพลาดในการเรียกใช้อัลกอริทึม Order5_plus_wshed วัตถุ 'NoneType' ไม่มีแอตทริบิวต์ 'dataProvider'"

สิ่งนี้เกิดขึ้นถ้าฉันไม่ได้ให้อินพุตสำหรับพารามิเตอร์ทางเลือกอย่างใดอย่างหนึ่ง (เช่นอินพุตเช่น "สตรีม order4") อย่างไรก็ตามถ้าฉันให้อินพุตทั้งหมดฉันได้รับผลลัพธ์ที่ต้องการ

ดังนั้นฉันอยากจะถามว่ามีวิธีที่ดีกว่าในการตั้งค่างานนี้หรือไม่

คำตอบ:


12

วิธีที่ฉันจะตั้งค่างานของคุณคือการสร้างสคริปต์ที่กำหนดเองซึ่งให้ความยืดหยุ่นมากกว่าตัวสร้างแบบจำลอง แต่ยังสามารถให้อินเทอร์เฟซที่คล้ายกันกับผู้ใช้ คุณสามารถสร้างจาก:

กำลังประมวลผลกล่องเครื่องมือ> สคริปต์> เครื่องมือ> สร้างสคริปต์ใหม่

จากนั้นคัดลอก / C:/Users/You/.qgis2/processing/scriptsวางสคริปต์ดังต่อไปนี้และบันทึกลงใน

สคริปต์ด้านล่างพยายามจำลองสิ่งที่โมเดลของคุณทำ สคริปต์ไม่ใช่ทางออกสุดท้าย (โดยเฉพาะอย่างยิ่งเนื่องจากพารามิเตอร์ที่ฉันใช้สำหรับคุณลักษณะIntersection and Join โดยเครื่องมือตำแหน่งอาจแตกต่างจากที่คุณกำหนดไว้) แต่หวังว่าคุณจะสามารถใช้เป็นแม่แบบเพื่อขยายและปรับปรุงสคริปต์ให้เหมาะกับความต้องการของคุณ . หากต้องการเรียกใช้เพียงเลือกจากเครื่องมือประมวลผลหลังจากบันทึกแล้ว

ฉันคิดว่าสคริปต์ทำในสิ่งที่คุณถาม:

  • คำสั่งซื้อสองรายการแรกนั้นจะต้องดำเนินการ

  • IF คำสั่งที่ใช้เพื่อให้แน่ใจว่าคำสั่งซื้อที่ประสบความสำเร็จใด ๆ จะได้รับการประมวลผลหากคำสั่งที่ถูกต้องอยู่ข้างหน้า (เช่น order4 จะทำงานเฉพาะเมื่อมีการเลือก order3)

  • นอกจากนี้ข้อความจะถูกพิมพ์ในPython Consoleเพื่อแสดงคำสั่งซื้อที่กำลังประมวลผล


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

ด้านล่างเป็นภาพหน้าจอของอินเทอร์เฟซเมื่อเรียกใช้สคริปต์ (ซึ่งควรมีลักษณะคล้ายกับเมื่อคุณใช้รุ่นของคุณ):

กำลังเรียกใช้สคริปต์

สิ่งที่ควรทราบ:

  • กล่องสีแดงมีพารามิเตอร์ที่จำเป็น

  • กล่องสีเขียวประกอบด้วยพารามิเตอร์ที่เป็นตัวเลือก

  • กล่องสีน้ำเงินประกอบด้วยพารามิเตอร์ที่จำเป็น

  • กล่องดำมีพารามิเตอร์ที่เป็นตัวเลือกสำหรับผลลัพธ์ผลลัพธ์ สคริปต์จะเลเยอร์เอาท์พุทเฉพาะในกรณีที่เลือกคำสั่งที่เกี่ยวข้อง (เช่นหากไม่ได้เลือกอินพุทสำหรับการสั่งซื้อ 5 แต่เอาท์พุทสำหรับมันเป็นข้อผิดพลาดจะเกิดขึ้น) ดังนั้นผู้ใช้จะต้องเลือกอินพุตและเอาต์พุตที่เกี่ยวข้อง นี่ไม่ใช่เจตนา แต่โดยส่วนตัวแล้วฉันคิดว่ามันเป็นวิธีที่ดีในการบังคับให้ผู้ใช้ตรวจสอบพารามิเตอร์อย่างรอบคอบ


ฉันใช้ QGIS 2.12.3 (พร้อมปลั๊กอินการประมวลผลรุ่น 2.12.2)


2
ในพอดคาสต์ QGIS เมื่อเร็ว ๆ นี้พวกเขามีผู้สร้างการประมวลผลและเขากล่าวว่าเนื่องจากวิธีการสร้างคุณไม่สามารถเพิ่มตัววนซ้ำได้โดยตรงในตัวสร้างแบบจำลองในขณะนี้ มันจะต้องมีการเขียนใหม่อย่างกว้างขวางเพื่อเพิ่ม ดังนั้นสคริปต์ที่กำหนดเองจึงเป็นวิธีที่จะทำได้ในตอนนี้
HeikkiVesanto

@Vesanto - น่าสนใจมากขอบคุณที่รวมไว้ คุณมีลิงค์ไปยังพอดแคสต์นี้หรือไม่?
โจเซฟ


1
@DennisTG - ขอโทษเพื่อนฉันควรจะกล่าวถึงในโพสต์ของฉันที่ฉันใช้ QGIS 2.12.3 (ด้วยปลั๊กอินการประมวลผลรุ่น 2.12.2)
โจเซฟ

1
@ โจเซฟมันใช้งานได้สำหรับฉัน ค่อนข้างลึกซึ้งฉันขอขอบคุณความช่วยเหลือ
DennisTG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.