BlogData Science

Visualização de Mapas do IBGE com Python e Jupyter

Para aqueles interessados em visualizar mapas geográficos utilizando Python e manipular dados territoriais do Brasil, este tutorial oferece uma abordagem passo a passo. O objetivo é extrair e visualizar os dados geográficos disponibilizados pelo IBGE.

Entendendo os pacotes utilizados

Os pacotes a seguir são necessários:

from datetime import datetime
import requests
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
Python

requests: faz requisições à web.
pandas: manipulação de dados em dataframes.
geopandas: uma extensão do pandas para trabalhar com dados geográficos.
matplotlib: visualização de dados.

Extração dos dados

A fonte dos dados é o IBGE, que disponibiliza diversos mapas geográficos em formato .zip. Uma lista de URLs desses arquivos é fornecida:

arquivos = {
    'brasil': 'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Pais_2021.zip',
    'rga':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_RG_Intermediarias_2021.zip',
    'rgi':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_RG_Imediatas_2021.zip',
    'rgme':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Mesorregioes_2021.zip',
    'rgmi':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Microrregioes_2021.zip',
    'uf': 'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_UF_2021.zip',
    'mun': 'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Municipios_2021.zip'
}
Python
  • brasil: Representa o contorno geográfico do Brasil como um todo. Oferece uma visão ampla das fronteiras do país.
  • rga: Trata-se das Regiões Geográficas Intermediárias, que são agrupamentos de municípios definidos pelo IBGE e que, juntos, formam uma Região Geográfica Imediata.
  • rgi: As Regiões Geográficas Imediatas são áreas dentro das Regiões Geográficas Intermediárias, definidas com base em centros urbanos, com objetivo de auxiliar na análise regional do país.
  • rgme: Este arquivo refere-se às Mesorregiões, que são agrupamentos de municípios com características semelhantes. Elas são definidas pelo IBGE e são maiores que as Microrregiões.
  • rgmi: Refere-se às Microrregiões, menores que as Mesorregiões, e são áreas que compartilham características socioeconômicas e geográficas similares.
  • uf: Este arquivo representa as Unidades Federativas do Brasil, ou seja, os estados. Ideal para visualizações que focam nas divisões estaduais.
  • mun: Contém dados geográficos de todos os municípios brasileiros. Esse é o arquivo mais detalhado e permite visualizações no nível municipal.

O código, então, percorre essa lista, fazendo uma requisição para cada URL e armazenando o conteúdo em um arquivo .zip:

for i in arquivos:
    arquivo = i+".zip"
    remote_url = arquivos[i]
    
    print("Coletando: "+remote_url)
    data = requests.get(remote_url)
    with open("./input/"+arquivo, 'wb') as file:
        file.write(data.content)
Python

Visualização dos dados dos Estados Brasileiros

Neste exemplo, o arquivo uf.zip, que contém dados das unidades federativas do Brasil, é lido.

df = gpd.read_file('zip://inputs/uf.zip')
df.head()
Python

Para uma visualização específica da região Nordeste, desenhando um gráfico, vamos utilizar o código abaixo:

df[df['NM_REGIAO']=='Nordeste'].plot()
Python

Visualização do mapa dos Municípios

Neste exemplo, o arquivo mun.zip, que contém dados dos municípios do Brasil será lido e exibiremos tanto os municípios de Minas Gerais como também da cidade de Uberlândia.

df = gpd.read_file('zip://./input/mun.zip')
df.head()
Python
mg = df[df['SIGLA']=='MG']

udi = df[(df['NM_MUN'] == 'Uberlândia')]


# Criar uma figura e dois eixos
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(15, 10))

# Plotar Minas Gerais no primeiro eixo
mg.plot(ax=ax1,column="NM_MUN", cmap="YlGnBu")
ax1.set_title('Minas Gerais')

# Plotar Uberlandia no segundo eixo
udi.plot(ax=ax2, edgecolor="k")
ax2.set_title('Uberlândia')

# Remover os eixos para uma melhor visualização
ax1.set_axis_off()
ax2.set_axis_off()

# Ajusta o espaçamento entre os mapas para que não se sobreponham
plt.tight_layout()

plt.show()
Python

Exemplo mais complexo

Neste código iremos baixar os dados populacionais por municípios do IBGE e plotaremos o mapa de Minas gerais com uma escala de cores de acordo com a população.

Neste exemplo, qualquer município com mais de 500mil habitantes estará no topo da escala.

import requests

#https://servicodados.ibge.gov.br/api/docs/agregados?versao=3
url = "http://servicodados.ibge.gov.br/api/v3/agregados/6579/periodos/2021/variaveis/9324?localidades=N6[N3[31]]"

response = requests.get(url,verify=False)
data = response.json()

# Extraia a lista de municípios e informações
municipios_info = data[0]['resultados'][0]['series']

# Crie uma lista de dicionários com as informações desejadas de cada município
municipios_list = []
for info in municipios_info:
    id = info['localidade']['id']
    nome_completo = info['localidade']['nome']
    municipio, estado = nome_completo.split(" - ")
    populacao = int(info['serie']['2021'])
    
    municipios_list.append({
        'id': id,
        'municipio': municipio,
        'estado': estado,
        'população': populacao
    })

# Converta a lista de dicionários em um DataFrame
df = pd.DataFrame(municipios_list)

# Mesclando os dataframes com base no nome do município
merged = mg.set_index('CD_MUN').join(df.set_index('id'))

# Definindo um esquema de cores para o mapa de calor
vmin, vmax = 0, 500000
fig, ax = plt.subplots(1, figsize=(10, 6))
merged.plot(column='população', cmap='YlGnBu', linewidth=0.8, ax=ax, edgecolor='0.8', legend=False,vmin=vmin,vmax=vmax)
ax.set_title('População por município em Minas Gerais', fontdict={'fontsize': '15', 'fontweight' : '3'})
plt.show()
Python

Espero que tenham gostado do post, até o próximo