Los scripts de PyQGIS, la librería de scripting de QGIS, son excelentes para automatizar flujos de trabajo de procesamiento espacial.
Es fácil ejecutar estos scripts dentro de QGIS, pero puede ser aún más conveniente ejecutar scripts de PyQGIS sin ni siquiera tener que iniciar QGIS.
La utilización de un IDE (Entorno de Desarrollo Integrado) como PyCharm cuando trabajamos con Python es fundamental, tanto para escribir código como para la detección y corrección de errores de programación.
Para crear un script de forma «autónoma» es necesario realizar algunos ajustes en el IDE, ya que tenemos que indicar al sistema dónde buscar las bibliotecas de QGIS y los módulos de Python.
Los siguientes pasos muestran cómo configurar PyCharm para el desarrollo independiente de PyQGIS en Windows 10 con OSGeo4W.
Prerrequisitos
- Instalar PyCharm.
- Instalar QGIS 3.x de forma avanzada utilizando OSGeo4W.
- Seleccionar QGIS desktop y QGIS full desktop.
Configurar PyCharm para usarlo con QGIS
Hemos probado a configurar PyCharm para usarlo con QGIS (en Windows 10) sin problemas.
En Linux no hay que hacer nada, pero en Windows necesitamos asegurarnos de que tiene la misma configuración de entorno y usar las mismas bibliotecas e intérprete que QGIS.
La forma más rápida de hacer esto es crear un archivo de línea de comandos en el directorio C:\OSGeo4W64 y denominarlo pycharm.cmd
A continuación, abrimos este archivo con un editor de texto e incluimos el siguiente código:
@echo off SET OSGEO4W_ROOT=C:\OSGeo4W64 call "%OSGEO4W_ROOT%"\bin\o4w_env.bat call "%OSGEO4W_ROOT%"\apps\grass\grass-7.4.0\etc\env.bat call qt5_env.bat call py3_env.bat @echo off path %PATH%;%OSGEO4W_ROOT%\apps\qgis\bin path %PATH%;%OSGEO4W_ROOT%\apps\grass\grass78\lib path %PATH%;C:\OSGeo4W64\apps\Qt5\bin path %PATH%;C:\OSGeo4W64\apps\Python37\Scripts set QGIS_PREFIX_PATH=%OSGEO4W_ROOT%\apps\qgis set GDAL_FILENAME_IS_UTF8=YES set VSI_CACHE=TRUE set VSI_CACHE_SIZE=1000000 set PYTHONPATH=%PYTHONPATH%;%OSGEO4W_ROOT%\apps\qgis\python set PYTHONHOME=%OSGEO4W_ROOT%\apps\Python37 set PATH=C:\Program Files\Git\bin;%PATH% set QT_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\qgis\qtplugins;%OSGEO4W_ROOT%\apps\qt5\plugins set PYTHONPATH=%OSGEO4W_ROOT%\apps\qgis\python;%PYTHONPATH% start "PyCharm aware of QGIS" /B "C:\Program Files\JetBrains\PyCharm Community Edition 2020.1\bin\pycharm64.exe" %*
Atento a las rutas, ya que depende de las versiones quizá sea necesario modificarlas con las de tu propia instalación.
Ahora cuando hagamos doble clic en este archivo se iniciará PyCharm.
El siguiente paso es incluir el intérprete de Python correspondiente a la instalación de OSGeo4W. Vamos a ver cómo configurarlo:
En PyCharm seleccionamos File > Settings…
Hacemos clic en Project > Python Interpreter y añadimos un nuevo interprete de sistema (System Interpreter).
Establecemos la ruta del intérprete como C:\OSGeo4W64\apps\Python37\python3.exe como se ve en la siguiente captura de pantalla:
Para finalizar la configuración del intérprete, necesitamos agregar una ruta adicional:
Que apunte a QGIS\python\plugins:
Listo!, vemos cómo se han añadido todos los paquetes de QGIS en nuestro editor:
Ahora ya podemos comenzar a crear aplicaciones independientes con scripts de QGIS.
El siguiente ejemplo muestra los pasos necesarios:
- Inicializar QGIS.
- Inicializar procesamiento.
- Ejecutar un algoritmo de procesamiento que utiliza una capa de entrada de ríos y mediante una expresión seleccione aquellos ríos cuyo nombre sea Nilo y genera una nueva capa únicamente con ese río:
import sys from qgis.core import QgsApplication, QgsProcessingFeedback from qgis.analysis import QgsNativeAlgorithms QgsApplication.setPrefixPath(r'C:\OSGeo4W64\apps\qgis', True) qgs = QgsApplication([], False) qgs.initQgis() # Add the path to processing so we can import it next sys.path.append(r'C:\OSGeo4W64\apps\qgis\python\plugins') # Imports usually should be at the top of a script but this unconventional # order is necessary here because QGIS has to be initialized first import processing from processing.core.Processing import Processing Processing.initialize() QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms()) feedback = QgsProcessingFeedback() rivers = r'C:\webmapping\Capas\ne_110m_rivers_lake_centerlines.shp' output = r'C:\temp\nile.shp' expression = "name LIKE '%Nile%'" nile = processing.run( 'native:extractbyexpression', {'INPUT': rivers, 'EXPRESSION': expression, 'OUTPUT': output}, feedback=feedback )['OUTPUT'] print(nile)
Al finalizar el proceso se ha creado la nueva capa en el directorio seleccionado. ¡Sin abrir QGIS!
Más info relacionada:
- https://haifengniu.com/en/post/pyqgis-pycharm/how-to-set-environment-for-pyqgis-3-in-pycharm/
- Stand-alone PyQGIS scripts with OSGeo4W
- https://gis.stackexchange.com/questions/302774/error-from-create-a-reference-to-the-qgsapplication
Si quieres aprender a automatizar tareas en QGIS con Python apúntate ya a nuestro curso online de PyQGIS.
Licenciado en Geografía. Máster en Sistemas de Información Geográfica. Consultor GIS desde el año 2004. En MappingGIS desde el año 2012 para ayudarte a impulsar tu perfil GIS y diferenciarte de la competencia. Echa un vistazo a todos nuestros cursos de SIG online.
Saludos una duda que me nace con este tema:
Pycharm tiene una versión de la comunidad gratuita y otra que es profesional, por la cual hay que pagar una licencia que asta la fecha no he entendido bien si es por pagos mensualmente, anual o se obtiene por un pago único.
en este caso y para este tema en especial que ganaría un desarrollador si tuviera la licencia; tendría algún beneficio mayor que valiera la pena en cuando a desarrollar para PyQGIS, o seria mejor trabajarlo libre puesto que no habrían beneficios.
quedo a la espera de comentarios
y gracias por este tema que es excelente los temas que me he encontrado acá.
saludos
excelente no sabia como usar esto sincronizado; uso PyCharm, pero no había pensado en usarlo así voy a probarlo;
Buen trabajo Aurelio.
Voy a probarlo a ver si soy capaz de, con la ayuda de pycharm, hacer algún plugin
saludos
Muchas gracias Jose Manuel, Ya nos irás contando tus avances!