Bagaimana menjalankan algoritma sextante di luar konsol python QGIS?

10

Saya agak macet mencoba mencari cara untuk menjalankan sextante dari python mandiri dari distribusi OSGeo4W. Alasan saya ingin melakukan ini adalah karena saya lelah memasukkan parameter dalam dialog setiap kali saya ingin menguji model dari Model Builder.

Jadi di sini adalah skrip python sebut saja 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")

Bahwa saya menelepon dari file batch saya

@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

Masalahnya adalah katanya Algorithm not foundsementara saya mendapatkan output yang berarti dari konsol python QGIS.

Saya merasa seperti kehilangan untuk menginisialisasi sesuatu. Tapi apa?

Apakah ada cara yang lebih baik untuk menguji Model selain dengan memasukkan banyak parameter menggunakan GUI?

PEMBARUAN 7/2/2012

Saya mencari solusi pythonic generik untuk diuji dengan algoritma "mine". Algoritma yang disebutkan di atas hanyalah contoh yang menunjukkan bahwa sesuatu mungkin tidak diinisialisasi.

PEMBARUAN 7/27/2012

Alternatif untuk Script Runner adalah dengan menggunakan konsol IPython untuk men-debug skrip. Selain itu sepertinya tidak ada cara untuk melakukan pengujian unit sederhana dengan sextante tanpa menjalankan :(

PEMBARUAN 7/30/2012

Seperti yang disarankan Victor Olaya, saya mencoba menginisialisasi Sextante seperti pada kode di bawah ini.

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

Namun saya mendapatkan sesuatu seperti

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'

Yah ... semuanya menjadi diskusi milis. Mungkin lebih baik pindah ke qgis-user atau qgis-developer daripada SE.

mlt
sumber
Anda tidak dapat mengakses ifacedalam skrip QGIS mandiri. ifacehanya digunakan saat berjalan di sisi QGIS.
Nathan W

Jawaban:

5

Anda dapat membuat skrip untuk bekerja dengan plugin Script Runner Gary Sherman dan menjalankannya dari dalam QGIS. Menjalankan kembali skrip, setelah diedit, akan meminta Script Runner memuat ulang modul dan mencerminkan perubahan Anda. Lihat juga: Daftar plugins.qgis.org Script Runner .

Yang penting adalah memastikan Anda memiliki fungsi run_script, yang dipanggil oleh Script Runner (contoh dari blog-nya):

def run_script(iface):
    ldr = Loader(iface)
    ldr.load_shapefiles('/vmap0_shapefiles')
dakcarto
sumber
Sementara secara teori seharusnya memang membantu untuk debug (meskipun di dalam QGIS), sepertinya rusak pada Windows. Itu terus mengatakan AttributeError: 'module' object has no attribute 'run_script'dan terus bersikeras bahwa saya tidak punya dokumen yang bisa saya lihat di sumber viewer.
mlt
Apakah Anda menambahkan def run_script(iface)fungsi? Script Anda tidak akan berjalan di Script Runner tanpa itu.
dakcarto
Rupanya seseorang tidak boleh menamai skrip sebagai tes :-) mytest berfungsi dengan baik sejauh ini. Alangkah baiknya jika __import__ruang lingkup dapat dibatasi daripada melihat seluruh sys.path. Ini menunjukkan docstring dan daftar fungsi lainnya.
mlt
Script Runner diperbarui di sini
Dave X
4

Sextante harus diinisialisasi, sehingga memuat algoritme dan kemudian dapat menjalankannya.

Panggil Sextante.initialize () sebelum melakukan apa pun.

Victor Olaya
sumber
Hai Victor, apakah ini masih terjadi? Saya berjuang dengan cara memanggil Sextante dalam skrip mandiri (di luar QGIS) dan menemukan semua contoh yang saya google tidak berfungsi. Ini diposting setahun yang lalu jadi saya bertanya-tanya apakah arsitektur sextante telah berubah?
Kaya
2

Karena algoritma yang ingin Anda gunakan adalah bagian dari saga, Anda dapat menggunakan saga secara langsung.

misal dari batchfile:

@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
sumber
Saya minta maaf, saya harus menjelaskannya. Itu hanya sebuah contoh. Saya tidak akan menggunakan SAGA secara khusus.
mlt