Использование алгоритмов обработки QGIS3 из автономных скриптов PyQGIS (за пределами GUI)

24

Я пишу скрипт, который должен работать за пределами QGIS GUI. Я вызываю некоторые функции API из qgis.core, но я бы хотел использовать плагин обработки.

Я могу импортировать обработку с помощью sys.path.append (), но не могу запустить какой-либо процесс. Более того, все «родные» algs отсутствуют в QgsApplication.processingRegistry () .gorithms ()

Так можно ли выполнить обработку таким образом? Что мне не хватает?

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

vidlb
источник

Ответы:

30

Вы можете запустить алгоритм обработки 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

У меня была ошибка «NameError: имя« QgsNativeAlgorithms не определено », когда я пытался использовать собственный алгоритм, как описано выше, в установке OSGeo4W, которая включала QGIS 3.4.4. Решение оказалось отсутствующим импортом:

from qgis.analysis import QgsNativeAlgorithms

(из автономного скрипта QGIS 3.4 / 3.6 )

Andrew_S
источник