{"id":2511,"date":"2017-09-13T15:14:20","date_gmt":"2017-09-13T18:14:20","guid":{"rendered":"http:\/\/www.elfirmamento.com.ar\/?page_id=2511"},"modified":"2025-09-24T17:45:49","modified_gmt":"2025-09-24T20:45:49","slug":"transito-estacion-espacial-internacional-eei-o-iss-siglas-en-ingles","status":"publish","type":"page","link":"http:\/\/www.elfirmamento.com.ar\/?page_id=2511","title":{"rendered":"Transito Estaci\u00f3n Espacial Internacional (EEI o ISS siglas en ingl\u00e9s)"},"content":{"rendered":"\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Ubicaci\u00f3n de la ISS en Tiempo Real<\/title>\n    <link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\n    <style>\n        body {\n            margin: 0;\n            padding: 0;\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);\n            min-height: 100vh;\n        }\n        \n        .container {\n            max-width: 1200px;\n            margin: 0 auto;\n            padding: 20px;\n        }\n        \n        h1 {\n            text-align: center;\n            color: white;\n            margin-bottom: 30px;\n            text-shadow: 2px 2px 4px rgba(0,0,0,0.3);\n            font-size: 2.5em;\n        }\n        \n        .info-panel {\n            background: rgba(255, 255, 255, 0.95);\n            border-radius: 15px;\n            padding: 20px;\n            margin-bottom: 20px;\n            box-shadow: 0 8px 32px rgba(0,0,0,0.1);\n            backdrop-filter: blur(10px);\n        }\n        \n        .info-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n            gap: 20px;\n            margin-bottom: 20px;\n        }\n        \n        .info-item {\n            text-align: center;\n            padding: 15px;\n            background: linear-gradient(145deg, #f0f0f0, #e0e0e0);\n            border-radius: 10px;\n            box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n        }\n        \n        .info-item h3 {\n            margin: 0 0 10px 0;\n            color: #333;\n            font-size: 1.1em;\n        }\n        \n        .info-item .value {\n            font-size: 1.5em;\n            font-weight: bold;\n            color: #2a5298;\n        }\n        \n        #map {\n            height: 500px;\n            border-radius: 15px;\n            box-shadow: 0 8px 32px rgba(0,0,0,0.2);\n            overflow: hidden;\n        }\n        \n        .status {\n            text-align: center;\n            padding: 10px;\n            border-radius: 8px;\n            margin: 10px 0;\n            font-weight: bold;\n        }\n        \n        .status.online {\n            background: rgba(76, 175, 80, 0.2);\n            color: #2e7d32;\n            border: 1px solid #4caf50;\n        }\n        \n        .status.offline {\n            background: rgba(244, 67, 54, 0.2);\n            color: #c62828;\n            border: 1px solid #f44336;\n        }\n        \n        .update-info {\n            text-align: center;\n            color: #666;\n            font-size: 0.9em;\n            margin-top: 10px;\n        }\n        \n        @keyframes pulse {\n            0% { transform: scale(1); }\n            50% { transform: scale(1.1); }\n            100% { transform: scale(1); }\n        }\n        \n        .iss-marker, .iss-marker-moving {\n            z-index: 1000;\n        }\n        \n        .iss-marker {\n            animation: pulse 2s infinite;\n        }\n        \n        .iss-marker-moving {\n            \/* Sin animaci\u00f3n de pulso durante el movimiento para mayor suavidad *\/\n        }\n\n        .leaflet-popup-content {\n            min-width: 200px;\n        }\n        \n        .orbit-legend {\n            position: absolute;\n            top: 10px;\n            right: 10px;\n            background: rgba(255, 255, 255, 0.9);\n            padding: 10px;\n            border-radius: 8px;\n            box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n            font-size: 0.9em;\n            z-index: 1000;\n        }\n        \n        .legend-item {\n            display: flex;\n            align-items: center;\n            margin: 5px 0;\n        }\n        \n        .legend-line {\n            width: 20px;\n            height: 3px;\n            margin-right: 8px;\n        }\n        \n        .recent-path {\n            background: linear-gradient(90deg, #00ff88, #00cc66);\n        }\n        \n        .predicted-orbit {\n            background: linear-gradient(90deg, #ff6b6b, #ff4444);\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <h1>\ud83d\udef0\ufe0f Programa El Firmamento &#8211; Estaci\u00f3n Espacial Internacional &#8211; Ubicaci\u00f3n en Tiempo Real<\/h1>\n        \n        <div class=\"info-panel\">\n            <div id=\"status\" class=\"status offline\">Conectando&#8230;<\/div>\n            \n            <div class=\"info-grid\">\n                <div class=\"info-item\">\n                    <h3>Latitud<\/h3>\n                    <div id=\"latitude\" class=\"value\">&#8212;<\/div>\n                <\/div>\n                <div class=\"info-item\">\n                    <h3>Longitud<\/h3>\n                    <div id=\"longitude\" class=\"value\">&#8212;<\/div>\n                <\/div>\n                <div class=\"info-item\">\n                    <h3>Velocidad<\/h3>\n                    <div id=\"velocity\" class=\"value\">&#8212; km\/h<\/div>\n                <\/div>\n                <div class=\"info-item\">\n                    <h3>Altitud<\/h3>\n                    <div id=\"altitude\" class=\"value\">&#8212; km<\/div>\n                <\/div>\n            <\/div>\n            \n            <div class=\"update-info\">\n                \u00daltima actualizaci\u00f3n: <span id=\"lastUpdate\">&#8212;<\/span>\n            <\/div>\n        <\/div>\n        \n        <div id=\"map\">\n            <div class=\"orbit-legend\">\n                <div class=\"legend-item\">\n                    <div class=\"legend-line recent-path\"><\/div>\n                    <span>Trayectoria reciente<\/span>\n                <\/div>\n                <div class=\"legend-item\">\n                    <div class=\"legend-line predicted-orbit\"><\/div>\n                    <span>\u00d3rbita predicha<\/span>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n    <script>\n        let map;\n        let issMarker;\n        let issPath = [];\n        let pathPolyline;\n        let orbitPolyline;\n        let updateInterval;\n        let animationInterval;\n        let lastPosition = null;\n        let currentPosition = null;\n        let targetPosition = null;\n        let animationProgress = 0;\n\n        \/\/ Inicializar el mapa\n        function initMap() {\n            map = L.map('map').setView([0, 0], 2);\n            \n            \/\/ Agregar capa de mapa (OpenStreetMap)\n            L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n                attribution: '\u00a9 OpenStreetMap contributors'\n            }).addTo(map);\n\n            \/\/ Crear icono personalizado de la ISS (representaci\u00f3n visual realista)\n            const issIcon = L.divIcon({\n                html: `\n                    <div style=\"transform: rotate(0deg); transition: transform 0.5s ease;\">\n                        <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" style=\"filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.8));\">\n                            <!-- Cuerpo principal -->\n                            <rect x=\"15\" y=\"10\" width=\"10\" height=\"20\" fill=\"#C0C0C0\" stroke=\"#808080\" stroke-width=\"1\"\/>\n                            <!-- Paneles solares izquierdos -->\n                            <rect x=\"2\" y=\"8\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"2\" y=\"14\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"2\" y=\"20\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"2\" y=\"26\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <!-- Paneles solares derechos -->\n                            <rect x=\"26\" y=\"8\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"26\" y=\"14\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"26\" y=\"20\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"26\" y=\"26\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <!-- M\u00f3dulo principal -->\n                            <circle cx=\"20\" cy=\"20\" r=\"3\" fill=\"#FFD700\" stroke=\"#FFA500\" stroke-width=\"1\"\/>\n                            <!-- Antenas -->\n                            <line x1=\"20\" y1=\"5\" x2=\"20\" y2=\"10\" stroke=\"#FF6B6B\" stroke-width=\"2\"\/>\n                            <line x1=\"20\" y1=\"30\" x2=\"20\" y2=\"35\" stroke=\"#FF6B6B\" stroke-width=\"2\"\/>\n                        <\/svg>\n                    <\/div>\n                `,\n                className: 'iss-marker',\n                iconSize: [40, 40],\n                iconAnchor: [20, 20]\n            });\n\n            \/\/ Crear marcador para la ISS\n            issMarker = L.marker([0, 0], {icon: issIcon}).addTo(map);\n            \n            \/\/ Crear polyline para la trayectoria reciente (\u00faltimos puntos)\n            pathPolyline = L.polyline([], {\n                color: '#00ff88',\n                weight: 3,\n                opacity: 0.8,\n                dashArray: '10, 5'\n            }).addTo(map);\n\n            \/\/ Crear polyline para la \u00f3rbita completa predicha\n            orbitPolyline = L.polyline([], {\n                color: '#ff6b6b',\n                weight: 2,\n                opacity: 0.4,\n                dashArray: '5, 10'\n            }).addTo(map);\n        }\n\n        \/\/ Interpolaci\u00f3n lineal entre dos puntos\n        function lerp(start, end, progress) {\n            return start + (end - start) * progress;\n        }\n\n        \/\/ Interpolaci\u00f3n esf\u00e9rica para coordenadas geogr\u00e1ficas\n        function lerpLatLng(pos1, pos2, progress) {\n            let lat1 = pos1.latitude;\n            let lng1 = pos1.longitude;\n            let lat2 = pos2.latitude;\n            let lng2 = pos2.longitude;\n\n            \/\/ Manejar el cruce del antimeridiano (l\u00ednea de fecha internacional)\n            let deltaLng = lng2 - lng1;\n            if (Math.abs(deltaLng) > 180) {\n                if (deltaLng > 0) {\n                    lng1 += 360;\n                } else {\n                    lng2 += 360;\n                }\n            }\n\n            let lat = lerp(lat1, lat2, progress);\n            let lng = lerp(lng1, lng2, progress);\n\n            \/\/ Normalizar longitud\n            if (lng > 180) lng -= 360;\n            if (lng < -180) lng += 360;\n\n            return { latitude: lat, longitude: lng };\n        }\n\n        \/\/ Funci\u00f3n de easing para movimiento m\u00e1s suave (ease-in-out)\n        function easeInOutCubic(t) {\n            return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n        }\n\n        \/\/ Animar el movimiento de la ISS entre actualizaciones\n        function animateISS() {\n            if (!currentPosition || !targetPosition) return;\n\n            \/\/ Incrementar progreso de animaci\u00f3n\n            animationProgress += 0.02; \/\/ 2% por frame (50fps = 1 segundo para completar)\n\n            if (animationProgress >= 1) {\n                animationProgress = 1;\n            }\n\n            \/\/ Aplicar easing para movimiento m\u00e1s natural\n            const easedProgress = easeInOutCubic(animationProgress);\n\n            \/\/ Interpolar posici\u00f3n\n            const interpolatedPos = lerpLatLng(currentPosition, targetPosition, easedProgress);\n\n            \/\/ Calcular rotaci\u00f3n basada en direcci\u00f3n de movimiento\n            const rotation = calculateBearing(\n                currentPosition.latitude,\n                currentPosition.longitude,\n                targetPosition.latitude,\n                targetPosition.longitude\n            );\n\n            \/\/ Crear icono rotado\n            const rotatedIssIcon = L.divIcon({\n                html: `\n                    <div style=\"transform: rotate(${rotation}deg); transition: none;\">\n                        <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" style=\"filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.8));\">\n                            <!-- Cuerpo principal -->\n                            <rect x=\"15\" y=\"10\" width=\"10\" height=\"20\" fill=\"#C0C0C0\" stroke=\"#808080\" stroke-width=\"1\"\/>\n                            <!-- Paneles solares izquierdos -->\n                            <rect x=\"2\" y=\"8\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"2\" y=\"14\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"2\" y=\"20\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"2\" y=\"26\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <!-- Paneles solares derechos -->\n                            <rect x=\"26\" y=\"8\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"26\" y=\"14\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"26\" y=\"20\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <rect x=\"26\" y=\"26\" width=\"12\" height=\"4\" fill=\"#1E3A8A\" stroke=\"#3B82F6\" stroke-width=\"1\"\/>\n                            <!-- M\u00f3dulo principal -->\n                            <circle cx=\"20\" cy=\"20\" r=\"3\" fill=\"#FFD700\" stroke=\"#FFA500\" stroke-width=\"1\"\/>\n                            <!-- Antenas -->\n                            <line x1=\"20\" y1=\"5\" x2=\"20\" y2=\"10\" stroke=\"#FF6B6B\" stroke-width=\"2\"\/>\n                            <line x1=\"20\" y1=\"30\" x2=\"20\" y2=\"35\" stroke=\"#FF6B6B\" stroke-width=\"2\"\/>\n                        <\/svg>\n                    <\/div>\n                `,\n                className: 'iss-marker-moving',\n                iconSize: [40, 40],\n                iconAnchor: [20, 20]\n            });\n\n            \/\/ Actualizar posici\u00f3n del marcador\n            issMarker.setLatLng([interpolatedPos.latitude, interpolatedPos.longitude]);\n            issMarker.setIcon(rotatedIssIcon);\n\n            \/\/ Actualizar trayectoria en tiempo real durante la animaci\u00f3n\n            if (animationProgress > 0.1) { \/\/ Comenzar a agregar puntos despu\u00e9s del 10% del movimiento\n                const recentPoint = [interpolatedPos.latitude, interpolatedPos.longitude];\n                \n                \/\/ Agregar punto interpolado a la trayectoria si ha habido suficiente movimiento\n                if (issPath.length === 0 || \n                    Math.abs(issPath[issPath.length - 1][0] - recentPoint[0]) > 0.001 ||\n                    Math.abs(issPath[issPath.length - 1][1] - recentPoint[1]) > 0.001) {\n                    \n                    issPath.push(recentPoint);\n                    \n                    \/\/ Limitar puntos para rendimiento\n                    if (issPath.length > 100) {\n                        issPath.shift();\n                    }\n                    \n                    pathPolyline.setLatLngs(issPath);\n                }\n            }\n        }\n\n        \/\/ Iniciar animaci\u00f3n continua\n        function startAnimation() {\n            if (animationInterval) clearInterval(animationInterval);\n            animationInterval = setInterval(animateISS, 20); \/\/ 50 FPS\n        }\n        function calculateOrbit(currentLat, currentLng) {\n            const orbitPoints = [];\n            const earthRadius = 6371; \/\/ km\n            const issAltitude = 408; \/\/ km (altitud promedio)\n            const orbitalRadius = earthRadius + issAltitude;\n            \n            \/\/ Calcular inclinaci\u00f3n orbital de la ISS (aproximadamente 51.6\u00b0)\n            const inclination = 51.6;\n            \n            \/\/ Generar puntos de \u00f3rbita\n            for (let i = 0; i <= 360; i += 2) {\n                const angle = (i * Math.PI) \/ 180;\n                \n                \/\/ Calcular posici\u00f3n orbital simplificada\n                let lat = Math.asin(Math.sin(inclination * Math.PI \/ 180) * Math.sin(angle)) * 180 \/ Math.PI;\n                let lng = currentLng + (i - 180);\n                \n                \/\/ Normalizar longitud\n                if (lng > 180) lng -= 360;\n                if (lng < -180) lng += 360;\n                \n                orbitPoints.push([lat, lng]);\n            }\n            \n            return orbitPoints;\n        }\n\n        \/\/ Calcular direcci\u00f3n de movimiento para rotar el icono\n        function calculateBearing(lat1, lng1, lat2, lng2) {\n            const dLng = (lng2 - lng1) * Math.PI \/ 180;\n            const lat1Rad = lat1 * Math.PI \/ 180;\n            const lat2Rad = lat2 * Math.PI \/ 180;\n            \n            const y = Math.sin(dLng) * Math.cos(lat2Rad);\n            const x = Math.cos(lat1Rad) * Math.sin(lat2Rad) - \n                      Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(dLng);\n            \n            const bearing = Math.atan2(y, x) * 180 \/ Math.PI;\n            return (bearing + 360) % 360;\n        }\n        async function getISSData() {\n            try {\n                const response = await fetch('http:\/\/api.open-notify.org\/iss-now.json');\n                if (!response.ok) throw new Error('Error en la respuesta del servidor');\n                \n                const data = await response.json();\n                const position = data.iss_position;\n                \n                \/\/ Obtener datos adicionales de velocidad y altitud\n                const detailsResponse = await fetch('https:\/\/api.wheretheiss.at\/v1\/satellites\/25544');\n                let details = null;\n                if (detailsResponse.ok) {\n                    details = await detailsResponse.json();\n                }\n                \n                updateISSPosition({\n                    latitude: parseFloat(position.latitude),\n                    longitude: parseFloat(position.longitude),\n                    velocity: details ? Math.round(details.velocity) : null,\n                    altitude: details ? Math.round(details.altitude) : 408 \/\/ altitud promedio de la ISS\n                });\n                \n                updateStatus(true);\n                \n            } catch (error) {\n                console.error('Error al obtener datos de la ISS:', error);\n                updateStatus(false);\n                \n                \/\/ Usar API alternativa si falla la primera\n                try {\n                    const fallbackResponse = await fetch('https:\/\/api.wheretheiss.at\/v1\/satellites\/25544');\n                    if (fallbackResponse.ok) {\n                        const fallbackData = await fallbackResponse.json();\n                        updateISSPosition({\n                            latitude: fallbackData.latitude,\n                            longitude: fallbackData.longitude,\n                            velocity: Math.round(fallbackData.velocity),\n                            altitude: Math.round(fallbackData.altitude)\n                        });\n                        updateStatus(true);\n                    }\n                } catch (fallbackError) {\n                    console.error('Error con API de respaldo:', fallbackError);\n                }\n            }\n        }\n\n        \/\/ Actualizar posici\u00f3n de la ISS en el mapa\n        function updateISSPosition(data) {\n            const { latitude, longitude, velocity, altitude } = data;\n            \n            \/\/ Actualizar informaci\u00f3n en el panel\n            document.getElementById('latitude').textContent = latitude.toFixed(4) + '\u00b0';\n            document.getElementById('longitude').textContent = longitude.toFixed(4) + '\u00b0';\n            document.getElementById('velocity').textContent = velocity ? velocity + ' km\/h' : '27,600 km\/h';\n            document.getElementById('altitude').textContent = altitude + ' km';\n            document.getElementById('lastUpdate').textContent = new Date().toLocaleTimeString();\n            \n            \/\/ Configurar animaci\u00f3n hacia la nueva posici\u00f3n\n            if (currentPosition) {\n                \/\/ La posici\u00f3n actual se convierte en el punto de partida\n                currentPosition = targetPosition || currentPosition;\n            } else {\n                \/\/ Primera carga - posicionar inmediatamente\n                currentPosition = { latitude, longitude };\n                issMarker.setLatLng([latitude, longitude]);\n                map.setView([latitude, longitude], 4);\n            }\n            \n            \/\/ Establecer nueva posici\u00f3n objetivo\n            targetPosition = { latitude, longitude };\n            animationProgress = 0; \/\/ Reiniciar animaci\u00f3n\n            \n            \/\/ Iniciar animaci\u00f3n si no est\u00e1 corriendo\n            if (!animationInterval) {\n                startAnimation();\n            }\n            \n            \/\/ Calcular rotaci\u00f3n para el popup\n            let rotation = 0;\n            if (currentPosition &#038;&#038; targetPosition) {\n                rotation = calculateBearing(\n                    currentPosition.latitude,\n                    currentPosition.longitude,\n                    targetPosition.latitude,\n                    targetPosition.longitude\n                );\n            }\n            \n            \/\/ Calcular y mostrar \u00f3rbita predicha (cada 10 actualizaciones para rendimiento)\n            if (issPath.length % 10 === 0 || issPath.length === 1) {\n                const orbitPoints = calculateOrbit(latitude, longitude);\n                orbitPolyline.setLatLngs(orbitPoints);\n            }\n            \n            \/\/ Actualizar popup del marcador\n            issMarker.bindPopup(`\n                <div style=\"text-align: center;\">\n                    <h3>\ud83d\udef0\ufe0f Estaci\u00f3n Espacial Internacional<\/h3>\n                    <p><strong>Lat:<\/strong> ${latitude.toFixed(4)}\u00b0<\/p>\n                    <p><strong>Lng:<\/strong> ${longitude.toFixed(4)}\u00b0<\/p>\n                    <p><strong>Velocidad:<\/strong> ${velocity ? velocity + ' km\/h' : '27,600 km\/h'}<\/p>\n                    <p><strong>Altitud:<\/strong> ${altitude} km<\/p>\n                    <p><strong>Direcci\u00f3n:<\/strong> ${rotation.toFixed(0)}\u00b0<\/p>\n                    <p style=\"color: #28a745; font-weight: bold;\">\ud83d\udd34 EN VIVO - Movi\u00e9ndose<\/p>\n                    <p><em>Actualizado: ${new Date().toLocaleTimeString()}<\/em><\/p>\n                <\/div>\n            `);\n            \n            \/\/ Guardar posici\u00f3n para referencia\n            lastPosition = { latitude, longitude };\n        }\n\n        \/\/ Actualizar estado de conexi\u00f3n\n        function updateStatus(online) {\n            const statusElement = document.getElementById('status');\n            if (online) {\n                statusElement.textContent = '\ud83d\udfe2 Conectado - Datos en tiempo real';\n                statusElement.className = 'status online';\n            } else {\n                statusElement.textContent = '\ud83d\udd34 Error de conexi\u00f3n';\n                statusElement.className = 'status offline';\n            }\n        }\n\n        \/\/ Inicializar aplicaci\u00f3n\n        function init() {\n            initMap();\n            getISSData(); \/\/ Primera carga\n            \n            \/\/ Actualizar cada 5 segundos\n            updateInterval = setInterval(getISSData, 5000);\n        }\n\n        \/\/ Limpiar intervals al cerrar la p\u00e1gina\n        window.addEventListener('beforeunload', () => {\n            if (updateInterval) clearInterval(updateInterval);\n            if (animationInterval) clearInterval(animationInterval);\n        });\n\n        \/\/ Inicializar cuando la p\u00e1gina est\u00e9 cargada\n        document.addEventListener('DOMContentLoaded', init);\n    <\/script>\n<\/body>\n\n\n\n<div id=\"av-orbit\">\n    <script>\n        var avOrbitProperties = {\n            size: 'medium',\n            lang: 'en'\n        };\n    <\/script>\n    <script src=\"https:\/\/astroviewer.net\/widgets\/widgets\/orbit.js\"><\/script>\n<\/div>\n\n\n\n<iframe width=\"695\" height=\"391\" src=\"https:\/\/www.youtube.com\/embed\/iYmvCUonukw\" title=\"Live Video from the International Space Station (Official NASA Stream)\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n","protected":false},"excerpt":{"rendered":"<p>Ubicaci\u00f3n de la ISS en Tiempo Real \ud83d\udef0\ufe0f Programa El Firmamento &#8211; Estaci\u00f3n Espacial Internacional &#8211; Ubicaci\u00f3n en Tiempo Real Conectando&#8230; Latitud &#8212; Longitud &#8212; Velocidad &#8212; km\/h Altitud &#8212; km \u00daltima actualizaci\u00f3n: &#8212; Trayectoria reciente \u00d3rbita predicha<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/www.elfirmamento.com.ar\/index.php?rest_route=\/wp\/v2\/pages\/2511"}],"collection":[{"href":"http:\/\/www.elfirmamento.com.ar\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.elfirmamento.com.ar\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.elfirmamento.com.ar\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.elfirmamento.com.ar\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2511"}],"version-history":[{"count":14,"href":"http:\/\/www.elfirmamento.com.ar\/index.php?rest_route=\/wp\/v2\/pages\/2511\/revisions"}],"predecessor-version":[{"id":8139,"href":"http:\/\/www.elfirmamento.com.ar\/index.php?rest_route=\/wp\/v2\/pages\/2511\/revisions\/8139"}],"wp:attachment":[{"href":"http:\/\/www.elfirmamento.com.ar\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}