Доступ до "обробки" з Python?


16

Я хочу отримати доступ до функції вибухових ліній в Python за межами QGIS із окремого сценарію.

Який модуль потрібно завантажити, щоб його використовувати?

Як я можу отримати доступ processing?

from qgis.core import *

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

processing.runalg('qgis:explodelines', layerInput, 'temp.shp')

2
Я думаю, що вам доведеться користуватися import processing.
Йосип

@Joseph Вибачте за не конкретність: Але я хочу отримати доступ до нього за допомогою окремого сценарію.
ustroetz

Ах, не хвилюйся :). У цьому випадку вибачте, але я не знаю, оскільки я завжди запускаю це в рамках QGIS. Сподіваємось, інші порадить.
Йосип

Привіт @ustroetz, вам вдалося запустити це зі свого окремого сценарію? Я запитую, тому що я також намагаюся запустити зовнішні сценарії.
Йосип

@Joseph Ні, у мене немає
ustroetz

Відповіді:


25

ОНОВЛЕННЯ 24.04.2018: Дивіться, як це зробити в QGIS v3.x тут .


Для QGIS v2.x

Нарешті знайшов правильний спосіб роботи алгоритмів обробки через окремі сценарії PyQGIS.

Використовуючи плагін для обробки версії 2.2.0-2, ви можете спробувати наступний сценарій:

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

Більш новіші версії обробки можуть бути розміщені за адресою /usr/share/qgis/python/plugins, тому вам може знадобитися sys.path.append('/usr/share/qgis/python/plugins')відповідно використовувати .

Я знайшов робочий приклад у помилці: Алгоритм не знайдено , який, у свою чергу, ґрунтується на обговоренні списку розсилки Qgis-dev .


1
Плагін для обробки може бути не на '/home/user/.qgis2/python/plugins'. Ви можете знайти місце, відкривши QGIS і натиснувши plugins/Manage and install pluginsпрокрутку вниз до обробки, і ви побачите місце установки в описі.
Містер Пурпла

2
Я отримав багато попереджень про cannot-create-a-qpixmapцю самостійну функцію, але я бачу, що ви вирішили це питання і в цьому питанні gis.stackexchange.com/questions/188074/…
пан Purple

1
Ви можете зробити окремий сценарій ще більш загальним, layerInputвідмінивши та змінивши лінію runalg на: general.runalg(*sys.argv[1:])не кажучи вже про те, що цей скрипт може бути основою для паралельної обробки ГІС відповідно до цього питання: gis.stackexchange.com/questions/119961/…
Містер Фіолетовий

Чи можна зробити те саме, але запустити PLUGINS з автономного Python (не в QGIS)? Я виконав функцію alglist (), і я не бачу моїх плагінів, встановлених у моєму QGIS там ...
Ірен

3

Поки я не зроблю на роботі загальний спосіб цього, я розкажу тобі обхід.

Я використовую плагін Processing версії 2.2.0-2 (пропоную використовувати цю версію), який встановлений /home/germap/.qgis2/python/plugins/на моєму комп’ютері. Вам потрібно знати місце розташування цієї папки, оскільки ви імпортуєте модуль обробки звідти.

Оскільки ви знаєте провайдера ( qgis) та алгоритму ( explodelines), ви можете подивитися /home/germap/.qgis2/python/plugins/processing/algs/qgis/назву сценарію вибухових ліній: Explode.pyЦя інформація дозволяє імпортувати алгоритм безпосередньо у ваш окремий сценарій Python.

Отже, відкрийте консоль Python та скопіюйте такий скрипт (я використовую GNU / Linux, тому змінні середовища встановлені за замовчуванням, що дозволяє мені імпортувати бібліотеки qgis та PyQt4 на вітрі):

# 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)

Якщо ви не отримуєте повідомлення про помилки, це все. Вихідний шар був збережений у вказаному вами шляху виведення ( /home/user/data/out.shp)

Примітка. Що стосується загального способу (тобто виклику алгоритмів за іменем), я знайшов деякі проблеми, які мені потрібно вирішити, перш ніж публікувати його. Як тільки я змушу його працювати, я опублікую його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.