Làm cách nào để chạy các thuật toán sextante bên ngoài bảng điều khiển python của QGIS?


10

Tôi bị mắc kẹt khi cố gắng tìm ra cách chạy sextante từ một con trăn độc lập từ bản phân phối OSGeo4W. Lý do tôi muốn làm điều này là vì tôi cảm thấy mệt mỏi khi nhập các tham số trong hộp thoại mỗi lần tôi muốn kiểm tra một mô hình từ Model Builder.

Vì vậy, đây là kịch bản python hãy gọi nó 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")

Đó là tôi đang gọi từ tập tin bó của tôi

@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

Vấn đề là nó nói Algorithm not foundtrong khi tôi nhận được đầu ra có ý nghĩa từ bảng điều khiển python của QGIS.

Tôi cảm thấy như mình đang thiếu để khởi tạo một cái gì đó. Nhưng cái gì?

Có cách nào tốt hơn để kiểm tra Mô hình ngoài việc nhập hàng tấn tham số bằng GUI không?

CẬP NHẬT 7/2/2012

Tôi đang tìm kiếm giải pháp pythonic chung để thử nghiệm với thuật toán "của tôi". Thuật toán được đề cập chỉ là một ví dụ cho thấy rằng một cái gì đó có thể không được khởi tạo.

CẬP NHẬT 27/07/2012

Một thay thế cho Script Runner là sử dụng bảng điều khiển IPython để gỡ lỗi các tập lệnh. Ngoài ra, dường như không có cách nào để thực hiện kiểm tra đơn vị đơn giản với sextante mà không có gì khác đang chạy :(

CẬP NHẬT NGÀY 30/07/2012

Như Victor Olaya gợi ý, tôi cố gắng khởi tạo Sextante như trong đoạn mã dưới đây.

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

Tuy nhiên tôi nhận được một cái gì đó như

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'

Chà ... tất cả trở thành một cuộc thảo luận danh sách gửi thư như nhau. Có lẽ nó đáng để chuyển sang qgis-user hoặc qgis-developer thay vì SE.


Bạn không thể truy cập ifacetrong tập lệnh QGIS độc lập. ifacechỉ được sử dụng khi chạy trong QGIS bên.
Nathan W

Câu trả lời:


5

Bạn có thể tạo tập lệnh của mình để hoạt động với plugin Script Runner của Gary Sherman và chạy nó từ bên trong QGIS. Chạy lại tập lệnh, sau khi chỉnh sửa, sẽ nhắc Script Runner tải lại mô-đun và phản ánh các thay đổi của bạn. Xem thêm: Danh sách plugins.qgis.org của Script Runner .

Các yếu tố cần thiết là đảm bảo bạn có chức năng run_script, được Script Runner gọi (ví dụ từ blog của anh ấy):

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

Mặc dù về lý thuyết, nó thực sự sẽ giúp gỡ lỗi (mặc dù bên trong QGIS), có vẻ như nó bị hỏng trên Windows. Nó cứ nói AttributeError: 'module' object has no attribute 'run_script'và cứ khăng khăng rằng tôi không có tài liệu nào mà tôi có thể thấy trong trình xem nguồn.
mlt

Bạn đã thêm def run_script(iface)chức năng? Kịch bản của bạn sẽ không chạy trong Script Runner nếu không có điều đó.
dakcarto

Rõ ràng người ta không nên đặt tên kịch bản là thử nghiệm :-) mytest hoạt động ổn cho đến nay. Sẽ thật tuyệt nếu __import__phạm vi có thể bị hạn chế thay vì nhìn khắp nơi sys.path. Nó hiển thị chuỗi và danh sách các chức năng khác.
mlt

Script Runner được cập nhật tại đây
Dave X

4

Sextante phải được khởi tạo, vì vậy nó tải các thuật toán và sau đó có thể thực hiện chúng.

Gọi Sextante.initialize () trước khi làm bất cứ điều gì.


Xin chào Victor, đây có phải là trường hợp không? Tôi đang vật lộn với cách gọi Sextante trong một tập lệnh độc lập (bên ngoài QGIS) và tìm tất cả các ví dụ tôi google để không hoạt động. Điều này đã được đăng một năm trước vì vậy tôi tự hỏi nếu kiến ​​trúc của sextante đã thay đổi?
Giàu


2

Vì thuật toán bạn muốn sử dụng là một phần của saga, bạn có thể sử dụng saga trực tiếp.

ví dụ từ một tập tin:

@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

Tôi xin lỗi, tôi nên đã làm cho nó rõ ràng. Đó chỉ là một ví dụ. Tôi sẽ không sử dụng SAGA nói riêng.
mlt

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.