¿Cómo ejecutar algoritmos sextante fuera de la consola de Python QGIS?

10

Estoy un poco atascado tratando de descubrir la forma de ejecutar sextante desde una pitón independiente de la distribución OSGeo4W. La razón por la que quiero hacer esto es porque me cansé de ingresar parámetros en el cuadro de diálogo cada vez que quiero probar un modelo de Model Builder.

Así que aquí está el script de Python, llamémoslo 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")

Que estoy llamando desde mi archivo por lotes

@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

El problema es que dice, Algorithm not foundmientras que obtengo resultados significativos de la consola QGIS python.

Siento que me falta para inicializar algo. ¿Pero que?

¿Existe una mejor manera de probar un modelo que no sea mediante la introducción de toneladas de parámetros utilizando la GUI?

ACTUALIZACIÓN 7/2/2012

Estoy buscando una solución pitónica genérica para probar con algoritmos "míos". El algoritmo mencionado anteriormente es solo un ejemplo que muestra que algo probablemente no se inicializó.

ACTUALIZACIÓN 27/07/2012

Una alternativa a Script Runner es usar la consola IPython para depurar scripts. Aparte de eso, no parece haber una forma de hacer pruebas unitarias simples con sextante sin nada más en ejecución :(

ACTUALIZACIÓN 30/07/2012

Como sugiere Victor Olaya, trato de inicializar Sextante como en el código a continuación.

#!/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()

Sin embargo me sale algo como

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'

Bueno ... todo se convierte en una discusión de la lista de correo por igual. Quizás valga la pena pasar a qgis-user o qgis-developer en lugar de SE.

mlt
fuente
No puede acceder ifaceen un script QGIS independiente. ifacesolo es útil cuando se ejecuta en QGIS lateral.
Nathan W

Respuestas:

5

Puede crear su script para que funcione con el complemento Script Runner de Gary Sherman y ejecutarlo desde QGIS. Volver a ejecutar el script, después de editarlo, debe solicitar a Script Runner que vuelva a cargar el módulo y refleje sus cambios. Vea también: Listado de plugins.qgis.org de Script Runner .

Lo esencial es asegurarse de tener una función run_script, que es ejecutada por Script Runner (ejemplo de su blog):

def run_script(iface):
    ldr = Loader(iface)
    ldr.load_shapefiles('/vmap0_shapefiles')
dakcarto
fuente
Si bien en teoría debería ayudar a depurar (aunque dentro de QGIS), parece que está roto en Windows. Sigue diciendo AttributeError: 'module' object has no attribute 'run_script'e insistiendo en que no tengo cadenas de documentos que pueda ver en el visor de origen.
mlt
¿Agregaste la def run_script(iface)función? Su script no se ejecutará en Script Runner sin eso.
dakcarto
Aparentemente, uno no debe nombrar el script como prueba :-) mytest funciona bien hasta ahora. Sería bueno si el __import__alcance se puede restringir en lugar de mirar por todas partes sys.path. Muestra docstring y una lista de otras funciones.
mlt
Script Runner se actualiza aquí
Dave X
4

Sextante tiene que ser inicializado, por lo que carga los algoritmos y luego puede ejecutarlos.

Llame a Sextante.initialize () antes de hacer algo.

Victor Olaya
fuente
Hola Victor, ¿sigue siendo así? Estoy luchando con cómo llamar a Sextante en un script independiente (fuera de QGIS) y encontrar todos los ejemplos que busco en Google para que no funcionen. Esto fue publicado hace un año, así que me pregunto si la arquitectura de sextante ha cambiado.
Rico
2

Dado que el algoritmo que desea usar es parte de saga, puede usar saga directamente.

por ejemplo, de un archivo por lotes:

@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
fuente
Pido disculpas, debería haberlo dejado claro. Fue solo un ejemplo. Estoy no iba a usar SAGA en particular.
mlt