Standalone-Anwendungen mit QGIS und Umgebungsvariablen

12

Ich habe versucht, durch das IRC zu gehen, um zu sehen, ob mir die Leute dabei helfen können, aber das Medium scheint etwas ungeschickt zu sein, um Antworten klar zu machen, also werde ich es stattdessen versuchen.

Ich möchte eine eigenständige Anwendung mit PyQGIS so programmieren, wie ich bereits eigenständige Anwendungen mit ArcPy programmieren kann.

PyQGIS selbst ist unkompliziert. Ich hatte keine Schwierigkeiten, Python-Skripte im QGIS-Konsoleneditor auszuführen. Um die Python-Bindungen in einem eigenständigen Skript verwenden zu können, wird empfohlen, die Umgebungseinstellungen mithilfe eines Batch-Skripts zu ändern (ich verwende Windows Vista zu Hause, daher sprechen wir über Batch-Scripting für Windows). Dies hat zu einem Durcheinander geführt, da ich Batch-Scripting nicht wirklich verstehe und die Idee, dass ich eine Umgebung zurücksetze, die für andere von mir ausgeführte Anwendungen eine bestimmte Art und Weise sein muss, nicht mag.

Ich habe Schwierigkeiten zu verstehen, warum die Anweisungen zum Erstellen dieser Einstellungen so unnötig kompliziert sind und warum sie sich nicht auf eine Codezeile belaufen, in der steht: "Gehen Sie zu den Bindungen, und stellen Sie die gewünschten Bibliotheken für dieses Programm zur Verfügung." ) Bei ArcPy müssen die Benutzer sicherlich nicht mit den Umgebungseinstellungen des Computers herumspielen, daher habe ich Schwierigkeiten zu verstehen, warum PyQGIS dies tut. Mir scheint, dass die Benutzer einfach aufgeben, anstatt sich selbst die Windows Batch Scripting Language beizubringen.

Jetzt stelle ich fest, dass es funktioniert, wenn ich ein Skript im QGIS-Konsoleneditor ausführe. Zugegeben, es macht auch den Rest von QGIS unbrauchbar, nachdem das Skript ausgeführt wurde, sodass ich QGIS danach erneut starten muss, aber das Skript funktioniert genau so, wie ich es programmiert habe. Wenn ich dies jedoch außerhalb der QGIS-Anwendung tue, ist dies nicht der Fall. Das Problem scheint nicht zu sein, dass ich ein Python-Paket, das automatisch von der QGIS-Anwendung importiert wurde (qgis.core und qgis.utils), nicht importiert habe. Ich habe diese Importanweisungen in meinem eigenständigen Skript, zusammen mit allen anderen Paketimporten Skript erfordert. Dies lässt mich glauben, dass der Unterschied darin besteht, dass die QGIS-Anwendung externe Umgebungsvariablen korrekt festlegt, diese Variablen jedoch nicht richtig festgelegt werden, wenn ich sie als eigenständiges Skript ausführe.

Wenn ich das Skript als eigenständiges Skript ausführe, durchläuft es außerdem den gesamten Code, ohne einen Fehler auszulösen. es macht einfach nicht das, was der Code befiehlt. Wenn ich das Skript im Konsoleneditor ausführe, wird alles korrekt ausgeführt. Wenn ich es als eigenständiges System ausführe, wird ein Fenster erstellt und sofort zerstört, ohne dass Fehler auftreten. Der Interpreter versteht also alles, was ich vom Skript verlange - es wird es einfach nicht tun.

Hier ist das Skript:

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

Bitte ... gibt es eine Möglichkeit, dieses Skript außerhalb von QGIS auszuführen und es so zu machen, wie es in QGIS funktioniert (idealerweise ohne die Dinge ganz am Ende herunterzufahren)?

QGIS ist ein wunderbares Programm, und PyQGIS scheint genauso intuitiv zu sein wie ArcPy und wäre ein echter Vorteil für eine Open-Source-Software - aber wenn die Leute alle Rahmen durchlaufen müssen, die ich bereits durchlaufen habe, und immer noch keine eigenständige Anwendung haben Zugriff auf PyQGIS-Bibliotheken so wie sie Zugriff auf ArcPy haben, scheint mir PyQGIS für Menschen nicht von großem Nutzen zu sein. Ich hoffe ich liege falsch und das ist einfacher als bisher. Hat jemand eine Lösung?

Zak Klaas
quelle

Antworten:

6

Sie müssen die Qt-Ereignisschleife starten mit:

app.exec_()

Ich würde QgsApplication.exitQgis () entfernen. Es sollte idealerweise in einem Steckplatz behandelt werden, der mit dem lastWindowClosed () -Signal der Anwendung verbunden ist.

gsherman
quelle
Gut zu wissen. Ich werde meine Energie darauf richten, PyQt4 zu lesen, damit ich mehr weiß, was ich tun muss, damit alle GUIs, die ich in der Zukunft versuche, funktionieren. Wenn G. Sherman vom Script Runner-Plugin berühmt ist ... Ich habe festgestellt, dass mein Skript genau das getan hat, was es getan hat, als ich versucht habe, diesen Code ohne die Verweise auf QgsApplication auszuführen, und mit dem def run_script-Header, den Script Runner benötigt Ich habe das oben gezeigte Skript als eigenständiges Skript ausprobiert ... ein Fenster erstellt und es dann sofort geschlossen. Dies war einer der Gründe, warum ich davon ausging, dass ich weiterhin Probleme mit Umgebungsvariablen habe.
Zak Klaas
7

In der PyQGis-Dokumentation finden Sie vier Möglichkeiten, die PyQGis-API zu verwenden:

  1. über Befehle in der Python-Konsole
  2. über Python-Skripte in Processing oder mit dem ScritRunner- Plugin von Gary Sherman
  3. über die Entwicklung von benutzerdefinierten Plugins für die QGis-Anwendung
  4. außerhalb von QGIS (in der Python-Shell oder beim Erstellen von Anwendungen mit PyQt4 und nicht mit Tkinter (warum Tkinter zweimal importieren?)

und Sie interessieren sich für diesen letzten Punkt:

  • Sie können PyQGIS wie jedes andere Python-Modul verwenden. Python weiß jedoch nicht, wo sich PyQGIS befindet. Dazu müssen Sie den PyQGIS-Ordner zum PYTHONPATH hinzufügen (unter Windows finden Sie unter Hinzufügen zum Python-Pfad in Windows 7? ).

In ArcPy müssen die Benutzer sicherlich nicht mit den Umgebungseinstellungen des Computers herumspielen, daher habe ich Schwierigkeiten zu verstehen, warum PyQGIS dies tut

Da Sie die Python-Version von ArcGIS verwenden, gilt dies auch in anderen Fällen. Verwenden Sie arcpy außerhalb von arcmap oder konfigurieren Sie PyScripter für die Verwendung mit QGIS (und verwenden Sie weiterhin arcpy) unter Windows .

Sie brauchen hier nicht PyQt4, Tkinter oder 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()))
  • Sie können eine Anwendung erstellen. Sie benötigen hier PyQt4 (und nicht Tkinter) und qgis.gui.

Ich möchte eine eigenständige Anwendung mit PyQGIS so programmieren, wie ich bereits eigenständige Anwendungen mit ArcPy programmieren kann.

Dazu müssen Sie PyQt4 lernen, da Sie beispielsweise Tkinter (oder wxPython) lernen müssen. Dies ist ein weiteres Problem: Die von gsherman angegebene Lösung ist ein Problem von PyQt4, nicht von PyQGIS (siehe beispielsweise das PyQt4-Tutorial ).

Gen
quelle
Vielen Dank. Ich hatte noch niemanden gehört, der PyQt4 als eine Art exklusive Alternative zu Tkinter beschrieb, die ich jetzt ziemlich gut kenne (nicht sicher, warum ich es im obigen Code zweimal deklariert habe ... das war nur ein Fehler). Ihr Link zum PyQt4-Tutorial scheint sehr hilfreich zu sein. Nachdem ich heute experimentiert hatte, entschied ich mich, mein Problem mithilfe des Konsoleneditors zu lösen und das Skript das Fenster der QGIS-GUI minimieren zu lassen, sodass das Fenster meines Skripts als eigenständiges Fenster erscheint und QGIS im Hintergrund ausgeführt wird. Ich denke, das ist die Nummer 1 in Ihrer Liste von 4 Möglichkeiten.
Zak Klaas