如何在QGIS python控制台之外运行sextante算法?


10

我有点想从OSGeo4W发行版的独立python中找出运行sextante的方式。我要执行此操作的原因是,每当我要从“模型构建器”测试模型时,我都会在对话框中输入参数感到厌倦。

所以这是python脚本,我们称之为 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")

我正在从批处理文件中调用

@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

问题是它说,Algorithm not found而我从QGIS python控制台获得有意义的输出。

我觉得我想初始化一些东西。但是呢

除了使用GUI输入大量参数外,还有没有更好的方法来测试模型?

更新7/2/2012

我正在寻找通用的pythonic解决方案来测试“我的”算法。前面提到的算法只是一个示例,表明可能未初始化某些内容。

更新7/27/2012

Script Runner的替代方法是使用IPython控制台调试脚本。除此之外,似乎没有一种方法可以使用sextante进行简单的单元测试,而没有其他任何运行:(

更新7/30/2012

正如Victor Olaya所建议的那样,我尝试像下面的代码中那样初始化Sextante。

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

但是我得到类似

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'

好吧...所有这些都变成了邮件列表讨论。也许值得将其转移到qgis-user或qgis-developer而不是SE。


您无法iface在独立的QGIS脚本中访问。 iface仅在侧面QGIS中运行时才使用。
内森·W

Answers:


5

您可以设计脚本来与Gary Sherman的Script Runner插件一起使用,并在QGIS中运行它。编辑后重新运行脚本,应提示Script Runner重新加载模块并反映您的更改。另请参阅:Script Runner的plugins.qgis.org清单

要点是确保您具有run_script函数,该函数会被Script Runner调用(示例来自其博客):

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

从理论上讲,它确实应该有助于调试(尽管在QGIS中),但看起来好像在Windows上已损坏。它一直在说,AttributeError: 'module' object has no attribute 'run_script'并坚持认为我没有在源代码查看器中可以看到的文档字符串。
mlt 2012年

您添加了def run_script(iface)功能吗?否则,您的脚本将无法在Script Runner中运行。
dakcarto 2012年

显然,不应将脚本命名为test :-) mytest到目前为止还可以。如果__import__可以限制范围而不是四处寻找,那就很好sys.path。它显示文档字符串和其他功能列表。
mlt 2012年

Script Runner 在这里
Dave X

4

Sextante必须初始化,因此它会加载算法并在以后执行它们。

在执行任何操作之前,请调用Sextante.initialize()。


你好维克多,还是这样吗?我在如何用独立脚本(在QGIS之外)中调用Sextante感到困惑,并且发现我在Google上无法使用的所有示例。这是在一年前发布的,所以我想知道六面体的体系结构是否发生了变化?
Rich


2

由于要使用的算法是saga的一部分,因此可以直接使用saga。

例如从批处理文件:

@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

抱歉,我应该说清楚。这只是一个例子。我不会特别使用SAGA。
mlt 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.