Menggunakan algoritma Pemrosesan QGIS3 dari skrip PyQGIS mandiri (di luar GUI)

24

Saya sedang menulis skrip yang harus berfungsi di luar QGIS GUI. Saya memanggil beberapa fungsi API dari qgis.core tetapi saya ingin menggunakan plugin pemrosesan.

Saya dapat mengimpor pemrosesan dengan sys.path.append () tetapi saya tidak dapat menjalankan proses apa pun. Selain itu, semua "asli" algs hilang dalam algoritma QgsApplication.processingRegistry (). ()

Jadi apakah mungkin menjalankan pemrosesan seperti itu? Apa yang saya lewatkan?

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

Saya menggunakan QGIS 3.0.1 - Debian 9

vidlb
sumber

Jawaban:

29

Anda dapat menjalankan algoritma Pemrosesan QGIS dalam mode mandiri (tanpa GUI) dengan cara ini:

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

Algoritma Asli

Sekarang, jika Anda ingin menggunakan algoritma asli (yaitu, algoritma dari penyedia asli, yang algoritmanya ditulis dalam C ++), Anda perlu menambahkan penyedia setelah menginisialisasi Pemrosesan:

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
Germán Carrillo
sumber
Berfungsi dengan baik, terima kasih! Apakah saya tetap bisa menulis output pada disk pada saat yang sama, jika path disediakan?
vidlb
Tentu, itu opsi yang sangat berguna juga.
Germán Carrillo
1
Ini adalah sihir murni - Terima kasih telah berbagi solusi terperinci Anda!
root676
@ GermánCarrillo Entah bagaimana kode yang sangat mirip tidak berfungsi. Lihat lebih lanjut: gis.stackexchange.com/questions/286281/…
Mr. Che
Saya mencoba menjalankan algoritma QGIS dalam Plugin QGIS, apakah ini bekerja dengan cara yang sama? Karena saya tidak bisa menjalankannya
gHupf
1

Saya mengalami kesalahan "NameError: name 'QgsNativeAlgorithms' tidak didefinisikan" ketika saya mencoba menggunakan algoritma asli seperti di atas, dalam instalasi OSGeo4W yang menyertakan QGIS 3.4.4. Solusinya ternyata impor yang hilang:

from qgis.analysis import QgsNativeAlgorithms

(dari QGIS 3.4 / 3.6 skrip mandiri )

Andrew_S
sumber