Використання алгоритмів обробки QGIS3 з автономних сценаріїв PyQGIS (за межами GUI)


24

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

Я можу імпортувати обробку за допомогою sys.path.append (), але я не можу запустити жоден процес. Більше того, у "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

Відповіді:


29

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

Звичайно, це теж дуже корисний варіант.
Герман Каррілло

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 )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.