Monitoramento de frota de ônibus

code
monitoramento dos ônibus
Author

Anielly Miranda

Published

November 20, 2025

Mapeando a mobilidade urbana! Nesta atividade, construí um mapa interativo com as paradas de uma linha de ônibus e a posição em tempo real dos veículos.

import requests
import folium
import os
from dotenv import load_dotenv

load_dotenv()
TOKEN = os.getenv("TOKEN_SPTRANS")
URL_BASE = "https://api.olhovivo.sptrans.com.br/v2.1"

if not TOKEN:
    raise ValueError("❌ Token SPTrans não encontrado.")

# Cria uma sessão persistente
sess = requests.Session()

# 1️⃣ Autenticação
login_url = f"{URL_BASE}/Login/Autenticar?token={TOKEN}"
auth = sess.post(login_url)
if auth.status_code != 200 or auth.json() is not True:
    raise Exception(f"❌ Falha na autenticação ({auth.status_code}): {auth.text}")
print("✅ Autenticação bem-sucedida!")

# 2️⃣ Buscar a linha
numero_linha = "875A-10"
busca_linha_url = f"{URL_BASE}/Linha/Buscar?termosBusca={numero_linha}"
resp_linha = sess.get(busca_linha_url)
if resp_linha.status_code != 200 or not resp_linha.json():
    raise Exception(f"❌ Linha não encontrada. Status: {resp_linha.status_code}")

linha = resp_linha.json()[0]
codigo_linha = linha["cl"]
nome_linha = f"{linha['lt']} - {linha['tp']}"
print(f"🚍 Linha encontrada: {nome_linha} (Código {codigo_linha})")

# 3️⃣ Buscar paradas
paradas_url = f"{URL_BASE}/Parada/BuscarParadasPorLinha?codigoLinha={codigo_linha}"
resp_paradas = sess.get(paradas_url)
paradas = resp_paradas.json()

print(f"📍 {len(paradas)} paradas encontradas.")
lats = [p["py"] for p in paradas]
lons = [p["px"] for p in paradas]
centro = (sum(lats)/len(lats), sum(lons)/len(lons))
mapa = folium.Map(location=centro, zoom_start=12)

for p in paradas:
    folium.Marker(
        location=(p["py"], p["px"]),
        popup=p["np"],
        icon=folium.Icon(color="blue")
    ).add_to(mapa)

# 4️⃣ Posições em tempo real
posicao_url = f"{URL_BASE}/Posicao/Linha?codigoLinha={codigo_linha}"
resp_posicao = sess.get(posicao_url)
dados = resp_posicao.json()
veiculos = dados.get("vs", [])
print(f"🚦 {len(veiculos)} veículos em tempo real.")

for v in veiculos:
    folium.Marker(
        location=(v["py"], v["px"]),
        popup=f"Veículo: {v['p']}",
        icon=folium.Icon(color="red")
    ).add_to(mapa)

mapa.save("mapa_875A10.html")
print("🗺️ Mapa salvo como mapa_875A10.html")
✅ Autenticação bem-sucedida!
🚍 Linha encontrada: 875A - PERDIZES (Código 609)
📍 7 paradas encontradas.
🚦 0 veículos em tempo real.
🗺️ Mapa salvo como mapa_875A10.html