import gradio as gr
import sqlite3
import pandas as pd
from datetime import datetime
import folium
from folium import plugins
import webbrowser
import os
# Configuração do banco de dados
def init_db():
conn = sqlite3.connect('locations.db', check_same_thread=False)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS locations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
device_id TEXT NOT NULL,
device_name TEXT NOT NULL,
latitude REAL NOT NULL,
longitude REAL NOT NULL,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
accuracy REAL,
battery_level INTEGER
)
''')
conn.commit()
conn.close()
init_db()
# Função para adicionar localização
def add_location(device_id, device_name, latitude, longitude, accuracy=10, battery=100):
try:
lat = float(latitude)
lng = float(longitude)
if not (-90 <= lat <= 90) or not (-180 <= lng <= 180):
return "❌ Erro: Coordenadas inválidas!"
conn = sqlite3.connect('locations.db', check_same_thread=False)
cursor = conn.cursor()
cursor.execute('''
INSERT INTO locations (device_id, device_name, latitude, longitude, accuracy, battery_level)
VALUES (?, ?, ?, ?, ?, ?)
''', (device_id, device_name, lat, lng, accuracy, battery))
conn.commit()
conn.close()
return f"✅ Localização atualizada!\n📍 {lat:.6f}, {lng:.6f}\n⏰ {datetime.now().strftime('%H:%M:%S')}"
except Exception as e:
return f"❌ Erro: {str(e)}"
# Função para criar página HTML de captura automática
def create_auto_gps_page(device_id, device_name):
html_content = f"""
Compartilhamento de Localização
Compartilhando Localização
Obtendo sua localização...
"""
with open("gps_auto_capture.html", "w") as f:
f.write(html_content)
return os.path.abspath("gps_auto_capture.html")
def start_auto_gps(device_id, device_name):
page_path = create_auto_gps_page(device_id, device_name)
webbrowser.open(f"file://{page_path}")
return "🌍 Captura automática iniciada! Permita o acesso à localização."
# Função para obter mapa atualizado
def get_updated_map():
try:
conn = sqlite3.connect('locations.db', check_same_thread=False)
df = pd.read_sql_query('''
SELECT device_name, latitude, longitude, timestamp, accuracy
FROM locations
ORDER BY timestamp DESC
LIMIT 50
''', conn)
conn.close()
if df.empty:
m = folium.Map(location=[-14.235, -51.9253], zoom_start=4)
folium.Marker([-14.235, -51.9253], popup="Nenhum dado disponível").add_to(m)
return m._repr_html_()
m = folium.Map(location=[df.iloc[0]['latitude'], df.iloc[0]['longitude']], zoom_start=15)
for _, row in df.iterrows():
folium.Marker(
[row['latitude'], row['longitude']],
popup=f"{row['device_name']}
{row['timestamp']}",
icon=folium.Icon(color='blue')
).add_to(m)
plugins.Fullscreen().add_to(m)
return m._repr_html_()
except Exception as e:
return f"Erro: {str(e)}
"
# Interface Gradio simplificada
def create_interface():
with gr.Blocks(title="📍 Monitor GPS Automático") as demo:
gr.Markdown("## 📍 Monitor de Localização em Tempo Real")
with gr.Row():
device_id = gr.Textbox(label="ID do Dispositivo", value="celular_1")
device_name = gr.Textbox(label="Nome do Dispositivo", value="Meu Celular")
auto_gps_btn = gr.Button("📍 Iniciar Captura Automática", variant="primary")
gps_status = gr.Textbox(label="Status", interactive=False)
auto_gps_btn.click(
start_auto_gps,
inputs=[device_id, device_name],
outputs=gps_status
)
with gr.Tab("Mapa"):
map_html = gr.HTML(get_updated_map())
gr.Timer(5.0, get_updated_map, None, map_html)
with gr.Tab("Dados"):
gr.Dataframe(
lambda: pd.read_sql_query(
"SELECT device_name, latitude, longitude, timestamp, accuracy FROM locations ORDER BY timestamp DESC",
sqlite3.connect('locations.db')
),
interactive=False
)
@demo.load(inputs=None, outputs=None)
def handle_gps_data(request: gr.Request):
params = request.query_params
if 'latitude' in params and 'longitude' in params:
add_location(
params.get('device_id', 'unknown'),
params.get('device_name', 'Dispositivo Móvel'),
params['latitude'],
params['longitude'],
params.get('accuracy', 10)
)
return demo
if __name__ == "__main__":
demo = create_interface()
demo.launch(server_name="0.0.0.0", server_port=7860)