| name | solar-shadow-computation |
| description | Calculo de sombras solares con Web Workers + Comlink, cache por terraza/dia/franja, footprints OSM, estimacion de alturas de edificios. Derivado de solmad. |
| version | 1.0.0 |
| tags | ["solar","sombras","web-workers","gis","solmad"] |
Solar Shadow Computation - Patron de Calculo de Sombras Solares
Descripcion
Patron para calcular si una ubicacion tiene sol directo en un momento dado, cruzando datos de terrazas/ubicaciones con footprints de edificios de OpenStreetMap y posicion solar via SunCalc.
Origen
Derivado del repositorio solmad (Madrid Solea) — buscador de terrazas con sol en Madrid.
Algoritmo
- Cargar las ubicaciones (terrazas, puntos de interes)
- Descargar footprints de edificios desde Overpass/OpenStreetMap por zona visible
- Estimar alturas con
height, building:levels * 3.2m o fallback de 10m
- Indexar segmentos de fachadas en un grid dentro de un Web Worker
- Para cada ubicacion trazar un rayo hacia el sol y comprobar si algun edificio lo tapa
- Repetir en pasos de tiempo para estimar minutos restantes y ritmo solar del dia
- Cachear resultados por ubicacion, dia del ano y franja de 15 minutos
Stack Tecnologico
- Vite + React + TypeScript
- Leaflet para el mapa
- Leaflet.markercluster para 6.200+ terrazas sin lag
- SunCalc para posicion solar
- Web Workers + Comlink para calculos sin bloquear UI
- Zustand para estado global
- Tailwind para interfaz
Cache Solar
const cacheKey = `${terrazzaId}_${dayOfYear}_${quarterHour}`;
Datos y Fuentes
- Terrazas: censo oficial del Ayuntamiento de Madrid (CC BY 4.0)
- Edificios: OpenStreetMap contributors (ODbL)
- Calculo solar: SunCalc
- Proyeccion: EPSG:25830 -> WGS84
Limitaciones
- No considera arbolado real, toldos, sombrillas
- Overpass puede devolver menos edificios si la red/API esta lenta
- Por eso se trabaja por zona y se cachea
Implementacion en Hermes
Para replicar este patron:
- Usar Web Workers para calculos pesados de sombras
- Implementar cache por ubicacion + dia + franja horaria
- Usar Overpass API para footprints por zona (no todo el mapa de golpe)
- Estimar alturas con multiples fuentes: height, levels*3.2, fallback 10m
- Priorizar rendimiento percibido: primero calculo del punto seleccionado, luego cercanos
Pitfalls
- Overpass API rate limit — trabajar por zona visible, no descargar todo
- Web Worker — los calculos deben ir en hilo secundario para no bloquear UI
- Cache invalidation — invalidar cache cuando cambian datos de edificios
- Precision — comunicar claramente que las sombras son aproximadas