Proyecto
Málaga en datos
Málaga en datos es una aplicación abierta, sin registro, que convierte los datos abiertos del Ayuntamiento de Málaga en respuestas a preguntas de cada día: qué tengo cerca andando, dónde reciclo las pilas, qué barrios lo tienen todo a mano, qué autobuses circulan ahora. La he hecho porque el portal de datos es un catálogo de ficheros y a la mayoría de la gente le sirve más un mapa que responde.
Puedes usarla tú mismo: abrir Málaga en datos. Toca cualquier punto del mapa, o usa tu ubicación (solo se calcula en tu navegador), y verás qué tienes cerca.
Qué se puede hacer
- Tu calle: desde cualquier punto, las calles alcanzables a pie en 5, 10 y 15 minutos, calculadas sobre la red de calles del Ayuntamiento y no en línea recta, y el servicio más cercano de cada tipo con su tiempo y su camino dibujado.
- Málaga a 15 minutos: cuánto tarda cada barrio en llegar andando a lo de uso diario, con el titular calculado con los datos (qué servicio falta a más gente). Se puede colorear también por zonas verdes por habitante, por mayores de 64 años o por edad media, y comparar dos barrios.
- Autobuses EMT: las 48 líneas con su recorrido real, sus paradas y los autobuses en circulación, que se actualizan solos mientras miras la línea. Cada parada muestra una estimación de cuándo llega el siguiente autobús, calculada con la posición del autobús sobre el trazado y el horario programado.
- Cómo llegar en autobús: de una dirección a otra (calle y número, con más de 100.000 portales reales), con las mejores combinaciones de líneas: propone la opción más rápida y alternativas con otras líneas, con las horas de salida y de cada autobús, los trasbordos, el camino a pie y todo dibujado en el mapa. Se calcula entero en el navegador con el horario programado de la EMT.
- Aire de la ciudad: las mediciones diarias de las cabinas de la zona de bajas emisiones, con su evolución y los días por encima del valor guía de la OMS, avisando de hasta qué fecha llegan los datos.
- Guías por situación: reciclar, ir en bici, movilidad reducida, coche eléctrico, con perro, hacer deporte, cultura y turismo, y lo que pasa hoy en la calle.
- Una ficha por lugar: con todos sus datos, su fuente, la fecha en que se recogieron, un enlace para compartirlo y qué hay cerca.
De dónde salen los datos
Todo sale del portal de datos abiertos del Ayuntamiento: unas 40 capas y casi 5.000 elementos (equipamientos, aparcamientos, contenedores, cortes de tráfico, líneas y paradas de la EMT, mediciones de calidad del aire), más el callejero, los barrios, los distritos y las zonas verdes para dibujar el mapa, y el padrón para los datos por barrio. Los recorridos y horarios de la EMT vienen del feed GTFS que publica la propia empresa. La licencia del portal casi siempre es CC BY-SA 4.0, así que los datos derivados se publican igual y con atribución en cada pantalla.
Al revisar los datos aparecieron cosas que no se ven a simple vista, y la aplicación las tiene en cuenta:
- La accesibilidad viene como «No» por defecto: el campo dice «No» en más del 99 % de los elementos, incluidas las bibliotecas. Mostrarlo habría sido desinformar, así que solo se marca como accesible lo que el Ayuntamiento marca expresamente.
- Cuatro capas están rotas en el origen: las fuentes de agua potable, los envases, el papel y los ecopuntos están vacíos o devuelven un error. Se han dejado fuera en lugar de enseñar un mapa vacío.
- El padrón por barrios más reciente es de 2021: se dice en cada cifra, y los barrios con menos de 200 habitantes o muy extensos (monte y campo) no se puntúan, porque su centro no representa dónde vive la gente.
- La calidad del aire no está al día: el Ayuntamiento publica una descarga acumulada que llega hasta una fecha pasada. La aplicación lo avisa arriba del todo y no la presenta como el aire de hoy.
Un servidor que pide con cuidado
Quería datos actualizados sin que cada visitante cargue al Ayuntamiento ni le envíe sus datos. Por eso el navegador nunca habla con el portal: lo hace un recolector en mi servidor, que deja ficheros estáticos que sirve nginx. Con esto no hay ningún servicio abierto a internet que atacar.
- Peticiones educadas: una a la vez y con una pausa de 4 segundos; cada capa respeta su intervalo (una vez al día casi todas, los cortes de tráfico cada 30 minutos); se pregunta si el dato ha cambiado antes de bajarlo; se respeta
Retry-After; si el portal falla, se espera cada vez más y se corta tras dos errores seguidos. Hay un tope por pasada y otro por día. - Autobuses en vivo: una petición pequeña cada dos minutos, solo de seis de la mañana a medianoche.
- Seguridad: solo HTTPS y un único host permitido, sin seguir redirecciones, con tope de tamaño y de tiempo; los textos se limpian de HTML; se comprueba que las coordenadas están en Málaga; nunca se sustituye una copia buena por datos vacíos o con una caída de más de la mitad; escritura atómica y bloqueo para que no corran dos a la vez. Corre con un usuario sin privilegios y solo puede escribir en su carpeta.
Lo aprendí a las malas: mientras estudiaba el catálogo, el portal me devolvió un error 503 tras varias consultas seguidas mías. De ahí que los límites sean tan estrictos.
Rutas a pie sin servicios de mapas
El mapa lo dibujo yo en un canvas con el callejero, los barrios y las zonas verdes del Ayuntamiento, sin librerías de mapas ni teselas de terceros. Con los tramos de vial construyo en el navegador un grafo de unos 31.000 vértices y recorro con el algoritmo de Dijkstra, acotado por distancia: calcular las calles alcanzables desde un punto tarda unos milisegundos. Con él calculo los tiempos reales de «Tu calle», el color de cada barrio y el trazado aproximado de cada línea de autobús.
Tiene límites que están dichos en la propia aplicación: los tiempos son a 4,8 km/h por calles del callejero, sin cruces ni semáforos ni cuestas, y el trazado de las líneas de autobús sigue las calles entre paradas pero no es el recorrido exacto.
SEO y primera carga
- Metadatos: título, descripción, canonical, Open Graph y Twitter Card con su imagen, y datos estructurados de aplicación web enlazados con el resto de la web.
- Primera carga solo de HTML: el inicio ya viene pintado en el HTML (unos 6 KB). El mapa y los datos se piden cuando el navegador ya ha pintado lo principal, y el mapa base completo, de unos 850 KB sin comprimir, se descarga una sola vez.
- Imágenes: todas en WebP y ninguna por encima de 200 KB, con nombres descriptivos y ancho y alto.
- Sin sorpresas: sin cookies, sin almacenamiento local, sin analítica y sin peticiones del navegador a terceros. La ubicación, si la pides, se usa solo en tu navegador.
Cómo está hecho
- Aplicación: Astro genera la página estática y el resto es JavaScript sin dependencias: un motor de mapa propio con zoom, arrastre y pellizco, vistas que se enlazan por la dirección (cada lugar y cada barrio tiene la suya) y un panel que pasa a hoja inferior en el móvil.
- Datos del mapa: el callejero, los barrios, las zonas verdes y los ríos se simplifican y se codifican por diferencias en enteros; el conjunto pesa unos 350 KB comprimido.
- Servidor: un recolector en Node.js sin dependencias, lanzado por un temporizador de systemd, y dos reglas de nginx: los datos con caché corta y la página con permiso de geolocalización solo para ella.
- Accesible: todo lo que enseña el mapa está también en el panel, con navegación por teclado y respetando la preferencia de movimiento reducido.
Herramientas e IA
El código lo he hecho con ayuda de Claude Code. Los datos son públicos y cada pantalla cita su fuente y su fecha. No es una aplicación oficial ni está vinculada al Ayuntamiento de Málaga.
Ver otros proyectos
Villa NereaWeb de alquiler con vídeo guiado por el scroll y reserva simulada.
BRIGANTFicha de producto de moda con compra simulada y SEO técnico.
Málaga en 3DMaqueta 3D del centro histórico con datos abiertos del IGN y el Catastro.
Vineyard & PeopleAplicación de vinos que dice cuánto encaja cada uno contigo.
The World CanvasPortada editorial diaria con IA y archivo del mundo.- AgentNodeVigilancia doméstica con análisis visual por IA. Hackathon OpenAI Build Week.