Atlas - Auto dimensionar paginas

72 views
Skip to first unread message

elis...@gmail.com

unread,
Oct 12, 2025, 12:59:31 PMOct 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 AMOct 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,
Oct 15, 2025, 2:25:36 PMOct 15
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á;

Rodrigo Gabriel Bastos

unread,
Oct 20, 2025, 8:08:14 AMOct 20
to qgisbrasil
Olá!

Pesquisando aqui percebi que, a função calcula pelas unidades nativas da feição. Ou seja, se estiver em SIRGAS 2000 (Graus) ele retornará um número muito baixo quando for selecionar o melhor papel.
Uma dica é lidar com as unidades em metros.

Cordialmente,
Reply all
Reply to author
Forward
0 new messages