De ModelBuilder y ArcPy a QGIS Processing y Python
Reescriba automatizaciones por resultados verificables, con entradas, tolerancias y errores explícitos.
Revisión editorial: 2026-09-23
Una herramienta con nombre similar no garantiza el mismo resultado. Antes de portar un modelo, registre sus entradas, selección activa, CRS, tolerancias, tratamiento de nulos, licencia requerida y salidas. Esos parámetros implícitos explican muchas diferencias entre ArcPy y otro motor.
Empiece por una operación controlada
Este ejemplo para la consola Python de QGIS 3.44 crea un punto sintético en un CRS métrico y calcula un buffer de 100 metros. No representa un predio real. La capa temporal evita sobrescribir archivos.
from qgis.core import QgsVectorLayer, QgsFeature, QgsGeometry, QgsPointXY, QgsProject
import processing
layer = QgsVectorLayer('Point?crs=EPSG:32618', 'demo', 'memory')
feature = QgsFeature()
feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(500000, 700000)))
layer.dataProvider().addFeatures([feature])
layer.updateExtents()
result = processing.run('native:buffer', {
'INPUT': layer, 'DISTANCE': 100, 'SEGMENTS': 16,
'END_CAP_STYLE': 0, 'JOIN_STYLE': 0, 'MITER_LIMIT': 2,
'DISSOLVE': False, 'OUTPUT': 'memory:'
})['OUTPUT']
assert result.featureCount() == 1
area = next(result.getFeatures()).geometry().area()
assert 31000 < area < 31500
QgsProject.instance().addMapLayer(result)
El área se aproxima a la de un círculo con radio de 100 metros; la segmentación explica la diferencia. No cambie el CRS a grados manteniendo el mismo umbral. Una tolerancia numérica expresa qué precisión admite el proceso y debe acompañar a la prueba.
Traduzca el contrato del modelo
En el historial de Processing puede revisar los parámetros que QGIS utiliza. Use la ayuda del algoritmo antes de convertirlo en un script programado. Separe selección, cálculo y escritura: una selección interactiva no debe convertirse accidentalmente en una dependencia invisible del proceso nocturno.
Compare cantidad de objetos, geometría, atributos y resultados agregados. Incluya entradas vacías, geometrías inválidas y objetos en el borde de la zona de estudio. En un join espacial, defina cómo resolver múltiples coincidencias; en un dissolve, indique qué sucede con campos no agrupados.
Lleve el piloto a operación
Registre versiones de QGIS, proveedores y bibliotecas. Un script de consola tiene contexto de aplicación; ejecutarlo con Python del sistema no carga automáticamente QGIS. Para automatización use un entorno QGIS inicializado o qgis_process, con rutas y permisos definidos. Mantenga credenciales fuera del código y escriba en una salida nueva antes de reemplazar un resultado publicado.
La aceptación consiste en repetir el proceso con el conjunto de prueba, explicar cada diferencia frente a ArcPy y demostrar un fallo controlado cuando una entrada no cumple el contrato. Mantenga el trabajo original hasta que el responsable del producto apruebe las salidas. Un modelo que solo termina sin excepciones todavía puede producir un resultado incorrecto.
Definir el contrato antes de reescribir
Para cada modelo ModelBuilder o script ArcPy, registra tipos de entrada, campos obligatorios, CRS admitidos, parámetros, temporales, esquema de salida y efectos adicionales. Incluye entornos: extensión, tamaño de celda, raster de ajuste, sobrescritura y uso de entidades seleccionadas pueden modificar resultados sin cambiar la secuencia visible.
Clasifica cada paso como operación espacial estándar, operación sobre objetos específicos de Esri o integración externa. Un buffer puede tener un candidato directo; modificar un objeto especializado de geodatabase puede exigir conservar un componente Esri. Enviar correos o mover archivos programadamente corresponde a la aplicación, no al algoritmo espacial.
Ejecutar una operación transparente con PyQGIS
Este ejemplo se ejecuta dentro de la consola Python de QGIS, con una sola capa llamada puntos. EPSG:32618 se usa únicamente para los puntos sintéticos cercanos a Medellín del ejercicio de escritorio. No copies esa proyección a otro territorio sin evaluarla.
import processing
from qgis.core import QgsProject
layers = QgsProject.instance().mapLayersByName('puntos')
if len(layers) != 1:
raise ValueError('Carga exactamente una capa llamada puntos')
source = layers[0]
projected = processing.run('native:reprojectlayer', {
'INPUT': source,
'TARGET_CRS': 'EPSG:32618',
'OUTPUT': 'memory:'
})['OUTPUT']
buffered = processing.run('native:buffer', {
'INPUT': projected,
'DISTANCE': 50,
'SEGMENTS': 12,
'END_CAP_STYLE': 0,
'JOIN_STYLE': 0,
'MITER_LIMIT': 2,
'DISSOLVE': False,
'OUTPUT': 'memory:'
})['OUTPUT']
buffered.setName('synthetic_50m_buffers')
QgsProject.instance().addMapLayer(buffered)
print(source.featureCount(), buffered.featureCount())
Con dos puntos y sin disolver se esperan dos entidades. Exporta explícitamente si necesitas persistencia: las capas en memoria desaparecen al cerrar. Es un punto de partida inspeccionable; no declara que ArcPy use los mismos valores predeterminados. Segmentos, tratamiento plano o geodésico y validez de entrada pueden cambiar el resultado.
Comparar mediante controles independientes
- Ejecuta ambas implementaciones sobre la misma entrada sintética congelada, con un nulo opcional y una entidad cerca del límite del ensayo.
- Compara conteo, nombres y tipos de campos, identificadores, CRS y tipo geométrico.
- Compara áreas o distancias con método y tolerancia declarados. Dos decimales coincidentes no sirven sin conocer las unidades.
- Inspecciona una capa de diferencias geométricas o los casos discrepantes. Un área total puede ocultar errores que se compensan.
- Repite con entrada vacía e inválida. Define si debe detenerse, separar rechazos o entregar un resultado vacío explícito.
Registra los objetos rechazados en lugar de activar silenciosamente “omitir errores”. Un script que termina perdiendo filas suele ser más difícil de diagnosticar que uno que falla con un mensaje útil.
Pasar de consola a ejecución programada
Un proceso independiente requiere inicialización del entorno QGIS, proveedores, directorio temporal escribible y dependencias concretas. El Python del escritorio no necesariamente es el Python del sistema. Comienza ejecutando el modelo guardado mediante qgis_process instalado y consulta su ayuda; el despliegue cambia según sistema operativo y distribución.
Usa nombres de salida deterministas por ejecución, conserva entradas inmutables y publica resultados después de validarlos. Un reintento no debe insertar dos veces el mismo lote. Captura estado de salida y errores acotados sin credenciales. Quien opera la programación necesita un procedimiento de recuperación además del modelo funcional.
Referencia técnica: algoritmos de Procesos desde consola.
Fuentes y documentación
Siguiente paso
Continúe en la colección Open GIS. Para comparar un proyecto concreto, use la calculadora de costo total y solicite una evaluación.