Bom dia,
Desconheço uma forma que o próprio QGIS faça, mas talvez você possa usar Python.
Segue uma prévia do código:
# --- INÍCIO DA CONFIGURAÇÃO ---
# 1. Nome da sua camada de municípios no QGIS
NOME_CAMADA_MUNICIPIOS = 'municipios_br'
# 2. Campo da camada que será usado para nomear os arquivos de saída (ex: 'NM_MUN')
CAMPO_NOME_MUNICIPIO = 'NM_MUN'
# 3. A escala fixa que você deseja usar
ESCALA_FIXA = 250000
# 4. Caminho para a pasta onde os mapas serão salvos
PASTA_SAIDA = '/home/user/mapas_municipios/'
# 5. Nome do seu layout base no projeto QGIS
# (Crie um layout básico, ele será redimensionado pelo script)
NOME_LAYOUT = 'MeuLayoutBase'
# 6. ID do item de mapa dentro do seu layout (geralmente 'Mapa 1')
ID_ITEM_MAPA = 'Mapa 1'
# 7. Margem em milímetros a ser adicionada ao redor do município
MARGEM_MM = 20
# --- FIM DA CONFIGURAÇÃO ---
from qgis.core import QgsProject, QgsLayout, QgsLayoutExporter, QgsUnitTypes
# Definições de tamanhos de papel padrão em milímetros (Largura x Altura)
formatos = {
'A4_Retrato': (210, 297),
'A4_Paisagem': (297, 210),
'A3_Retrato': (297, 420),
'A3_Paisagem': (420, 297),
'A2_Retrato': (420, 594),
'A2_Paisagem': (594, 420),
}
# Funçao para escolher o melhor formato
def escolher_formato(largura_necessaria, altura_necessaria):
for nome, dimensoes in sorted(formatos.items(), key=lambda item: item[1][0] * item[1][1]):
if largura_necessaria <= dimensoes[0] and altura_necessaria <= dimensoes[1]:
return dimensoes
# Se nenhum formato couber, retorna o maior (A2 Paisagem) como padrão
return formatos['A2_Paisagem']
# Início do processo
print("Iniciando geração de mapas...")
projeto = QgsProject.instance()
camada = projeto.mapLayersByName(NOME_CAMADA_MUNICIPIOS)[0]
layout_manager = projeto.layoutManager()
layout_base = layout_manager.layoutByName(NOME_LAYOUT)
if not layout_base:
print(f"Erro: Layout '{NOME_LAYOUT}' não encontrado!")
else:
for feicao in camada.getFeatures():
nome_municipio = feicao[CAMPO_NOME_MUNICIPIO]
print(f"Processando: {nome_municipio}...")
bbox = feicao.geometry().boundingBox()
# Converte as dimensões do município (em metros) para milímetros no papel
largura_mapa_mm = (bbox.width() * 1000) / ESCALA_FIXA
altura_mapa_mm = (bbox.height() * 1000) / ESCALA_FIXA
# Adiciona as margens
largura_total_mm = largura_mapa_mm + (2 * MARGEM_MM)
altura_total_mm = altura_mapa_mm + (2 * MARGEM_MM)
# Escolhe o melhor formato de papel
dimensoes_folha = escolher_formato(largura_total_mm, altura_total_mm)
# Redimensiona a página do layout
pagina = layout_base.pageCollection().pages()[0] # Pega a primeira página
pagina.setPageSize(QgsLayoutSize(dimensoes_folha[0], dimensoes_folha[1], QgsUnitTypes.LayoutMillimeters))
# Ajusta o mapa
mapa = layout_base.itemById(ID_ITEM_MAPA)
if mapa:
mapa.setExtent(bbox)
mapa.setScale(ESCALA_FIXA)
# Pode ser necessário forçar a atualização de outros itens aqui (título, etc.)
# Exporta o layout
exporter = QgsLayoutExporter(layout_base)
caminho_arquivo = f"{PASTA_SAIDA}{nome_municipio}.pdf"
exporter.exportToPdf(caminho_arquivo, QgsLayoutExporter.PdfExportSettings())
print("Processo concluído!")