Como automatizar QGIS com Python em 5 linhas de código (7 exemplos prontos)

Esse post é prático, sem rodeio: 7 scripts curtos, copiáveis, que rodam direto no Console Python do QGIS (Ctrl+Alt+P) e resolvem dor real do dia a dia. Cola e usa.

1. Buffer em todas as camadas selecionadas (3 linhas)

Problema: você selecionou 5 camadas no Painel de Camadas e quer fazer buffer de 100 metros em todas, sem abrir o Caixa de Ferramentas 5 vezes.

from qgis.core import QgsProject
import processing

for camada in iface.layerTreeView().selectedLayers():
    processing.runAndLoadResults("native:buffer",
        {"INPUT": camada, "DISTANCE": 100, "OUTPUT": "memory:"})

Por que importa: o que era 5 cliques vezes 5 camadas (25 cliques + esperas), virou um Ctrl+Enter. Em estudo de impacto ambiental, onde você gera buffer pra cursos d’água, estradas, residências, isso paga sozinho.

Ganho de tempo: 5 minutos vira 5 segundos.

2. Reprojetar uma pasta inteira de shapefiles (5 linhas)

Problema: o cliente te mandou 80 shapefiles em SAD69 e você precisa todos em SIRGAS 2000 / UTM 23S (EPSG:31983) pra integrar no projeto.

import os, processing

pasta_in = r"C:\dados\sad69"
pasta_out = r"C:\dados\sirgas"
for arquivo in [a for a in os.listdir(pasta_in) if a.endswith(".shp")]:
    processing.run("native:reprojectlayer", {
        "INPUT": os.path.join(pasta_in, arquivo),
        "TARGET_CRS": "EPSG:31983",
        "OUTPUT": os.path.join(pasta_out, arquivo)
    })

Por que importa: o cara que perdeu 4 horas reprojetando 80 arquivos manualmente teria resolvido isso em 30 segundos. Esse script sozinho já paga o investimento em aprender PyQGIS.

Ganho de tempo: 4 horas vira 30 segundos.

3. Calcular área e adicionar em coluna nova de TODAS as camadas vetoriais do projeto (4 linhas)

Problema: você tem 12 camadas de polígonos (talhões, áreas de preservação, edificações) e precisa que cada uma tenha campo area_ha com a área em hectares.

from qgis.core import QgsProject, QgsField, QgsVectorLayer
from qgis.PyQt.QtCore import QVariant

for camada in QgsProject.instance().mapLayers().values():
    if isinstance(camada, QgsVectorLayer) and camada.geometryType() == 2:
        camada.dataProvider().addAttributes([QgsField("area_ha", QVariant.Double)])
        camada.updateFields()
        idx = camada.fields().indexOf("area_ha")
        with edit(camada):
            for f in camada.getFeatures():
                camada.changeAttributeValue(f.id(), idx, f.geometry().area() / 10_000)

Por que importa: num laudo de georreferenciamento, área é informação obrigatória. Em vez de abrir calculadora de campo em cada camada, você roda 1 vez e tá tudo populado.

Ganho de tempo: 30 minutos por projeto vira 10 segundos.

4. Exportar TODOS os layers do projeto pra GeoPackage único (5 linhas)

Problema: o projeto tá uma bagunça com shapefile espalhado em 4 pastas, e o cliente quer entrega em UM GeoPackage limpo.

from qgis.core import QgsProject, QgsVectorFileWriter, QgsVectorLayer

destino = r"C:\entrega\projeto_consolidado.gpkg"
for camada in QgsProject.instance().mapLayers().values():
    if isinstance(camada, QgsVectorLayer):
        opts = QgsVectorFileWriter.SaveVectorOptions()
        opts.driverName = "GPKG"
        opts.layerName = camada.name()
        opts.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer
        QgsVectorFileWriter.writeAsVectorFormatV3(
            camada, destino, QgsProject.instance().transformContext(), opts)

Por que importa: GeoPackage é o futuro (e o presente), 1 arquivo único, sem aquela meleca de .shp + .shx + .dbf + .prj espalhada. Cliente abre, importa tudo de uma vez, fim.

Ganho de tempo: 20 minutos vira 15 segundos.

5. Aplicar a mesma simbologia (qml) em N camadas (4 linhas)

Problema: você caprichou na simbologia de uma camada de uso do solo (cores certas, classes, rótulos) e precisa replicar exatamente em outras 15 camadas iguais de outros municípios.

from qgis.core import QgsProject, QgsVectorLayer

estilo = r"C:\estilos\uso_solo.qml"
for camada in QgsProject.instance().mapLayers().values():
    if isinstance(camada, QgsVectorLayer) and "uso_solo" in camada.name():
        camada.loadNamedStyle(estilo)
        camada.triggerRepaint()

Por que importa: padronização visual em projeto multi-município é um inferno manual. Esse script garante que TODAS as camadas saiam iguais. Quando o cliente abrir o atlas, vai ver a mesma legenda em todos os mapas.

Ganho de tempo: 1 hora vira 5 segundos.

6. Gerar mapa em batch com Atlas usando lista de polígonos (8 linhas)

Problema: você tem 50 propriedades rurais e precisa gerar 50 PDFs, um por propriedade, com o layout do mapa centrado em cada uma. Manualmente é uma vida inteira.

from qgis.core import QgsProject, QgsLayoutExporter

projeto = QgsProject.instance()
layout = projeto.layoutManager().layoutByName("LayoutPropriedades")
atlas = layout.atlas()
atlas.setEnabled(True)

exporter = QgsLayoutExporter(layout)
settings = QgsLayoutExporter.PdfExportSettings()
exporter.exportToPdfs(atlas, r"C:\saida\propriedade_", settings)

Por que importa: Atlas no QGIS é poderosíssimo, mas configurar e exportar manualmente cada PDF dá trabalho. Com PyQGIS, você dispara o batch inteiro com 1 enter. Pra georreferenciamento de imóveis rurais (CCIR, CAR), salva sua semana.

Ganho de tempo: 2 dias de trabalho vira 5 minutos (que é o tempo do QGIS renderizar).

7. Substituir Find & Replace em campo de atributo (em 1.000 features) (5 linhas)

Problema: a base do cliente veio com a coluna “municipio” tudo em CAIXA ALTA e com erros de acento (“SAO PAULO”, “FLORIANOPOLIS”). Você quer normalizar pra “São Paulo”, “Florianópolis”, e tem 1.000 feições.

from qgis.core import QgsProject

camada = iface.activeLayer()
trocas = {"SAO PAULO": "São Paulo", "FLORIANOPOLIS": "Florianópolis", "VITORIA": "Vitória"}
idx = camada.fields().indexOf("municipio")
with edit(camada):
    for f in camada.getFeatures():
        if f["municipio"] in trocas:
            camada.changeAttributeValue(f.id(), idx, trocas[f["municipio"]])

Por que importa: limpeza de base é 60% do trabalho real em GIS. Em vez de editar célula por célula na tabela de atributos (e correr risco de errar), você define o dicionário de trocas e roda. Reproduzível, auditável.

Ganho de tempo: 1 hora vira 10 segundos.

Como sair do “copio script da internet” pro “escrevo meu próprio PyQGIS”

Olha, esses 7 scripts já vão te economizar dezenas de horas. Mas a verdade é que eles são só a ponta do iceberg. PyQGIS tem API gigante, o ecossistema processing tem mais de 700 algoritmos disponíveis, e quando você junta isso com GeoPandas, Rasterio e automação de pasta, vira outro nível profissional.

E é exatamente isso que ensino no Descomplica Geo-Python: 40 horas, 74 aulas, do “nunca abri o Console Python” ao “monto plugin do QGIS sozinho”. A gente passa por PyQGIS, GeoPandas, Rasterio, Shapely, automação de fluxo completo. Quem termina sai com cabeça de desenvolvedor GIS, não só de usuário.

Pra quem ainda não programa nada em Python, antes de cair no Descomplica Geo-Python vale fazer o Mini-Curso Introdutório Python GIS, que monta o terreno: variáveis, condicional, loops, funções.

Conheça o Descomplica Geo-Python aqui

E se eu quiser dominar TODO o stack GIS, não só Python?

Se a meta é virar geoprofissional completo (QGIS avançado, sensoriamento remoto, geoestatística, banco PostGIS, Python, cartografia), o caminho enxuto é o Clube do GIS Premium, com acesso a toda a biblioteca de cursos.

Clube do GIS Premium

Perguntas frequentes

Onde eu cole esses scripts no QGIS?

No Console Python (Ctrl+Alt+P, ou no menu Plugins, Console Python). Cola, dá Enter, roda. Pra reaproveitar, salva como .py e abre pelo editor de scripts do mesmo Console.

Preciso saber programação pra usar isso?

Pra COPIAR e rodar, não. Pra ADAPTAR pro seu caso (mudar pasta, mudar EPSG, mudar nome de campo), sim, precisa do básico de Python.

PyQGIS funciona em qual versão do QGIS?

Funciona em todas as versões 3.x (a partir do QGIS 3.0). Os scripts desse post foram testados no QGIS 3.34 LTR e devem rodar em 3.28 ou superior. Em versões mais antigas pode ter ajuste de API.

Como descubro o nome do algoritmo (tipo “native:buffer”)?

Abre o Caixa de Ferramentas, acha o algoritmo que você quer, clica com botão direito, “Copiar nome do algoritmo”. Cola no script. Atalho que vale ouro.

Esses scripts funcionam fora do QGIS, num arquivo .py qualquer?

Não, esses dependem do QGIS rodando, porque usam iface, QgsProject.instance(), etc. Pra script standalone (sem QGIS aberto), você usa GeoPandas, Rasterio, Shapely, que rodam em qualquer ambiente Python.

Importante dizer também que há uma solução para quem não tem tempo a perder e quer produzir mapas profissionais em pouquíssimo tempo

Eu montei um curso completo de QGIS que vai te levar do zero a mapas profissionais em 1 a 2 semanas, com suporte a dúvidas para te ajudar sempre que precisar: Curso completo de QGIS.

Espero ter te ajudado e aberto um novo leque de possibilidades!

Muito sucesso na jornada!

Gostou do conteúdo? Compartilhe nos botões abaixo!
WhatsApp
Facebook
Twitter
LinkedIn
Pinterest
Foto de Leonardo Marques

Leonardo Marques

Leonardo Marques é engenheiro ambiental e doutor, com atuação focada em Sistemas de Informação Geográfica (SIG/GIS), geoprocessamento, cartografia digital e sensoriamento remoto. É fundador e principal instrutor do Clube do GIS — a maior plataforma de ensino de geotecnologias do Brasil, com mais de 10.000 alunos formados em cursos de QGIS, ArcGIS, Python GIS, PostGIS, drones e análise espacial. Atua também como consultor e instrutor corporativo para empresas dos setores de agronegócio, meio ambiente, engenharia e planejamento urbano. Áreas de especialidade: QGIS avançado, análise multicritério, mapeamento aéreo com drones, Python para geoprocessamento e banco de dados espacial PostGIS.
Você também pode se interessar por estes posts…