Uzyskujesz dostęp do „przetwarzania” za pomocą Pythona?

16

Chcę uzyskać dostęp do funkcji linii rozstrzelenia w Pythonie poza QGIS z niezależnego skryptu.

Jaki moduł muszę załadować, aby z niego korzystać?

Jak mogę uzyskać dostęp processing?

from qgis.core import *

layerInput = QgsVectorLayer('test.shp', 'test', 'ogr')

processing.runalg('qgis:explodelines', layerInput, 'temp.shp')
ustroetz
źródło
2
Myślę, że musisz użyć import processing.
Joseph
@Joseph Przepraszam, że nie jestem konkretny: Ale chcę uzyskać do niego dostęp z niezależnego skryptu.
ustroetz
Ach, nie martw się :). W takim razie przepraszam, ale nie wiem, ponieważ zawsze uruchamiam go w QGIS. Mam nadzieję, że inni doradzą.
Joseph
Cześć @ustroetz, udało ci się uruchomić to ze swojego samodzielnego skryptu? Pytam, ponieważ próbuję również uruchamiać zewnętrzne skrypty.
Joseph
@Joseph Nie, nie mam
ustroetz

Odpowiedzi:

25

AKTUALIZACJA 24.04.2018: Zobacz, jak to zrobić w QGIS v3.x tutaj .


W przypadku QGIS v2.x

Wreszcie znalazł właściwy sposób uruchamiania algorytmów przetwarzania za pomocą samodzielnych skryptów PyQGIS.

Korzystając z wtyczki Processing plugin 2.2.0-2, możesz wypróbować następujący skrypt:

# Prepare the environment
import sys
from qgis.core import *
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

# Prepare processing framework 
sys.path.append('/home/user/.qgis2/python/plugins') # Folder where Processing is located
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

# Run the algorithm
layerInput = QgsVectorLayer('test.shp', 'test', 'ogr')
general.runalg('qgis:explodelines', layerInput, 'temp.shp')

# Exit applications
QgsApplication.exitQgis()
QApplication.exit()

Można znaleźć nowsze wersje przetwarzania /usr/share/qgis/python/plugins, więc może być konieczne odpowiednie użycie sys.path.append('/usr/share/qgis/python/plugins').

Znalazłem działający przykład w Error: Algorytm nie został znaleziony , co z kolei opiera się na dyskusji na liście dyskusyjnej Qgis-dev .

Germán Carrillo
źródło
1
Wtyczka przetwarzania może nie być w '/home/user/.qgis2/python/plugins'. Możesz znaleźć lokalizację, otwierając QGIS i klikając plugins/Manage and install pluginsprzewiń w dół do przetwarzania, a zobaczysz lokalizację instalacji w opisie.
Mr Purple
2
Otrzymałem wiele ostrzeżeń dotyczących cannot-create-a-qpixmaptej samodzielnej funkcji, ale widzę, że rozwiązaliście to również w tym pytaniu gis.stackexchange.com/questions/188074/…
Mr Purple
1
Możesz uczynić samodzielny skrypt jeszcze bardziej ogólnym, upuszczając layerInputi zmieniając wiersz runalg na: general.runalg(*sys.argv[1:])nie wspominając, że ten skrypt może być podstawą do równoległego przetwarzania GIS zgodnie z tym pytaniem: gis.stackexchange.com/questions/119961/...
Mr Purpurowy
Czy można zrobić to samo, ale uruchomić PLUGINS z samodzielnego Pythona (nie w QGIS)? Uruchomiłem funkcję alglist () i nie widzę tam moich wtyczek zainstalowanych w moim QGIS ...
Irene
3

Dopóki nie zacznę działać w sposób ogólny, powiem ci o obejściu.

Korzystam z wtyczki Processing w wersji 2.2.0-2 (sugeruję skorzystanie z tej wersji), która jest zainstalowana /home/germap/.qgis2/python/plugins/na moim komputerze. Musisz znać tę lokalizację folderu, ponieważ stamtąd importujesz moduł przetwarzania.

Ponieważ znasz dostawcę ( qgis) i algorytm ( explodelines), możesz /home/germap/.qgis2/python/plugins/processing/algs/qgis/wziąć nazwę skryptu linii rozstrzelenia: Explode.pyInformacje te pozwalają zaimportować algorytm bezpośrednio do samodzielnego skryptu Python.

Więc otwórz konsolę Python i skopiuj następujący skrypt (używam GNU / Linux, więc zmienne środowiskowe są ustawione domyślnie, co pozwala mi na szybki import bibliotek qgis i PyQt4):

# Prepare the environment
import sys
from PyQt4.QtGui import *
from qgis.core import *
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

# Tell Python where you will get processing from
sys.path.append('/home/germap/.qgis2/python/plugins')

# Reference the algorithm you want to run
from processing.algs.qgis.Explode import *
alg = Explode() 

# Set input and output
inLayer = QgsVectorLayer('/home/user/data/in.shp', 'input', 'ogr')
outLayer = '/home/user/data/out.shp'
alg.setParameterValue('INPUT', inLayer)
alg.setOutputValue('OUTPUT', outLayer)

# Run the algorithm
from processing.core.SilentProgress import SilentProgress
progress = SilentProgress()
alg.processAlgorithm(progress)

Jeśli nie otrzymujesz komunikatów o błędach, to wszystko. Warstwa wyjściowa została zapisana w określonej ścieżce wyjściowej ( /home/user/data/out.shp)

Uwaga: Jeśli chodzi o ogólny sposób (tj. Wywoływanie algorytmów według nazwy), znalazłem pewne problemy, które muszę rozwiązać przed opublikowaniem. Jak tylko go uruchomię, opublikuję go.

Germán Carrillo
źródło