Wie führe ich Sextante-Algorithmen außerhalb der QGIS-Python-Konsole aus?

10

Ich bin festgefahren, um herauszufinden, wie Sextante von einer eigenständigen Python aus der OSGeo4W-Distribution ausgeführt werden kann. Der Grund, warum ich dies tun möchte, ist, dass ich jedes Mal, wenn ich ein Modell aus Model Builder testen möchte, müde geworden bin, Parameter in den Dialog einzugeben.

Also hier ist das Python-Skript, nennen wir es test.py

# as per http://qgis.org/pyqgis-cookbook/intro.html#using-pyqgis-in-custom-application
from qgis.core import *
# supply path to where is your qgis installed
QgsApplication.setPrefixPath("C:/OSGeo4W/apps/qgis", True)
# load providers
QgsApplication.initQgis()

from sextante.core.Sextante import Sextante
Sextante.alglist()
Sextante.alghelp("saga:slopeaspectcurvature")

Das rufe ich aus meiner Batch-Datei an

@echo off

set OSGEO4W_ROOT=C:\OSGeo4W
set PYTHONPATH=%OSGEO4W_ROOT%\apps\qgis\python;%OSGEO4W_ROOT%\apps\qgis\python\plugins;%HOME%/.qgis/python/plugins
set PATH=%OSGEO4W_ROOT%\bin;%OSGEO4W_ROOT%\apps\qgis\bin;%OSGEO4W_ROOT%\apps\qgis\plugins

python test.py

Das Problem ist, dass es heißt, Algorithm not foundwährend ich eine aussagekräftige Ausgabe von der QGIS-Python-Konsole erhalte.

Ich habe das Gefühl, dass mir etwas fehlt, um etwas zu initialisieren. Aber was?

Gibt es eine bessere Möglichkeit, ein Modell zu testen, als Tonnen von Parametern über die GUI einzugeben?

UPDATE 02.07.2012

Ich suche nach einer generischen Python-Lösung zum Testen mit "meinen" Algorithmen. Der oben genannte Algorithmus ist nur ein Beispiel dafür, dass wahrscheinlich etwas nicht initialisiert wurde.

UPDATE 27.07.2012

Eine Alternative zu Script Runner ist die Verwendung der IPython-Konsole zum Debuggen von Skripten. Abgesehen davon scheint es keine Möglichkeit zu geben, einfache Unit-Tests mit Sextante durchzuführen, ohne dass etwas anderes ausgeführt wird :(

UPDATE 30.07.2012

Wie Victor Olaya vorschlägt, versuche ich, Sextante wie im folgenden Code zu initialisieren.

#!/usr/bin/env python

import sys
from PyQt4.QtGui import QApplication
from sextante.core.Sextante import Sextante

def main():
    """ main function or something """
    # as per http://qgis.org/pyqgis-cookbook/intro.html#using-pyqgis-in-custom-application
    from qgis.core import *
    import qgis.utils

    app = QApplication(sys.argv)
    # supply path to where is your qgis installed
    QgsApplication.setPrefixPath("C:/OSGeo4W/apps/qgis", True)
    # load providers
    QgsApplication.initQgis()
    # how???
    # qgis.utils.iface = QgisInterface.instance()
    Sextante.initialize()
    run_script(qgis.utils.iface)

def run_script(iface):
    """ this shall be called from Script Runner"""
    Sextante.alglist()
    Sextante.alghelp("saga:slopeaspectcurvature")

if __name__=="__main__":
    main()

Allerdings bekomme ich so etwas wie

Traceback (most recent call last):
  File "test.py", line 29, in
    main()
  File "test.py", line 20, in main
    Sextante.initialize()
  File "C:\Documents and Settings\user\.qgis\python\plugins\sextante\core\Sextante.py", line 94, in initialize
    Sextante.addProvider(GrassAlgorithmProvider())
  File "C:\Documents and Settings\user\.qgis\python\plugins\sextante\grass\GrassAlgorithmProvider.py", lin
e 17, in __init__
    self.actions.append(DefineGrassRegionAction())
  File "C:\Documents and Settings\user\.qgis\python\plugins\sextante\grass\DefineGrassRegionAction.py", li
ne 16, in __init__
    canvas = QGisLayers.iface.mapCanvas()
AttributeError: 'NoneType' object has no attribute 'mapCanvas'

Nun ... alles wird zu einer Mailinglistendiskussion. Vielleicht lohnt es sich, zu qgis-user oder qgis-developer anstelle von SE zu wechseln.

mlt
quelle
Sie können ifacein einem eigenständigen QGIS-Skript nicht darauf zugreifen . ifaceist nur nützlich, wenn Sie in Side QGIS ausgeführt werden.
Nathan W

Antworten:

5

Sie können Ihr Skript so erstellen, dass es mit dem Script Runner-Plugin von Gary Sherman funktioniert, und es in QGIS ausführen. Wenn Sie das Skript nach der Bearbeitung erneut ausführen, sollte Script Runner aufgefordert werden, das Modul neu zu laden und Ihre Änderungen wiederzugeben. Siehe auch: Plugins.qgis.org von Script Runner .

Das Wesentliche ist, sicherzustellen, dass Sie eine run_script-Funktion haben, die von Script Runner aufgerufen wird (Beispiel aus seinem Blog):

def run_script(iface):
    ldr = Loader(iface)
    ldr.load_shapefiles('/vmap0_shapefiles')
Dakcarto
quelle
Während es theoretisch in der Tat helfen sollte, Fehler zu beheben (obwohl in QGIS), sieht es so aus, als ob es unter Windows kaputt ist. Es wird immer wieder gesagt AttributeError: 'module' object has no attribute 'run_script'und darauf bestanden, dass ich keine Dokumentzeichenfolgen habe, die ich im Quell-Viewer sehen kann.
Mlt
Haben Sie die def run_script(iface)Funktion hinzugefügt ? Ihr Skript wird ohne das nicht in Script Runner ausgeführt.
Dakcarto
Anscheinend sollte man Skript nicht als Test benennen :-) mytest funktioniert soweit okay. Es wäre schön, wenn der __import__Umfang eingeschränkt werden könnte, anstatt überall hinzuschauen sys.path. Es zeigt die Dokumentzeichenfolge und eine Liste anderer Funktionen.
mlt
Script Runner wird hier
Dave X
4

Sextante muss initialisiert werden, damit die Algorithmen geladen und später ausgeführt werden können.

Rufen Sie Sextante.initialize () auf, bevor Sie etwas tun.

Victor Olaya
quelle
Hallo Victor, ist das noch so? Ich habe Probleme damit, Sextante in einem eigenständigen Skript (außerhalb von QGIS) aufzurufen und alle Beispiele zu finden, die ich google, um nicht zu funktionieren. Dies wurde vor einem Jahr gepostet, also frage ich mich, ob sich die Architektur von Sextante geändert hat?
Rich
2

Da der Algorithmus, den Sie verwenden möchten, Teil der Saga ist, können Sie die Saga direkt verwenden.

zB aus einer Batchdatei:

@ECHO OFF

REM SET SAGA_MLB = C:\SAGA\Modules
REM SET PATH = %PATH%;C:\SAGA

saga_cmd ta_morphometry "Slope, Aspect, Curvature" -ELEVATION=elevation.sgrd -SLOPE=slope.sgrd -ASPECT=aspect.sgrd -CURV=NULL -HCURV=NULL -VCURV=NULL -METHOD=5

PAUSE
johanvdw
quelle
Ich entschuldige mich, ich hätte es klarstellen sollen. Es war nur ein Beispiel. Ich bin nicht gehen zu SAGA insbesondere verwenden.
Mlt