// ==============================================
// CONFIGURACIÓN GENERAL
// ==============================================
const URL_GOOGLE_SHEETS = "https://docs.google.com/spreadsheets/d/e/2PACX-1vSBqGhaptWm05CDJXuCsVcZnVdwI15z0oDQS1MnY7gYOxy43Ok5aM_yJCRkm6fv5l4J1gm6yT/pub?output=csv";
let repetidoras = [];
let marcadores = [];
let mapa;
// ==============================================
// 1. FUNCIÓN PARA LEER ARCHIVO CSV
// ==============================================
function parseCSV(texto) {
const filas = [];
let filaActual = [];
let valorActual = "";
let entreComillas = false;
for (let i = 0; i < texto.length; i++) {
const c = texto[i];
const siguiente = texto[i + 1] || "";
if (c === '"') {
if (entreComillas && siguiente === '"') {
valorActual += '"';
i++;
} else {
entreComillas = !entreComillas;
}
} else if (c === "," && !entreComillas) {
filaActual.push(valorActual.trim());
valorActual = "";
} else if (c === "\n" && !entreComillas) {
filaActual.push(valorActual.trim());
filas.push(filaActual);
filaActual = [];
valorActual = "";
} else {
valorActual += c;
}
}
if (valorActual || filaActual.length) filaActual.push(valorActual.trim());
if (filaActual.length) filas.push(filaActual);
return filas;
}
// ==============================================
// 2. COORDENADAS DE COMUNAS DE CHILE
// ==============================================
const coordsComunas = {
"santiago": { lat: -33.4489, lon: -70.6693 },
"las condes": { lat: -33.4094, lon: -70.5776 },
"peñalolén": { lat: -33.4706, lon: -70.5494 },
"lampa": { lat: -33.2833, lon: -70.8833 },
"puente alto": { lat: -33.6167, lon: -70.5667 },
"san joaquín": { lat: -33.4767, lon: -70.6239 },
"san bernardo": { lat: -33.6033, lon: -70.7161 },
"calera de tango": { lat: -33.6333, lon: -70.8333 },
"maipú": { lat: -33.5167, lon: -70.7500 },
"providencia": { lat: -33.4333, lon: -70.6167 },
"vitacura": { lat: -33.3989, lon: -70.5986 },
"la florida": { lat: -33.5333, lon: -70.5833 },
"conchalí": { lat: -33.3833, lon: -70.6833 },
"quilicura": { lat: -33.3667, lon: -70.7667 },
"renca": { lat: -33.4167, lon: -70.7333 },
"cerro navia": { lat: -33.4667, lon: -70.7167 },
"lo prado": { lat: -33.4500, lon: -70.7000 },
"estación central": { lat: -33.4667, lon: -70.6833 },
"independencia": { lat: -33.4333, lon: -70.6667 },
"recoleta": { lat: -33.4250, lon: -70.6583 },
"ñuñoa": { lat: -33.4500, lon: -70.6000 },
"macul": { lat: -33.4833, lon: -70.5833 },
"la cisterna": { lat: -33.5167, lon: -70.6667 },
"san miguel": { lat: -33.4917, lon: -70.6444 },
"pedro aguirre cerda": { lat: -33.4917, lon: -70.6917 },
"lo espejo": { lat: -33.5083, lon: -70.7083 },
"rancagua": { lat: -34.1667, lon: -70.7333 },
"valparaíso": { lat: -33.0472, lon: -71.6127 },
"viña del mar": { lat: -33.0245, lon: -71.5518 },
"concepción": { lat: -36.8270, lon: -73.0503 },
"temuco": { lat: -38.7367, lon: -72.5906 },
"antofagasta": { lat: -23.6524, lon: -70.3954 },
"iquique": { lat: -20.2131, lon: -70.1511 },
"arica": { lat: -18.4783, lon: -70.3126 },
"chillán": { lat: -36.6067, lon: -72.1033 },
"valdivia": { lat: -39.8142, lon: -73.2459 },
"osorno": { lat: -40.5733, lon: -73.1350 },
"puerto montt": { lat: -41.4693, lon: -72.9423 },
"punta arenas": { lat: -53.1638, lon: -70.9171 }
};
// ==============================================
// 3. FUNCIÓN PARA OBTENER COORDENADAS
// ==============================================
function obtenerCoordenadasPorComuna(comuna) {
if (!comuna) return { lat: 0, lon: 0 };
const clave = comuna.trim().toLowerCase();
return coordsComunas[clave] || { lat: 0, lon: 0 };
}
// ==============================================
// 4. CARGAR DATOS DESDE GOOGLE SHEETS
// ==============================================
async function cargarRepetidorasDesdeGoogle() {
try {
console.log("🔄 Cargando datos...");
const respuesta = await fetch(URL_GOOGLE_SHEETS + `&nocache=${Date.now()}`);
if (!respuesta.ok) throw new Error("No se pudo conectar a la hoja");
const texto = await respuesta.text();
const filas = parseCSV(texto);
if (filas.length < 2) {
repetidoras = [];
mostrarLista(repetidoras);
marcarEnMapa(repetidoras);
alert("⚠️ No hay datos o falta encabezado");
return;
}
const procesadas = [];
for (let i = 1; i < filas.length; i++) {
const fila = filas[i] || [];
let lat = parseFloat((fila[4] || "").replace(",", "."));
let lon = parseFloat((fila[5] || "").replace(",", "."));
const comuna = (fila[6] || "").trim();
const direccion = (fila[7] || "").trim();
const pais = (fila[8] || "Chile").trim();
if (isNaN(lat) || isNaN(lon) || lat === 0 || lon === 0) {
const coords = obtenerCoordenadasPorComuna(comuna);
lat = coords.lat;
lon = coords.lon;
}
procesadas.push({
indicativo: (fila[0] || "").trim(),
frecuencia: (fila[1] || "").trim(),
desplazamiento: (fila[2] || "").trim(),
tono: (fila[3] || "").trim(),
lat: lat,
lon: lon,
comuna: comuna,
direccion: direccion,
pais: pais
});
}
repetidoras = procesadas;
console.log("✅ Cargadas:", repetidoras.length);
console.log("📍 Con ubicación:", repetidoras.filter(r => r.lat !== 0 && r.lon !== 0).length);
mostrarLista(repetidoras);
marcarEnMapa(repetidoras);
} catch (error) {
console.error("❌ Error:", error);
repetidoras = [];
mostrarLista(repetidoras);
marcarEnMapa(repetidoras);
alert("❌ Fallo al cargar: " + error.message);
}
}
// ==============================================
// 5. MARCADORES EN EL MAPA
// ==============================================
function marcarEnMapa(lista) {
if (!mapa) return;
marcadores.forEach(m => mapa.removeLayer(m));
marcadores = [];
lista.forEach(r => {
if (!isNaN(r.lat) && !isNaN(r.lon) && r.lat !== 0 && r.lon !== 0) {
const popup = `
${r.indicativo || "Sin indicativo"}
📡 Frecuencia: ${r.frecuencia || "---"}
➡️ Desplazamiento: ${r.desplazamiento || "---"}
🔊 Tono: ${r.tono || "---"}
📍 Comuna: ${r.comuna || "---"}
🏠 Dirección: ${r.direccion || "---"}
`;
const m = L.marker([r.lat, r.lon]).bindPopup(popup).addTo(mapa);
marcadores.push(m);
}
});
}
// ==============================================
// 6. MOSTRAR LISTA
// ==============================================
function mostrarLista(lista) {
const contenedor = document.getElementById("lista-repetidoras");
if (!contenedor) return;
if (lista.length === 0) {
contenedor.innerHTML = "
No hay repetidoras para mostrar
"; return; } let html = `📡 Frec: ${r.frecuencia} | ➡️ Desp: ${r.desplazamiento} | 🔊 Tono: ${r.tono}
📍 ${r.comuna} | 🏠 ${r.direccion || "Sin dirección"}