การใช้อัลกอริทึมการประมวลผล QGIS3 จากสคริปต์ PyQGIS แบบสแตนด์อโลน (นอก GUI)


23

ฉันกำลังเขียนสคริปต์ซึ่งต้องทำงานนอก QGIS GUI ฉันเรียกฟังก์ชั่น API บางอย่างจาก qgis.core แต่ฉันต้องการใช้ปลั๊กอินการประมวลผล

ฉันสามารถนำเข้าการประมวลผลด้วย sys.path.append () แต่ฉันไม่สามารถเรียกใช้กระบวนการใด ๆ นอกจากนี้ algs "เนทีฟ" ทั้งหมดหายไปใน QgsApplication.processingRegistry ()

ดังนั้นจึงเป็นไปได้ที่จะเรียกใช้การประมวลผลด้วยวิธีนี้? ฉันพลาดอะไรไป

import os, sys
from qgis.core import *
QgsApplication.setPrefixPath('/usr', True)
qgs = QgsApplication([], False)
qgs.initQgis()

sys.path.append('/usr/share/qgis/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()
import processing

layer1 = QgsVectorLayer('data/ROUTE_PRIMAIRE.SHP')
layer2 = QgsVectorLayer('data/ROUTE_SECONDAIRE.SHP')

processing.run('qgis:union', layer1, layer2, 'test.shp') # returns nothing

ฉันใช้ QGIS 3.0.1 - Debian 9

คำตอบ:


28

คุณสามารถเรียกใช้อัลกอริทึมการประมวลผล QGIS ในโหมดสแตนด์อโลน (ไม่มี GUI) ด้วยวิธีนี้:

import sys

from qgis.core import (
     QgsApplication, 
     QgsProcessingFeedback, 
     QgsVectorLayer
)

# See /gis//a/155852/4972 for details about the prefix 
QgsApplication.setPrefixPath('/usr', True)
qgs = QgsApplication([], False)
qgs.initQgis()

# Append the path where processing plugin can be found
sys.path.append('/docs/dev/qgis/build/output/python/plugins')

import processing
from processing.core.Processing import Processing
Processing.initialize()

layer1 = QgsVectorLayer('/path/to/geodata/lines_1.shp', 'layer 1', 'ogr')
layer2 = QgsVectorLayer('/path/to/geodata/lines_2.shp', 'layer 2', 'ogr')

# You can see what parameters are needed by the algorithm  
# using: processing.algorithmHelp("qgis:union")
params = { 
    'INPUT' : layer1,
    'OVERLAY' : layer2, 
    'OUTPUT' : '/path/to/output_layer.gpkg|layername=output'
}
feedback = QgsProcessingFeedback()

res = processing.run('qgis:union', params, feedback=feedback)
res['OUTPUT'] # Access your output layer

อัลกอริทึมพื้นเมือง

ตอนนี้ถ้าคุณต้องการใช้อัลกอริธึมดั้งเดิม (เช่นอัลกอริทึมจากผู้ให้บริการเนทีฟซึ่งอัลกอริธึมถูกเขียนใน C ++) คุณต้องเพิ่มผู้ให้บริการหลังจากเริ่มต้นการประมวลผล:

import sys

from qgis.core import (
     QgsApplication, 
     QgsProcessingFeedback, 
     QgsVectorLayer
)
from qgis.analysis import QgsNativeAlgorithms

# See /gis//a/155852/4972 for details about the prefix 
QgsApplication.setPrefixPath('/usr', True)
qgs = QgsApplication([], False)
qgs.initQgis()

# Append the path where processing plugin can be found
sys.path.append('/docs/dev/qgis/build/output/python/plugins')

import processing
from processing.core.Processing import Processing
Processing.initialize()
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())

layer = QgsVectorLayer('/path/to/geodata/lines.shp', 'my layer', 'ogr')

# You can see what parameters are needed by the algorithm  
# using: processing.algorithmHelp("native:extractvertices")
params = {
    'INPUT': layer,
    'OUTPUT': 'memory:'
}
feedback = QgsProcessingFeedback()

res = processing.run("native:extractvertices", params, feedback=feedback)
res['OUTPUT'] # Access your output layer

ทำงานได้ดีขอบคุณ! การเขียนเอาต์พุตบนดิสก์ในเวลาเดียวกันถ้ามีพา ธ ให้หรือไม่?
vidlb

แน่นอนว่าเป็นตัวเลือกที่มีประโยชน์มากเช่นกัน
Germán Carrillo

1
นี่คือเวทมนต์ที่บริสุทธิ์ - ขอบคุณที่แบ่งปันโซลูชันที่มีรายละเอียดของคุณ!
root676

@ GermánCarrilloอย่างใดรหัสที่คล้ายกันมาก dosen't ทำงาน ดูเพิ่มเติมได้ที่: gis.stackexchange.com/questions/286281/…
Mr. Che

ฉันลองใช้อัลกอริทึม QGIS ในปลั๊กอิน QGIS มันใช้วิธีเดียวกันได้หรือไม่? เพราะฉันไม่สามารถทำงานได้
gHupf

1

ฉันมีข้อผิดพลาด "NameError: ชื่อ 'QgsNativeAlgorithms' ไม่ได้กำหนดไว้" เมื่อฉันพยายามใช้อัลกอริทึมดั้งเดิมดังกล่าวข้างต้นในการติดตั้ง OSGeo4W ที่รวม QGIS 3.4.4 การแก้ปัญหากลายเป็นการนำเข้าที่ขาดหายไป:

from qgis.analysis import QgsNativeAlgorithms

(จากQGIS 3.4 / 3.6 สคริปต์แบบสแตนด์อโลน )

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