# PROMPT DE IMPLEMENTACIÓN COMPLETA – ECDIS OFFLINE DISTRIBUIBLE ## OBJETIVO GENERAL Desarrollar una aplicación de escritorio **totalmente offline** que implemente un sistema de visualización de cartas electrónicas (ECDIS) conforme a los estándares IMO (MSC.232(82), MSC.302(87)) con funciones avanzadas de navegación astronómica, AIS/Radar, meteorología, planificación de rutas, anotaciones del usuario y auditoría. La aplicación debe ser distribuible como un único ejecutable (Windows/Linux) sin dependencia de internet durante su operación normal, con internet usado únicamente para actualizaciones voluntarias de cartas, avisos a los navegantes y del propio software. ## ARQUITECTURA TÉCNICA - **Lenguaje**: Python 3.10+ - **GUI**: PyQt5 con QWebEngineView que carga una interfaz web local (HTML+MapLibre GL JS) empaquetada junto a la aplicación. - **Base de datos local**: SQLite con extensión Spatialite para consultas geoespaciales y auditoría. - **Librerías principales**: PyQt5, PyQtWebEngine, gdal (osgeo), pynmea2, pyserial, skyfield, numpy, shapely, matplotlib (para gráficos astronómicos), reportlab (para exportar PDFs). - **Empaquetado**: PyInstaller genera un solo ejecutable con todos los recursos incrustados. - **Idioma**: Bilingüe español/inglés, conmutable en ajustes. - **Roles de usuario**: Superadmin (desarrollador), Admin (dueño del equipo), Usuario (privilegios limitados por Admin). ## FUNCIONAMIENTO OFFLINE La aplicación debe arrancar y operar plenamente sin internet, cargando cartas preprocesadas GeoJSON locales, catálogos estelares, y todos los recursos desde la carpeta de instalación. Internet solo se usará para: - Descargar actualizaciones de cartas (S-57, S-63) desde fuentes oficiales (NOAA, UKHO, NGA). - Descargar avisos a los navegantes (NtM). - Actualizar el software (incremental o completa a decisión del superadmin). - Descargar archivos GRIB meteorológicos opcionales. La actualización por USB es posible: insertar una memoria pre-verificada con archivos NtM/cartas y el sistema los importa. --- # MÓDULO 1: CARTOGRAFÍA Y VISUALIZACIÓN DE CARTAS ## Cartas soportadas - S-57 (sin cifrar) y S-63 (cifradas, con desencriptado mediante permiso). - CM93 (modo no certificado únicamente). - Modo certificado/ no certificado: Un botón/switch en menú de superadmin bloquea o habilita cartas no oficiales y funciones reducidas. ## Preprocesado de cartas Las cartas se convierten a GeoJSON una sola vez mediante GDAL/OGR y se almacenan en `data/charts/`. La carga es instantánea y no requiere parseo bajo demanda. ## Capas S-57 Se mostrará un panel de checkboxes con todas las capas S-57 disponibles (incluyendo profundidades, boyas, zonas de peligro, contornos de seguridad, batimetrías, etc.). Las capas obligatorias por IMO no pueden desactivarse en modo certificado (aparecen bloqueadas con un candado). Las capas batimétricas (DEPARE, DEPCNT, SOUNDG) están incluidas y son tratadas como capas independientes. ## Carga automática por área geográfica Un gestor de catálogo de cartas mantiene los bounding boxes de cada carta instalada. Según la posición del barco, se cargan y descargan automáticamente las cartas necesarias. Si no hay cobertura, se muestra un aviso. ## Herramientas sobre la carta (integradas en este módulo) - **Creación de rutas**: gráfica (clic en mapa) y numérica (ingreso coordenadas). - **Medición de distancias y rumbos** (regla electrónica). - **Chequeo automático de seguridad** al planificar/modificar ruta contra: - Contornos de profundidad y sondas (batimetría) - Áreas prohibidas/restringidas - Zonas militares (cargadas vía NtM o manuales) - Peligros aislados Si hay conflicto, **alarma visual y sonora** en el punto exacto. - **Correcciones Notice to Mariners semiautomáticas**: - El texto del NtM se pega en un campo, el sistema extrae coordenadas, objeto y corrección mediante NLP básico (spaCy offline). Muestra formulario prellenado, el oficial valida antes de aplicar. - Las correcciones validadas se almacenan en DB local con geometría, y al planificar rutas se consultan espacialmente para advertir. - Se añaden como capa temporal sobre la carta (no modifican el archivo oficial). - **Anotaciones del usuario** (ver Módulo 4). --- # MÓDULO 2: AIS Y RADAR ## Fuentes de datos - Soportar NMEA 0183 y NMEA 2000 vía puerto serie/CAN. Selección en menú de superadmin. - Datos simulados para pruebas sin hardware. ## Visualización de blancos AIS - Capa AIS con targets. Al hacer clic en un blanco: - Popup/panel con dos pestañas: 1. **Información básica reglamentaria IMO**: MMSI, nombre, rumbo (HDG), velocidad (SOG), CPA, TCPA, distancia, demora, tipo de buque. 2. **Más información**: eslora, manga, calado, destino, etc. - **CPA/TCPA**: calculados en Python. Alarma visual+sonora si se cruzan límites configurados por el usuario (silencio con acknowledge, registrado en auditoría). ## Radar overlay - Soporte dual: **imagen radar real** (captura de video de escáner) o **blancos radar simulados desde AIS**. - Selector: "Radar", "AIS", "Ambos". Si no hay señal radar, la opción se deshabilita automáticamente. ## Herramientas de plotting radar/carta - **EBL** (Electronic Bearing Line): línea ajustable desde centro desplazable; muestra demora numérica. - **VRM1 y VRM2** (Variable Range Marker): anillos de radio ajustable, centro desplazable, indicando distancia. - **Anillos de distancia fijos**: círculos concéntricos configurables. El usuario define manualmente cada distancia, pudiendo ser irregulares (ej: 1MN, 3MN, 7MN). - **Líneas paralelas (Parallel Index Lines)**: líneas rectas paralelas separables, orientables. - **Centro desplazable**: absolutamente todas las herramientas (EBL, VRM, anillos, paralelas) permiten anclarse en cualquier punto de la carta (ej: una boya) y **botón de reset** que devuelve el centro a la posición del barco. ## Orientación del mapa - Botón para alternar: Norte Arriba (por defecto), Rumbo Arriba, Curso Arriba. ## Safety Area / Guard Zone - Herramienta de dibujo manual de polígonos sobre la carta para definir zonas de guarda. - Si un contacto AIS/radar entra en una de estas zonas, alarma sonora. - Aplicables también en modo solo carta (sin radar). --- # MÓDULO 3: PLANIFICACIÓN DE RUTAS ## Creación y edición - Waypoints gráficos (clic en mapa) y numéricos (tabla con coordenadas, nombre, radio de giro, velocidad planificada). - **Importación CSV**: desde Google Earth Pro u otros, con columnas: nombre ruta, nombre WPT, lat, lon. Los cálculos de distancia/rumbo los hace el ECDIS. - Al mover un waypoint gráfico, pregunta "¿Guardar cambio?". - Múltiples rutas alternativas. Ruta activa visualmente distinta (color/grosor/estilo). - Panel de gestión de rutas: alternar, guardar, cargar. ## Chequeo automático de seguridad de ruta - Contra cartas (contornos de profundidad, obstáculos), NtM, zonas de guarda. - Si hay conflicto: alarma visual+sonora, y el sistema **sugiere una ruta alternativa segura**. - Si el usuario acepta la sugerencia, se puede modificar antes de activar. ## XTD (Cross-Track Distance) - Configurable por tramo. - Alarma de fuera de derrota con acknowledge y registro de quién reconoció. ## Formatos de archivo - **Guardar/cargar**: tanto GPX (intercambio) como formato propio (que preserva XTD, metadatos, historial). --- # MÓDULO 4: ANOTACIONES DEL USUARIO (MARINER'S OBJECTS) ## Tipos y contenido - Puntos, líneas, áreas (polígonos, rectángulos, círculos) con sombreado tenue. - Texto suelto. - Cada anotación: texto descriptivo + símbolo seleccionable de biblioteca. - Opción de borrar con confirmación y registro en auditoría. ## Organización - Capas separadas (ej: "Avisos NtM", "Notas del patrón"), activables/desactivables. - Crear nuevas capas con nombre personalizado. - Persistencia en SQLite y JSON entre sesiones. ## Exportación - Botón **Convertir a PDF** la vista actual de la carta con sus anotaciones visibles. ## Guardado - Antes de realizar otra acción, se pregunta si desea guardar cambios pendientes. --- # MÓDULO 5: NAVEGACIÓN ASTRONÓMICA ## Entrada de datos - Formulario manual: hora UTC, astro, altura instrumental sextante, presión, temperatura. - Cuatro alturas del ojo predefinidas y seleccionables (alerón, puente, cubierta magistral, principal). - Preparado para captura automática futura de estación meteorológica (presión/temperatura automáticas). ## Cálculos - **Sight reduction** con explicación paso a paso del triángulo esférico (reporte pedagógico para cadetes) incluyendo errores. - **Recta de altura** (sol, estrellas, planetas, luna). - **Latitud por Polaris**. - **Desvío de compás** por azimut de astro. - Correcciones completas (dip, refracción, paralaje, semidiámetro). ## Star Finder / Plato de estrellas - Calcula hora estimada de sunrise/sunset según posición. - Planisferio interactivo con círculos de elevación equidistantes. - Silueta del barco orientada al rumbo recomendado para el crepúsculo. - Muestra astros visibles (nombre, azimut, elevación estimada) de catálogo amplio (no solo 57 estrellas, todas las utilizables en cualquier hemisferio). - Permite seleccionar estrellas para observación planificada y pasarlas a un formulario. - Exportable a PDF. ## Fijación de posición - Mínimo 3 estrellas (mínimos cuadrados con elipse de error), pero acepta 2 si se nubló (intersección simple, avisando menor precisión). - **Sun-Run-Sun**, **Sol+Luna**, **Sol+Venus** totalmente implementados. --- # MÓDULO 6: METEOROLOGÍA Y RUTAS DE ESCAPE DE HURACANES ## Datos meteorológicos - Botón dual: descarga automática (si hay internet) o carga manual de archivo GRIB. - Capas independientes para: viento, presión, olas, corrientes, precipitación. - Leyenda con escala de colores. ## Ruta de escape de huracán - Doble método: 1. **Cálculo automático**: trayectoria del huracán extraída del GRIB+algoritmo pathfinding A* que genera ruta segura. 2. **Herramienta manual**: el oficial traza su propia ruta sobre la capa meteorológica. - La ruta automática es editable antes de aceptarse. --- # MÓDULO 7: INTERFAZ DE USUARIO Y DISTRIBUCIÓN ## Layout - Menú izquierdo (herramientas / capas). - Mapa central (MapLibre GL en QWebEngineView). - Panel derecho configurable con módulos apilables verticalmente (arrastrables, redimensionables). - Módulos disponibles: ecosonda/fishfinder (configurable), compás electrónico, GPS, AIS, radar, astronomía, meteorología, etc. - Cada módulo puede mostrar adicionalmente: CMG, COG, speed log (si disponible), SOG, XTD, desvío del rumbo, corriente calculada, viento real, deriva. ## Idioma Bilingüe español/inglés, conmutable. ## Sistema operativo Windows y Linux. ## Actualizaciones - Al iniciar (si hay internet) avisa de nueva versión. La descarga e instalación las decide el usuario. - Incremental por defecto, completa si el superadmin lo determina. - No afecta configuraciones ni datos de usuario. ## Credenciales y acceso - **Superadmin**: acceso total, configuración de fuentes de datos, modo certificado, menús bloqueados. - **Admin** (dueño del equipo): acceso avanzado según determine superadmin. - **Usuario**: acceso limitado según admin. --- # MÓDULO 8: AUDITORÍA ## Registro automático e inmutable - Tabla `audit_log` en SQLite con campos: timestamp UTC, event_type, object_type, object_id, description, operator, previous_value, new_value, checksum. - Eventos: creación/modificación/borrado de rutas, waypoints, anotaciones, correcciones NtM, cambios de configuración, alarmas y acknowledges. - No se puede editar ni borrar desde la interfaz. - Exportación a PDF para cuaderno de bitácora. --- # MÓDULO 9 (EXTRA PAGO): MODO SURVEY - Al activarse, la profundidad de la carta oficial se opaca. - Datos de ecosonda superpuestos en tiempo real sobre la carta. - Se genera un archivo batimétrico exportable (CSV/GeoJSON) con: lat, lon, profundidad, HDOP, error medio del GPS. - Compatible con QGIS para creación de cartas personalizadas. --- # DESARROLLO INICIAL (SIN INSTALADOR) 1. Crear entorno virtual Python e instalar dependencias. 2. Estructura de carpetas: webecdis/ ├── main.py ├── ui/ (index.html, js, css) ├── data/ (charts/, stars.json, etc.) ├── logs/ ├── modules/ (nmea_reader.py, celestial.py, updater.py, audit.py) └── tests/ 3. main.py lanza PyQt5 con QWebEngineView cargando ui/index.html local. 4. Probar sin conexión. # EMPAQUETADO FINAL pyinstaller --onefile --add-data "ui/*;ui" --add-data "data/*;data" main.py