Applications autonomes utilisant QGIS et des variables d'environnement

12

J'ai essayé de passer par IRC pour voir si les gens peuvent m'aider, mais le médium semble un peu maladroit pour clarifier les réponses, donc je vais essayer à la place.

Je voudrais programmer une application autonome à l'aide de PyQGIS comme je peux déjà programmer des applications autonomes à l'aide d'ArcPy.

PyQGIS lui-même est simple. Je n'ai eu aucune difficulté à utiliser des scripts Python dans l'éditeur de console QGIS. Cependant, afin d'utiliser les liaisons Python dans un script autonome, je suis informé que je dois modifier les paramètres d'environnement à l'aide d'un script de commandes (j'utilise Windows Vista à la maison, nous parlons donc de scripts de commandes pour Windows). Cela a entraîné un gâchis de ma part, car je ne comprends pas vraiment les scripts par lots, et je n'aime pas l'idée que je réinitialise un environnement qui doit être d'une certaine manière pour les autres applications que j'exécute.

J'ai du mal à comprendre pourquoi les instructions pour créer ces paramètres sont si inutilement compliquées, et pourquoi elles ne se résument pas à une ligne de code disant "allez là où sont les liaisons, rendez les bibliothèques que je veux disponibles pour ce programme à utiliser Il est certain qu'ArcPy n'exige pas que les gens manipulent les paramètres environnementaux de l'ordinateur, j'ai donc du mal à comprendre pourquoi PyQGIS le fait. Il me semble que les gens abandonneront simplement plutôt que de s'enseigner eux-mêmes Windows Batch Scripting Language.

Maintenant, je remarque que lorsque j'exécute un script dans l'éditeur de console de QGIS, cela fonctionne. Certes, cela rend également le reste de QGIS inutilisable après l'exécution du script, je dois donc redémarrer QGIS après, mais le script fonctionne exactement comme je l'ai programmé pour fonctionner. Mais quand je le fais en dehors de l'application QGIS, ce n'est pas le cas. Le problème ne semble pas être que je n'ai pas réussi à importer un package Python importé automatiquement par l'application QGIS (qgis.core et qgis.utils) - J'ai ces instructions d'importation dans mon script autonome, avec tous les autres packages qui importent le le script requiert. Cela m'amène à croire que la différence est que l'application QGIS définit correctement les variables d'environnement externes, mais ces variables ne sont pas définies correctement lorsque je l'exécute en tant que script autonome.

De plus, lorsque j'exécute le script en tant que script autonome, il passe à travers tout le code sans générer d'erreur. il ne fait tout simplement pas ce que le code commande. Lorsque j'exécute le script dans l'éditeur de console, il fait tout correctement. Lorsque je l'exécute en mode autonome, il crée une fenêtre, puis la détruit immédiatement, sans lancer d'erreurs. Donc, l'interprète comprend tout ce que je demande au script de faire - il ne le fera tout simplement pas.

Voici le script:

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

S'il vous plaît ... est-il possible d'exécuter ce script en dehors de QGIS et de le faire fonctionner comme il le fait dans QGIS (idéalement sans arrêter les choses à la fin)?

QGIS est un merveilleux programme, et PyQGIS semble aussi intuitif qu'ArcPy et serait un réel avantage pour un logiciel open source - mais si les gens doivent passer par tous les cerceaux que j'ai déjà traversés et n'ont toujours pas d'application autonome l'accès aux bibliothèques PyQGIS comme ils ont accès à ArcPy, il me semble que PyQGIS ne sera pas d'une grande utilité pour les gens. J'espère que je me trompe et c'est plus facile qu'il ne l'a été jusqu'à présent. Quelqu'un a-t-il une solution?

Zak Klaas
la source

Réponses:

6

Vous devez démarrer la boucle d'événement Qt en utilisant:

app.exec_()

Je supprimerais QgsApplication.exitQgis (). Il devrait idéalement être manipulé dans un emplacement connecté au signal lastWindowClosed () de l'application.

gsherman
la source
Bon à savoir. Je dirigerai mes énergies vers la lecture de PyQt4 afin que je sache plus ce que je dois faire pour faire les GUI que j'essaierai dans le futur travail. Si G. Sherman du plugin Script Runner était célèbre ... j'ai remarqué quand j'essayais d'exécuter ce code sans aucune référence à QgsApplication, et avec l'en-tête def run_script dont Script Runner a besoin, mon script a fait exactement ce qu'il faisait quand J'essayais le script comme indiqué ci-dessus en tant que script autonome ... créant une fenêtre puis la fermant immédiatement. C'est en partie pourquoi j'ai supposé que j'avais des problèmes de variables environnementales persistants.
Zak Klaas
7

En consultant la documentation de PyQGis, vous constaterez qu'il existe quatre façons principales d'utiliser l'API PyQGis:

  1. via des commandes dans la console Python
  2. via des scripts Python dans Processing ou avec le plugin ScritRunner de Gary Sherman
  3. via le développement de plugins personnalisés pour l'application QGis
  4. en dehors de QGIS (dans le shell Python ou en créant une application avec PyQt4 et non Tkinter (pourquoi importer Tkinter deux fois?)

et vous êtes intéressé par ce dernier point:

  • vous pouvez utiliser PyQGIS comme n'importe quel autre module Python. Mais Python ne sait pas où trouver PyQGIS. Pour cela, vous devez ajouter le dossier PyQGIS au PYTHONPATH (pour Windows, regardez Comment ajouter au pythonpath dans Windows 7? ).

Certes, ArcPy n'exige pas que les gens se moquent des paramètres environnementaux de l'ordinateur, donc j'ai du mal à comprendre pourquoi PyQGIS le fait

Étant donné que vous utilisez la version Python d'ArcGIS, dans d'autres cas, la même chose est vraie, regardez en utilisant arcpy en dehors d'arcmap ou Configure PyScripter pour l'utiliser avec QGIS (et utilisez toujours arcpy) sous Windows , par exemple.

Vous n'avez pas besoin ici de PyQt4, Tkinter ou 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()))
  • vous pouvez créer une application. Vous avez besoin ici de PyQt4 (et non de Tkinter) et de qgis.gui.

Je voudrais programmer une application autonome à l'aide de PyQGIS comme je peux déjà programmer des applications autonomes à l'aide d'ArcPy.

Donc, pour cela, vous devez apprendre PyQt4, comme vous devez apprendre Tkinter (ou wxPython), par exemple. C'est un autre problème: la solution donnée par gsherman est un problème de PyQt4, pas de PyQGIS (regardez le tutoriel PyQt4 , par exemple)

gène
la source
Merci. Je n'avais encore entendu personne décrire PyQt4 comme quelque chose qui était une sorte d'alternative exclusive à Tkinter, que je connais assez bien maintenant (je ne sais pas pourquoi je l'ai déclaré deux fois dans le code ci-dessus ... c'était juste une erreur). Votre lien vers le didacticiel PyQt4 semble être très utile. Après avoir expérimenté aujourd'hui, j'ai choisi de résoudre mon problème au moyen de l'éditeur de console et d'avoir le script minimiser la fenêtre de l'interface graphique QGIS afin que la fenêtre de mon script semble être autonome, avec QGIS en arrière-plan - donc je suppose que c'est le numéro 1 dans votre liste de 4 possibilités.
Zak Klaas