Aplicaciones independientes que usan QGIS y variables de entorno

12

He intentado pasar por IRC para ver si las personas pueden ayudarme con esto, pero el medio parece un poco torpe para aclarar las respuestas, así que voy a intentar esto en su lugar.

Me gustaría programar una aplicación independiente usando PyQGIS de la misma manera que ya puedo programar aplicaciones independientes usando ArcPy.

PyQGIS en sí es sencillo. No he tenido dificultades para usar scripts de Python en el editor de la consola QGIS. Sin embargo, para usar los enlaces de Python en una secuencia de comandos independiente, se me aconseja que cambie la configuración del entorno usando una secuencia de comandos por lotes (estoy usando Windows Vista en casa, por lo que estamos hablando de secuencias de comandos por lotes para Windows). Esto ha resultado en un desastre de mi parte, ya que realmente no entiendo las secuencias de comandos por lotes, y no me gusta la idea de que estoy restableciendo un entorno que debe ser de cierta manera para otras aplicaciones que ejecuto.

Tengo dificultades para entender por qué las instrucciones para crear estas configuraciones son tan innecesariamente complicadas y por qué no equivalen a una línea de código que dice "ve a donde están los enlaces, haz que las bibliotecas que quiero estén disponibles para que este programa las use Ciertamente, ArcPy no requiere que las personas jueguen con la configuración ambiental de la computadora, por lo que tengo dificultades para entender por qué PyQGIS lo hace. Me parece que la gente simplemente se dará por vencida en lugar de aprender el lenguaje de secuencia de comandos por lotes de Windows.

Ahora, noto que cuando ejecuto un script en el editor de consola de QGIS, funciona. Por supuesto, también hace que el resto de QGIS sea inutilizable después de que se ejecute el script, por lo que tengo que reiniciar QGIS nuevamente después, pero el script funciona exactamente como lo programé para que funcione. Pero cuando lo hago fuera de la aplicación QGIS, no lo hace. El problema no parece ser que no haya podido importar algún paquete de Python importado automáticamente por la aplicación QGIS (qgis.core y qgis.utils): tengo esas declaraciones de importación en mi script independiente, junto con todos los demás paquetes que importan guión requiere. Esto me lleva a creer que la diferencia es que la aplicación QGIS establece correctamente las variables de entorno externas, pero esas variables no se configuran correctamente cuando lo ejecuto como un script independiente.

Además, cuando ejecuto el script como un script independiente, pasa por todo el código sin generar un error; simplemente no hace lo que ordena el código. Cuando ejecuto el script en el editor de la consola, lo hace todo correctamente. Cuando lo ejecuto de forma independiente, crea una ventana, luego lo destruye inmediatamente, sin arrojar errores. Entonces, el intérprete entiende todo lo que le pido al script que haga, simplemente no lo hará.

Aquí está el guión:

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

Por favor ... ¿hay alguna forma de ejecutar este script fuera de QGIS y hacer que funcione como lo hace dentro de QGIS (idealmente sin cerrar las cosas al final)?

QGIS es un programa maravilloso, y PyQGIS parece tan intuitivo como ArcPy y sería una verdadera ventaja para un software de código abierto, pero si la gente tiene que pasar por todos los obstáculos que ya he pasado, y todavía no tengo una aplicación independiente acceso a las bibliotecas PyQGIS de la forma en que tienen acceso a ArcPy, me parece que PyQGIS no será de mucha utilidad para las personas. Espero estar equivocado y esto es más fácil de lo que ha sido hasta ahora. ¿Alguien tiene una solución?

Zak Klaas
fuente

Respuestas:

6

Debe iniciar el ciclo de eventos Qt usando:

app.exec_()

Quitaría QgsApplication.exitQgis (). Idealmente, debe manejarse en una ranura que esté conectada a la señal lastWindowClosed () de la aplicación.

gsherman
fuente
Bueno saber. Dirigiré mis energías a leer PyQt4 para saber más sobre lo que necesito hacer para que cualquier GUI que intente en el futuro funcione. Si G. Sherman de la fama del complemento Script Runner ... Me di cuenta cuando estaba intentando ejecutar este código sin ninguna de las referencias a QgsApplication, y con el encabezado def run_script que Script Runner necesita, mi script hizo exactamente lo que estaba haciendo cuando Estaba probando el script como se muestra arriba como un script independiente ... creando una ventana y luego cerrándola inmediatamente. Esto fue parte de por qué supuse que tenía problemas continuos con las variables ambientales.
Zak Klaas
7

Al consultar la documentación de PyQGis, encontrará que hay cuatro formas principales de utilizar la API de PyQGis:

  1. a través de comandos en la consola de Python
  2. a través de scripts Python en Processing o con el complemento ScritRunner de Gary Sherman
  3. mediante el desarrollo de complementos personalizados para la aplicación QGis
  4. fuera de QGIS (en el shell de Python o creando aplicaciones con PyQt4 y no con Tkinter (¿por qué importar Tkinter dos veces?)

y te interesa este último punto:

  • Puede usar PyQGIS como cualquier otro módulo de Python. Pero Python no sabe dónde encontrar PyQGIS. Para eso, debe agregar la carpeta PyQGIS a PYTHONPATH (para Windows, consulte ¿Cómo agregar Pythonpath en Windows 7? ).

Ciertamente, ArcPy no requiere que las personas jueguen con la configuración ambiental de la computadora, por lo que tengo dificultades para entender por qué PyQGIS sí

Debido a que usa la versión Python de ArcGIS, en otros casos, lo mismo es cierto, mire usando arcpy fuera de arcmap o Configure PyScripter para usar con QGIS (y aún use arcpy) en Windows , por ejemplo.

No necesita aquí 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()))
  • Puedes crear una aplicación. Necesita aquí PyQt4 (y no Tkinter) y qgis.gui.

Me gustaría programar una aplicación independiente usando PyQGIS de la misma manera que ya puedo programar aplicaciones independientes usando ArcPy.

Entonces, para eso, debe aprender PyQt4, ya que debe aprender Tkinter (o wxPython), por ejemplo. Este es otro problema: la solución dada por gsherman es un problema de PyQt4, no de PyQGIS (consulte el tutorial de PyQt4 , por ejemplo)

gene
fuente
Gracias. Todavía no había escuchado a nadie describir PyQt4 como algo que fuera una especie de alternativa exclusiva a Tkinter, que ahora sé bastante bien (no estoy seguro de por qué lo declaró dos veces en el código anterior ... eso fue solo un error). Parece que su enlace al tutorial PyQt4 será muy útil. Después de experimentar hoy, elegí resolver mi problema por medio del editor de la consola y hacer que el script minimice la ventana de la GUI de QGIS, por lo que la ventana de mi script parece ser independiente, con QGIS ejecutándose en segundo plano, así que supongo que es el número 1 en tu lista de 4 posibilidades.
Zak Klaas