8 votos

Llamar PyQGIS funciones de editores externos (Linux)

Es posible integrar externo de Python editores (como KDevelop) con QGIS, por lo que sería posible ejecutar funciones en qgis.core, qgis.utils etc. fuera de la QGIS Consola de Python?

Siguiendo las instrucciones del sitio web de QGIS (http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/intro.html), he probado este, pero sólo devuelve 1 y nada más:

import sys
sys.path.append('/usr/share/qgis/python')
import qgis.core
import qgis.utils

app = qgis.core.QgsApplication([], True)
qgis.core.QgsApplication.initQgis()
qgis.utils.iface.addVectorLayer("testing.shp", "anewlayer", "ogr") 
aLayer = qgis.utils.iface.activeLayer()
print aLayer.name()

Tales como:

$ LD_LIBRARY_PATH=/usr/lib64/qgis/ python qgis-test.py && echo "OK" || echo "Died"
Died

Estoy corriendo openSUSE Tumbleweed, 64-bit.

8voto

hyty Puntos 91

Yo uso la siguiente intro para aplicaciones independientes:

# the_app.py
import os
import sys

from qgis.core import *
from PyQt4.QtGui import *     

def main():
    QgsApplication.setPrefixPath(os.environ['QGIS_PREFIX'], True)
    QgsApplication.initQgis()

    # app specific code
    ...

    QgsApplication.exitQgis()
    sys.exit(result)

if __name__ == '__main__':
    main()

Cuando la aplicación no necesita una interfaz gráfica de usuario (por ejemplo, hacer algo de geoprocesamiento), sustituir los puntos suspensivos con algo como esto:

# app specific code (console)
print 'starting test'
layer1 = QgsVectorLayer('LineString', 'anewlayer', 'memory')
print layer.isValid()
QgsMapLayerRegistry.instance().addMapLayer(layer1, False)
print 'layer added to map layer registry'
aLayer = QgsMapLayerRegistry.instance().mapLayersByName('anewlayer')[0]
print aLayer.name()

Para trabajar con una o más capas de las que usted no tiene que añadir a la capa del mapa de registro, sólo se hace referencia a ellos por su nombre de variable (aquí layer1).

Cuando se utiliza una interfaz gráfica de usuario, por ejemplo un asignador de ventana, esto sería una clase de python derivados de QMainWindow, se debe generalmente se diseñan con QtDesigner. Los puntos suspensivos tienen que ser reemplazados con código como en el siguiente ejemplo:

# app specific code (GUI)
app = QApplication(sys.argv)

# create gui window
window = Main()
window.show() 

result = app.exec_()
app.deleteLater()

Para probar este método sin necesidad de tener una interfaz gráfica de usuario probar esta modificación de la versión de la consola:

# app specific code (GUI ready)
app = QApplication(sys.argv)

layer1 = QgsVectorLayer('LineString', 'anewlayer', 'memory')
QgsMapLayerRegistry.instance().addMapLayer(layer1, False)
aLayer = QgsMapLayerRegistry.instance().mapLayersByName('anewlayer')[0]
print aLayer.name()

app.qApp.quit()

result = app.exec_()
app.deleteLater()

Es casi la misma que la versión de la consola (como hay realmente ninguna gráfica de los objetos), pero respecto de la quit() que detiene la aplicación.

Para iniciar la aplicación en Linux:

#!/bin/sh
export PYTHONPATH="/usr/share/qgis/python"
export LD_LIBRARY_PATH="/usr/lib64/qgis"
export QGIS_PREFIX="/usr"
python the_app.py

Y en un equipo Windows:

SET OSGEO4W_ROOT=D:\OSGeo4W64
SET QGISNAME=qgis
SET QGIS=%OSGEO4W_ROOT%\apps\%QGISNAME%
SET QGIS_PREFIX=%QGIS%

CALL %OSGEO4W_ROOT%\bin\o4w_env.bat

SET PATH=%PATH%;%QGIS%\bin
SET PYTHONPATH=%QGIS%\python;%PYTHONPATH%

python the_app.py

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X