Alexandre Chainho · Arquitectura GIS e automação operacional
Problemas reais transformados em sistemas que funcionam.
Um portefólio unificado de plataformas operacionais, cartografia de incêndio, automação, produtos digitais, jogos e IA — da recolha de dados no terreno à decisão, ao relatório e à notificação.
Transformo estrangulamentos operacionais em tecnologia funcional, do terreno ao centro de decisão.
Marcos do trabalho técnico
Estatística e georreferenciação operacionalRelatórios Excel com coordenadas, consolidação em VBA e criação de KML: os primeiros dados georreferenciados do GIPS.
Fiscalização preventiva de terrenosProjecto-piloto em Porto de Mós e Alcanena para prevenção de incêndios rurais.
Operação Floresta SeguraConcepção, desenvolvimento e manutenção de plataformas de prevenção à escala nacional.
Rasters e vectores à escala nacional: mosaicos de 10 m para Portugal Continental, reprojecção, recorte por grelha de sectores, álgebra de mapas. rasterio · geopandas · GDAL · shapely · pyproj
Modelação de risco
Índices FWI/CFFDRS, equações de Rothermel, scores compostos com pesos justificados, classificação supervisionada. numpy · scipy · scikit-learn · XGBoost
Integração de sistemas
APIs REST autenticadas, publicação em ArcGIS Online, ETL para MySQL, tolerância a falhas de rede e paginação de milhares de registos. requests · SQLAlchemy · arcpy · ArcGIS REST
Automação em produção
Jobs agendados de 10 minutos a semanais, com locks, retomas, auditoria e notificação de falhas ao operador. Task Scheduler · Docker · logging estruturado
Interfaces
Dashboards em tempo real, aplicação móvel, ferramentas de escritório em Tkinter para quem não usa terminal. Next.js 14 · React · Flutter/Dart · Tkinter · Plotly
IA aplicada
RAG local sobre documentação interna, geração de relatórios com modelo servido na própria máquina, sem dependência de nuvem. LangChain · ChromaDB · Ollama · llama.cpp
61 projectos
Nenhum projecto corresponde ao filtro.
Modelação de risco de incêndio
6 projectos
Onde é provável arder, com que intensidade, e quanto tempo falta até ao próximo ciclo. Cada modelo produz cartografia que alimenta directamente as decisões de patrulhamento.
Período
Mai 2026
Commits
7
Python
2 237 L
Estado
Concluído
Carta de Retorno de Incêndios
Mapa de risco de reincêndio para Portugal Continental, calculado pixel a pixel a partir de 50 anos de perímetros ardidos.
Problema
O histórico de áreas ardidas existe desde 1975, mas em forma de milhares de polígonos anuais — não responde à pergunta operacional «este sítio está em risco de voltar a arder?».
Abordagem
Rasterização de todo o histórico e cálculo de um score 0–100 com três componentes ponderadas: tempo desde o último fogo normalizado pelo tipo de vegetação (50 %), frequência de ocorrência desde 1975 (25 %) e atraso face ao ciclo de fogo típico daquela vegetação (25 %).
Resultado
Raster nacional a 10 m com seis classes de risco, reutilizado como camada de entrada por outros projectos de classificação de risco diário.
Python
geopandas
rasterio
numpy
matplotlib
python-pptx
Período
Jun – Jul 2026
Commits
62
Python
7 653 L
Estado
Activo
PoF Portugal — Probabilidade de Incêndio
Modelo de aprendizagem automática que estima a probabilidade de ignição por pixel, inspirado no AI Probability of Fire do ECMWF e adaptado a dados nacionais.
Problema
Os índices meteorológicos clássicos descrevem condições favoráveis ao fogo, mas não incorporam combustível, topografia, presença humana nem a idade da vegetação — variáveis que decidem se uma ignição chega a acontecer.
Abordagem
Pipeline que descarrega reanálise ERA5-Land, calcula os índices do sistema FWI canadiano e cruza-os com combustível, declive, proximidade a estradas e povoações e anos desde o último fogo; treino com gradient boosting sobre o histórico de ignições.
Resultado
Raster diário de probabilidade 0–1 para Portugal Continental, com armazenamento intermédio em Parquet e persistência dos resultados em base de dados.
XGBoost
scikit-learn
xarray
netCDF4
cdsapi (ERA5-Land)
rasterio
pyarrow
MySQL
Período
Jan – Fev 2026
Commits
8
Python
5 608 L
Estado
Cancelado
Fire Simulator Portugal
Sistema de modelação da propagação de incêndios florestais assente nas equações de Rothermel (1972).
Projecto interrompido antes da entrada em produção.
Problema
Os simuladores de referência exigem um conjunto de rasters rigorosamente alinhados (combustível, copa, declive, exposição) e uma grelha meteorológica coerente — preparação manual que demora mais do que a própria simulação.
Abordagem
Camada de preparação automática: cálculo de declive e exposição por blocos para rasters grandes, realinhamento e correcção de coberto de copa, construção de grelhas meteorológicas e clientes próprios para duas fontes de previsão com fallback entre elas.
Resultado
Cenários de simulação gerados a partir de uma data e de uma área, com os modelos de combustível definidos em ficheiro de configuração em vez de codificados.
Python
rasterio
numpy
Rothermel
API IPMA
Open-Meteo
Período
Fev – Jun 2026
Commits
20
Python
11 475 L
Estado
Cancelado
Pipeline de Modelos de Combustível (LiDAR)
Geração automática de cartografia de modelos de combustível NFFL e altura de copa a partir do LiDAR nacional, cobrindo 1 013 polígonos.
Problema
A cartografia de combustível disponível é grosseira e desactualizada; o LiDAR nacional tem a resolução necessária mas é distribuído em mais de mil blocos independentes, impossíveis de tratar à mão.
Abordagem
Pipeline por polígono que deriva altura de vegetação e coberto de copa do LiDAR e classifica cada pixel num dos 13 modelos NFFL, seguido de mosaicagem para uma cobertura nacional contínua.
Resultado
Três rasters a 10 m por polígono (modelo de combustível, altura, coberto) mais o mosaico nacional — a camada de entrada usada pelos simuladores de propagação.
Python
LiDAR
rasterio
GDAL
numpy
NFFL
Período
Ago 2025 – Ago 2026
Commits
24
Python
7 152 L
Estado
Produção · semanal
CAPVI — Actualização de Prioridades de Vigilância
Workflow semanal que converte a cartografia de prioridade de vigilância em mapas, relatórios e camadas publicadas, com envio automático por email.
Problema
A actualização semanal envolvia dezenas de passos manuais em SIG, repetidos por pessoas diferentes em duas fases da semana — lento e sujeito a divergências entre operadores.
Abordagem
Menu único que fixa utilizador e fase, e a partir daí faz tudo: junção dos shapefiles finais, relatório de texto com os dez concelhos prioritários por dia, mapas coropléticos em PNG, actualização das camadas online e preparação do email.
Resultado
Ciclo semanal reduzido a duas execuções guiadas, com resultado idêntico independentemente de quem corre o processo.
Python
geopandas
matplotlib
ArcGIS Online
pywin32
Tkinter
Período
Mar 2026
Commits
1
Python
3 979 L
Estado
Em desenvolvimento
Sistema de Risco Unificado (Planeamento de Inverno)
Modelo de risco de duplo domínio — hidrológico e incêndio — para planeamento de patrulhamento ao longo do ano inteiro.
Problema
O esforço de patrulhamento era planeado só para a época de incêndios, deixando o semestre húmido sem critério objectivo, apesar de o risco existir noutra forma — cheias e episódios hidrológicos.
Abordagem
Modelo v5.0 que mantém os dois domínios de risco em paralelo, aplica pesos sazonais a cada um e dispara gatilhos automáticos quando um limiar é ultrapassado.
Resultado
Critério único de prioridade válido nos doze meses, alimentado pelo repositório meteorológico próprio.
Python
geopandas
numpy
MySQL
Meteorologia e satélite
6 projectos
Aquisição contínua de dados de observação e previsão, de APIs públicas a produtos de satélite geoestacionário, guardados em formato próprio para não depender da disponibilidade da fonte.
Período
Fev – Jun 2026
Commits
2
Python
3 358 L
Estado
Produção · horário
MeteoDataHub
Repositório central de dados meteorológicos horários para Portugal Continental, servido a todos os outros projectos.
Problema
Cada projecto chamava as APIs meteorológicas por sua conta: pedidos repetidos, limites de utilização atingidos e valores diferentes para a mesma hora conforme o momento da consulta.
Abordagem
Grelha fixa de cerca de 300 pontos a 12 km, recolha automática de arquivo e previsão para MySQL, com camada de API interna para consumo pelos restantes sistemas.
Resultado
Fonte única de verdade meteorológica, com histórico próprio e independente da janela de retenção da API externa.
Python
MySQL
Open-Meteo
pandas
geopandas
Task Scheduler
Período
Out 2025
Commits
3
Python
6 336 L
Estado
Concluído
Fire Weather Data Collector
Aplicação de recolha meteorológica para análise de incêndios, com cálculo completo dos índices CFFDRS calibrados para Portugal.
Problema
Os índices de perigo de incêndio dependem de valores acumulados dos dias anteriores: uma leitura pontual dá um número errado, e nenhuma fonte isolada é fiável o suficiente para um serviço operacional.
Abordagem
Integração de cinco fontes meteorológicas com fallback automático entre elas, mais 90 dias de preenchimento histórico para que os valores de arrasto (FFMC, DMC, DC) entrem calibrados, com ajustes sazonais para clima mediterrânico.
Resultado
Mais de 25 parâmetros por localização, de −12 h a +24 h, exportados em CSV com metadados; interface gráfica para uso por não-programadores.
Python
CFFDRS / FWI
asyncio · aiohttp
ECMWF EarthKit
Tkinter
scipy
Período
Jul 2026
Commits
7
Python
1 137 L
Estado
Produção · 10 min
MTG FRP — Focos activos por satélite
Recolha em tempo real de hotspots de potência radiativa de fogo do Meteosat de terceira geração, recortados para Portugal.
Problema
O produto oficial cobre todo o disco visível do satélite e é publicado comprimido a cada dez minutos — descarregar e guardar tudo para usar uma fracção mínima é insustentável em disco e em tempo.
Abordagem
Descompressão do fluxo em memória e filtragem espacial imediata pela caixa envolvente de Portugal Continental mais 50 km, descartando o resto antes de tocar no disco.
Resultado
GeoJSON e CSV actualizados de dez em dez minutos, prontos a consumir por SIG e por plataformas de imagem operacional comum.
Python
GeoJSON
requests
geopandas
SQLAlchemy
MySQL
Período
Jun 2026
Commits
3
Formato
10 estudos
Estado
Concluído
LSA SAF — Catálogo de aplicações operacionais
Estudo sistemático dos produtos de satélite disponíveis e da aplicação concreta de cada um ao trabalho de protecção civil.
Problema
O catálogo de produtos de satélite é vasto e descrito em linguagem científica; sem tradução para casos de uso, fica por explorar.
Abordagem
Dez fichas, uma por produto — risco diário, focos activos, área ardida, condição da vegetação (VCI), condição térmica (TCI), saúde da vegetação (VHI), carta de retorno dinâmica, risco composto para patrulhamento, neve e cheia — cada uma com fonte, cadência, limitações e decisão que suporta.
Resultado
Especificação de origem para os projectos de aquisição que se seguiram, incluindo o recolector de focos activos.
Análise de requisitos
LSA SAF
Detecção remota
Período
Jan 2026
Commits
1
Python
1 115 L
Estado
Concluído
Wind Mapper
Ferramenta de campo de vento sobre uma área desenhada pelo utilizador, com visualização por setas sobre satélite e relevo.
Problema
Analisar o vento numa área de operação exigia consultar valores ponto a ponto, sem noção do padrão espacial que explica o comportamento do fogo no terreno.
Abordagem
Definição da área por coordenadas, shapefile ou mapa interactivo; geração de uma malha regular de resolução configurável; consulta de velocidade e direcção históricas para cada nó.
Resultado
Campo vectorial desenhado sobre imagem de satélite e modelo digital de elevação, exportável para análise posterior.
Python
cartopy
tkintermapview
rasterio
Open-Meteo
Período
Out 2025
Commits
1
Python
3 L
Estado
Arquivado
Meteorologia
Esboço inicial de recolha meteorológica, abandonado a favor de uma solução centralizada.
Problema
Primeira tentativa de resolver a aquisição meteorológica ponto a ponto, dentro de um projecto consumidor.
Abordagem
Registado aqui por honestidade de inventário: a direcção foi descartada cedo, ao perceber-se que o problema pedia um serviço partilhado e não uma função local.
Resultado
Substituído pelo MeteoDataHub, que serve hoje todos os projectos.
Python
Automação SIG e ArcGIS
13 projectos
Trabalho de plataforma: sincronizar, publicar, exportar e auditar camadas geográficas por API REST, sem depender da aplicação de escritório nem da presença de um operador.
Período
Ago 2026
Commits
8
Python
6 934 L
Estado
Produção
ArcGIS Reports
Geração massiva e paralela de relatórios de ocorrências em PDF a partir de camadas online.
Problema
Produzir centenas de relatórios de ocorrência à mão, um por um, na aplicação de escritório — dias de trabalho, e qualquer falha de rede obrigava a recomeçar.
Abordagem
Descarga e processamento paralelizados com a biblioteca nativa do ArcGIS, usando os modelos de impressão oficiais como templates, com gestão explícita de falhas de rede e retoma do que ficou por fazer.
Resultado
Centenas de PDF produzidos numa execução, com layout idêntico ao aprovado institucionalmente.
Python
arcpy
ArcGIS Pro
processamento paralelo
Pillow
tqdm
Período
Jun 2026
Commits
2
Python
1 021 L
Estado
Produção
Áreas Ardidas ICNF
Sincronização das camadas oficiais de áreas ardidas e pontos de início para cópia local e para camadas próprias online.
Problema
A camada oficial é a referência, mas está fora do controlo de quem a consome: indisponibilidades e alterações de esquema partem tudo o que dependa dela em tempo real.
Abordagem
Consulta REST paginada em GeoJSON, escrita de cópia offline em GeoPackage e actualização incremental das camadas próprias por operação de inserção-ou-actualização, com registo das camadas de origem centralizado num único módulo.
Resultado
Dados sempre disponíveis localmente e camadas próprias sincronizadas, com testes automáticos sobre o processo.
Python
ArcGIS REST
GeoPackage
pyogrio
pytest
Período
Mar 2026
Commits
5
Python
1 723 L
Estado
Produção · diário
Registo de Tracks de Patrulhas
Auditoria automática que verifica se as patrulhas activaram a localização durante o serviço.
Problema
Sem localização activa não há rasto do patrulhamento, mas confirmar patrulha a patrulha, dia a dia, era inviável — e por isso não se fazia.
Abordagem
Motor de correspondência que relaciona cada patrulha com o respectivo trajecto pelo indicativo rádio e unidade, com paginação robusta para milhares de registos e detecção automática dos dias em falta no histórico, reprocessando apenas esses.
Resultado
Precisão de correspondência de cerca de 95 % e painéis HTML interactivos diário, mensal e anual.
Python
plotly
ArcGIS Online
pandas
Período
Ago 2026
Commits
9
Python
1 832 L
Estado
Concluído
Ortos DGT
Descarregamento automático de ortofotomapas nacionais organizados pela grelha de sectores cartográficos.
Problema
Cada colecção anual de ortofotos é publicada num tipo de serviço diferente — o que obrigava a um procedimento manual distinto por ano e tornava impossível uma recolha uniforme de séries temporais.
Abordagem
Arquitectura híbrida com um orquestrador que detecta o tipo de serviço de cada colecção e escolhe o motor de aquisição adequado, mantendo a mesma interface de saída para a colecção corrente e para os anos históricos.
Resultado
Aquisição uniforme por sector para qualquer ano publicado, sem intervenção manual.
Python
requests
GDAL
WMS/WMTS
shapefile de sectores
Período
Mai 2026
Commits
1
Python
332 L
Estado
Produção · 01h00
RCM / PIR — Risco de Combustibilidade Municipal
Publicação diária do risco municipal para os 68 concelhos abrangidos por áreas integradas de gestão da paisagem.
Problema
A fonte disponibilizava o risco por serviço de imagem temporal instável e sem controlo fiável da dimensão temporal — inutilizável para gerar o produto do dia e o do dia seguinte.
Abordagem
Consumo directo da API de dados em vez do serviço de imagem, junção à cartografia administrativa e publicação automática, com dois ficheiros distintos para dia corrente e dia seguinte.
Resultado
Produto diário fiável às 01h00, com histórico controlado por quem o publica.
Python
API IPMA
geopandas
GeoPackage
ArcGIS Online
Período
Fev 2026
Commits
3
Python
696 L
Estado
Produção · 2–4 h
Portugal Road Closures
Recolha e publicação automática de estradas cortadas e condicionadas em Portugal Continental.
Problema
Em episódios de cheia ou incêndio, saber que estradas estão cortadas é decisivo para o encaminhamento de meios — e a informação estava dispersa por avisos de texto.
Abordagem
Consulta periódica à API de incidentes de tráfego, contornando o limite de área por pedido com uma grelha de 18 células que cobre todo o continente, e consolidação dos incidentes relevantes numa camada única.
Resultado
Camada geográfica actualizada de duas em duas a quatro horas, pronta a sobrepor à cartografia operacional.
Python
TomTom Traffic API
ArcGIS Online
requests
Período
Ago 2026
Commits
1
Python
746 L
Estado
Activo
Auditar Sinalizações
Auditoria contínua de uma camada de fiscalização, com recuperação automática de registos apagados indevidamente.
Problema
Registos operacionais desapareciam da camada partilhada sem rasto de quem ou porquê, comprometendo metas anuais de actividade que dependem da contagem.
Abordagem
Verificação periódica do universo esperado de registos contra o que está publicado, com reposição automática dos que faltam a partir da cópia de referência.
Resultado
Integridade garantida do conjunto de registos do ano, sem vigilância manual.
Python
ArcGIS REST
auditoria de dados
Período
Mai 2026
Commits
3
Python
425 L
Estado
Concluído
RPA Export
Exportação de uma camada operacional para seis formatos geográficos a partir da API REST.
Problema
Cada destinatário pedia o mesmo conjunto de dados num formato diferente — GPS de campo, SIG de escritório, visualizador de terreno — e a conversão era feita à mão, uma de cada vez.
Abordagem
Exportador único que autentica no portal, lê a camada por API e escreve GeoJSON, JSON, GeoPackage, shapefile, KMZ e GPX, com credenciais fora do código, em ficheiro de ambiente.
Resultado
Um comando responde a todos os pedidos de formato, sem passar pelo software de escritório.
Python
simplekml
gpxpy
fiona
python-dotenv
Período
Mai 2026
Commits
4
Python
595 L
Estado
Concluído
Tools ArcGIS
Conjunto de utilitários de gestão de camadas por API REST, sem licença de escritório nem bibliotecas proprietárias.
Problema
Operações correntes de manutenção de dados exigiam abrir a aplicação de escritório numa máquina licenciada — inviável em servidor e em tarefas agendadas.
Abordagem
Um script por tarefa (remoção selectiva, exportação, actualização de campos calculados), cada um autónomo e dependente apenas de bibliotecas livres.
Resultado
Manutenção de dados executável em qualquer máquina, incluindo agendada sem sessão interactiva.
Python
ArcGIS REST
geopandas
openpyxl
Período
Ago 2026
Commits
2
Python
450 L
Estado
Concluído
pat_igini — Patrulhas × Ignições
Exportação de dados operacionais para GeoPackage, prontos a abrir em SIG livre.
Projecto interrompido antes da entrada em produção.
Problema
Cruzar a actividade de patrulhamento com as ignições registadas exigia extrair dados da base a cada análise, sempre com consultas ligeiramente diferentes.
Abordagem
Três scripts independentes que lêem a base operacional, filtram por período e escrevem camadas de pontos num sistema de coordenadas único — patrulhas, ignições e o cruzamento das duas.
Resultado
Análise reprodutível: mesmo período, mesmo resultado, sem SQL ad-hoc.
Python
MySQL
GeoPackage
QGIS
Período
Set 2025
Commits
1
Python
4 465 L
Estado
Cancelado
Aglomerados
Aplicação de escritório que produz cadernos cartográficos de aglomerados populacionais em PDF.
Problema
A caracterização de um aglomerado para efeitos de protecção exigia montar à mão vários layouts — área edificada, interface urbano-florestal, lugares — e depois juntá-los num documento.
Abordagem
Interface gráfica sobre um conjunto de geradores de layout reutilizáveis, com escala gráfica, exportação do layout principal e das quadrículas de detalhe, e junção final num PDF único.
Resultado
Caderno cartográfico completo por aglomerado, gerado a partir da selecção de uma pasta e de um nome.
Python
Tkinter
matplotlib
geopandas
PDF
Período
Fev – Abr 2026
Commits
11
Python
48 286 L
Estado
Activo
Workspace de automação (Python)
Repositório de trabalho com a colecção de scripts de automação diária, organizados por entidade e por tema.
Problema
Dezenas de rotinas pequenas — extracções, verificações, conversões — que não justificam repositório próprio mas precisam de estar versionadas e localizáveis.
Abordagem
Organização por origem dos dados e por tema (ocorrências, planos municipais, susceptibilidade, consultas SQL, dados de efectivos), com dependências declaradas num só ficheiro para todo o conjunto.
Resultado
Base a partir da qual várias rotinas amadureceram e saíram para repositório próprio — é aqui que os projectos começam.
Python
geopandas
OWSLib
reportlab
opencv
SQL
Período
Fev – Jul 2026
Commits
8
Python
37 238 L
Estado
Activo
Workspace ArcPy (Conda)
Colecção paralela de rotinas que dependem da biblioteca proprietária do ArcGIS, isolada no seu próprio ambiente.
Problema
A biblioteca nativa do ArcGIS obriga a um interpretador próprio e conflitua com o ambiente geoespacial livre — misturar as duas famílias de scripts partia ambas.
Abordagem
Separação deliberada por ambiente, com levantamento documentado das 26 dependências externas em 72 ficheiros e instruções de instalação reproduzíveis.
Resultado
Dois ambientes estáveis em vez de um instável, e a fronteira entre eles explícita na estrutura do repositório.
Python
arcpy
Conda
ruff
Sistemas operacionais e relatórios
8 projectos
Aplicações de ponta a ponta usadas por operadores: entra um número de ocorrência, sai o dossier completo. É aqui que o volume de código está.
Período
Set 2025 – Jul 2026
Commits
475
Python
52 032 L
Estado
Produção
Activação GTO — Análise do Teatro de Operações
Sistema de análise geoespacial que transforma o registo de uma ocorrência num dossier territorial completo em 5 a 10 minutos. O projecto maior do conjunto.
Problema
Quando uma equipa é activada para um teatro de operações, a informação de que precisa — cartografia, meteorologia, combustível, acessos — existe, mas dispersa por dezenas de sistemas. Reuni-la à mão demora horas que a ocorrência não dá.
Abordagem
Pipeline único que parte do número da ocorrência, resolve a localização, recolhe meteorologia histórica e de previsão, calcula susceptibilidade, prepara os ficheiros de entrada dos simuladores de propagação e compõe a cartografia; o relatório final é redigido por um modelo de linguagem servido localmente. O relógio do processo é congelado num ponto explícito para que todos os módulos usem o mesmo instante — antes, uma execução de 11 minutos aparecia espalhada por horas diferentes.
Resultado
Mais de 39 mapas temáticos, análise meteorológica, mapas de susceptibilidade, dados prontos para simulador e relatório com análise automática — tudo no tempo de uma deslocação.
Python 3.13
geopandas
rasterio
scikit-learn
contextily
folium
Open-Meteo
LLM local
Telegram
Período
2025 – 2026
Commits
—
Python
9 628 L
Estado
Produção · v1.2.5
App Buscas
Sistema de automação para processamento de operações de busca e salvamento.
Problema
Numa busca, o produto cartográfico e a reconstituição temporal dos movimentos das equipas são precisos enquanto a operação decorre — não no dia seguinte.
Abordagem
Processamento espacial automatizado sobre os dados da operação, com construção de fitas temporais que ordenam a série de eventos e permitem ver a progressão da busca no tempo.
Resultado
Aplicação em produção, com registo de versões e documentação técnica dos conceitos usados, mantida ao longo de sucessivas operações reais.
Python
arcpy
análise temporal
cartografia automática
Período
Jul 2026
Commits
5
Python
16 301 L
Estado
Produção
Relatórios de Incêndio
Geração de um relatório completo de incêndio florestal a partir de um único número de ocorrência.
Problema
Cada relatório obrigava a consultar seis sistemas diferentes e a copiar valores entre eles à mão, com o erro de transcrição a entrar sempre em alguma etapa.
Abordagem
Vinte e oito etapas encadeadas: o operador introduz o número, o sistema lê a data, recolhe dados meteorológicos de observação e reanálise, cartografia, camadas online e rasters locais, e compõe um livro Excel com imagens e mapas embebidos. A recolha em portais sem API é feita por automação de navegador.
Resultado
Pasta de relatório completa por ocorrência, com origem dos dados rastreável em vez de valores copiados.
Python
playwright
openpyxl
rasterio
contextily
ECMWF
Período
Jan – Jul 2026
Commits
11
Python
2 924 L
Estado
Produção
Guias de Entrega — Detecção de Anomalias
Detecção automática de erros em guias de entrega e notificação individual dos responsáveis.
Problema
Os erros de preenchimento só apareciam na consolidação mensal, quando já era tarde para corrigir, e a notificação em massa dispersava a responsabilidade por quem não tinha nada a corrigir.
Abordagem
Migração de um fluxo assente em folhas de cálculo para leitura directa da base de dados, com agrupamento das anomalias por destinatário, limitação de ritmo no envio para não accionar defesas do servidor de correio, e registo de auditoria de tudo o que foi enviado. O fluxo antigo ficou preservado como alternativa de recurso.
Resultado
Cada responsável recebe apenas as suas anomalias, no próprio dia, com rasto do que foi comunicado a quem.
Python
MySQL
SMTP
pandas
auditoria
Período
Abr – Jul 2026
Commits
21
Python
11 746 L
Estado
Activo
Gestão da Operação Kristin
Conjunto de rotinas de gestão operacional centradas na rede viária florestal e nos relatórios de situação.
Problema
Uma operação prolongada gera relatórios de situação com periodicidade fixa, e a caracterização da rede viária florestal muda à medida que o terreno é percorrido — sem automação, o esforço de reporte come o tempo de operação.
Abordagem
Quatro áreas funcionais: tratamento da rede viária florestal, produção dos relatórios de situação, consolidação dos dados da operação e apoio à decisão diária, com configuração de máquina documentada para se replicar noutro posto.
Resultado
Reporte periódico produzido a partir dos dados já registados, em vez de recolhido de novo a cada ciclo.
Python
pandas
geopandas
SIG
Período
Abr – Jun 2026
Commits
14
Python
3 927 L
Estado
Produção
Verificar Serviço — Qualidade de Dados
Validação sistemática dos dados operacionais contra regras de negócio, com relatório navegável dos erros encontrados.
Problema
Os dados que alimentam todos os relatórios vêm de preenchimento humano; sem verificação sistemática, os erros só se descobrem quando o número final não bate certo.
Abordagem
Motor de regras sobre cinco tabelas da base operacional, capaz de correr também sobre uma cópia local para quem não tem acesso à rede interna, com testes automáticos sobre as próprias regras.
Resultado
Relatório HTML interactivo que aponta o registo concreto a corrigir, em vez de sinalizar apenas a existência de um problema.
Python
MySQL
SQLite
pytest
HTML
Período
Set 2025
Commits
2
Python
1 077 L
Estado
Concluído
Preparação de Dados para Simulador
Automatiza a preparação da pasta de dados de entrada para simulação de propagação numa área de operação.
Projecto interrompido antes da entrada em produção.
Problema
Os simuladores de propagação exigem um conjunto rígido de ficheiros — rasters recortados e alinhados, humidade dos combustíveis, série de vento — cuja preparação manual é morosa e falha silenciosamente por desalinhamento.
Abordagem
Fluxo guiado que cria a estrutura de pastas do projecto, resolve a localização por número de ocorrência ou coordenadas, descarrega os meteogramas, recorta e alinha os rasters, gera ponto e buffer, e escreve os ficheiros de humidade e de vento nos formatos exigidos.
Resultado
Ferramenta portátil: copiar a pasta para outro posto e configurar os caminhos uma única vez pela interface.
Python
GDAL
rasterio
playwright
Tkinter
Período
Mar 2026
Commits
1
Python
583 L
Estado
Cancelado
Cálculo de Transferências
Cálculo automático de colocações a partir da lista de pedidos e das vagas disponíveis, em duas implementações.
Projecto interrompido antes da entrada em produção.
Problema
A afectação era feita à mão sobre folhas de cálculo, com risco de atribuir a mesma vaga duas vezes ou de aplicar critérios de forma inconsistente entre casos.
Abordagem
Duas versões do mesmo algoritmo — uma em Python, outra em macro de folha de cálculo — para funcionar mesmo em postos onde não é possível instalar nada, produzindo um ficheiro final formatado a partir de um modelo.
Resultado
Resultado reproduzível e auditável, e a versão em macro garante que o processo corre em qualquer posto.
Python
pandas
openpyxl
VBA
Bots e notificações
4 projectos
A camada de entrega: levar o resultado ao telemóvel de quem decide, no canal que essa pessoa já usa, sem lhe pedir que aprenda uma ferramenta nova.
Período
Jul – Ago 2026
Commits
12
Python
1 498 L
Estado
Produção
Bot de Apoio à Sala de Situação
Interface de comunicação automática que serve relatórios de síntese executiva num canal de mensagens.
Problema
Quem coordena não está ao computador: pedia por telefone números que já estavam na base de dados, e alguém tinha de os ir buscar e transcrever.
Abordagem
Seis comandos oficiais sobre a base de dados operacional, servidos a conversas e canais autorizados, com o serviço a correr permanentemente na máquina e agendamento nativo do sistema.
Resultado
Em produção: síntese executiva a pedido, no telemóvel, sem intermediário humano.
Python 3.13
python-telegram-bot
MySQL
SQLAlchemy
Windows Service
Período
Jul – Ago 2026
Commits
29
Python
3 400 L
Estado
Activo
Hub de Bots (arquitectura de plugins)
Um único bot partilhado que aloja plugins de vários projectos, em vez de um bot por projecto.
Problema
Cada projecto que quisesse notificar criava o seu próprio bot, duplicando lista de autorizações, tratamento de erros e entrega de ficheiros — e obrigando quem recebe a gerir várias conversas.
Abordagem
Núcleo agnóstico ao domínio que resolve uma vez o que é comum — autorização, bloqueio de execuções concorrentes, execução de tarefas, entrega de resultados, relato de progresso e cancelamento — e expõe uma interface de plugin para cada projecto registar os seus comandos.
Resultado
Novo projecto ganha comandos próprios sem infra-estrutura nova, e quem usa tem uma conversa só.
Python
python-telegram-bot
arquitectura de plugins
Bot API auto-alojada
Período
Fev – Set 2026
Commits
33
Código
3 529 L JS
Estado
Em desenvolvimento
ArcGIS → WhatsApp
Serviço de notificações automáticas por WhatsApp desencadeadas por alterações em camadas geográficas.
Problema
Nem toda a gente no terreno usa a aplicação de mensagens institucional, mas praticamente toda a gente usa WhatsApp — e a informação que interessa nasce numa camada geográfica, não numa conversa.
Abordagem
Serviço em Node.js que vigia camadas online e encaminha os eventos relevantes para uma API de WhatsApp auto-alojada em contentor, com base de dados própria para estado e destinatários.
Resultado
Alertas geográficos entregues no canal que as equipas já têm aberto; projecto mais activo do conjunto neste momento.
Node.js
Docker
PostgreSQL
Evolution API
ArcGIS Online
Período
Mai 2026 (fork)
Commits
805 · 1 ramo
Python
1 739 L
Estado
Activo
Réplica local de dados de incidentes
Ramo próprio de um projecto público de dados de incêndios, dedicado a sincronização local como recurso alternativo.
Problema
Um serviço público de dados de incidentes é excelente até ao dia em que fica indisponível — que costuma ser exactamente o dia em que é mais preciso.
Abordagem
Contribuição num ramo separado do projecto original, com um sincronizador que replica os incidentes activos para base de dados local, mantendo a origem intacta e o histórico do projecto público preservado.
Resultado
Disponibilidade dos dados garantida mesmo com a fonte em baixo. O grosso dos 805 commits é do projecto original — a contribuição própria é o sincronizador.
Python
MySQL
fork open-source
Web e móvel
3 projectos
Interfaces para consumo em tempo real, dentro e fora do posto de comando — o único bloco do portefólio fora de Python.
Período
Mar – Ago 2026
Commits
199
Código
15 733 L TS/JS
Estado
Activo
Dashboard de Gestão de Emergências
Painel operacional em tempo real de meios, missões e ocorrências, com mapa interactivo, fita de tempo e painel multimédia.
Problema
Acompanhar uma operação exigia ter várias aplicações abertas em paralelo, cada uma com a sua parte da verdade e nenhuma com a linha do tempo do que aconteceu.
Abordagem
Aplicação Next.js com renderização no servidor e rotas de API próprias, integrando as camadas geográficas oficiais numa vista única, com autenticação por sessão verificada do lado do servidor e fita de tempo navegável sobre os eventos.
Resultado
Vista única de operação, com 199 commits de iteração continuada sobre utilização real. Segunda geração do projecto.
Next.js 14
React
TypeScript
ArcGIS Online
autenticação por sessão
Período
Dez 2025 – Mar 2026
Commits
32
Código
9 620 L TS/JS
Estado
Substituído
Dashboard de Emergências — 1.ª geração
Primeira versão do painel operacional, que estabeleceu o modelo de dados e a linguagem visual.
Problema
Provar que era possível reunir meios, registos e ocorrências numa vista única antes de investir numa arquitectura definitiva.
Abordagem
Protótipo funcional em Next.js, levado até utilização real para descobrir os requisitos que só aparecem em serviço.
Resultado
Validou o conceito e foi deliberadamente substituído pela segunda geração — a decisão de reescrever está documentada em vez de o protótipo ter sido remendado indefinidamente.
Next.js
React
ArcGIS Online
Período
Dez 2025
Commits
4
Código
3 805 L Dart
Estado
Em desenvolvimento
Aplicação móvel para operações helitransportadas
Aplicação Flutter para registo de operações com helicóptero, pensada para funcionar sem rede.
Problema
O registo destas operações é feito em papel e transcrito depois, porque no local de trabalho não há cobertura de rede que sustente uma aplicação ligada.
Abordagem
Arquitectura local-primeiro com base de dados no dispositivo e gestão de estado reactiva, sincronizando com os serviços geográficos quando há rede; sistema de desenho documentado antes da implementação.
Resultado
Aplicação em desenvolvimento com registo de alterações detalhado e documentação dos padrões usados — repositório e singleton — escrita para aprendizagem própria.
Flutter
Dart
Riverpod
SQLite · Drift
ArcGIS
Drone e LiDAR
3 projectos
Da imagem aérea ao produto com valor legal: fotogrametria automatizada e análise de conformidade da vegetação face à lei.
Período
Fev 2026
Commits
4
Python
1 703 L
Estado
Concluído
Altura de Combustíveis — conformidade legal
Verifica, a partir de voos de drone, se a vegetação junto a infra-estruturas críticas está em infracção às faixas de protecção legais.
Problema
A fiscalização de faixas de gestão de combustível ao longo de estradas, linhas eléctricas e gasodutos é feita a pé, por amostragem, e a prova de infracção depende de medição no local.
Abordagem
Cálculo do modelo de altura de copa pela diferença entre superfície e terreno obtidos do voo, e confronto da altura de cada pixel com o limite legal aplicável à faixa em causa — regimes distintos para rede viária, rede eléctrica e gasodutos.
Resultado
Identificação objectiva das áreas em infracção, com o critério legal explícito no código em vez de dependente do julgamento do operador.
Python
rasterio
numpy
fotogrametria
CHM
Período
Abr 2026
Commits
1
Integração
WebODM
Estado
Activo
Processamento de Drone — WebODM
Instalação local de fotogrametria com automação de ponta a ponta: escolher a pasta, processar, abrir resultados.
Problema
O processamento fotogramétrico em serviço externo implica enviar imagens de operações para fora e esperar por fila; localmente, implica uma sequência de passos manuais na interface.
Abordagem
Plataforma aberta instalada em contentores na máquina, com camada de automação por cima da sua API que submete o voo, acompanha o processamento e recolhe os produtos finais.
Resultado
Ortomosaicos e modelos 3D produzidos localmente, sem envio de dados operacionais para o exterior. Alimenta a análise de conformidade de vegetação.
Docker
WebODM
Python
pyodm
Período
Fev 2026
Commits
1
Python
439 L
Estado
Substituído
Processamento de Drone — 1.ª versão
Primeira abordagem à automação do processamento fotogramétrico, por linha de comandos.
Problema
Perceber que parte do processamento fotogramétrico valia a pena automatizar antes de montar infra-estrutura a sério.
Abordagem
Orquestração directa dos contentores de processamento, com configuração em ficheiro e acompanhamento do progresso em consola.
Resultado
Serviu de estudo prévio; substituída pela versão com interface web dois meses depois.
Python
Docker SDK
PyYAML
IA local e ferramentas de desenvolvimento
3 projectos
Infra-estrutura própria para usar modelos de linguagem sobre documentação e dados internos sem que nada saia da máquina.
Período
Jul – Ago 2026
Commits
6
Código
3 644 L Py · 2 301 L JS
Estado
Em desenvolvimento
RAG local sobre documentação interna
Sistema de pergunta-e-resposta sobre a documentação da secção, com consulta de dados em linguagem natural — a correr inteiramente na máquina.
Problema
A documentação técnica acumulada é extensa e a informação existe, mas encontrá-la exige saber onde procurar. Enviar documentação de serviço para um serviço de nuvem não é opção.
Abordagem
Indexação vectorial de documentos em vários formatos com modelo servido localmente, camada de agente capaz de executar pequenas edições de ficheiros e de traduzir perguntas em consultas SQL, e interface web local.
Resultado
Funciona sem ligação ao exterior; nenhum documento sai da máquina. Em fase de consolidação.
Python
LangChain
ChromaDB
Ollama
PyMuPDF
WebUI local
Período
Ago – Set 2026
Commits
7
Python
3 826 L
Estado
Activo
Servidor LLM local
Servidor de modelos de linguagem compatível com a interface padrão, com gestão gráfica do ciclo de vida.
Problema
Vários projectos precisam de um modelo de linguagem, mas cada um a arrancar o seu servidor competia pela mesma placa gráfica e pela mesma porta — com colisões reais de porta a partir serviços de outros projectos.
Abordagem
Um único servidor partilhado que expõe a interface padrão do sector, com arranque e paragem por interface gráfica e selecção do modelo a carregar; a porta ocupada passou a estar documentada no inventário da máquina.
Resultado
Qualquer projecto aponta para o mesmo ponto de acesso e troca de modelo sem mudar código. Usado pelo gerador de relatórios e pelo sistema de RAG.
Python
llama.cpp
API compatível OpenAI
Tkinter
Período
Fev – Abr 2026
Commits
6
Formato
Configuração
Estado
Activo
Configuração de assistentes de código
Regras, comandos e modelos de projecto versionados, partilhados por três assistentes de programação diferentes.
Problema
Regras de trabalho definidas na cabeça não sobrevivem à mudança de máquina nem à troca de ferramenta, e cada assistente guarda a configuração no seu formato.
Abordagem
Repositório único com as regras globais, os comandos e os modelos de estrutura de projecto, instalados por ligação nos caminhos que cada ferramenta espera — uma fonte, três destinos.
Resultado
Método de trabalho reproduzível em qualquer posto e explícito o suficiente para ser criticado e melhorado, em vez de implícito.
Markdown
ferramentas de IA
automação de ambiente
Plataformas institucionais GNR / UEPS
6 projectos independentes
Sistemas de âmbito operacional descritos no portefólio GNR/UEPS. São apresentados separadamente das fichas técnicas anteriores: partilham dados, processos ou integrações com várias delas, mas cada plataforma constitui um projecto autónomo.
Âmbito
Nacional
Domínio
Prevenção rural
Papel
Arquitectura ponta a ponta
Estado
Uso operacional
Floresta Segura — Plataforma GIS Nacional
Pipeline completo da recolha em campo à distribuição de relatórios para a operação nacional de prevenção de incêndios rurais.
Problema
Equipas no terreno precisam de registar fiscalizações, validar pontos de água e cartografar incêndios com informação administrativa e predial consistente.
Abordagem
Formulários Field Maps e QuickCapture, cálculo automático de freguesia/concelho/distrito, cruzamento com DGT/BUPi, sinalização de possíveis infracções e dashboard em ArcGIS Experience Builder.
Resultado
Monitorização em tempo real, edição controlada e planeamento; um processo Python/ArcGIS Pro cria cópias de segurança e relatórios PDF, Excel e shapefile, distribuídos por SharePoint.
Relação
Relaciona-se com as fichas de automação SIG, relatórios ArcGIS e prevenção rural deste portefólio, mantendo-se aqui como plataforma institucional independente.
ArcGIS Online
Field Maps
QuickCapture
Python
SharePoint
Âmbito
Portugal Continental
Domínio
Operações UEPS
Papel
Arquitectura ponta a ponta
Estado
Uso diário
PIGE — Plataforma de Gestão Operacional em Tempo Real
Quadro operacional diário para acompanhamento de equipas terrestres e helitransportadas e apoio à decisão de comando.
Problema
Actividade, localização, meios multimédia, indicativos e pedidos urgentes estavam dispersos e não formavam uma visão operacional comum.
Abordagem
QuickCapture e Field Maps recolhem movimentos, fotografias, vídeo, GPS e pedidos de recursos; o Experience Builder reúne actividade ao vivo, mapa de 12 horas, planeamento, pedidos e histórico.
Resultado
Uma visão ligada entre equipas de terra e ar, com atraso de 1–2 minutos, cálculo da patrulha mais próxima, filtros temporais e acesso a camadas de risco de incêndio.
Relação
Liga-se às camadas de risco e às fichas de registo de patrulhas já catalogadas; é a plataforma operacional de origem da evolução PIGE Next-Gen.
ArcGIS Experience Builder
QuickCapture
Field Maps
GPS
Multimédia
Âmbito
Operacional
Domínio
Dashboard web
Papel
Full-stack
Estado
Nova geração
PIGE Next-Gen — Dashboard React
Reconstrução independente da vista principal do PIGE para ultrapassar limites de desempenho e interface do construtor low-code.
Problema
Consultas directas ao ArcGIS Online em cada carregamento limitavam a rapidez, o controlo da interface e a reprodução nativa de vídeo recolhido no terreno.
Abordagem
Frontend React apoiado por servidor dedicado que mantém uma cache local actualizada; integração WhatsApp auto-alojada em Docker com Evolution API.
Resultado
Carregamentos mais rápidos, interacção mais fluida, vídeo reproduzido na própria página e encaminhamento automático de dados QuickCapture para grupos operacionais.
Relação
Evolui a experiência do PIGE e cruza-se com a automação WhatsApp já documentada, mas é tratado como projecto próprio pela nova arquitectura.
React
Backend cache
ArcGIS Online
Docker
Evolution API
Âmbito
Multi-entidade
Domínio
Registo de alertas
Papel
Arquitectura ponta a ponta
Estado
Plataforma de entrada
SEPNA — EMEIF · Registo de Alertas
Plataforma de registo de ocorrências rurais e florestais detectadas por quatro tipos de vigilância.
Problema
Alertas de torres e videovigilância, patrulhas de várias entidades, chamadas 112 e meios aéreos têm requisitos diferentes, mas precisam de um registo coerente.
Abordagem
Modelo partilhado e flexível com dashboard por tipo de vigilância, mapa filtrável, listagem integral com exportação CSV, revisão de erros de cálculo e editor geográfico estruturado.
Resultado
Um ponto principal de entrada com dados mais consistentes para monitorização de incêndios e sistemas de apoio ao comando.
Relação
Alimenta o ecossistema de acompanhamento de incêndios, incluindo o DIVDIR; permanece uma plataforma de registo independente.
ArcGIS
Dashboard
Editor geográfico
CSV
Multi-entidade
Âmbito
Comando
Domínio
Incêndio rural
Papel
Arquitectura ponta a ponta
Estado
Apoio à decisão
DIVDIR — Dashboard de Apoio ao Comando
Visão operacional consolidada das ocorrências, meios e sistemas de vigilância ligados aos incêndios rurais e florestais.
Problema
Decisores precisavam de consultar numa só vista ocorrências ANEPC, alertas, actividade helitransportada, planeamento de drones e cobertura de vigilância.
Abordagem
Dashboard com linha temporal, contagens e filtros; módulos de histórico, ligações externas e edição de estado; bot Telegram local para converter relatórios CAPVI/IPMA em camadas publicadas.
Resultado
Uma imagem operacional actualizada, com fotografias e vídeo de campo, planeamento aéreo e automatização da ingestão de relatórios definidos com parâmetros AGIF.
Relação
Recebe dados do EMEIF e relaciona-se com as fichas CAPVI, IPMA, bots e monitorização de incêndios, sem deixar de ser um dashboard independente.
ANEPC
ArcGIS
Telegram
CAPVI / IPMA
AGIF
Período
2026
Domínio
Recuperação pós-tempestade
Papel
Arquitectura ponta a ponta
Estado
Missão operacional
CIPO — Monitorização de Trabalhos de Recuperação
Plataforma construída para a participação da GNR no comando interministerial de recuperação após a tempestade Kristin.
Problema
Era necessário coordenar necessidades municipais, planeamento de várias entidades e validação no terreno da limpeza de caminhos florestais danificados.
Abordagem
Field Maps para validação de trabalhos; sincronização contínua de planeamento em Google Sheets para camadas ArcGIS; processamento diário de dados administrativos.
Resultado
Plataforma pública com planeado versus concluído, geração automática do SITREP, cópia local em Google Drive e republicação para o GeoSiFOR da AGIF.
Relação
Relaciona-se com as fichas sobre Kristin, rede viária, sincronização e relatórios operacionais; é apresentada como missão e plataforma autónoma.
Field Maps
Google Sheets
ArcGIS
SITREP
GeoSiFOR
Produtos digitais e comércio
1 projecto
Produtos orientados ao utilizador final, com operação, dados e experiência de compra integrados.
Primeira plataforma completa Full-Stack & DevOps: loja online Boticário construída do zero até à entrada em produção.
Desafio
Desenvolver um ecossistema completo de comércio eletrónico aliando extrema resiliência a um custo quase nulo de infraestrutura (VPS partilhada e SQLite).
Abordagem
App universal Next.js (React+TS) consumindo SQLite. Pipeline em Python para extrair dados de faturas em PDF. Painel Admin blindado à internet pública através de túnel VPN (WireGuard).
Resultado
Loja otimizada em produção na OVHcloud por trás da Cloudflare (com AEO ativo). Sistema autónomo e imune a perdas via backups cifrados híbridos automatizados com Restic.
Next.js
React
TypeScript
Python
SQLite
Serviços cívicos
1 projecto
Tecnologia para aproximar cidadãos e administração local através de um fluxo único de participação e resposta.