Доступ к `обработке` с помощью Python?

16

Я хочу получить доступ к функции разнесения строк в Python вне QGIS из автономного скрипта.

Какой модуль мне нужно загрузить, чтобы использовать его?

Как я могу получить доступ processing?

from qgis.core import *

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

processing.runalg('qgis:explodelines', layerInput, 'temp.shp')
ustroetz
источник
2
Я думаю, что вы должны использовать import processing.
Иосиф
@Joseph Извините, что не конкретизирую: но я хочу получить к нему доступ из автономного скрипта.
Устроец
Ааа, не беспокойся :). В таком случае, извиняюсь, но я не знаю, потому что я всегда запускаю его в QGIS. Надеюсь, другие посоветуют.
Иосиф
Привет @ustroetz, тебе удалось запустить это из своего автономного скрипта? Я спрашиваю, потому что я также пытаюсь запустить внешние скрипты.
Иосиф
@ Джозеф Нет, у меня нет
ustroetz

Ответы:

25

ОБНОВЛЕНИЕ 24.04.2018: Смотрите, как это сделать в QGIS v3.x здесь .


Для QGIS v2.x

Наконец-то нашли правильный способ запуска алгоритмов обработки с помощью автономных скриптов PyQGIS.

Используя плагин Processing версии 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/…
Мистер Пурпур
1
Вы можете сделать автономный скрипт еще более универсальным, опустив layerInputи изменив строку runalg на: general.runalg(*sys.argv[1:])не говоря уже о том, что этот скрипт может быть основой для параллельной обработки ГИС в соответствии с этим вопросом: gis.stackexchange.com/questions/119961/…
Mr Фиолетовый
Можно ли сделать ту же платформу, но запустить 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)

Примечание. Что касается общего способа (т. Е. Вызова алгоритмов по имени), я обнаружил некоторые проблемы, которые необходимо решить перед публикацией. Как только я заставлю это работать, я отправлю это.

Герман Каррильо
источник