Async scraper and OCR tools for FBDS (geo.fbds.org.br) geodata
Project description
# FBDS Map Data Extractor / Extrator de Datas dos Mapas FBDS
English summary: This Python package asynchronously downloads geospatial data from the public FBDS repository (geo.fbds.org.br) and performs OCR on MAPAS images to extract two key metadata fields: ANO_BASE (image/satellite year) and ANO_SIRGAS (datum year). It offers CLI commands for scraping and batch OCR (sequential and multiprocessing) plus easy integration with Airflow for scheduled pipelines.
Resumo em Português: Este pacote Python faz download assíncrono de geodados do repositório público da FBDS (geo.fbds.org.br) e executa OCR em imagens de MAPAS para extrair dois metadados principais: ANO_BASE (ano da imagem/satélite) e ANO_SIRGAS (ano do datum). Inclui comandos de CLI para scraping e OCR em lote (sequencial e multiprocessing) e integração simples com Airflow para execuções agendadas.
Extração de datas (ANO BASE / SIRGAS) a partir dos MAPAS da FBDS
Este pacote Python fornece ferramentas para:
- Download assíncrono de geodados do site geo.fbds.org.br
- OCR (reconhecimento óptico de caracteres) em imagens de mapas para extrair metadados
- Integração com Airflow para execuções periódicas e automatizadas
Dados extraídos por OCR das imagens em MAPAS:
- ANO_BASE – ano da imagem/satélite (ex.:
2012emImagens Rapideye - Ano 2012) - ANO_SIRGAS – ano do datum (ex.:
2000emDatum SIRGAS 2000) - FULL – texto completo reconhecido na área de interesse (limpo para caber bem em CSV)
Os resultados são gravados em arquivos CSV (fbds_mapas_ocr.csv e
fbds_mapas_ocr_mp.csv).
Instalação
Como pacote Python (recomendado para Airflow)
# Instalação direta do repositório
pip install git+https://github.com/CEPAD-IFSP/extrator_fbds.git
# Ou em modo editável para desenvolvimento
git clone https://github.com/CEPAD-IFSP/extrator_fbds.git
cd extrator_fbds
pip install -e .
Dependências do sistema
É necessário ter o Tesseract OCR instalado:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install tesseract-ocr tesseract-ocr-por
# Outras distribuições: consulte a documentação do Tesseract
Uso
1. Linha de comando (CLI)
Após a instalação, três comandos ficam disponíveis:
# Scraper assíncrono
fbds-scraper --help
# OCR sequencial
fbds-ocr --help
# OCR paralelo (multiprocessing)
fbds-ocr-mp --help
2. Uso programático (Python/Airflow)
import asyncio
from pathlib import Path
from extrator_fbds import FBDSAsyncScraper
from extrator_fbds.run_fbds_ocr_batch_mp import run_batch_mp
# Download de dados
async def download_example():
scraper = FBDSAsyncScraper(
download_root=Path("/data/fbds"),
max_concurrency=8,
city_concurrency=3,
)
results = await scraper.download_all(
state_filter=["SP", "MG"],
folder_filter=["MAPAS"],
)
scraper.save_exceptions()
return results
# Executar
results = asyncio.run(download_example())
# OCR batch
run_batch_mp(
download_root=Path("/data/fbds"),
output_csv=Path("/data/results/ocr_output.csv"),
max_workers=4,
)
3. Integração com Airflow
Veja o exemplo completo em examples/airflow_dag_example.py.
Instalação no ambiente Airflow:
# No ambiente Python do Airflow
pip install git+https://github.com/CEPAD-IFSP/extrator_fbds.git
Exemplo simplificado de DAG:
from airflow import DAG
from airflow.operators.python import PythonOperator
from extrator_fbds import FBDSAsyncScraper
from extrator_fbds.run_fbds_ocr_batch_mp import run_batch_mp
import asyncio
def download_task():
scraper = FBDSAsyncScraper(download_root="/data/fbds")
asyncio.run(scraper.download_state("SP", folder_filter=["MAPAS"]))
scraper.save_exceptions()
def ocr_task():
run_batch_mp(download_root="/data/fbds", output_csv="/data/results.csv")
with DAG("fbds_monthly", schedule_interval="@monthly") as dag:
download = PythonOperator(task_id="download", python_callable=download_task)
ocr = PythonOperator(task_id="ocr", python_callable=ocr_task)
download >> ocr
Componentes do pacote
Módulos principais
-
extrator_fbds.fbds_coreFBDSAsyncScraper: classe principal para download assíncrono- Lista estados e cidades diretamente do site
geo.fbds.org.br - Baixa recursivamente arquivos de
APP,HIDROGRAFIA,MAPAS,USO, etc. - Mantém a estrutura de diretórios do site
- Registra exceções em
exceptions.json
- Lista estados e cidades diretamente do site
-
extrator_fbds.fbds_async_scraper- Interface de linha de comando (CLI) para o scraper
- Comando:
fbds-scraper
-
extrator_fbds.fbds_ocrextract_year_and_datum(image_path): função OCR para extrair metadados de uma imagem
-
extrator_fbds.run_fbds_ocr_batchrun_batch(): processamento OCR sequencial- Comando:
fbds-ocr
-
extrator_fbds.run_fbds_ocr_batch_mprun_batch_mp(): processamento OCR paralelo (multiprocessing)- Comando:
fbds-ocr-mp
Parâmetros do scraper CLI
-
--base-url(opcional)- URL raiz do repositório FBDS (padrão:
https://geo.fbds.org.br/)
- URL raiz do repositório FBDS (padrão:
-
--output(opcional)- Pasta onde os arquivos serão salvos (padrão:
downloads)
- Pasta onde os arquivos serão salvos (padrão:
-
--max-concurrency(opcional)- Número máximo de downloads simultâneos por arquivo (padrão:
5) - Valores maiores aceleram o download, mas podem sobrecarregar a conexão/servidor
- Número máximo de downloads simultâneos por arquivo (padrão:
-
--city-concurrency(opcional)- Número de cidades processadas em paralelo (padrão:
1) - Permite processar múltiplas cidades simultaneamente
- Número de cidades processadas em paralelo (padrão:
-
--folders(opcional)- Lista de pastas de topo a baixar para cada cidade
- Exemplo:
--folders APP MAPASbaixa apenas as pastasAPPeMAPAS
-
--exceptions(opcional)- Caminho do arquivo JSON onde o log de exceções será salvo/lido
- Se não informado, usa
downloads/exceptions.json
-
--retry-failures- Em vez de fazer um novo scrape, lê o
exceptions.jsone tenta novamente apenas os downloads/requisições que falharam
- Em vez de fazer um novo scrape, lê o
Comandos de listagem/inspeção:
-
--list-states- Lista os códigos de estados disponíveis
-
--list-cities UF-
Lista as cidades de uma UF, por exemplo:
fbds-scraper --list-cities SP
-
-
--describe-city UF CIDADE- Mostra a estrutura de pastas/arquivos para uma cidade específica
Comandos de download (usar um de cada vez):
-
--download-city UF CIDADE1 [CIDADE2 ...]Exemplo: baixar apenas
APPeMAPASpara duas cidades específicas:fbds-scraper \ --download-city SP SAO_PAULO SANTOS \ --folders APP MAPAS \ --max-concurrency 5
-
--download-state UFExemplo: baixar todas as cidades de
SP, somente pastaMAPAS:fbds-scraper \ --download-state SP \ --folders MAPAS \ --max-concurrency 8 \ --city-concurrency 3
-
--download-allBaixa todos os estados disponíveis. Pode ser combinado com
--statespara filtrar alguns estados.Exemplo: baixar apenas
SPeMG, todas as pastas padrão:fbds-scraper \ --download-all \ --states SP MG \ --max-concurrency 8 \ --city-concurrency 3
Exemplo de uso do --retry-failures após falhas:
fbds-scraper --retry-failures --exceptions downloads/exceptions.json
Exemplos de uso detalhados
Download via CLI
Listar estados disponíveis:
fbds-scraper --list-states
Listar cidades de um estado:
fbds-scraper --list-cities SP
Ver estrutura de uma cidade:
fbds-scraper --describe-city SP SAO_PAULO
Baixar apenas MAPAS para todas as cidades de SP:
fbds-scraper \
--download-state SP \
--folders MAPAS \
--max-concurrency 8 \
--city-concurrency 3
Baixar APP + MAPAS para SP, MG, RJ:
fbds-scraper \
--download-all \
--states SP MG RJ \
--folders APP MAPAS \
--max-concurrency 10 \
--city-concurrency 4
OCR via CLI
Processamento sequencial:
fbds-ocr
# Usa defaults: downloads/ como entrada, fbds_mapas_ocr.csv como saída
Processamento paralelo (recomendado):
fbds-ocr-mp
# Usa defaults: downloads/ como entrada, fbds_mapas_ocr_mp.csv como saída
Com variável de ambiente:
export DOWNLOAD_ROOT=/data/fbds/downloads
fbds-ocr-mp
Detalhes técnicos do OCR
A função extract_year_and_datum(image_path):
- Abre a imagem com Pillow (
PIL.Image) - Recorta a região inferior direita (onde ficam as legendas da FBDS)
- Roda Tesseract via
pytesseractpara extrair o texto - Usa regex para encontrar:
ANOouANO BASEseguido de 4 dígitos (qualquer combinação de maiúsculas/minúsculas)SIRGASseguido de 4 dígitos
- Retorna um dicionário:
{"ano": "2012" | None, "sirgas": "2000" | None, "raw_text": texto_original}
Os scripts run_batch() e run_batch_mp():
- Percorrem a árvore de downloads procurando imagens
.jpg/.jpegemMAPAS:downloads/UF/CIDADE/MAPAS/*.jpg
- Para cada imagem, chamam
extract_year_and_datume gravam uma linha no CSV- Colunas:
ESTADO, CIDADE, ANO_BASE, ANO_SIRGAS, FULL
- Colunas:
- Versão
_mpusaProcessPoolExecutorpara paralelizar
português. Em distribuições baseadas em Debian/Ubuntu, por exemplo:
sudo apt-get update
sudo apt-get install tesseract-ocr tesseract-ocr-por
Em outras distribuições, procure pelos pacotes equivalentes ou instale a partir do site oficial do Tesseract.
Estrutura de diretórios
Após o download, os dados seguem a estrutura:
downloads/
SP/
ADAMANTINA/
MAPAS/
SP_3500105_APP.jpg
SP_3500105_HIDROGRAFIA.jpg
SP_3500105_RGB532.jpg
SP_3500105_USO_DO_SOLO.jpg
...
MG/
...
Ajustando paralelismo/concorrência
Você pode acelerar os downloads ajustando dois parâmetros:
--max-concurrency: número de requisições/arquivos em paralelo (nível por arquivo)--city-concurrency: número de cidades processadas em paralelo (nível por cidade)
Recomendações gerais:
- Comece com valores moderados e aumente aos poucos.
- Se notar muitos timeouts ou instabilidade, reduza um pouco.
- Combine com
--folders MAPASquando o objetivo for apenas o OCR dos mapas (reduz o volume total).
Exemplos para um estado (SP):
-
Mais conservador (máquina/rede modestas):
python scripts/fbds_async_scraper.py \ --download-state SP \ --folders MAPAS \ --max-concurrency 3 \ --city-concurrency 1
-
Intermediário (bom equilíbrio):
python scripts/fbds_async_scraper.py \ --download-state SP \ --folders MAPAS \ --max-concurrency 8 \ --city-concurrency 3
-
Mais agressivo (use com cautela):
python scripts/fbds_async_scraper.py \ --download-state SP \ --max-concurrency 12 \ --city-concurrency 6
Exemplos para Brasil (todos os estados ou um conjunto grande):
-
Intermediário, filtrando alguns estados:
python scripts/fbds_async_scraper.py \ --download-all \ --states SP MG RJ ES \ --folders MAPAS \ --max-concurrency 8 \ --city-concurrency 3
-
Todos os estados, foco completo (sem filtrar pastas):
python scripts/fbds_async_scraper.py \ --download-all \ --max-concurrency 10 \ --city-concurrency 4
Se a execução for interrompida ou ocorrerem falhas pontuais (timeouts etc.), é possível retomar apenas o que falhou usando o log de exceções:
python scripts/fbds_async_scraper.py --retry-failures --exceptions downloads/exceptions.json
2. Versão sequencial (single process) do OCR
Roda em um único processo; é mais simples de depurar e mais leve em termos de uso de CPU.
Comando:
python scripts/run_fbds_ocr_batch.py
- Pasta padrão de entrada:
downloads/no diretório do repositório. - Saída:
fbds_mapas_ocr.csvna raiz do repositório.
Durante a execução, o script imprime algo como:
Scanning MAPAS JPEGs under: /caminho/para/downloadsProcessed 50 images so far...Done. Wrote 1234 rows to /caminho/para/fbds_mapas_ocr.csv
3. Versão multiprocessada (usa todos os cores)
Roda várias instâncias do Tesseract em paralelo, usando até os.cpu_count()
processos. Ideal quando há muitas imagens e você quer reduzir o tempo total.
Comando:
python scripts/run_fbds_ocr_batch_mp.py
Formato de saída (CSV)
Os scripts de OCR escrevem CSVs com as colunas:
ESTADO– código da UF (ex.:SP,MG)CIDADE– nome da cidade (como aparece na estrutura de diretórios)ANO_BASE– ano extraído da legenda (ANOouANO BASEseguido de 4 dígitos)ANO_SIRGAS– ano do datum extraído deSIRGAS XXXXFULL– texto completo da legenda usado para o OCR, mas normalizado:- quebras de linha substituídas por espaços
- múltiplos espaços colapsados em um só
- vírgulas removidas
- aspas duplas (
") trocadas por aspas simples (')
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file extrator_fbds-0.1.0.tar.gz.
File metadata
- Download URL: extrator_fbds-0.1.0.tar.gz
- Upload date:
- Size: 23.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea98c9b75ec39b1cc3f0f1912d900594c0e9410712fa92dc971c2f971449b90a
|
|
| MD5 |
14214517affaa390070b4823783c75ff
|
|
| BLAKE2b-256 |
14fa263b2cc6071283df507ee0451eae09ace3e4315934348092a40ade91f556
|
File details
Details for the file extrator_fbds-0.1.0-py3-none-any.whl.
File metadata
- Download URL: extrator_fbds-0.1.0-py3-none-any.whl
- Upload date:
- Size: 20.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d0380624b749a3408377e1a431efb68c447cbe79e5da776fff2a880c66cacef8
|
|
| MD5 |
bbe10b62a17dac4f012fa4d270f7cdcb
|
|
| BLAKE2b-256 |
deae7cd89f72089fb3cb1b0124a3760822a5e10e30c8d8819d050731afb1e005
|