He estado intentando, junto con esta publicación , ejecutar un script en OSGeo4w Shell , fuera de QGIS. Pero me sale el siguiente error:
ImportError: ningún módulo llamado qgis.core
También leí las siguientes publicaciones e intenté importar varios módulos, pero fue en vano:
- ¿Cómo ejecutar algoritmos sextante fuera de la consola de Python QGIS?
- ¿Cómo ejecutar un script python simple para QGIS desde el exterior (por ejemplo, Sublime Text)?
- ¿Escribir scripts de Python independientes usando PyQGIS?
Aquí hay un script simple que crea una cuadrícula y recorta un archivo de forma poligonal sobre él.
Nota: Este script se ha 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
Siguiendo la respuesta y el guión publicado por @gcarrillo, finalmente puedo importar los qgis.core.
módulos con éxito. El script proporcionado por @gcarrillo se ejecuta pero recibo un error de Traceback:
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'
pyqgis
qgis-processing
José
fuente
fuente
Respuestas:
Finalmente encontré la forma correcta de ejecutar algoritmos de procesamiento en scripts independientes de PyQGIS.
Esta respuesta se basa en las respuestas al Problema con la importación qgis.core al escribir un script PyQGIS independiente y al Error: Algoritmo no encontrado , que a su vez se basa en una discusión de la lista de correo Qgis-dev .
Le sugiero que siga el flujo de trabajo dado en Problema con import qgis.core al escribir un script PyQGIS independiente para habilitar sus bibliotecas QGIS en su Shell OSGeo4W. Una vez que tenga sus bibliotecas QGIS funcionando correctamente, podemos pasar a la segunda parte de su pregunta: ejecutar algoritmos de procesamiento en un script PyQGIS independiente.
Modifiqué un poco tu script original y lo probé en Windows 7 y GNU / Linux. Uso la versión de procesamiento 2.2.0-2 y le sugiero que use esta versión, que es la actual en el momento de escribir la respuesta.
Tenga en cuenta que he eliminado la creación de la cuadrícula del bucle for, ya que realmente no necesita una nueva cuadrícula para realizar cada clip.
¡Esto debería funcionar!
fuente
Processing
carpeta en el escritorio, similar a la contenida en la/qgis.2
carpeta. ¿Debería pasar esto?Esta respuesta se basa en las respuestas al Problema con la importación qgis.core al escribir un script PyQGIS independiente y a ¿Cómo puedo acceder al 'procesamiento' con Python? .
Le sugiero que siga el flujo de trabajo dado en Problema con import qgis.core al escribir un script PyQGIS independiente para habilitar sus bibliotecas QGIS en su Shell OSGeo4W. Una vez que tenga sus bibliotecas QGIS funcionando correctamente, podemos pasar a la segunda parte de su pregunta: ejecutar algoritmos de procesamiento en un script PyQGIS independiente.
Como en ¿Cómo puedo acceder al 'procesamiento' con Python? , Le daré una solución alternativa hasta que pueda ejecutar algoritmos por nombre (por ejemplo,
processing.runalg('provider:algorithm_name')
). Uso la versión de procesamiento 2.2.0-2 y le sugiero que use esta versión.Podemos usar la consola QGIS Python para averiguar dónde se encuentra un script de algoritmo en las carpetas de complementos de procesamiento. Por ejemplo, para saber desde dónde importar
qgis:creategrid
, escriba en la consola QGIS Python:Debes obtener:
lo cual es suficiente para que notemos tanto la ruta del módulo (
processing.algs.qgis.mmqgisx.MMQGISXAlgorithms
) como la clase de algoritmo (mmqgisx_grid_algorithm
). Utilizará esta información en el script a continuación.Modifiqué un poco tu script y lo probé en Windows 7. Es posible que debas ajustar las rutas para ejecutar el script en tu propio entorno.
¡Esto debería funcionar!
Como puede ver, he creado una carpeta Test / Grids para que almacene un único Shapefile de cuadrícula en lugar de crear un archivo temporal en cada ciclo for, lo que no parece ser necesario.
fuente
Test/Grids/
antes de ejecutar el script./Grids/
Creé la carpeta y se creó el archivo grid.shp. Eso funciona perfectamente! Algo más es el problema.path_dir + "Grids\grid.shp"
, lo que seríaC:\Users\your_username\Desktop\Test\Grids\grid.shp
Tuve que hacer cambios menores en el script proporcionado por @gcarrillo para incluir la ruta OSGEO4W64 (tuve que reinstalar QGIS a través del instalador OSGEO4W64 ya que usé el instalador independiente inicialmente) e incluir barras dobles. Aquí está el guión final y muchas gracias a todos por su ayuda:
fuente