Applicazioni autonome che utilizzano QGIS e variabili di ambiente


12

Ho provato a passare attraverso IRC per vedere se le persone possono aiutarmi con questo, ma il mezzo sembra un po 'goffo per chiarire le risposte, quindi proverò invece.

Vorrei programmare un'applicazione standalone usando PyQGIS come posso già programmare applicazioni standalone usando ArcPy.

PyQGIS stesso è semplice. Non ho avuto difficoltà a utilizzare gli script Python all'interno dell'editor della console QGIS. Tuttavia, per utilizzare i collegamenti Python in uno script autonomo, mi viene consigliato di modificare le impostazioni dell'ambiente tramite uno script batch (sto usando Windows Vista a casa, quindi stiamo parlando di script batch per Windows). Ciò ha provocato un disastro da parte mia, poiché non capisco davvero gli script batch e non mi piace l'idea che sto ripristinando un ambiente che deve essere un certo modo per altre applicazioni che eseguo.

Ho difficoltà a capire perché le istruzioni per la creazione di queste impostazioni sono così inutilmente complicate e perché non equivalgono a una riga di codice che dice "vai dove si trovano i binding, rendi disponibili le librerie che voglio siano disponibili per questo programma Certamente ArcPy non richiede alle persone di scherzare con le impostazioni ambientali del computer, quindi ho difficoltà a capire perché PyQGIS lo fa, a quanto pare le persone semplicemente rinunceranno piuttosto che insegnare a se stesse Windows Batch Scripting Language.

Ora noto che quando eseguo uno script nell'editor della console di QGIS, funziona. Certo, rende anche il resto di QGIS inutilizzabile dopo l'esecuzione dello script, quindi devo riavviare QGIS in seguito, ma lo script funziona esattamente come l'ho programmato per funzionare. Ma quando lo faccio al di fuori dell'applicazione QGIS, non lo fa. Il problema non sembra essere che non sono riuscito a importare alcuni pacchetti Python importati automaticamente dall'applicazione QGIS (qgis.core e qgis.utils) - Ho queste istruzioni di importazione nel mio script autonomo, insieme a tutti gli altri pacchetti che importano il lo script richiede. Questo mi porta a credere che la differenza sia che l'applicazione QGIS imposta correttamente le variabili di ambiente esterne, ma tali variabili non sono impostate correttamente quando lo eseguo come script autonomo.

Inoltre, quando eseguo lo script come script autonomo, passa attraverso tutto il codice senza generare un errore; semplicemente non fa ciò che il codice comanda. Quando eseguo lo script nell'editor della console, fa tutto correttamente. Quando lo eseguo come autonomo, crea una finestra, quindi immediatamente lo distrugge, senza generare errori. Quindi l'interprete comprende tutto ciò che sto chiedendo alla sceneggiatura di fare - semplicemente non lo farà.

Ecco la sceneggiatura:

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

Per favore ... c'è un modo in cui posso eseguire questo script al di fuori di QGIS e farlo funzionare come in QGIS (idealmente senza chiudere le cose alla fine)?

QGIS è un programma meraviglioso, e PyQGIS sembra intuitivo come ArcPy e sarebbe un vero vantaggio per un software open source - ma se le persone devono passare attraverso tutti i cerchi che ho già attraversato e ancora non hanno un'applicazione standalone l'accesso alle librerie PyQGIS nel modo in cui hanno accesso ad ArcPy, mi sembra che PyQGIS non sarà di grande utilità per le persone. Spero di sbagliarmi e questo è più facile di quanto non sia stato finora. Qualcuno ha una soluzione?

Risposte:


6

Devi avviare il ciclo degli eventi Qt usando:

app.exec_()

Vorrei rimuovere QgsApplication.exitQgis (). Idealmente, dovrebbe essere gestito in uno slot collegato al segnale lastWindowClosed () dell'applicazione.


Buono a sapersi. Indirizzerò le mie energie a leggere su PyQt4, quindi so di più cosa devo fare per far funzionare le GUI che cercherò in futuro. Se G. Sherman della fama del plug-in Script Runner ... Ho notato quando stavo tentando di eseguire questo codice senza alcun riferimento a QgsApplication e con l'intestazione run_script di cui ha bisogno Script Runner, il mio script ha fatto esattamente quello che stava facendo quando Stavo provando lo script come mostrato sopra come uno script autonomo ... creando una finestra e poi immediatamente chiudendolo. Questo era parte del motivo per cui pensavo di avere continui problemi con le variabili ambientali.
Zak Klaas,

7

Consultando la documentazione di PyQGis, scoprirai che ci sono quattro modi principali per utilizzare l'API PyQGis:

  1. tramite comandi nella console di Python
  2. tramite script Python in Processing o con il plugin ScritRunner di Gary Sherman
  3. tramite lo sviluppo di plugin personalizzati per l'applicazione QGis
  4. al di fuori di QGIS (nella shell di Python o creando un'applicazione con PyQt4 e non con Tkinter (perché importare due volte Tkinter?)

e sei interessato a quest'ultimo punto:

  • puoi usare PyQGIS come qualsiasi altro modulo Python. Ma Python non sa dove trovare PyQGIS. Per questo, è necessario aggiungere la cartella PyQGIS a PYTHONPATH (per Windows, vedere Come aggiungere al pythonpath in Windows 7? ).

Certamente ArcPy non richiede alle persone di fare confusione con le impostazioni ambientali del computer, quindi ho difficoltà a capire perché PyQGIS lo fa

Poiché usi la versione Python di ArcGIS, in altri casi, lo stesso vale, guarda ad esempio usando arcpy fuori da arcmap o Configura PyScripter da usare con QGIS (e usa ancora arcpy) su Windows , per esempio.

Non è necessario qui PyQt4, Tkinter o 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()))
  • puoi creare un'applicazione. È necessario qui PyQt4 (e non Tkinter) e qgis.gui.

Vorrei programmare un'applicazione standalone usando PyQGIS come posso già programmare applicazioni standalone usando ArcPy.

Quindi, per questo, devi imparare PyQt4, come devi imparare Tkinter (o wxPython), per esempio. Questo è un altro problema: la soluzione fornita da gsherman è un problema di PyQt4, non di PyQGIS (guarda il tutorial di PyQt4 , per esempio)


Grazie. Non avevo ancora sentito nessuno descrivere PyQt4 come una sorta di alternativa esclusiva a Tkinter, che ora conosco abbastanza bene (non so perché l'ho dichiarato due volte nel codice sopra ... è stato solo un errore). Il tuo link al tutorial di PyQt4 sembra essere molto utile. Dopo aver sperimentato oggi, ho scelto di risolvere il mio problema tramite l'editor della console e facendo in modo che lo script minimizzi la finestra della GUI di QGIS in modo che la finestra del mio script appaia autonoma, con QGIS in esecuzione in background - quindi immagino che sia il numero 1 nella tua lista di 4 possibilità.
Zak Klaas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.