Автономные приложения, использующие QGIS и переменные среды

12

Я пытался пройти через IRC, чтобы посмотреть, могут ли люди помочь мне с этим, но среда кажется немного неуклюжей для того, чтобы прояснить любые ответы, поэтому я собираюсь попробовать это вместо этого.

Я хотел бы запрограммировать автономное приложение с использованием PyQGIS так, как я уже могу программировать автономные приложения с использованием ArcPy.

Сам PyQGIS прост. У меня не было проблем с использованием скриптов Python в редакторе консоли QGIS. Однако, чтобы использовать привязки Python в автономном скрипте, я советую изменить параметры среды с помощью пакетного сценария (дома я использую Windows Vista, поэтому мы говорим о пакетном сценарии для Windows). Это привело к беспорядку с моей стороны, так как я не очень разбираюсь в пакетных сценариях, и мне не нравится идея, что я перезагружаю среду, которая должна быть определенным образом для других приложений, которые я запускаю.

У меня возникают трудности с пониманием того, почему инструкции по созданию этих настроек настолько излишне сложны, и почему они не составляют одну строку кода, говорящую «перейдите туда, где находятся привязки, сделайте библиотеки, которые я хочу, доступными для использования этой программой». Конечно, ArcPy не требует, чтобы люди возились с настройками среды компьютера, поэтому мне сложно понять, почему это делает PyQGIS. Мне кажется, что люди просто сдаются, а не изучают язык Windows Batch Scripting Language.

Теперь я заметил, что когда я запускаю скрипт в редакторе консоли QGIS, он работает. Конечно, это также делает остальную часть QGIS непригодной после запуска скрипта, поэтому мне придется снова перезапускать QGIS, но скрипт работает точно так, как я запрограммировал его для работы. Но когда я делаю это вне приложения QGIS, это не так. Похоже, проблема заключается не в том, что мне не удалось импортировать какой-либо пакет Python, автоматически импортированный приложением QGIS (qgis.core и qgis.utils) - у меня есть эти операторы импорта в моем автономном скрипте вместе со всеми другими пакетами, импортирующими скрипт требует. Это заставляет меня поверить, что разница в том, что приложение QGIS правильно устанавливает внешние переменные среды, но эти переменные не устанавливаются должным образом, когда я запускаю его как отдельный скрипт.

Кроме того, когда я запускаю скрипт как отдельный скрипт, он проходит через весь код, не выдавая ошибки; он просто не делает то, что командует кодом. Когда я запускаю скрипт в редакторе консоли, он все делает правильно. Когда я запускаю его как отдельный, он создает окно, а затем сразу же уничтожает его, не выдавая ошибок. Таким образом, интерпретатор понимает все, что я прошу сделать сценарий - он просто не сделает этого.

Вот сценарий:

from PyQt4 import *
from PyQt4 import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *
from qgis.utils import *
import Tkinter
from Tkinter import *
import sys
import os

qgishome = "c:/OSGeo4W/apps/qgis/"
app = QgsApplication([], True)
QgsApplication.setPrefixPath(qgishome, True)
QgsApplication.initQgis()

canvas = QgsMapCanvas()
canvas.setCanvasColor(Qt.yellow)
canvas.enableAntiAliasing(True)
canvas.show()

layer = QgsVectorLayer(r"c:/GIS Data/fed308/cpc.shp", "Ridings", "ogr")
reg = QgsMapLayerRegistry.instance()
reg.addMapLayer(layer)
canvas.setExtent(layer.extent())
canvas.setLayerSet([QgsMapCanvasLayer(layer)])
QgsApplication.exitQgis()

Пожалуйста ... есть ли какой-нибудь способ, которым я могу запустить этот скрипт за пределами QGIS и заставить его работать так же, как и в QGIS (в идеале, без остановки в самом конце)?

QGIS - замечательная программа, и PyQGIS кажется настолько же интуитивно понятным, как и ArcPy, и станет реальным преимуществом для программного обеспечения с открытым исходным кодом, но если людям придется пройти через все испытания, которые я уже прошел, и все еще не иметь отдельного приложения доступ к библиотекам PyQGIS так же, как у них есть доступ к ArcPy, мне кажется, что PyQGIS не очень пригодится людям. Надеюсь, я ошибаюсь, и это проще, чем было до сих пор. у кого-нибудь есть решение?

Зак Клаас
источник

Ответы:

6

Вы должны запустить цикл событий Qt используя:

app.exec_()

Я бы удалил QgsApplication.exitQgis (). В идеале он должен обрабатываться в слоте, который подключен к сигналу lastWindowClosed () приложения.

gsherman
источник
Хорошо знать. Я направлю свои силы на чтение на PyQt4, чтобы я знал больше, что мне нужно сделать, чтобы создать любой графический интерфейс, который я попробую в будущей работе. Если Дж. Шерман из плагина Script Runner прославился ... Я заметил, когда пытался запустить этот код без каких-либо ссылок на QgsApplication и с заголовком def run_script, который нужен Script Runner, мой сценарий делал именно то, что делал, когда Я пытался сценарий, как показано выше, как автономный сценарий ... создать окно, а затем сразу же закрыть его. Это было частью того, почему я предположил, что у меня продолжаются проблемы с переменными окружения.
Зак Клаас
7

Изучив документацию по PyQGis, вы обнаружите, что есть четыре основных способа использования API PyQGis:

  1. с помощью команд в консоли Python
  2. через скрипты Python в обработке или с плагином ScritRunner Гэри Шермана
  3. через разработку пользовательских плагинов для приложения QGis
  4. вне QGIS (в оболочке Python или создании приложений с PyQt4, а не с Tkinter (зачем дважды импортировать Tkinter?)

и вы заинтересованы в этом последнем пункте:

  • Вы можете использовать PyQGIS как любой другой модуль Python. Но Python не знает, где найти PyQGIS. Для этого вам нужно добавить папку PyQGIS в PYTHONPATH (для Windows, смотрите Как добавить в pythonpath в Windows 7? ).

Конечно, ArcPy не требует, чтобы люди возились с настройками среды компьютера, поэтому мне трудно понять, почему PyQGIS делает

Поскольку вы используете версию ArcGIS для Python, в других случаях то же самое верно, посмотрите, например, использование arcpy вне arcmap или Configure PyScripter для использования с QGIS (и все еще использовать arcpy) в Windows .

Вам не нужны здесь PyQt4, Tkinter или qgis.gui:

from qgis.core import *
QgsApplication.setPrefixPath("yourpath", True)
QgsApplication.initQgis()
# or your solution
# read a shapefile 
layer = QgsVectorLayer('your.shp', 'your', 'ogr')
layer.isValid()
True
# loop through layer 
for elem in layer.getFeatures():
    geom= elem.geometry()
    attr =elem.attributes()
    (processing)

 # interaction with other Python module: Shapely, for example
 from shapely.geometry import shape
 from json import loads
 for elem in layer.getFeatures():
       shapely_geometry = shape(loads(elem.geometry().exportToGeoJSON()))
  • Вы можете создать приложение. Вам нужен PyQt4 (а не Tkinter) и qgis.gui.

Я хотел бы запрограммировать автономное приложение с использованием PyQGIS так, как я уже могу программировать автономные приложения с использованием ArcPy.

Итак, для этого вы должны изучить PyQt4, как, например, вы должны изучать Tkinter (или wxPython). Это еще одна проблема: решение, данное gsherman, является проблемой PyQt4, а не PyQGIS (см. , Например, учебник по PyQt4 )

ген
источник
Спасибо. Я еще не слышал, чтобы кто-нибудь описывал PyQt4 как нечто вроде исключительной альтернативы Tkinter, которую я теперь хорошо знаю (не знаю, почему я дважды объявил это в приведенном выше коде ... это было просто ошибкой). Ваша ссылка на учебник PyQt4 кажется очень полезной. После экспериментов сегодня, я решил , чтобы решить мою проблему с помощью редактора консоли и имеющего сценария минимизировать окно QGIS GUI так окно моего скрипта появляется , чтобы быть автономным, с QGIS работает в фоновом режиме - так что я думаю , что это номер 1 в вашем списке 4 варианта.
Зак Клаас