Доступ к интерфейсу через консоль

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
SMOuk96
Новоприбывший
Сообщения: 6
Зарегистрирован: 30 июн 2017, 17:07
Репутация: 0

Доступ к интерфейсу через консоль

Сообщение SMOuk96 » 11 июл 2017, 08:49

Необходимо включить команду "Вектор -> Геообработка -> Dissolve" через консоль
и следом еще другую "Вектор -> обработка геометрии -> Разбить составные объекты "
ищу методы через iface, но не знаю какой нужен
Помогите, чем можете, не могу ничего сам найти :(
Все это надо для плагина, который объединяет пересекающиеся полигоны

QGIS 18.9
язык Python
что еще указать?
Последний раз редактировалось SMOuk96 11 июл 2017, 09:02, всего редактировалось 1 раз.

trir
Гуру
Сообщения: 2946
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 462
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Доступ к интерфейсу через консоль

Сообщение trir » 11 июл 2017, 08:55

для начала стоит указать софт...

SMOuk96
Новоприбывший
Сообщения: 6
Зарегистрирован: 30 июн 2017, 17:07
Репутация: 0

Re: Доступ к интерфейсу через консоль

Сообщение SMOuk96 » 11 июл 2017, 09:02

qgis 18.9 вы это имели ввиду?

Аватара пользователя
Эдуард Казаков
Завсегдатай
Сообщения: 305
Зарегистрирован: 23 апр 2014, 17:11
Статьи: 3
Репутация: 266
Откуда: Санкт-Петербург
Контактная информация:

Re: Доступ к интерфейсу через консоль

Сообщение Эдуард Казаков » 11 июл 2017, 10:27

Добрый день!

import processing
processing.runalg('qgis:dissolve',<input vector>,<DISSOLVE_ALL (True/False)>,<field name>,<output vector>)
processing.runalg('qgis:multiparttosingleparts',<input vector>,<output vector>)

SMOuk96
Новоприбывший
Сообщения: 6
Зарегистрирован: 30 июн 2017, 17:07
Репутация: 0

Re: Доступ к интерфейсу через консоль

Сообщение SMOuk96 » 11 июл 2017, 16:13

Эдуард Казаков писал(а):Добрый день!

import processing
processing.runalg('qgis:dissolve',<input vector>,<DISSOLVE_ALL (True/False)>,<field name>,<output vector>)
processing.runalg('qgis:multiparttosingleparts',<input vector>,<output vector>)
Вот такая ошибка: "'QgsVectorLayer' object has no attribute '__getitem__' See log for more details"

Аватара пользователя
Эдуард Казаков
Завсегдатай
Сообщения: 305
Зарегистрирован: 23 апр 2014, 17:11
Статьи: 3
Репутация: 266
Откуда: Санкт-Петербург
Контактная информация:

Re: Доступ к интерфейсу через консоль

Сообщение Эдуард Казаков » 11 июл 2017, 16:35

Покажите, что запускаете

yasen
Новоприбывший
Сообщения: 3
Зарегистрирован: 11 июл 2017, 22:26
Репутация: 1

Re: Доступ к интерфейсу через консоль

Сообщение yasen » 11 июл 2017, 22:36

Эдуард Казаков писал(а):Покажите, что запускаете
Добрый вечер!

Столкнулся с аналогичной проблемой что и уважаемый автор, сперва запускал через OSGeo4W Shell с таким алгоритмом

set PYTHONPATH=C:\OSGeo4W\apps\qgis\python
set PATH=C:\OSGeo4W\apps\qgis\bin;%PATH%

python

Код: Выделить всё

import sys
from qgis.core import *
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.initQgis()
sys.path.append('C:/OSGeo4W/apps/qgis/python/plugins')
sys.path.append('C:/OSGeo4W/apps/qgis/python')
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

ilay = QgsVectorLayer("C:\\SAT\\Release\\plan\\temp\\other_zorder.shp", "oth", "ogr")
maxlayer = QgsVectorLayer("C:\\SAT\\Release\\plan\\temp\\mx_zorder.shp", "max" "ogr")
resultlayer = QgsVectorLayer("C:\\SAT\\Release\\plan\\temp\\result.shp", "out" "ogr")
general.runalg("qgis:difference",ilay,maxlayer,0,resultlayer)
Получаю ответ:
Unable to execute algorithm
Wrong parameter value: C:\SAT\Release\plan\temp\other_zorder.shp


Загружаю QGIS открываю консоль...

Код: Выделить всё

from qgis.core import *
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *
ilay = QgsVectorLayer("C:\\SAT\\Release\\plan\\temp\\other_zorder.shp", "oth", "ogr")
maxlayer = QgsVectorLayer("C:\\SAT\\Release\\plan\\temp\\mx_zorder.shp", "max" "ogr")
resultlayer = QgsVectorLayer("C:\\SAT\\Release\\plan\\temp\\result.shp", "out" "ogr")
general.runalg("qgis:Difference",ilay,maxlayer,0,resultlayer)
Error: Algorithm not found

general.runalg("qgis:difference",ilay,maxlayer,0,resultlayer)
Ответ получаю.
{'OUTPUT': <qgis._core.QgsVectorLayer object at 0x0000000014266620>}

'QgsVectorLayer' object has no attribute '__getitem__' See log for more details

Аватара пользователя
Эдуард Казаков
Завсегдатай
Сообщения: 305
Зарегистрирован: 23 апр 2014, 17:11
Статьи: 3
Репутация: 266
Откуда: Санкт-Петербург
Контактная информация:

Re: Доступ к интерфейсу через консоль

Сообщение Эдуард Казаков » 12 июл 2017, 01:14

Здравствуйте, yasen, проблема решается очень просто.
Вы не должны создавать экземпляр класса QgsVectorLayer для записи результата. Нужно просто указать путь. В строке вызова алгоритма:

general.runalg("qgis:difference",ilay,maxlayer,0,"C:\\SAT\\Release\\plan\\temp\\result.shp")

SMOuk96, вероятно, у вас похожая проблема.

SMOuk96
Новоприбывший
Сообщения: 6
Зарегистрирован: 30 июн 2017, 17:07
Репутация: 0

Re: Доступ к интерфейсу через консоль

Сообщение SMOuk96 » 12 июл 2017, 06:29

Эдуард Казаков писал(а):SMOuk96, вероятно, у вас похожая проблема.
Команды работают)

processing.runalg('qgis:dissolve',lyr,True,id,"C:/Users/MATTHEW/.qgis2/Project_polig/test.shp")
processing.runalg('qgis:multiparttosingleparts','C:/Users/MATTHEW/.qgis2/Project_polig/test.shp','C:/Users/MATTHEW/.qgis2/Project_polig/result.shp')

И результат кстати не отображается в shape файле, думал в чем беда, оказалось в shx он почему-то
Думаю, что надо как-то перерисовать эти слои, но как не знаю(
Последний раз редактировалось SMOuk96 12 июл 2017, 07:23, всего редактировалось 1 раз.

SMOuk96
Новоприбывший
Сообщения: 6
Зарегистрирован: 30 июн 2017, 17:07
Репутация: 0

Re: Доступ к интерфейсу через консоль

Сообщение SMOuk96 » 12 июл 2017, 07:03

Попробовал
result.triggerRepaint()
Но нет, в shp файле так ничего и не появилось

SMOuk96
Новоприбывший
Сообщения: 6
Зарегистрирован: 30 июн 2017, 17:07
Репутация: 0

Re: Доступ к интерфейсу через консоль

Сообщение SMOuk96 » 12 июл 2017, 07:39

Пока ждал ответа, сам сделал) Теперь у меня последняя задача) Я создал векторный слой с результатом и вопрос как показать его пользователю?

Аватара пользователя
Эдуард Казаков
Завсегдатай
Сообщения: 305
Зарегистрирован: 23 апр 2014, 17:11
Статьи: 3
Репутация: 266
Откуда: Санкт-Петербург
Контактная информация:

Re: Доступ к интерфейсу через консоль

Сообщение Эдуард Казаков » 12 июл 2017, 10:04

QgsMapLayerRegistry.instance().addMapLayer(<layer>)

yasen
Новоприбывший
Сообщения: 3
Зарегистрирован: 11 июл 2017, 22:26
Репутация: 1

Re: Доступ к интерфейсу через консоль

Сообщение yasen » 12 июл 2017, 10:18

Эдуард Казаков, здравствуйте и спасибо!

Ваш ответ помог мне запустить эту команду в консоли Python QGIS'a, но как мне быть с тем что OSGeo4W Shell упорно не хочет воспринимать то что я ему "скрамливаю", помогите пожалуйста! Вот кот, ой код ;))

Код: Выделить всё


C:\>set PYTHONPATH=C:\OSGeo4W\apps\qgis\python

C:\>set PATH=C:\OSGeo4W\apps\qgis\bin;%PATH%

C:\>python

Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> from qgis.core import *
>>> from PyQt4.QtGui import *
>>> app = QApplication([])
>>> QgsApplication.initQgis()
>>> sys.path.append('C:/OSGeo4W/apps/qgis/python/plugins')
>>> sys.path.append('C:/OSGeo4W/apps/qgis/python')
>>> from processing.core.Processing import Processing
>>> Processing.initialize()
>>> from processing.tools import *
>>>
>>>
>>> ilay = QgsVectorLayer("C:\\SAT\\Release\\plan\\temp\\other_zorder.shp", "oth", "ogr")
>>> maxlayer = QgsVectorLayer("C:\\SAT\\Release\\plan\\temp\\mx_zorder.shp", "max" "ogr")
>>> general.runalg("qgis:difference",ilay,maxlayer,0,"C:\\SAT\\Release\\plan\\temp\\result.shp")
Unable to execute algorithm
Wrong parameter value: C:\SAT\Release\plan\temp\other_zorder.shp
>>> general.runalg("qgis:difference","C:\\SAT\\Release\\plan\\temp\\other_zorder.shp","C:\\SAT\\Release\\plan\\temp\\mx_zorder.shp",0,"C:\\SAT\\Release\\plan\\temp\\result.shp")
Unable to execute algorithm
Wrong parameter value: C:\SAT\Release\plan\temp\other_zorder.shp
>>>
>>> general.runalg("qgis:difference","C:\\SAT\\Release\\plan\\temp\\mx_zorder.shp","C:\\SAT\\Release\\plan\\temp\\other_zorder.shp",0,"C:\\SAT\\Release\\plan\\temp\\result.shp")
Unable to execute algorithm
Wrong parameter value: C:\SAT\Release\plan\temp\mx_zorder.shp
>>>
Вывод сообщения выделил жирным. Ну хотя бы код ошибки указали, я бы на яндексил, а то просто:
Unable to execute algorithm
Wrong parameter value: C:\SAT\Release\plan\temp\other_zorder.shp


Путь к файлу валидный, но видно что он отказывается из-за пути и(или) файла, хотя с ними(путь\файл) всё ОК!, Unable to execute algorithm, раньше я думал что он не понимает что от него хотят, НО если убрать все переменные....

Код: Выделить всё

>>> general.runalg("qgis:difference")
Error: Wrong number of parameters
ALGORITHM: Difference
        INPUT <ParameterVector>
        OVERLAY <ParameterVector>
        IGNORE_INVALID <ParameterBoolean>
        OUTPUT <OutputVector>

Код: Выделить всё

>>> general.runalg("qgis:difference","C:/other_zorder.shp","C:/mx_zorder.shp",0,
"C:/result.shp")
Unable to execute algorithm
Wrong parameter value: C:/other_zorder.shp
Положил прямо корень диска C:/ и ... Ничего не произошло...

Что ему нужно???

Аватара пользователя
Эдуард Казаков
Завсегдатай
Сообщения: 305
Зарегистрирован: 23 апр 2014, 17:11
Статьи: 3
Репутация: 266
Откуда: Санкт-Петербург
Контактная информация:

Re: Доступ к интерфейсу через консоль

Сообщение Эдуард Казаков » 12 июл 2017, 12:48

Хм. Нужно либо поиграться со слэшами в путях, либо попробовать, к примеру, перед каждой кавычкой в путях до файлов поставить экранирующий слэш \.

yasen
Новоприбывший
Сообщения: 3
Зарегистрирован: 11 июл 2017, 22:26
Репутация: 1

Re: Доступ к интерфейсу через консоль

Сообщение yasen » 12 июл 2017, 13:04

Спасибо за совет. Не помогло. Сейчас переустановлю все компоненты. Попробую заново. Главное что алгоритм выполнения правильный.
Спасибо еще раз!


upd: переустановка не помогла.

upd2:Ура, наконец решил головоломку, правда работает не так быстро как хотелось бы.... Но уже работает!!!
Решение в виде скрипта:

Код: Выделить всё

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath(r"C:\OSGeo4W64\apps\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser


#   Folder path of the Results for shapefiles

ilay = QgsVectorLayer(r"C:\other_zorder.shp", "1", "ogr")
maxlayer = QgsVectorLayer(r"C:\mx_zorder.shp", "2", "ogr")
#resultlayer = QgsVectorLayer(r"C:\result.shp", "3", "ogr")



# Prepare processing framework 
sys.path.append(r'C:\OSGeo4W64\apps\qgis\python\plugins')
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

def run():
    outputs_1=general.runalg("qgis:difference",ilay,maxlayer,0,r"C:\result.shp")
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder


run()

[ Сообщение с мобильного устройства ]

Ответить

Вернуться в «Я новичок!»