// ============================================== // 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 = `
`; lista.forEach(r => { html += `
${r.indicativo || "Sin indicativo"}

📡 Frec: ${r.frecuencia} | ➡️ Desp: ${r.desplazamiento} | 🔊 Tono: ${r.tono}

📍 ${r.comuna} | 🏠 ${r.direccion || "Sin dirección"}

`; }); html += `
`; contenedor.innerHTML = html; } // ============================================== // 7. IR AL MARCADOR // ============================================== function irAMarcador(lat, lon) { if (!mapa || isNaN(lat) || isNaN(lon) || lat === 0 || lon === 0) return; mapa.setView([lat, lon], 14); } // ============================================== // 8. BUSCADOR // ============================================== function buscarRepetidora() { const texto = document.getElementById("buscador")?.value.trim().toLowerCase() || ""; if (!texto) { mostrarLista(repetidoras); marcarEnMapa(repetidoras); return; } const filtradas = repetidoras.filter(r => r.indicativo.toLowerCase().includes(texto) || r.frecuencia.toLowerCase().includes(texto) || r.comuna.toLowerCase().includes(texto) || r.direccion.toLowerCase().includes(texto) ); mostrarLista(filtradas); marcarEnMapa(filtradas); } // ============================================== // 9. INICIALIZACIÓN // ============================================== function inicializarMapa() { if (mapa) return; mapa = L.map("mapa").setView([-33.45, -70.65], 10); L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { attribution: "© OpenStreetMap" }).addTo(mapa); } window.addEventListener("load", () => { inicializarMapa(); cargarRepetidorasDesdeGoogle(); const buscador = document.getElementById("buscador"); if (buscador) buscador.addEventListener("input", buscarRepetidora); });