독립형 PyQGIS 스크립트에서 QGIS3 처리 알고리즘 사용 (GUI 외부)


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

다음과 같은 방식으로 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 어쨌든 매우 유사한 코드가 작동하지 않습니다. 더보기 : gis.stackexchange.com/questions/286281/…
Mr. Che

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.