import numpy as np
import matplotlib.pyplot as plt
laranja_queimado = "#D45A1A"
ocre = "#E8A33D"
azul_rio = "#3F6B85"
azul_petroleo = "#1F3A4D"
grafite = "#1A1A1A"
bone = "#FAF8F2"Notebook — Bacia do Formoso: cartografia da BHRF
Notebook de cartografia. Demonstra dois caminhos para mapear a Bacia Hidrográfica do Rio Formoso: (1) geobr + matplotlib para mapas pedagógicos; (2) PyGMT para mapa de qualidade publicação adequado a paper na ASC 2026. Para a versão simples, basta pip install -r requirements.txt. Para PyGMT, instalação adicional: conda install -c conda-forge pygmt (mais simples que pip, traz GMT compilado). Tutorial standalone comparativo em recursos/notebook-cartografia.qmd.
Setup
Caminho 1 — geobr + matplotlib (pedagógico)
Para uso em sala de aula, página web pedagógica, ou figura simples em texto.
# Em R seria mais natural; em Python via geobrasil ou recriação manual.
# Aqui mostramos o esqueleto:
#
# import geobrasil as gb # pip install geobrasil
# tocantins = gb.read_state(code_state=17) # GeoDataFrame
# municipios_to = gb.read_municipality(code_state=17)
# formoso = municipios_to[municipios_to.code_muni.isin([1709500, 1712504])]
# # 1709500 = Lagoa da Confusão; 1712504 = Cristalândia (próximo)
# Versão didática: bounding box estilizado de Tocantins + recorte BHRF
fig, ax = plt.subplots(figsize=(9, 9))
# Tocantins aproximado por bounding box estilizado
to_x = [-50.5, -45.5, -45.5, -50.5, -50.5]
to_y = [-13.5, -13.5, -5.0, -5.0, -13.5]
ax.fill(to_x, to_y, color=ocre, alpha=0.18, edgecolor=azul_petroleo, lw=2)
ax.plot([-50.5, -45.5], [-9.5, -9.5], color=grafite, lw=0.4, ls=":") # paralelo
# Microrregião do Formoso (recorte sudoeste de TO)
bhrf_x = [-49.8, -49.0, -49.0, -49.8, -49.8]
bhrf_y = [-11.6, -11.6, -10.5, -10.5, -11.6]
ax.fill(bhrf_x, bhrf_y, color=azul_rio, alpha=0.5, edgecolor=azul_petroleo, lw=2,
label="Bacia Hidrográfica do Rio Formoso")
# Pontos: Cristalândia, Lagoa da Confusão, Formoso do Araguaia
for nome, lon, lat, c in [
("Cristalândia", -49.18, -10.58, laranja_queimado),
("Lagoa da Confusão", -49.62, -10.79, laranja_queimado),
("Formoso do Araguaia", -49.53, -11.79, laranja_queimado),
("Palmas (capital)", -48.36, -10.18, azul_petroleo),
]:
ax.plot(lon, lat, "o", color=c, ms=10, mec=grafite, mew=1, zorder=5)
ax.annotate(nome, (lon, lat), xytext=(8, 6), textcoords="offset points",
fontsize=9, color=grafite)
# Rio Formoso simbolizado (linha)
ax.plot([-49.7, -49.4, -49.5, -49.6], [-11.5, -11.0, -10.7, -10.5],
color=azul_petroleo, lw=2.5)
ax.set_xlabel("Longitude (°W)"); ax.set_ylabel("Latitude (°)")
ax.set_xlim(-51, -45); ax.set_ylim(-14, -5)
ax.set_title("Bacia Hidrográfica do Rio Formoso (BHRF) — Tocantins (esquemático)")
ax.legend(frameon=False, loc="upper right")
ax.grid(alpha=0.2)
ax.set_aspect("equal")
fig.tight_layout()
plt.show()Esta versão é estilizada (bounding boxes em vez de polígonos reais) para facilitar leitura sem dependência do servidor IBGE. Para produção: usar geobr::read_state("TO") em R ou geobrasil em Python para shapes oficiais. Em ambiente local com geobr instalado, substitua o bloco acima pela versão real.
Caminho 2 — PyGMT (qualidade publicação)
Para paper na ASC 2026, sessão “Cartografias em Disputa” da Metaphorum, ou contribuição ao IDEA. Use PyGMT.
# import pygmt
#
# fig = pygmt.Figure()
#
# # Mapa do Tocantins com relevo (SRTM via @earth_relief)
# region = [-51, -45, -14, -5] # [W, E, S, N]
# fig.basemap(region=region, projection="M15c", frame=["WSne", "a2f1"])
# fig.grdimage(grid="@earth_relief_03s", region=region, cmap="oleron", shading=True)
# fig.coast(shorelines="0.5p,white", borders=["1/0.8p,white"], region=region)
#
# # Recorte BHRF como retângulo destacado
# fig.plot(x=[-49.8, -49.0, -49.0, -49.8, -49.8],
# y=[-11.6, -11.6, -10.5, -10.5, -11.6],
# pen="2p,red", close=True)
#
# # Pontos: cidades-chave
# fig.plot(x=[-49.18, -49.62, -49.53, -48.36],
# y=[-10.58, -10.79, -11.79, -10.18],
# style="c0.3c", fill="orange", pen="1p,black")
# fig.text(x=[-49.18, -49.62, -49.53, -48.36],
# y=[-10.58, -10.79, -11.79, -10.18],
# text=["Cristalândia", "Lagoa da Confusão", "Formoso do Araguaia", "Palmas"],
# font="9p,Helvetica,black", justify="LM", offset="0.4c/0c")
#
# # Rio Formoso simbólico
# fig.plot(x=[-49.7, -49.4, -49.5, -49.6],
# y=[-11.5, -11.0, -10.7, -10.5],
# pen="3p,blue@30")
#
# # Inset com Brasil mostrando localização
# with fig.inset(position="jTL+w4c+o0.2c", margin=0):
# fig.coast(region="BR", projection="M3.5c", land="lightgray", borders="1/thin",
# water="white")
# fig.plot(x=[-51, -45, -45, -51, -51], y=[-14, -14, -5, -5, -14],
# pen="1p,red", close=True)
#
# fig.savefig("bhrf-pygmt.png", dpi=300)
# fig.show()A versão acima fica como referência (não-executada — eval: false). Para gerar a figura real:
# 1. instalar PyGMT (recomendado conda)
conda install -c conda-forge pygmt
# 2. abrir Quarto preview deste notebook removendo `eval: false`
quarto preview fase-04-sintese/02-bacia-formoso-caso/notebook.qmdA saída esperada é mapa A4 com relevo SRTM, hidrografia simbólica, recorte BHRF em destaque vermelho, cidades anotadas em sans-serif, inset Brasil para contexto. Adequado para paper revisado por pares.
Comparação de uso
| Caminho | Pedagógico (geobr + matplotlib) | Publicação (PyGMT) |
|---|---|---|
| Instalação | pip install -r requirements.txt |
conda install -c conda-forge pygmt |
| Tempo de aprendizado | ~1 hora | ~5 horas |
| Qualidade visual | Suficiente para slides e web | Adequada para paper revisado |
| Relevo / hidrografia | Manual via geopandas | @earth_relief integrado |
| Tipografia | Padrão matplotlib | Controle PostScript completo |
| Quando usar | Página web do curso, sala de aula | ASC 2026, JBHE, Environmental Management |
Interpretação cibernética
Mapas não são neutros. Em cibernética de segunda ordem (sessão “Cartografias em Disputa” da ASC 2026), a escolha de projeção, recorte, cor e legenda constrói o objeto que diz descrever. Para a tese de Joana sobre o IDEA: o mapa da BHRF não é decoração — é evidência da \(H(D)\) territorial que o sistema regulador precisa absorver. Cada município omitido é variedade subtraída. Cada cor escolhida é decisão de S5 sobre o que é “central” e o que é “fundo”.