Bağımsız PyQGIS betiklerinden QGIS3 İşleme algoritmalarını kullanma (GUI dışında)


24

QGIS GUI dışında çalışması gereken bir komut dosyası yazıyorum. Bazı API işlevlerini qgis.core adresinden çağırıyorum ancak işlem eklentisini kullanmak istiyorum.

İşlemi sys.path.append () ile içe aktarabilirim ancak hiçbir işlemi çalıştıramıyorum. Dahası, tüm "yerel" alg'ler QgsApplication.processingRegistry (). Algorithms () içinde eksik

Bu şekilde işlem yapmak mümkün mü? Neyi kaçırıyorum ?

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'deyim - Debian 9

Yanıtlar:


29

QGIS İşleme algoritmasını bağımsız (GUI yok) modda şu şekilde çalıştırabilirsiniz:

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

Yerli Algoritmalar

Şimdi, bir yerel algoritma kullanmak istiyorsanız (yani algoritmaları C ++ ile yazılmış olan yerel sağlayıcıdan alınan bir algoritma), İşlemeyi başlattıktan sonra sağlayıcıyı eklemeniz gerekir:

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

İyi çalışıyor, teşekkürler! Bir yol sağlanmışsa, çıktıyı aynı anda diske yazmak uygun mudur?
vidlb

Tabii, bu da çok kullanışlı bir seçenek.
Germán Carrillo

1
Bu saf bir sihir - Ayrıntılı çözümlerinizi paylaştığınız için teşekkür ederiz!
root676

@ GermánCarrillo Bir şekilde çok benzer bir kod işe yaramaz. Daha fazlasını görün: gis.stackexchange.com/questions/286281/…
Mr. Che

QGIS Eklentisinde bir QGIS algoritması çalıştırmayı deniyorum, bu aynı şekilde çalışıyor mu? Çünkü çalışmasını
sağlayamıyorum

1

QGIS 3.4.4'ü içeren bir OSGeo4W kurulumunda yukarıdaki gibi bir yerel algoritma kullanmaya çalıştığımda "NameError: name 'QgsNativeAlgorithms' tanımlanmadı" hatası aldım. Çözüm, eksik bir ithalat olarak ortaya çıktı:

from qgis.analysis import QgsNativeAlgorithms

( QGIS 3.4 / 3.6'den bağımsız komut dosyasından )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.