Ich habe zusammen mit diesem Beitrag versucht, ein Skript in OSGeo4w Shell außerhalb von QGIS auszuführen . Aber ich bekomme folgenden Fehler:
ImportError: Kein Modul mit dem Namen qgis.core
Ich habe auch die folgenden Beiträge gelesen und versucht, verschiedene Module zu importieren, aber ohne Erfolg:
- Ausführen von Sextante-Algorithmen außerhalb der QGIS-Python-Konsole
- Wie führe ich ein einfaches Python-Skript für QGIS von außen aus (zB Sublime Text)?
- Eigenständige Python-Skripte mit PyQGIS schreiben?
Hier ist ein einfaches Skript, mit dem ein Raster erstellt und ein Polygon-Shapefile darauf geklippt wird.
Hinweis: Dieses Skript wurde getestet und funktioniert erfolgreich, wenn es in QGIS ausgeführt wird.
##Test=name
import os
import glob
import sys
sys.path.append("C:\Program Files\QGIS Brighton\lib;%OSGEO4W_ROOT:\=/%/apps/qgis;%OSGEO4W_ROOT%\apps\qgis\bin;%OSGEO4W_ROOT%\apps\grass\grass-6.4.3\lib;%PATH%")
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
QgsApplication.setPrefixPath("C:\Program Files\QGIS Brighton\apps\qgis", True)
QgsApplication.initQgis()
from os.path import expanduser
home = expanduser("~")
# Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"
def run():
# Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
os.chdir(path_dir + "Shapefiles\\")
for fname in glob.glob("*.shp"):
outputs_1=processing.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405', None)
outputs_2=processing.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res + "/"+ fname)
run()
QgsApplication.exitQgis()
# Remove the above line when running in QGIS
Nach der Antwort und dem Skript von @gcarrillo kann ich die qgis.core.
Module endlich erfolgreich importieren . Das von @gcarrillo bereitgestellte Skript wird ausgeführt, es wird jedoch ein Traceback-Fehler angezeigt:
Traceback (most recent call last):
File "Test.py", line 55, in <module>
run()
File "Test.py", line 53, in run
algClip.processAlgorithm(progress)
File "C:\Users\username\.qgis2\python\plugins\processing\algs\qgis\ftools\Clip.py", line 59, in processAlgorithm
layerA.pendingFields(),
AttributeError: 'NoneType' object has no attribute 'pendingFields'
pyqgis
qgis-processing
Joseph
quelle
quelle
Antworten:
Endlich den richtigen Weg gefunden, um Verarbeitungsalgorithmen in PyQGIS-Standalone-Skripten auszuführen.
Diese Antwort basiert auf den Antworten auf Problem mit dem Import von qgis.core beim Schreiben eines eigenständigen PyQGIS-Skripts und auf Fehler: Algorithmus nicht gefunden , der wiederum auf einer Qgis-dev-Mailinglistendiskussion basiert .
Ich empfehle Ihnen, den in Problem mit dem Import von qgis.core angegebenen Arbeitsablauf zu befolgen, wenn Sie ein eigenständiges PyQGIS-Skript schreiben , um Ihre QGIS-Bibliotheken in Ihrer OSGeo4W-Shell zu aktivieren. Sobald Ihre QGIS-Bibliotheken ordnungsgemäß funktionieren, können Sie mit dem zweiten Teil Ihrer Frage fortfahren: Ausführen von Verarbeitungsalgorithmen in einem eigenständigen PyQGIS-Skript.
Ich habe Ihr ursprüngliches Skript ein wenig modifiziert und es unter Windows 7 und GNU / Linux getestet. Ich verwende die Verarbeitungsversion 2.2.0-2 und schlage vor, diese Version zu verwenden, die zum Zeitpunkt des Schreibens der Antwort aktuell ist.
Beachten Sie, dass ich die Rastererstellung aus der for-Schleife entfernt habe, da Sie nicht wirklich für jeden Clip ein neues Raster benötigen.
Dies sollte den Trick machen!
quelle
Processing
Ordner auf dem Desktop erstellt, der dem/qgis.2
Ordner ähnelt . Sollte das passieren?Diese Antwort basiert auf den Antworten auf Problem mit dem Import von qgis.core beim Schreiben eines eigenständigen PyQGIS-Skripts und auf Wie kann ich mit Python auf die Verarbeitung zugreifen? .
Ich empfehle Ihnen, den in Problem mit dem Import von qgis.core angegebenen Arbeitsablauf zu befolgen, wenn Sie ein eigenständiges PyQGIS-Skript schreiben , um Ihre QGIS-Bibliotheken in Ihrer OSGeo4W-Shell zu aktivieren. Sobald Ihre QGIS-Bibliotheken ordnungsgemäß funktionieren, können Sie mit dem zweiten Teil Ihrer Frage fortfahren: Ausführen von Verarbeitungsalgorithmen in einem eigenständigen PyQGIS-Skript.
Wie in Wie kann ich `VERARBEITUNG mit Python? Ich gebe Ihnen eine Problemumgehung, bis ich in der Lage bin, Algorithmen nach Namen auszuführen (z
processing.runalg('provider:algorithm_name')
. B. ). Ich verwende die Verarbeitungsversion 2.2.0-2 und empfehle Ihnen, diese Version zu verwenden.Wir können die QGIS Python-Konsole verwenden, um herauszufinden, wo sich ein Algorithmus-Skript in der Verarbeitung von Plugin-Ordnern befindet. Wenn Sie beispielsweise wissen
qgis:creategrid
möchten , woher Sie importieren möchten, schreiben Sie in die QGIS Python-Konsole:Sie sollten erhalten:
Dies reicht aus, um sowohl den Modulpfad (
processing.algs.qgis.mmqgisx.MMQGISXAlgorithms
) als auch die Algorithmusklasse (mmqgisx_grid_algorithm
) zu erkennen. Sie werden diese Informationen im folgenden Skript verwenden.Ich habe Ihr Skript ein wenig geändert und unter Windows 7 getestet. Möglicherweise müssen Sie die Pfade anpassen, um das Skript in Ihrer eigenen Umgebung auszuführen.
Dies sollte den Trick machen!
Wie Sie sehen, habe ich einen Test / Grids-Ordner erstellt, in dem Sie ein einzelnes Grid-Shapefile speichern, anstatt in jeder for-Schleife eine temporäre Datei zu erstellen, was anscheinend nicht erforderlich ist.
quelle
Test/Grids/
bevor Sie das Skript ausführen./Grids/
Ordner erstellt und die Datei grid.shp wird erstellt. Das funktioniert einwandfrei Etwas anderes ist das Problem.path_dir + "Grids\grid.shp"
, der lauten würdeC:\Users\your_username\Desktop\Test\Grids\grid.shp
Ich musste geringfügige Änderungen an dem von @gcarrillo bereitgestellten Skript vornehmen, um den OSGEO4W64-Pfad einzuschließen (ich musste QGIS über das OSGEO4W64-Installationsprogramm neu installieren, da ich das eigenständige Installationsprogramm ursprünglich verwendete) und doppelte Schrägstriche einschließen. Hier ist das endgültige Drehbuch und vielen Dank an alle für ihre Hilfe:
quelle