A ANA (Agência Nacional de Águas e Saneamento Básico) é a autarquia federal responsável pela gestão dos recursos hídricos de domínio da União e pela regulação do setor de saneamento no Brasil. A ANA disponibiliza um amplo conjunto de dados abertos sobre o monitoramento e a gestão das águas brasileiras.
Os principais conjuntos de dados incluem:
Outorgas de direito de uso — autorizações para uso de recursos hídricos (irrigação, abastecimento, indústria, geração de energia)
Monitoramento hidrológico — dados de estações fluviométricas e pluviométricas (vazão, nível do rio, precipitação)
Bacias hidrográficas — divisão hidrográfica do Brasil em bacias, sub-bacias e microbacias
Reservatórios — monitoramento de volume e operação de reservatórios
Qualidade da água — parâmetros físico-químicos e biológicos monitorados em rios e reservatórios
SNIRH (Sistema Nacional de Informações sobre Recursos Hídricos) — base consolidada de dados hidrológicos
A ANA mantém a maior rede de monitoramento hidrológico da América do Sul, com mais de 4.600 estações fluviométricas e 11.000 estações pluviométricas operadas diretamente ou por entidades conveniadas.
import requestsimport pandas as pdfrom io import StringIO# Baixar série histórica de vazão de uma estação# Exemplo: estação 15030000 (Rio Amazonas em Óbidos)COD_ESTACAO = "15030000"url = f"https://www.snirh.gov.br/hidroweb/rest/api/documento/convencionais"params = { "tipo": 3, # Tipo 3 = vazão "codEstacao": COD_ESTACAO, "dataInicio": "2020-01-01", "dataFim": "2024-12-31",}response = requests.get(url, params=params, timeout=120)response.raise_for_status()# O retorno pode ser um arquivo CSV ou JSON dependendo do endpoint# Processar conforme o formato retornadoprint(f"Dados de vazão para estação {COD_ESTACAO}")print(f"Tamanho da resposta: {len(response.content):,} bytes")
import requestsimport pandas as pd# API de dados abertos da ANA — consultar outorgasBASE_URL = "https://dadosabertos.ana.gov.br/api/3/action"# Primeiro, identificar o ID do recurso de outorgasresp = requests.get( f"{BASE_URL}/package_show", params={"id": "outorgas"}, timeout=30,)if resp.status_code == 200: dados = resp.json() recursos = dados.get("result", {}).get("resources", []) print("Recursos de outorgas disponíveis:") for r in recursos: print(f" - {r['name']}: {r['format']} ({r['id']})")# Consultar dados de outorgas via datastoredef consultar_outorgas(uf: str = None, finalidade: str = None, limite: int = 100): """ Consulta outorgas de uso de recursos hídricos. Args: uf: Sigla da UF finalidade: Finalidade de uso (irrigação, abastecimento, etc.) limite: Número máximo de registros Returns: DataFrame com outorgas """ url = f"{BASE_URL}/datastore_search" params = { "resource_id": "RESOURCE_ID_OUTORGAS", # Substituir pelo ID real "limit": limite, } filtros = {} if uf: filtros["uf"] = uf if finalidade: filtros["finalidade"] = finalidade if filtros: import json params["filters"] = json.dumps(filtros) response = requests.get(url, params=params, timeout=30) response.raise_for_status() resultado = response.json() registros = resultado.get("result", {}).get("records", []) return pd.DataFrame(registros)# Exemplo: outorgas no Mato Grossodf_outorgas = consultar_outorgas(uf="MT")print(f"Outorgas encontradas: {len(df_outorgas)}")
import requestsimport pandas as pd# Sistema de Acompanhamento de ReservatóriosSAR_URL = "https://www.snirh.gov.br/sar/"# Consultar nível dos principais reservatórios# Os dados são publicados diariamentedef consultar_reservatorios(): """ Consulta o nível atual dos reservatórios monitorados pela ANA. Returns: DataFrame com dados dos reservatórios """ url = f"{SAR_URL}rest/api/reservatorio" response = requests.get(url, timeout=30) response.raise_for_status() return pd.DataFrame(response.json())df_reservatorios = consultar_reservatorios()print(f"Reservatórios monitorados: {len(df_reservatorios):,}")print(df_reservatorios[["nome", "bacia", "volume_util_pct"]].head(10))# Reservatórios em estado crítico (volume < 30%)criticos = df_reservatorios[ pd.to_numeric(df_reservatorios["volume_util_pct"], errors="coerce") < 30]print(f"\nReservatórios em estado crítico (<30%): {len(criticos)}")print(criticos[["nome", "bacia", "volume_util_pct"]].to_string(index=False))
import geopandas as gpd# Carregar divisão hidrográfica do Brasilgdf_bacias = gpd.read_file("bacias_hidrograficas_brasil.shp")print(f"Total de bacias: {len(gdf_bacias):,}")print(f"Colunas: {list(gdf_bacias.columns)}")# Área por bacia de nível 1por_bacia = ( gdf_bacias.groupby("nome_bacia") .agg(area_km2=("area_km2", "sum")) .sort_values("area_km2", ascending=False))print("\nBacias hidrográficas por área:")print(por_bacia.to_string())
import geopandas as gpdimport pandas as pd# Verificar se áreas com outorgas de irrigação apresentam desmatamento recente# 1. Carregar outorgas com coordenadasdf_outorgas = pd.read_csv("outorgas_ana.csv", sep=";", encoding="utf-8")df_outorgas = df_outorgas.dropna(subset=["latitude", "longitude"])gdf_outorgas = gpd.GeoDataFrame( df_outorgas, geometry=gpd.points_from_xy(df_outorgas["longitude"], df_outorgas["latitude"]), crs="EPSG:4674",)# 2. Carregar polígonos PRODESgdf_prodes = gpd.read_file("prodes_amazonia_2023.shp").to_crs("EPSG:4674")# 3. Buffer de 5km ao redor dos pontos de outorgagdf_outorgas_buffer = gdf_outorgas.copy()gdf_outorgas_buffer["geometry"] = gdf_outorgas_buffer.geometry.buffer(0.05) # ~5km# 4. Cruzamento espacialoutorgas_com_desmat = gpd.sjoin( gdf_outorgas_buffer, gdf_prodes, how="inner", predicate="intersects")print(f"Outorgas próximas a áreas desmatadas: {len(outorgas_com_desmat):,}")print(f"Outorgados afetados: {outorgas_com_desmat['cpf_cnpj'].nunique():,}")
O sistema HidroWeb pode ser muito lento para download de séries históricas longas. Considere downloads parciais por período.
Séries com falhas
As séries históricas de vazão e precipitação frequentemente possuem lacunas (dias sem medição), especialmente em estações remotas.
Dados brutos vs. consistidos
Os dados passam por um processo de consistência (validação). Dados brutos (nível 1) podem conter erros; dados consistidos (nível 2) podem ter anos de defasagem.
API não padronizada
Os diferentes sistemas da ANA (HidroWeb, SAR, Dados Abertos) possuem APIs distintas, sem padronização de formato ou parâmetros.
Outorgas estaduais ausentes
A ANA emite outorgas apenas para rios de domínio da União. Outorgas de rios estaduais são emitidas pelos órgãos estaduais e não estão consolidadas na base da ANA.
Georreferenciamento variável
Estações mais antigas podem ter coordenadas com precisão limitada.
Dados de qualidade da água
O monitoramento de qualidade da água tem frequência menor (trimestral) e cobertura espacial limitada em comparação com dados de quantidade.
Formato de download
Alguns dados do HidroWeb são disponibilizados em formato proprietário ou CSV com estrutura complexa (múltiplos cabeçalhos), exigindo pré-processamento.
Timeout em consultas grandes
Requisições que retornam muitos dados podem sofrer timeout. Recomenda-se consultar por período ou por estação individual.
Portal ArcGIS Hub
O portal dadosabertos.ana.gov.br utiliza a plataforma ArcGIS Hub, não CKAN. Os endpoints CKAN documentados podem não funcionar. Utilize a interface web do portal ou a API de busca ArcGIS.