Como executar algoritmos sextantes fora do console python do QGIS?

10

Estou meio que tentando descobrir o caminho para executar sextante a partir de um python independente da distribuição OSGeo4W. O motivo pelo qual desejo fazer isso é que me cansei de inserir parâmetros na caixa de diálogo toda vez que desejo testar um modelo no Model Builder.

Então aqui está o script python, vamos chamá-lo 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 estou ligando do meu arquivo em 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

O problema é que ele diz Algorithm not foundque eu recebo uma saída significativa do console python do QGIS.

Sinto que estou faltando para inicializar alguma coisa. Mas o que?

Existe uma maneira melhor de testar um modelo que não seja através da inserção de toneladas de parâmetros usando a GUI?

ATUALIZAÇÃO 7/2/2012

Estou procurando uma solução python genérica para testar com algoritmos "mine". O algoritmo mencionado acima é apenas um exemplo que mostra que algo provavelmente não foi inicializado.

ATUALIZAÇÃO 7/27/2012

Uma alternativa ao Script Runner é usar o console IPython para depurar scripts. Fora isso, não parece haver uma maneira de fazer testes simples de unidade com sextante sem mais nada em execução :(

ATUALIZAÇÃO 30/07/2012

Como Victor Olaya sugere, tento inicializar o Sextante como no código abaixo.

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

No entanto, eu recebo 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'

Bem ... tudo se torna uma discussão na lista de discussão. Talvez valha a pena mudar para qgis-user ou qgis-developer em vez de SE.

mlt
fonte
Você não pode acessar ifaceem um script QGIS independente. ifaceé útil apenas quando executado no lado QGIS.
19713 Nathan W

Respostas:

5

Você pode criar seu script para trabalhar com o plug - in Script Runner de Gary Sherman e executá-lo no QGIS. A nova execução do script, após a edição, deve solicitar ao Script Runner que recarregue o módulo e reflita suas alterações. Veja também: Listagem de plugins.qgis.org do Script Runner .

O essencial é garantir que você tenha uma função run_script, que é chamada pelo Script Runner (exemplo de seu blog):

def run_script(iface):
    ldr = Loader(iface)
    ldr.load_shapefiles('/vmap0_shapefiles')
dakcarto
fonte
Embora, em teoria, deva realmente ajudar a depurar (embora dentro do QGIS), parece que ele está quebrado no Windows. Ele continua dizendo AttributeError: 'module' object has no attribute 'run_script'e continua insistindo que não tenho documentos que eu possa ver no visualizador de código-fonte.
mlt
Você adicionou a def run_script(iface)função? Seu script não será executado no Script Runner sem isso.
Dakcarto
Aparentemente, não se deve nomear o script como teste :-) O mytest funciona bem até agora. Seria bom se o __import__escopo pudesse ser restringido em vez de parecer todo sys.path. Ele mostra a documentação e a lista de outras funções.
mlt
O Script Runner é atualizado aqui
Dave X
4

O Sextante precisa ser inicializado, para carregar os algoritmos e depois executá-los.

Chame Sextante.initialize () antes de fazer qualquer coisa.

Victor Olaya
fonte
Oi Victor, esse ainda é o caso? Estou lutando com como chamar Sextante em um script independente (fora do QGIS) e encontrando todos os exemplos que eu google para não funcionarem. Isso foi postado um ano atrás, então eu me pergunto se a arquitetura do sextante mudou?
Rich
2

Como o algoritmo que você deseja usar faz parte da saga, você pode usá-la diretamente.

por exemplo, de um arquivo em lote:

@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
fonte
Peço desculpas, eu deveria ter deixado claro. Foi só um exemplo. Eu não vou usar SAGA em particular.
mlt