Jak uruchomić algorytmy sextante poza konsolą python QGIS?

10

W pewnym sensie utknąłem, próbując znaleźć sposób uruchomienia sextante z samodzielnego pytona z dystrybucji OSGeo4W. Powodem, dla którego chcę to zrobić, jest zmęczenie wprowadzaniem parametrów w oknie dialogowym za każdym razem, gdy chcę przetestować model z Model Builder.

Więc oto skrypt w języku Python nazwijmy go 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")

Dzwonię z mojego pliku wsadowego

@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

Problem polega na tym, że mówi, Algorithm not foundpodczas gdy otrzymuję znaczące dane wyjściowe z konsoli python QGIS.

Czuję, że brakuje mi czegoś inicjującego. Ale co?

Czy jest lepszy sposób na przetestowanie modelu niż wprowadzenie ton parametrów za pomocą GUI?

AKTUALIZACJA 7/2/2012

Szukam ogólnego rozwiązania pythonowego do testowania przy użyciu algorytmów „moje”. Wspomniany algorytm jest tylko przykładem pokazującym, że coś prawdopodobnie nie zostało zainicjowane.

AKTUALIZACJA 7/27/2012

Alternatywą dla Script Runner jest użycie konsoli IPython do debugowania skryptów. Poza tym nie wydaje się, aby można było przeprowadzać proste testy jednostkowe przy użyciu sextante bez niczego innego :(

AKTUALIZACJA 7/30/2012

Jak sugeruje Victor Olaya, staram się zainicjować Sextante jak w poniższym kodzie.

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

Jednak dostaję coś takiego

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'

Cóż ... to wszystko staje się dyskusją na liście mailowej. Być może warto przejść do qgis-user lub qgis-developer zamiast SE.

mlt
źródło
Nie można uzyskać dostępu ifacew samodzielnym skrypcie QGIS. ifacejest użyteczny tylko podczas pracy w bocznym QGIS.
Nathan W

Odpowiedzi:

5

Możesz stworzyć swój skrypt do pracy z wtyczką Gary'ego Shermana Script Runner i uruchomić go z poziomu QGIS. Ponowne uruchomienie skryptu, po edycji, powinno zachęcić Script Runnera do ponownego załadowania modułu i odzwierciedlenia twoich zmian. Zobacz także: wpis plugins.qgis.org w skrypcie Runnera .

Konieczne jest upewnienie się, że masz funkcję run_script, która jest wywoływana przez Script Runner (przykład z jego bloga):

def run_script(iface):
    ldr = Loader(iface)
    ldr.load_shapefiles('/vmap0_shapefiles')
dakcarto
źródło
Chociaż teoretycznie powinien on rzeczywiście pomóc w debugowaniu (chociaż w QGIS), wygląda na to, że jest zepsuty w systemie Windows. Ciągle mówi AttributeError: 'module' object has no attribute 'run_script'i upiera się, że nie mam żadnych dokumentów, które widzę w przeglądarce źródła.
mlt
Czy dodałeś def run_script(iface)funkcję? Bez tego skrypt nie będzie działał w Script Runner.
dakcarto
Najwyraźniej nie należy nazywać skryptu testem :-) mytest jak dotąd działa dobrze. Byłoby miło, gdyby __import__zasięg można było ograniczyć, zamiast rozglądać się dookoła sys.path. Pokazuje dokumentację i listę innych funkcji.
mlt
Script Runner został zaktualizowany tutaj
Dave X
4

Sextante musi zostać zainicjowany, aby załadował algorytmy i mógł je później wykonać.

Wywołaj Sextante.initialize () przed zrobieniem czegokolwiek.

Victor Olaya
źródło
Cześć Victor, czy nadal tak jest? Mam problem z wywołaniem Sextante w samodzielnym skrypcie (poza QGIS) i znajduję wszystkie przykłady, w których google nie działa. Zostało to opublikowane rok temu, więc zastanawiam się, czy zmieniła się architektura sextante?
Rich
2

Ponieważ algorytm, którego chcesz użyć, jest częścią sagi, możesz użyć sagi bezpośrednio.

np. z pliku wsadowego:

@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
źródło
Przepraszam, powinienem był to wyjaśnić. To był tylko przykład. Ja nie będziemy używać SAGA w szczególności.
mlt