Автономні програми, що використовують QGIS та змінні середовища


12

Я намагався пройти через IRC, щоб побачити, чи можуть люди допомогти мені в цьому, але середовище здається трохи незграбною, щоб зрозуміти будь-які відповіді, тому я замість цього спробую.

Я хотів би запрограмувати окремий додаток за допомогою PyQGIS так, як я вже можу програмувати окремі програми за допомогою ArcPy.

PyQGIS сам по собі простий. У мене не було труднощів із використанням сценаріїв Python в редакторі консолі QGIS. Однак для того, щоб використовувати прив'язки Python в окремому сценарії, мені рекомендується змінити налаштування середовища за допомогою пакетного сценарію (я використовую домашню Windows Vista, тому ми говоримо про пакетний сценарій для Windows). Це призвело до безладу в моєму кінці, тому що я не дуже розумію пакетні сценарії, і мені не подобається думка, що я скидаю середовище, яке повинно бути певним чином для інших застосунків, які я запускаю.

У мене виникають труднощі з розумінням того, чому інструкції щодо створення цих налаштувань настільки непотрібні, і чому вони не складаються з одного рядка коду, що говорить "перейдіть туди, де є прив'язки, зробіть бібліотеки, які я хочу використовувати для цієї програми, використовувати Безумовно, ArcPy не вимагає від людей возитися з налаштуваннями навколишнього середовища комп’ютера, тому мені виникають труднощі з розумінням того, що робить PyQGIS. Мені здається, люди просто відмовляться, а не навчатимуться мові пакетного сценарію Windows.

Тепер я помічаю, що коли я запускаю скрипт у консольному редакторі 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 () програми.


Добре знати. Я спрямую свою енергію на читання на PyQt4, щоб я більше знав, що мені потрібно зробити, щоб зробити будь-які графічні інтерфейси, які я намагаюся в майбутній роботі. Якщо Г. Шерман із плагіну Script Runner прославився ... Я помітив, коли я намагався запустити цей код без будь-яких посилань на QgsApplication, а з заголовком def run_script, який потрібен Script Runner, мій сценарій робив саме те, що робив, коли Я намагався сценарій, як показано вище, як окремий сценарій ... створивши вікно, а потім негайно закривши його. Це було частиною того, чому я припускав, що у мене виникають постійні проблеми змінних довкілля.
Зак Клаас

7

Звернувшись до документації PyQGis, ви побачите, що існують чотири основні способи використання API PyQGis:

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

і вас цікавить останній пункт:

  • ви можете використовувати PyQGIS як будь-який інший модуль Python. Але Python не знає, де знайти PyQGIS. Для цього вам потрібно додати папку PyQGIS до PYTHONPATH (для Windows дивіться у розділі Як додати до pythonpath у Windows 7? ).

Безумовно, ArcPy не вимагає, щоб люди возилися з налаштуваннями навколишнього середовища комп'ютера, тому у мене виникають труднощі зрозуміти, чому PyQGIS робить

Оскільки ви використовуєте Python версію ArcGIS, в інших випадках це те саме, перегляньте, використовуючи, наприклад, arcpy за межами arcmap або Налаштувати 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 можливостей.
Зак Клаас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.