Nach dem Update auf Qgis 3.0 ist es sehr schwierig geworden, Informationen zum Schreiben von Verarbeitungsskripten in Qgis 3.0 zu finden.
@Underdark (siehe hier ) hat eine Basis für das Skelett bereitgestellt. Dieser Code scheint auch in Qgis hinzugefügt worden zu sein, wenn ein neues Skript aus einer Vorlage (Qgis 3.0.2) geschrieben wird.
Ich konnte jedoch keinen Weg finden, Python-Neulingen wie mir zu helfen, zu verstehen, wie dieser Code geändert wird, insbesondere für die Eingabe- und Ausgabe-Layer.
Mein Ziel ist es, ein Skript mit zwei Rasterebenen und einer doppelten als Eingabe zu schreiben, das zwei Ebenen ausgibt.
Welche Änderungen wären am Beispielcode erforderlich, um dies zu ermöglichen?
Für Qgis 2.x hätte ich die folgende Syntax verwendet:
##Layer1=raster
##Layer2=raster
##myDouble=Double
##OutLayer1=output raster
##OutLayer2=output raster
Soweit ich weiß, müssen die Änderungen in der folgenden Prozedur vorgenommen werden, aber ich bin nicht sicher, was installiert werden soll.
def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterFeatureSource(
self.INPUT,
self.tr("Input layer"),
[QgsProcessing.TypeVectorAnyGeometry]))
self.addParameter(QgsProcessingParameterFeatureSink(
self.OUTPUT,
self.tr("Output layer"),
QgsProcessing.TypeVectorAnyGeometry))
Am 16. Mai wurde die Qgis-Python-API- Dokumentation veröffentlicht. Allerdings ist mir noch unklar, wie ich es hier verwenden soll. (Was sehr wohl ein Mangel an Python-Kenntnissen sein könnte)
Antworten:
Mit dem Übergang von QGIS2.x zu QGIS3.x wurde das gesamte Verarbeitungsframework überarbeitet und große Teile davon werden jetzt als C ++ - Klassen ausgeführt, mit denen Sie mit Python interagieren können. Leider ist die einfache Parametersyntax für Daten / Datensatz-E / A nicht mehr gültig. Die neue Parameterstruktur orientiert sich viel stärker an den in der Toolbox vorinstallierten (Python-) Verarbeitungsalgorithmen.
Wie ich sehe, haben Sie bereits die Beschreibung der neuen Algorithmusstruktur von @underdark befolgt. Um diese Struktur an Ihre Anforderungen anzupassen (Rasterebenen, doppelte Eingabe usw.), müssen Sie den Code an mehreren Stellen im Skript ändern. Ich habe ein grobes Beispiel mit einer kurzen Erklärung für Sie codiert (nur ein Algorithmus-Skelett basierend auf @underdarks-Beispiel):
Welche Schritte werden gemacht?
QgsProcessingAlgorithm
.INPUT_RASTER_A = 'INPUT_RASTER_A'
) deklarieren, um auf Ihren Algorithmus mit den vom Verarbeitungsframework bereitgestellten Parametern zu verweisen.QgsProcessingParameterType
- im Fall des Algorithmus:QgsProcessingParameterRasterLayer
,QgsProcessingParameterNumber
, und so weiter. Sie können die API-Einträge (dhQgsProcessingParameterRasterLayer
) konsultieren , um die richtigen Argumente zu übergeben und die Parameterobjekte zu konstruieren.context
undfeedback
Objekte dasprocessAlgorithm()
Verfahren , bei dem man die Eingabedatensätze aus den Parametern zur Laufzeit zu erhalten (in diesem Fall QgsRasterLayer Aufgaben werden durch die Verwendung vonparameterAsRasterLayer()
Verfahren, etc.).processAlgorithm()
.Ich hoffe, ich konnte Ihnen einige Einblicke geben, wie Sie Ihre Python-Algorithmen in QGIS3 entwerfen können. Wenn Sie nicht weiterkommen, ist es immer hilfreich zu prüfen, wie vorhandene Algorithmen des Verarbeitungsframeworks mit den Parametern umgehen. Sie können sie hier ansehen .
quelle