Mengakses `pemrosesan` dengan Python?

16

Saya ingin mengakses fungsi garis meledak di Python di luar QGIS dari skrip mandiri.

Modul apa yang harus saya muat untuk menggunakannya?

Bagaimana saya bisa mengakses processing?

from qgis.core import *

layerInput = QgsVectorLayer('test.shp', 'test', 'ogr')

processing.runalg('qgis:explodelines', layerInput, 'temp.shp')
ustroetz
sumber
2
Saya pikir Anda harus menggunakan import processing.
Joseph
@ Joseph Maaf karena tidak spesifik: Tapi saya ingin mengaksesnya dari skrip mandiri.
ustroetz
Ahh jangan khawatir :). Dalam hal ini, permintaan maaf tetapi saya tidak tahu karena saya selalu menjalankannya dalam QGIS. Semoga orang lain akan memberi saran.
Joseph
Hai @ustroetz, apakah Anda berhasil menjalankan ini dari skrip mandiri Anda? Saya bertanya karena saya juga mencoba menjalankan skrip eksternal.
Joseph
@ Joseph Tidak, saya belum
ustroetz

Jawaban:

25

UPDATE 24.04.2018: Lihat bagaimana melakukan ini di QGIS v3.x di sini .


Untuk QGIS v2.x

Akhirnya ditemukan cara yang tepat untuk menjalankan algoritma pemrosesan melalui skrip PyQGIS yang berdiri sendiri.

Menggunakan Memproses plugin versi 2.2.0-2, Anda dapat mencoba skrip berikut:

# Prepare the environment
import sys
from qgis.core import *
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

# Prepare processing framework 
sys.path.append('/home/user/.qgis2/python/plugins') # Folder where Processing is located
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

# Run the algorithm
layerInput = QgsVectorLayer('test.shp', 'test', 'ogr')
general.runalg('qgis:explodelines', layerInput, 'temp.shp')

# Exit applications
QgsApplication.exitQgis()
QApplication.exit()

Versi Pemrosesan yang lebih baru dapat ditemukan di /usr/share/qgis/python/plugins, jadi Anda mungkin perlu menggunakannya sys.path.append('/usr/share/qgis/python/plugins').

Saya menemukan contoh yang berfungsi di Galat: Algoritma tidak ditemukan , yang pada gilirannya didasarkan pada diskusi milis Qgis-dev .

Germán Carrillo
sumber
1
Plugin pemrosesan mungkin tidak di '/home/user/.qgis2/python/plugins'. Anda dapat menemukan lokasi dengan membuka QGIS dan mengklik plugins/Manage and install pluginsgulir ke bawah untuk memproses dan Anda akan melihat lokasi instalasi dalam deskripsi.
Tn. Purple
2
Saya menerima banyak peringatan tentang cannot-create-a-qpixmapdengan fungsi yang berdiri sendiri ini, tetapi saya melihat Anda menyelesaikannya juga dalam pertanyaan ini gis.stackexchange.com/questions/188074/…
Mr Purple
1
Anda dapat membuat skrip mandiri lebih umum dengan menjatuhkan layerInputdan mengubah baris runalg ke: general.runalg(*sys.argv[1:])belum lagi skrip ini dapat menjadi dasar untuk pemrosesan GIS paralel sesuai pertanyaan ini: gis.stackexchange.com/questions/119961/…
Mr Ungu
Apakah mungkin untuk melakukan kerangka kerja yang sama tetapi untuk menjalankan PLUGIN dari Python mandiri (tidak di dalam QGIS)? Saya menjalankan fungsi alglist () dan saya tidak bisa melihat plugin saya terpasang di QGIS saya di sana ...
Irene
3

Sampai saya mulai bekerja dengan cara umum untuk melakukannya, saya akan memberi tahu Anda solusinya.

Saya menggunakan plugin Pengolah versi 2.2.0-2 (saya sarankan Anda untuk menggunakan versi ini), yang diinstal di /home/germap/.qgis2/python/plugins/dalam komputer saya. Anda perlu mengetahui lokasi folder ini, karena Anda mengimpor modul pemrosesan dari sana.

Karena Anda mengetahui penyedia ( qgis) dan algoritme ( explodelines), Anda dapat melihat /home/germap/.qgis2/python/plugins/processing/algs/qgis/untuk mengambil nama skrip garis meledak: Explode.pyInformasi ini memungkinkan Anda untuk mengimpor algoritma secara langsung ke skrip mandiri Python Anda.

Jadi, buka konsol Python dan salin skrip berikut (saya menggunakan GNU / Linux, sehingga variabel lingkungan diatur secara default, memungkinkan saya untuk mengimpor pustaka qgis dan PyQt4 dengan mudah):

# Prepare the environment
import sys
from PyQt4.QtGui import *
from qgis.core import *
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

# Tell Python where you will get processing from
sys.path.append('/home/germap/.qgis2/python/plugins')

# Reference the algorithm you want to run
from processing.algs.qgis.Explode import *
alg = Explode() 

# Set input and output
inLayer = QgsVectorLayer('/home/user/data/in.shp', 'input', 'ogr')
outLayer = '/home/user/data/out.shp'
alg.setParameterValue('INPUT', inLayer)
alg.setOutputValue('OUTPUT', outLayer)

# Run the algorithm
from processing.core.SilentProgress import SilentProgress
progress = SilentProgress()
alg.processAlgorithm(progress)

Jika Anda tidak mendapatkan pesan kesalahan, itu saja. Lapisan output telah disimpan di jalur output yang Anda tentukan ( /home/user/data/out.shp)

Catatan: Mengenai cara umum (yaitu, memanggil algoritma dengan nama), saya telah menemukan beberapa masalah yang perlu saya selesaikan sebelum mempostingnya. Segera setelah saya membuatnya berfungsi, saya akan mempostingnya.

Germán Carrillo
sumber