Atlas - Auto dimensionar paginas

25 views
Skip to first unread message

elis...@gmail.com

unread,
Oct 12, 2025, 12:59:31 PM (3 days ago) Oct 12
to qgisbrasil
Olá pessoal!!!

Tenho um layout no atlas para mostrar cada município, mas queria que cada município ficasse na escala fixa e que o Atlas escolhesse o formato da folha no Compositor de Impressão   automaticamente, pois sabemos que os municipios tem tamanho bem diferentes. Alguém conhece alguma forma de fazer isso?

Rodrigo Gabriel Bastos

unread,
Oct 13, 2025, 11:05:16 AM (2 days ago) Oct 13
to qgisbrasil
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!")

elis...@gmail.com

unread,
2:25 PM (2 hours ago) 2:25 PM
to qgisbrasil
Olá Rodrigo,
Rodei o script, gerou os arquivos pdf, mas todos sempre no mesmo formato A4, estou fazendo algo errado?

agradeço desde já;
Reply all
Reply to author
Forward
0 new messages