スタンドアロンPyQGISスクリプト(GUIの外部)からQGIS3処理アルゴリズムを使用する


23

私はQGIS GUIの外で動作しなければならないスクリプトを書いています。qgis.coreからいくつかのAPI関数を呼び出しますが、処理プラグインを使用したいと思います。

sys.path.append()で処理をインポートできますが、プロセスを実行できません。さらに、QgsApplication.processingRegistry()。algorithms()ですべての「ネイティブ」アルゴリズムが欠落しています。

それで、そのように処理を実行することは可能ですか?私は何が欠けていますか?

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

この方法で、スタンドアロン(GUIなし)モードでQGIS処理アルゴリズムを実行できます。

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 ++で記述されたネイティブプロバイダーのアルゴリズム)を使用する場合、Processingを初期化した後にプロバイダーを追加する必要があります。

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

もちろん、これも非常に便利なオプションです。
ジェルマンカリージョ

1
これは純粋な魔法です-詳細なソリューションを共有していただきありがとうございます!
root676

@GermánCarrilloどういうわけか、非常によく似たコードは機能しません。もっと参照:gis.stackexchange.com/questions/286281/...
ミスターチェに

QGISプラグインでQGISアルゴリズムを実行しようとしましたが、これは同じように機能しますか?実行させることができないため
gHupf

1

上記のネイティブアルゴリズムを使用しようとしたときに、QGIS 3.4.4を含むOSGeo4Wインストールで「NameError:name 'QgsNativeAlgorithms' is not defined」というエラーが発生しました。ソリューションはインポートの欠落であることが判明しました。

from qgis.analysis import QgsNativeAlgorithms

QGIS 3.4 / 3.6スタンドアロンスクリプトから

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.