Страница 1 из 1
Доступ к интерфейсу через консоль
Добавлено: 11 июл 2017, 08:49
SMOuk96
Необходимо включить команду "Вектор -> Геообработка -> Dissolve" через консоль
и следом еще другую "Вектор -> обработка геометрии -> Разбить составные объекты "
ищу методы через iface, но не знаю какой нужен
Помогите, чем можете, не могу ничего сам найти
Все это надо для плагина, который объединяет пересекающиеся полигоны
QGIS 18.9
язык Python
что еще указать?
Re: Доступ к интерфейсу через консоль
Добавлено: 11 июл 2017, 08:55
trir
для начала стоит указать софт...
Re: Доступ к интерфейсу через консоль
Добавлено: 11 июл 2017, 09:02
SMOuk96
qgis 18.9 вы это имели ввиду?
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>)
Re: Доступ к интерфейсу через консоль
Добавлено: 11 июл 2017, 16:13
SMOuk96
Эдуард Казаков писал(а):Добрый день!
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"
Re: Доступ к интерфейсу через консоль
Добавлено: 11 июл 2017, 16:35
Эдуард Казаков
Покажите, что запускаете
Re: Доступ к интерфейсу через консоль
Добавлено: 11 июл 2017, 22:36
yasen
Эдуард Казаков писал(а):Покажите, что запускаете
Добрый вечер!
Столкнулся с аналогичной проблемой что и уважаемый автор, сперва запускал через 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
Re: Доступ к интерфейсу через консоль
Добавлено: 12 июл 2017, 01:14
Эдуард Казаков
Здравствуйте, yasen, проблема решается очень просто.
Вы не должны создавать экземпляр класса QgsVectorLayer для записи результата. Нужно просто указать путь. В строке вызова алгоритма:
general.runalg("qgis:difference",ilay,maxlayer,0,"C:\\SAT\\Release\\plan\\temp\\result.shp")
SMOuk96, вероятно, у вас похожая проблема.
Re: Доступ к интерфейсу через консоль
Добавлено: 12 июл 2017, 06:29
SMOuk96
Эдуард Казаков писал(а):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 он почему-то
Думаю, что надо как-то перерисовать эти слои, но как не знаю(
Re: Доступ к интерфейсу через консоль
Добавлено: 12 июл 2017, 07:03
SMOuk96
Попробовал
result.triggerRepaint()
Но нет, в shp файле так ничего и не появилось
Re: Доступ к интерфейсу через консоль
Добавлено: 12 июл 2017, 07:39
SMOuk96
Пока ждал ответа, сам сделал) Теперь у меня последняя задача) Я создал векторный слой с результатом и вопрос как показать его пользователю?
Re: Доступ к интерфейсу через консоль
Добавлено: 12 июл 2017, 10:04
Эдуард Казаков
QgsMapLayerRegistry.instance().addMapLayer(<layer>)
Re: Доступ к интерфейсу через консоль
Добавлено: 12 июл 2017, 10:18
yasen
Эдуард Казаков, здравствуйте и спасибо!
Ваш ответ помог мне запустить эту команду в консоли 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:/ и ... Ничего не произошло...
Что ему нужно???
Re: Доступ к интерфейсу через консоль
Добавлено: 12 июл 2017, 12:48
Эдуард Казаков
Хм. Нужно либо поиграться со слэшами в путях, либо попробовать, к примеру, перед каждой кавычкой в путях до файлов поставить экранирующий слэш \.
Re: Доступ к интерфейсу через консоль
Добавлено: 12 июл 2017, 13:04
yasen
Спасибо за совет. Не помогло. Сейчас переустановлю все компоненты. Попробую заново. Главное что алгоритм выполнения правильный.
Спасибо еще раз!
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()
[ Сообщение с мобильного устройства ]