# Observar desde cualquier lugar

La versión 03 permite elegir una ciudad o introducir coordenadas. La ubicación
se utiliza en el cielo local, los eventos del observador y su marcador terrestre.
Los cálculos se ejecutan en el navegador: no se envía tu ubicación a ningún servicio.

## Cómo usarlo

1. En **Tu punto en la Tierra**, elige una ciudad. El cambio es inmediato.
2. Para otro lugar, elige **Coordenadas personalizadas…** y abre los campos.
3. Introduce latitud, longitud y altitud. Norte/este son positivos; sur/oeste negativos.
4. Escribe una zona horaria como `Europe/Madrid`, `America/New_York` o `UTC`.
5. Pulsa **Aplicar ubicación**. Si hay un valor incorrecto, continúa activo el lugar anterior.

Los valores permitidos son latitud entre −90 y +90 grados, longitud entre −180 y
+180 grados y altitud entre −500 y 10.000 metros sobre el mar. Las ciudades incluyen
coordenadas y alturas orientativas del centro urbano, editables. No representan
el domicilio de una persona ni una estación de observación de precisión.

La zona horaria controla cómo se presentan las horas, incluidos los cambios
estacionales que conoce el navegador. No cambia el instante UTC ni el cielo
calculado. Para una coordenada libre el formulario sugiere UTC; no adivina su zona
horaria a partir de la longitud. La ubicación inicial vuelve a Granada al abrir
la aplicación; no se guarda en la cuenta ni en un servidor.

## Qué representa el cielo

- Se consideran la posición del observador sobre el elipsoide terrestre, el paralaje
  lunar y una aproximación estándar de refracción atmosférica.
- La altura numérica es la del centro del cuerpo. La etiqueta sobre/bajo el
  horizonte toma en cuenta su borde superior.
- El horizonte es ideal, sin montañas ni edificios. La altitud sobre el mar no se
  interpreta como si el observador estuviera en lo alto de una torre de esa altura.
- La búsqueda de salidas y puestas cubre los próximos **3 días** del reloj de la
  simulación. En zonas polares puede no haber un evento dentro de ese intervalo;
  se muestra explícitamente. No equivale a que el Sol o la Luna nunca salgan.
- Los cuerpos están ampliados en el panorama para poder localizarlos. Durante
  un eclipse solar, el disco solar ampliado muestra la Luna superpuesta con sus
  radios y separación relativos calculados. La ilustración no reproduce el brillo
  de la corona ni la respuesta de la atmósfera.
- El disco lunar ampliado utiliza la orientación del observador y las sombras
  geométricas del módulo `eclipses.js`. El porcentaje de fase se distingue de
  la ocultación: durante un eclipse lunar la fase sigue siendo llena.

## Dónde está cada parte del código

| Archivo | Responsabilidad |
| --- | --- |
| `js/ubicacion.js` | Ciudades incluidas, formulario y cambio validado de ubicación. |
| `js/observador.js` | Validación compartida y cálculos del observador. |
| `js/cielo.js` | Panorama, disco lunar, horas locales y eventos de horizonte. |
| `css/cielo.css` | Apariencia de ubicación y cielo, incluida adaptación al móvil. |
| `tests/observador.cjs` | Verificaciones de eventos, polos, hemisferios y fechas. |

`SolarLocation.get()` devuelve `{ name, latitude, longitude, height, timeZone }`.
El constructor recibe el contenedor y una función que se ejecuta al aplicar una
ubicación válida. `set()` devuelve `false` y muestra un error si falla la validación.
`SolarObserver.setLocation()` valida antes de cambiar el observador. `SolarSky.setLocation()`
actualiza los títulos y borra la caché de eventos incluso si el reloj está en pausa.

Los cálculos utilizan [Astronomy Engine](https://github.com/cosinekitty/astronomy)
y las funciones estándar `Intl.DateTimeFormat` del navegador. Esta función no
añade mapas de terceros, APIs de pago ni otra licencia de recursos gráficos.

Las pruebas se ejecutan desde la raíz del proyecto con `node tests/observador.cjs`.
Incluyen Granada, Sídney, Nueva York, ambos polos, coordenadas límite y los cambios
de hora europeos de marzo y octubre de 2026.
