Saya sedang mengembangkan paket RQGIS. Untuk menjalankan QGIS dari dalam R, saya memanggil QGIS melalui baris perintah. Ini bekerja dengan sempurna dengan QGIS 2.14. Namun, menjalankan kode yang sama dengan QGIS 2.16 menghasilkan kesalahan. Inilah yang saya lakukan:
Pertama, saya mengatur semua jalur yang diperlukan di command prompt:
@echo off
SET OSGEO4W_ROOT=D:\osgeo4w_qgis16
call "%OSGEO4W_ROOT%"\bin\o4w_env.bat
@echo off
path %PATH%;%OSGEO4W_ROOT%\apps\qgis\bin
set PYTHONPATH=%PYTHONPATH%;%OSGEO4W_ROOT%\apps\qgis\python;
set QGIS_PREFIX_PATH=%OSGEO4W_ROOT%\apps\qgis
rem open python
python.exe
Selanjutnya, saya menjalankan baris berikut dengan Python:
import os
import sys
from qgis.core import *
import qgis.utils
from osgeo import ogr
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.gui import *
QgsApplication.setPrefixPath('D:\osgeo4w_qgis16\apps\qgis', True)
app = QgsApplication([], True)
QgsApplication.initQgis()
sys.path.append(r'D:\osgeo4w_qgis16\apps\qgis\python\plugins')
from processing.core.Processing import Processing
Processing.initialize()
import processing
processing.alglist()
processing.alghelp("grass7:v.voronoi")
Ini bekerja. Namun, memanggil processing.runalg ...
from processing.tests.TestData import points
result = processing.runalg('grass7:v.voronoi', points(), False, False, '270778.60198,270855.745301,4458921.97814,4458983.8488', -1, 0.0001, 0, None,)
... menghasilkan pesan kesalahan ini:
Error in sys.excepthook:
Traceback (most recent call last):
File "D:\osgeo4w_qgis16\apps\qgis\python\qgis\utils.py", line 196, in qgis_excepthook
showException(type, value, tb, None, messagebar=True)
File "D:\osgeo4w_qgis16\apps\qgis\python\qgis\utils.py", line 107, in showException
open_stack_dialog(type, value, tb, msg)
File "D:\osgeo4w_qgis16\apps\qgis\python\qgis\utils.py", line 142, in open_stack_dialog
iface.messageBar().popWidget()
AttributeError: 'NoneType' object has no attribute 'messageBar'
Original exception was:
Traceback (most recent call last):
File "<stdin>", line 10, in <module>
File "D:\osgeo4w_qgis16\apps\qgis\python\plugins\processing\tools\general.py", line 75, in runalg
alg = Processing.runAlgorithm(algOrName, None, *args, **kwargs)
File "D:\osgeo4w_qgis16\apps\qgis\python\plugins\processing\core\Processing.py", line 304, in runAlgorithm
ret = runalg(alg, progress)
File "D:\osgeo4w_qgis16\apps\qgis\python\plugins\processing\gui\AlgorithmExecutor.py", line 52, in runalg
progress.error(e.msg)
AttributeError: 'NoneType' object has no attribute 'error'
qgis
pyqgis
qgis-processing
Jannes
sumber
sumber
alg.execute(progress)
denganalg.execute(progress or SilentProgress())
di AlgorithmExecutor.py untuk menggunakan QGIS dalam aplikasi khusus. Masalahnya menjadi lebih buruk karena sekarang tidak ada pesan kesalahan yang terjadi. Alih-alih, bahkan ada pesan sukses (misalnya, saat berjalansaga:catchmentarearecursive
), hanya folder output yang ditentukan yang tetap kosong. Saya akan sangat menghargai jika Anda dapat memperbaiki masalah itu. Atau apakah saya melewatkan sesuatu?Barry, terima kasih atas saran Anda. Tampaknya, tim inti QGIS mengubah kode. Dalam QGIS 2.14
runalg
didefinisikan sebagai berikut:Jadi, jika kemajuan sama dengan
None
(yang merupakan kasus dalam kode contoh saya),SilentProgress
uruslah. Sebaliknya, dalam QGIS 2.16 pernyataan if yang sesuai telah dihapus (lihat jawaban Barry di atas), yang mengarah pada kegagalanrunalg
. Salah satu solusinya adalah mengedit skrip AlgorithmExecutor.py secara manual dengan menambahkan lagi baris yang hilang. Dalam hal ini, seseorang harus menambahkan baris impor lain ke awal skrip (from processing.core.SilentProgress import SilentProgress
).Saya juga akan bertanya kepada tim inti QGIS apakah ada alasan khusus untuk menghilangkan garis-garis ini. Dengan sedikit keberuntungan, mereka akan menambahkannya lagi ...
sumber
Ini sedikit kesalahan asli yang terakhir:
mengatakan bahwa
progress
adalahNone
, sehinggaprogress.error
panggilan gagal. Ini kemudian memicu bagian pertama dari kesalahan yang ditampilkan karena penangan kesalahan QGIS mencoba untuk menulis pesan ke objek iface yang juga tidak ada.Bit relevan dari kode python Pemrosesan yang menghasilkan kesalahan asli adalah:
Jadi untuk beberapa alasan, algoritma telah menaikkan GeoAlgorithmExecutionException dan
progress
tidak ada. Saya tidak tahu dari manaprogress
seharusnya berasal - mungkin skrip python Anda harus membuat sesuatu untuk diteruskan. Saya tidak tahu itu meningkatkan kesalahan GeoAlg juga, atau yang mana dari dua masalah yang Anda benar-benar perlu perbaiki ...sumber