18 votos

No se puede ejecutar independiente de QGIS script

He estado tratando, junto con este post, para ejecutar una secuencia de comandos en OSGeo4w Shell, fuera de QGIS. Pero me sale el siguiente error:

ImportError: No module named qgis.core

También he leído los siguientes puestos de trabajo y trató de importación de varios módulos, pero fue en vano:

Aquí es un simple script que crea una cuadrícula y clips de un shapefile de polígonos en ella. Cualquier ayuda en la obtención de esta secuencia de comandos para trabajar fuera de QGIS sería muy apreciada. Nota: Este script ha sido probado y funciona correctamente cuando se ejecuta en QGIS.

##Test=name

import os
import glob
import sys

sys.path.append("C:\Program Files\QGIS Brighton\lib;%OSGEO4W_ROOT:\=/%/apps/qgis;%OSGEO4W_ROOT%\apps\qgis\bin;%OSGEO4W_ROOT%\apps\grass\grass-6.4.3\lib;%PATH%")

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

QgsApplication.setPrefixPath("C:\Program Files\QGIS Brighton\apps\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

def run():
#   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):
            outputs_1=processing.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
            outputs_2=processing.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

EDITAR:

Tras la respuesta y la secuencia de comandos publicado por @gcarrillo, por fin puedo importar el qgis.core. módulos con éxito. La secuencia de comandos proporcionada por @gcarrillo (muchas, muchas gracias!) se ejecuta pero recibo un error de Trazas:

Traceback (most recent call last):
  File "Test.py", line 55, in <module>
    run()
  File "Test.py", line 53, in run
    algClip.processAlgorithm(progress)
  File "C:\Users\username\.qgis2\python\plugins\processing\algs\qgis\ftools\Clip.py", line 59, in processAlgorithm
    layerA.pendingFields(),
AttributeError: 'NoneType' object has no attribute 'pendingFields'

Actualización:

Tuve que hacer pequeños cambios en la secuencia de comandos proporcionada por @gcarrillo para incluir la OSGEO4W64 ruta (tuve que volver a instalar QGIS a través de la OSGEO4W64 instalador como he usado el instalador independiente inicialmente) y para incluir doble barras. Aquí está el final de la secuencia de comandos y muchas gracias a todos por su ayuda:

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("C:\\OSGeo4W64\\apps\\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Prepare processing framework 
sys.path.append( home + '\.qgis2\python\plugins' )
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

17voto

Elliott Maynard Puntos 11

Finalmente encontró la forma correcta de ejecución de algoritmos de procesamiento de PyQGIS independiente de secuencias de comandos.

Esta respuesta se basa en las respuestas a Problema con la importación de qgis.core cuando la escritura independiente secuencia de comandos de Python que utiliza QGIS y Error: Algoritmo no se encuentra, que está basado a su vez en un Qgis-dev de la lista de correo de discusión.

Le sugiero que siga el flujo de trabajo dada en el Problema con la importación de qgis.core cuando la escritura independiente secuencia de comandos de Python que utiliza QGIS para habilitar su QGIS las bibliotecas en su OSGeo4W Shell. Una vez que usted tiene su QGIS bibliotecas funcionando correctamente, se puede proceder a la 2ª parte de tu pregunta: la ejecución de algoritmos de procesamiento en un independiente PyQGIS secuencia de comandos.

He modificado el script original un poco y probado en Windows 7 y GNU/Linux. Yo uso el procesamiento de la versión 2.2.0-2 y sugieren el uso de esta versión, que es la actual en el momento de escribir la respuesta.

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("C:\\Program Files\\QGIS Brighton\\apps\\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Prepare processing framework 
sys.path.append( home + '\.qgis2\python\plugins' )
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)

run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

Tenga en cuenta que he tomado de creación del grid fuera del bucle for, usted realmente no necesita una nueva cuadrícula para realizar cada clip.

Esto debería hacer el truco!

7voto

Elliott Maynard Puntos 11

Esta respuesta se basa en las respuestas a Problema con la importación de qgis.core cuando la escritura independiente secuencia de comandos de Python que utiliza QGIS y a Cómo usar QGIS líneas de explosión con Python.

Le sugiero que siga el flujo de trabajo dada en el Problema con la importación de qgis.core cuando la escritura independiente secuencia de comandos de Python que utiliza QGIS para habilitar su QGIS las bibliotecas en su OSGeo4W Shell. Una vez que usted tiene su QGIS bibliotecas funcionando correctamente, se puede proceder a la 2ª parte de tu pregunta: la ejecución de algoritmos de procesamiento en un independiente PyQGIS secuencia de comandos.

Como en Cómo usar QGIS líneas de explosión con Python, me voy a dar una solución hasta que soy capaz de ejecutar los algoritmos de nombre (por ejemplo, processing.runalg('provider:algorithm_name')). Yo uso el procesamiento de la versión 2.2.0-2 y sugieren el uso de esta versión.

Podemos utilizar el QGIS consola de Python para averiguar donde un algoritmo de secuencia de comandos se encuentra en el procesamiento de plugin de carpetas. Por ejemplo, para saber a donde importación qgis:creategrid , escribir en QGIS consola de Python:

from processing.core.Processing import Processing
Processing.getAlgorithm('qgis:creategrid')

Usted debe obtener:

<processing.algs.qgis.mmqgisx.MMQGISXAlgorithms.mmqgisx_grid_algorithm instance at 0xae7382c>

lo cual es suficiente para notar tanto la ruta de acceso del módulo (processing.algs.qgis.mmqgisx.MMQGISXAlgorithms) y el algoritmo de la clase (mmqgisx_grid_algorithm). Usted va a utilizar esta información en el siguiente script.

He modificado el script un poco y probado en Windows 7. Puede que necesite ajustar las rutas con el fin de ejecutar la secuencia de comandos en su propio entorno.

import os
import glob
import sys

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

app = QApplication([])
QgsApplication.setPrefixPath("C:\\Program Files\\QGIS Brighton\\apps\\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Tell Python where you will get processing from
sys.path.append(home + "\.qgis2\python\plugins")

# Reference the algorithms you want to run
from processing.algs.qgis.mmqgisx.MMQGISXAlgorithms import *
from processing.algs.qgis.ftools.Clip import *
algGrid = mmqgisx_grid_algorithm()
algClip = Clip()

from processing.core.SilentProgress import SilentProgress
progress = SilentProgress()

def run():
    # Create a grid 
    grid = path_dir + "Grids\grid.shp"
    algGrid.setParameterValue('HSPACING', 1000)
    algGrid.setParameterValue('VSPACING', 1000)
    algGrid.setParameterValue('WIDTH', 24108)
    algGrid.setParameterValue('HEIGHT', 18351.157175)
    algGrid.setParameterValue('CENTERX', 258293.802316)
    algGrid.setParameterValue('CENTERY', 665638.226408)
    algGrid.setParameterValue('GRIDTYPE', 1)
    algGrid.setParameterValue('CRS', 'EPSG:7405')
    algGrid.setOutputValue('SAVENAME', grid)
    algGrid.processAlgorithm(progress)

    # Set directory, search for all polygon .shp files 
    os.chdir(path_dir + "Shapefiles\\")    
    for fname in glob.glob("*.shp"):
        # Run the Clip algorithm, then output results into Results folder
        algClip.setParameterValue('INPUT', grid)
        algClip.setParameterValue('OVERLAY', fname)
        algClip.setOutputValue('OUTPUT', path_res  + "/"+ fname)
        algClip.processAlgorithm(progress)

run()
QgsApplication.exitQgis()

Esto debería hacer el truco!

Como se puede ver, he creado un Test/Rejillas de carpeta para almacenar una sola cuadrícula Shapefile en lugar de crear un archivo temporal en cada bucle for, que no parece ser necesario.

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