Come eseguire algoritmi sestanti al di fuori della console Python di QGIS?


10

Sono un po 'bloccato cercando di capire come eseguire sestante da un pitone autonomo dalla distribuzione OSGeo4W. Il motivo per cui voglio farlo è che mi sono stancato di inserire i parametri nella finestra di dialogo ogni volta che voglio testare un modello da Model Builder.

Quindi ecco lo script di Python chiamiamolo 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")

Che sto chiamando dal mio file batch

@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

Il problema è che dice Algorithm not foundche ottengo un output significativo dalla console Python di QGIS.

Mi sento come se mi mancasse per inizializzare qualcosa. Ma cosa?

Esiste un modo migliore per testare un modello se non inserendo tonnellate di parametri usando la GUI?

AGGIORNAMENTO DEL 7/2/2012

Sto cercando una soluzione pitonica generica da testare con algoritmi "miei". L'algoritmo sopra menzionato è solo un esempio che mostra che qualcosa probabilmente non è stato inizializzato.

AGGIORNAMENTO 27/07/2012

Un'alternativa a Script Runner è utilizzare la console IPython per eseguire il debug degli script. A parte questo, non sembra esserci un modo per fare semplici test unitari con sestante con nient'altro in esecuzione :(

AGGIORNAMENTO DEL 30/07/2012

Come suggerisce Victor Olaya, provo a inizializzare Sextante come nel codice seguente.

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

Comunque ottengo qualcosa di simile

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'

Bene ... tutto diventa una discussione sulla mailing list allo stesso modo. Forse vale la pena passare a qgis-user o qgis-developer anziché a SE.


Non è possibile accedere ifacein uno script QGIS autonomo. ifaceè utile solo quando si esegue in QGIS laterale.
Nathan W,

Risposte:


5

Puoi creare il tuo script in modo che funzioni con il plug-in Script Runner di Gary Sherman ed eseguirlo da QGIS. La riesecuzione dello script, dopo la modifica, dovrebbe richiedere a Script Runner di ricaricare il modulo e riflettere le modifiche. Vedi anche: Elenco plugins.qgis.org di Script Runner .

L'essenziale è assicurarsi di avere una funzione run_script, che viene chiamata da Script Runner (esempio dal suo blog):

def run_script(iface):
    ldr = Loader(iface)
    ldr.load_shapefiles('/vmap0_shapefiles')

Mentre in teoria dovrebbe davvero aiutare il debug (anche se all'interno di QGIS), sembra che sia rotto su Windows. Continua a dire AttributeError: 'module' object has no attribute 'run_script'e continua a insistere sul fatto che non ho dotstrings che posso vedere nel visualizzatore di sorgenti.
mlt

Hai aggiunto la def run_script(iface)funzione? Lo script non verrà eseguito in Script Runner senza quello.
dakcarto,

Apparentemente non si dovrebbe nominare lo script come test :-) mytest funziona bene finora. Sarebbe bello se l' __import__ambito potesse essere limitato invece di guardare dappertutto sys.path. Mostra docstring ed elenco di altre funzioni.
mlt

Script Runner viene aggiornato qui
Dave X il

4

Sextante deve essere inizializzato, quindi carica gli algoritmi e può successivamente eseguirli.

Chiama Sextante.initialize () prima di fare qualsiasi cosa.


Ciao Victor, è ancora così? Sto lottando con come chiamare Sextante in uno script autonomo (al di fuori di QGIS) e trovando tutti gli esempi in cui Google non funziona. Questo è stato pubblicato un anno fa, quindi mi chiedo se l'architettura del sestante è cambiata?
Ricco


2

Poiché l'algoritmo che si desidera utilizzare fa parte di saga, è possibile utilizzare direttamente saga.

ad es. da un file batch:

@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

Mi scuso, avrei dovuto chiarire. Era solo un esempio. Io non intenzione di utilizzare SAGA in particolare.
mlt

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.