โทรฟังก์ชั่นคลิปใน pyQGIS จากคอนโซลหลาม?


11

มีวิธีเรียกฟังก์ชันคลิปใน QQGIS จากคอนโซลหลามหรือไม่ พบได้ภายใต้เครื่องมือประมวลผลทางภูมิศาสตร์ในเมนูเวกเตอร์


ตกลงฉันแก้ไขโดยใช้ multiparts เพื่อฟังก์ชั่นส่วนเดียวก่อน จากนั้นก็ใช้งานได้
Toke

คำตอบ:


11

แน่นอนคุณสามารถรับฟังก์ชั่นได้จากกล่องเครื่องมือประมวลผล นี่คือวิธีใช้: ตามhttp://docs.qgis.org/2.8/en/docs/user_manual/processing/console.html

จากคอนโซลคุณสามารถดูรายการอัลกอริธึมทั้งหมดที่มีอยู่ซึ่งมีคำว่า "คลิป" โดยพิมพ์:

import processing
processing.alglist("clip")

จากนั้นคุณสามารถค้นหาวิธีการใช้งานฟังก์ชั่นที่เหมาะสมที่สุดด้วย:

processing.alghelp("qgis:clip")

จากนั้นใช้อัลกอริทึมในสคริปต์ของคุณดังนี้:

processing.runalg("qgis:clip",inputlayer,overlaylayer,"output_file.shp")

หมายเหตุ: อัลกอริทึมจะทำงานเฉพาะกับคุณสมบัติที่เลือก "

หมายเหตุรหัสด้านบนไม่ถูกต้องสำหรับ 3.0+ สำหรับตัวอย่างของ alglist ที่คุณสามารถทำได้:

print([a.id() for a in gsApplication.processingRegistry().algorithms() if "clip" in a.id()])

สำหรับตัวอย่าง alghelp ที่คุณสามารถทำได้:

processing.algorithmHelp("qgis:clip")

สำหรับ QGIS3 ดูคำถามนี้:

alglist และ alghelp ใหม่ในการประมวลผล QGIS 3.0 คืออะไร?


ขออภัยที่นำหัวข้อนี้กลับมามีชีวิตอีกครั้ง แต่ไม่เคยทำงานนี้และตอนนี้ฉันต้องการมันอีกครั้ง ในคอนโซล pyhton ที่ฉันได้รับสองชั้นโดยและLayer = qgis.utils.iface.activeLayer() InputLayer = qgis.utils.iface.activeLayer()แล้วฉันจะใช้processing.runandload("qgis:clip",InputLayer,Layer,"output_file.shp")และชั้นใหม่จะถูกเพิ่มเมนูเลเยอร์ที่มีชื่อตัด แต่ชั้นว่างเปล่า ถ้าฉันใช้สองเลเยอร์เหล่านี้กับฟังก์ชั่นคลิปภายใน Qgis เลเยอร์เอาต์พุตมีเส้นจากการตัด ใครที่จะผิดพลาดได้บ้าง? ฉันไม่ได้รับข้อผิดพลาดใด ๆ
Toke

ใช้งานได้ถ้าฉันใช้รูปหลายเหลี่ยมสองรูป แต่ชั้นหนึ่งของฉันเป็นเส้นตรงและไม่ใช่รูปหลายเหลี่ยม มันมีหลายบรรทัดและฉันสามารถใช้เลเยอร์นี้เพื่อตัดเมื่อทำใน Qgis
Toke

2
คุณต้องมีคุณสมบัติที่คุณต้องการคลิปที่เลือก ฉันได้แก้ไขคำตอบเพื่อสะท้อนสิ่งนี้
Mr Purple

เราจะทำสิ่งนี้โดยไม่สร้างรูปร่างไฟล์ได้อย่างไร ฉันมีเลเยอร์ที่มีรูปหลายเหลี่ยมหลายร้อยรูปดิสก์ที่ฉันต้องการวนซ้ำโดยใช้แต่ละอันเป็นภาพซ้อนทับสำหรับข้อมูลจุดเดียว ฉันสามารถรับรายการวัตถุ QgsFeature แทนได้หรือไม่
เจ. เทย์เลอร์

คุณควรถามว่าเป็นคำถามแยกต่างหาก
Mr Purple

5

สมมติว่าคุณมีเลเยอร์ที่เรียกว่า "โอเวอร์เลย์" และอีกอันหนึ่งเรียกว่า "เลเยอร์" เพื่อโหลด "

# get the overlay layer in the console
overlay_layer = [x for x in iface.legendInterface().layers() if x.name() == 'overlay'][0]

# get the layer to clip in the console
layer_to_clip = [x for x in iface.legendInterface().layers() if x.name() == 'layer_to_clip'][0]

# run the algorithm and output the results in /tmp/output.shp

processing.runalg("qgis:clip", overlay_layer, layer_to_clip, "/tmp/output.shp")

0

ในเวอร์ชั่น PyQGIS ล่าสุดควรทำงานดังนี้

from qgis.core import *

def clipping(layer_1, layer_2):
    layer_clip = processing.run('qgis:clip',
        {'INPUT': layer_1,
        'OVERLAY': layer_2,
        'OUTPUT': "memory:"}
    )["OUTPUT"]

    return QgsProject.instance().addMapLayer(layer_clip)

your_layer_1 = QgsProject.instance().mapLayersByName('layer_name_1')[0] # main layer
your_layer_2 = QgsProject.instance().mapLayersByName('layer_name_2')[0] # secondary layer

clipping(your_layer_1, your_layer_2)

หมายเหตุ:ผลลัพธ์ของอัลกอริทึมจะมีรูปทรงเรขาคณิตเหมือนกับเลเยอร์หลัก


อ้างอิง:

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