API REST em Express/TypeScript para servir tiles de arquivos GeoTIFF com visualizações RGB e índice VARI.
Resumo rápido
- Build (TypeScript) -> gera o código JS em
dist/. - O servidor em
dist/server.jsé o artefato que executamos em produção. Rodamos o JS compilado porque evita a sobrecarga de compilar TS em tempo de execução, é mais rápido para iniciar e é o padrão para deploys.
Setup (uma vez)
# cria venv Python e instala dependências Python + Node
npm run setup
# (opcional) ative a venv no seu shell se for executar comandos Python interativamente
source .venv/bin/activateConfiguração
Copie .env.example para .env e ajuste as variáveis conforme seu ambiente:
PORT- porta para o servidor NodePYTHON_BIN- caminho para o Python na venv (ex:.venv/bin/python)TILE_SCRIPT- caminho para o script Python gerador de tiles (ex:python/tile.py)RASTER_PATH- caminho para o GeoTIFF a ser usadoHOST,DEFAULT_COUNT,ZOOM,TILE_X,TILE_Y,LOGS_DIR
Build
npm run buildStart (apenas servidor)
Existe um script útil que ativa a venv e inicia apenas o servidor Node (útil se já tiver dependências Python instaladas na venv):
npm run run:serverDetalhes sobre dist/server.js vs TypeScript direto
src/server.tsé o código fonte TypeScript. Para rodar em desenvolvimento usamos ferramentas comots-node-dev.- Para produção preferimos compilar para JavaScript (
npm run build) e executarnode dist/server.jsporque:- Remove a necessidade de compilar em tempo de execução.
- Minimiza tempo de startup.
- Evita dependências de runtime adicionais (ex.: ts-node).
Testes de performance
O projeto inclui scripts para medir latência de /tile e /vari. Os resultados são gravados em logs/.
# testar apenas tile
npm run perf:tile
# testar apenas vari
npm run perf:vari
# testar ambos (gera perf_tile_..., perf_vari_... e perf_combined_...)
npm run perf:bothTeste rápido via shell
bash scripts/test.shLogs
Os arquivos JSON de saída ficam em logs/ com nomes como perf_tile_YYYYMMDDTHHMMSSZ.json.
Endpoints principais
- GET /tile/:z/:x/:y -> tile RGB/RGBA
- GET /vari/:z/:x/:y -> tile VARI (mapa de calor)
Exemplo (curl):
curl http://localhost:3001/tile/18/95249/146380 -o tile.png