-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
89 lines (72 loc) · 2.84 KB
/
Copy pathscript.js
File metadata and controls
89 lines (72 loc) · 2.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// 1. Inicialização do Mapa
const map = L.map("map").setView([0, 0], 2);
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
attribution: "© OpenStreetMap contributors",
}).addTo(map);
// 2. Variáveis Globais para controle da animação e elementos do mapa
let polyline = L.polyline([], { color: "red", weight: 3 }).addTo(map);
let marker = L.marker([0, 0]).addTo(map);
let animationInterval = null;
const fileInput = document.getElementById("file-upload");
// 3. Listener de Upload
fileInput.addEventListener("change", function (e) {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function (event) {
try {
const dados = JSON.parse(event.target.result);
const dataArray = Array.isArray(dados) ? dados : [dados];
// Para a animação anterior se o usuário subir um novo arquivo
if (animationInterval) clearInterval(animationInterval);
processarEAnimar(dataArray);
} catch (err) {
console.error("Erro ao processar JSON:", err);
alert("Erro ao ler o arquivo JSON. Verifique o console.");
}
};
reader.readAsText(file);
});
// 4. Função que une o Ajuste de Escala (fitBounds) com a Animação
function processarEAnimar(dados) {
// Limpa o estado anterior
polyline.setLatLngs([]);
// Cria uma trajetória invisível rápida para calcular os limites (Bounds)
const todasCoords = dados.map((p) => [p.lat, p.lon]);
const tempPoly = L.polyline(todasCoords);
// Ajusta o zoom para caber a trajetória inteira antes de começar a animar
map.fitBounds(tempPoly.getBounds(), { padding: [50, 50] });
let i = 0;
animationInterval = setInterval(() => {
if (i >= dados.length) {
clearInterval(animationInterval);
return;
}
const ponto = dados[i];
const coordenadas = [ponto.lat, ponto.lon];
// Atualiza o mapa visualmente
polyline.addLatLng(coordenadas);
marker.setLatLng(coordenadas);
// Opcional: Centraliza o mapa no ponto atual durante a animação
// map.panTo(coordenadas);
// ATUALIZAÇÃO DA TELEMETRIA
atualizarInterface(ponto);
i++;
}, 100); // Velocidade da animação (100ms)
}
// 5. Função de Interface - Verifique os IDs no HTML
function atualizarInterface(d) {
const latEl = document.getElementById("lat-val");
const lngEl = document.getElementById("lng-val");
const altEl = document.getElementById("alt-val");
const velEl = document.getElementById("vel-val");
const timeEl = document.getElementById("time-sync");
if (latEl) latEl.innerText = d.lat.toFixed(4);
if (lngEl) lngEl.innerText = d.lon.toFixed(4);
if (altEl) altEl.innerText = (d.alt ?? 0).toFixed(0) + " m";
if (velEl) velEl.innerText = (d.vel_h ?? 0).toFixed(1) + " m/s";
if (timeEl)
timeEl.innerText = d.datetime
? d.datetime.split("T")[1].replace("Z", "")
: "--:--";
}