วิธีการเรียกใช้อัลกอริทึม sextante นอกคอนโซล QGIS หลาม?


10

ฉันติดอยู่กับการพยายามหาวิธีเรียกใช้ sextante จาก python แบบสแตนด์อโลนจากการกระจาย OSGeo4W เหตุผลที่ฉันต้องการทำสิ่งนี้คือฉันรู้สึกเหนื่อยที่จะป้อนพารามิเตอร์ในกล่องโต้ตอบทุกครั้งที่ฉันต้องการทดสอบแบบจำลองจากตัวสร้างแบบจำลอง

ดังนั้นนี่คือสคริปต์ 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ในขณะที่ฉันได้รับผลลัพธ์ที่มีความหมายจากคอนโซล Python ของ QGIS

ฉันรู้สึกเหมือนว่าฉันพลาดที่จะเริ่มต้นบางสิ่งบางอย่าง แต่อะไร?

มีวิธีที่ดีกว่าในการทดสอบแบบจำลองอื่น ๆ นอกเหนือจากการป้อนพารามิเตอร์จำนวนมากโดยใช้ GUI หรือไม่

อัพเดท 7/2/2012

ฉันกำลังมองหาวิธีแก้ปัญหาแบบ pythonic ทั่วไปเพื่อทดสอบด้วยอัลกอริทึม "mine" อัลกอริทึมดังกล่าวเป็นเพียงตัวอย่างที่แสดงให้เห็นว่าบางสิ่งบางอย่างอาจไม่ได้เริ่มต้น

อัพเดท 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

คำตอบ:


5

คุณสามารถสร้างสคริปต์ของคุณให้ทำงานกับปลั๊กอิน Script Runnerของ Gary Sherman และเรียกใช้จากภายใน QGIS การเรียกใช้สคริปต์ใหม่หลังจากแก้ไขควรแจ้งให้ Script Runner โหลดโมดูลใหม่และสะท้อนการเปลี่ยนแปลงของคุณ ดูเพิ่มเติม: Script วิ่ง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

คุณเพิ่มdef run_script(iface)ฟังก์ชั่น? สคริปต์ของคุณจะไม่ทำงานใน Script Runner หากไม่มี
dakcarto

เห็นได้ชัดว่าไม่ควรตั้งชื่อสคริปต์ว่าtest :-) mytest ใช้งานได้ดี มันคงจะดีถ้า__import__ขอบเขตสามารถ จำกัด sys.pathแทนที่จะมองทุกมุม มันแสดง docstring และรายการฟังก์ชั่นอื่น ๆ
mlt

มีการอัปเดต Script Runner ที่นี่
Dave X

4

Sextante จะต้องเริ่มต้นจึงโหลดอัลกอริทึมและสามารถดำเนินการได้ในภายหลัง

โทร Sextante.initialize () ก่อนทำอะไร


สวัสดี Victor นี่เป็นกรณีนี้หรือไม่? ฉันกำลังดิ้นรนกับวิธีการโทร Sextante ด้วยสคริปต์แบบสแตนด์อโลน (นอกเหนือจาก QGIS) และค้นหาตัวอย่างทั้งหมดที่ฉัน google ไม่ทำงาน ถูกโพสต์เมื่อปีที่แล้วดังนั้นฉันสงสัยว่าสถาปัตยกรรมของ sextante เปลี่ยนไปหรือไม่?
รวย

3

สำหรับผู้ใช้ใหม่ที่อ่านโพสต์นี้มีวิธีเรียกใช้อัลกอริทึมการประมวลผล QGIS ในสคริปต์ PyQGIS แบบสแตนด์อโลน ตรวจสอบคำตอบสำหรับการนำเข้าข้อผิดพลาดสำหรับ qgis.core เมื่อเรียกใช้เชลล์สคริปต์ OSGeo4wและฉันจะเข้าถึง "การประมวลผล" ด้วย Python ได้อย่างไร ซึ่งให้ตัวอย่างที่ทดสอบแก่คุณ


1
และเหตุผลของการโหวตคือ ... ?
Germán Carrillo

2

เนื่องจากอัลกอริทึมที่คุณต้องการใช้เป็นส่วนหนึ่งของเทพนิยายคุณสามารถใช้เทพนิยายได้โดยตรง

เช่นจาก 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

ฉันขอโทษฉันควรทำให้ชัดเจน มันเป็นเพียงตัวอย่าง ฉันจะไม่ใช้ SAGA เป็นพิเศษ
mlt

2

ตามวิธีการใช้งานสคริปต์ python แบบง่ายสำหรับ QGIS จากภายนอก (เช่น Sublime Text) คุณไม่สามารถรับการอ้างอิงถึงifaceวัตถุที่นี่เนื่องจากไม่มีอยู่ในบริบทนี้เนื่องจากสิ่งนี้ถูกเรียกใช้นอก QGIS ความคืบหน้าใด ๆ


ใช่โปรดตรวจสอบคำตอบของฉัน
Germán Carrillo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.