QGIS Modeler if / else เงื่อนไขสคริปต์ที่กำหนดเองสำหรับ Modeler


10

ฉันต้องการทำให้ฟังก์ชั่น if / else ง่าย ๆ ภายใน Model ของฉันและฉันต้องการทราบว่าเป็นไปได้หรือไม่

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

ฉันต้องการให้สิ่งนี้ทำเช่นนั้นหากมีการเลือกอินพุทสำหรับ 'เซกเมนต์เลเยอร์' ซึ่งไม่จำเป็นต้องดำเนินการ 'เซกเมนต์ (meanhift)' และใช้ 'เซกเมนต์เลเยอร์' แทนอินพุทสำหรับกระบวนการถัดไป

อินพุตสำหรับ 'การแบ่งส่วน (meanhift)' มีดังนี้

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

อัปเดตหลังจากพยายามใช้คำตอบของโจเซฟ: ฉันใช้รหัสต่อไปนี้และได้รับข้อผิดพลาดนี้ ป้อนคำอธิบายรูปภาพที่นี่

อัปเดต 2 หลังจากเปลี่ยนพารามิเตอร์ฉันได้รับข้อผิดพลาดในบรรทัด 28 นี่คือ 'else:' stands

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    -BGREN\
    -0\
    -70\
    -70\
    -0.1\
    -100\
    -100\
    -0\
    -0\
    -0\
    -'True'\
    -'False'\
    -1\
    -0.1\
    -'Layer'\
    -'DN'\
    -1024\
    -1\
    -0\
    -output)
else:
    output=Segment_Layer

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

อัปเดตให้ใช้งานได้ :) หลังจากลองไม่กี่ครั้งและด้วยโจเซฟช่วยให้โค้ดนี้ใช้งานได้อย่างมีเสน่ห์เคล็ดลับสุดท้ายคือแทนที่ค่าที่ไม่จำเป็นสองค่าด้วย 'ไม่มี'

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    BGREN, \
    0, \
    70, \
    70, \
    0.1, \
    100, \
    100, \
    0, \
    0, \
    None, \
    True, \
    False, \
    1, \
    0.1, \
    'Layer', \
    'DN', \
    1024, \
    1, \
    None, \
    output)
else:
    output=Segment_Layer

3
ฉันคิดว่าคุณจะต้องใช้สคริปต์ที่กำหนดเองภายใน modeler ของคุณเพื่อที่จะใช้คำสั่งif / ifอย่างถูกต้อง
โจเซฟ

1
@ โจเซฟนั่นคือสิ่งที่ฉันคิดเช่นกันปัญหาคือฉันไม่ดีในการเขียนสคริปต์ตามที่ฉันต้องการฉันแทบไม่มีประสบการณ์เลย ...
Andreas

1
@ Andreas ฉันยืนยันสิ่งที่โจเซฟเขียนไว้ในความคิดเห็น อย่างไรก็ตามฉันคิดว่าคุณอาจได้รับความช่วยเหลือเพิ่มเติมจากชุมชนหากคุณแก้ไขคำถามของคุณและให้โอกาสในการขอคำแนะนำบางอย่างกับ Python (เพิ่มแท็กที่เหมาะสม) ...
mgri

1
@Andreas - แก้ไขโพสต์ของฉัน นอกจากนี้คุณควรยอมรับคำตอบหลังจากที่พวกเขาแก้ไขปัญหาของคุณแล้ว)
โจเซฟ

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

คำตอบ:


8

ตามที่ระบุไว้ในความคิดเห็นของฉันสคริปต์ที่กำหนดเองอาจเป็นวิธีที่จะไปในสถานการณ์นี้ คุณสามารถสร้างจาก:

Processing Toolbox > Scripts > Tools > Create new script

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

นี่เป็นสคริปต์ที่เป็นไปได้:

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    -BGREN, \
    -filter, \
    -filter.meanshift.spatialr, \
    -filter.meanshift.ranger, \
    -filter.meanshift.thres, \
    -filter.meanshift.maxiter, \
    -filter.meanshift.minsize, \
    -mode, \
    -mode.vector.outmode, \
    -mode.vector.inmask, \
    -mode.vector.neighbor, \
    -mode.vector.stitch, \
    -mode.vector.minsize, \
    -mode.vector.simplify, \
    -mode.vector.layername, \
    -mode.vector.fieldname, \
    -mode.vector.tilesize, \
    -mode.vector.startlabel, \
    -mode.vector.ogroptions, \
    -output)
else:
    output=Segment_Layer

พารามิเตอร์สำหรับotb:segmentationmeanshiftรูปลักษณ์ที่น่ากลัว! น่าเสียดายที่ฉันไม่ได้ติดตั้ง Orfeo ดังนั้นจึงไม่สามารถทดสอบเครื่องมือนี้ได้ อย่างไรก็ตามพารามิเตอร์จะแสดงที่นี่คุณเพียงแค่ต้องพิมพ์พวกเขาแทนการใช้ GUI เมื่อเสร็จแล้วให้เพิ่มสคริปต์ลงใน modeler ของคุณโดยใช้BGRENและSegment_Layerเป็นเลเยอร์อินพุต:

พารามิเตอร์สคริปต์

นอกจากนี้ใน modeler ของคุณคุณอาจต้องเปลี่ยนข้อกำหนดพารามิเตอร์ที่ต้องการBGRENและSegment_Layer:

นิยามพารามิเตอร์

จากนั้นเชื่อมต่อผลลัพธ์ของสคริปต์กับเครื่องมือ NDVI ของคุณ


ฉันทดสอบสิ่งนี้ในระดับหนึ่งโดยใช้เครื่องมืออื่นที่ทำงานขึ้นอยู่กับเลเยอร์อินพุทที่ถูกเลือกดังนั้นหวังว่ามันจะใช้ได้กับ modeler ของคุณ!



แก้ไข:

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

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    BGREN, \
    0, \
    70, \
    70, \
    0.1, \
    100, \
    100, \
    0, \
    0, \
    0, \
    True, \
    False, \
    1, \
    0.1, \
    'Layer', \
    'DN', \
    1024, \
    1, \
    0, \
    output)
else:
    output=Segment_Layer

หรือเป็นหนึ่งซับ:

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift',BGREN,0,70,70,0.1,100,100,0,0,0,True,False,1,0.1,'Layer','DN',1024,1,0,output)
else:
    output=Segment_Layer

1
ฉันกำลังเพิ่มความคิดเห็นเพื่อสนับสนุน @Andreas เพื่อแก้ไขคำถามและให้โอกาสในการรับคำแนะนำบางอย่างจาก Python เพื่อรับความช่วยเหลือเพิ่มเติม แต่คุณเร็วขึ้น!
mgri

1
@mgri - ฉันจะแนะนำให้คุณแสดงความคิดเห็นที่เป็น OP อาจต้องการแก้ไขรายละเอียดบางอย่างในและหวังว่าจะส่งเสริมให้ผู้อื่นเพื่อแสดงทางออกที่เป็นไป :)
โจเซฟ

1
แช่ง @Joseph ที่มากขึ้นกว่าที่ฉันคิดว่ามันจะเป็น: O ต่อไปฉันจะพยายามที่จะสร้างนี้และออกความคิดเห็นถ้าฉันได้ไปทำงานขอบคุณล่วงหน้า :)
อันเดรีย

1
ยินดีมากที่สุด! ฉันอาจไม่ overthink นี้จึงอาจเป็นความคิดที่ดีที่จะแก้ไขคำถามของคุณเป็น @mgri ปัญหาเพื่อให้การแก้ปัญหาที่เหมาะสมมากขึ้นเช่นงูหลามหรือสามารถโพสต์ =)
โจเซฟ

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