GIS-LAB

Географические информационные системы и дистанционное зондирование


Форумы GIS-Lab.info

Геоинформационные системы (ГИС) и Дистанционное зондирование Земли


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

Не знаете, где задать вопрос? Задавайте здесь.

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

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

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

QGIS 18.9
язык Python
что еще указать?
  • 0

Последний раз редактировалось SMOuk96 11 июл 2017, 09:02, всего редактировалось 1 раз.
SMOuk96
Новоприбывший
 
Зарегистрирован: 30 июн 2017
 
Сообщения: 6
Репутация: 0

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

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

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

trir
просто мимо прохожу
 
Зарегистрирован: 09 апр 2010
Откуда: Ё-бург (на карте)
 
Сообщения: 2828
Репутация: 439
Статьи: 1

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

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

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

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

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>)
  • 3

Аватара пользователя
Эдуард Казаков
Завсегдатай
 
Зарегистрирован: 23 апр 2014
Откуда: Санкт-Петербург (на карте)
 
Сообщения: 290
Репутация: 245
Статьи: 3

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"
  • 0

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

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

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

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

Аватара пользователя
Эдуард Казаков
Завсегдатай
 
Зарегистрирован: 23 апр 2014
Откуда: Санкт-Петербург (на карте)
 
Сообщения: 290
Репутация: 245
Статьи: 3

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
  • 0

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

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

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

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

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

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

Аватара пользователя
Эдуард Казаков
Завсегдатай
 
Зарегистрирован: 23 апр 2014
Откуда: Санкт-Петербург (на карте)
 
Сообщения: 290
Репутация: 245
Статьи: 3

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 он почему-то
Думаю, что надо как-то перерисовать эти слои, но как не знаю(
  • 0

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

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

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

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

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

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

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

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

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

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

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

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

Аватара пользователя
Эдуард Казаков
Завсегдатай
 
Зарегистрирован: 23 апр 2014
Откуда: Санкт-Петербург (на карте)
 
Сообщения: 290
Репутация: 245
Статьи: 3

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:/ и ... Ничего не произошло...

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

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

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

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

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

Аватара пользователя
Эдуард Казаков
Завсегдатай
 
Зарегистрирован: 23 апр 2014
Откуда: Санкт-Петербург (на карте)
 
Сообщения: 290
Репутация: 245
Статьи: 3

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



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

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


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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


(Геокруг)

© GIS-Lab и авторы, 2002-2013. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов (подробнее).