Laboratorio Frontend

Leaflet.js Components Lab

Laboratorio frontend de mapas interactivos con Leaflet. Ocho patrones en vivo sobre datos reales de Chile —del marcador al choropleth con leyenda— con render diferido, tema claro/oscuro sincronizado y cero herramientas de build.

Vista del Leaflet Components Lab: silueta de Chile con marcadores, clúster de 346 comunas y leyenda de densidad
El Contexto

No es un Mapa Suelto: es Arquitectura Geográfica

Leaflet expone un API modular: capas base, vectores, GeoJSON, plugins de clustering y controles. Cada mapa parece un caso aparte, con su inicialización, sus datos y su manejo de tema.

Sin una capa de abstracción, cada mapa vuelve a ser copia del mismo boilerplate. El desafío fue construir un sistema donde añadir un mapa cueste una entrada en un registro, no cien líneas duplicadas.

Sin arquitectura

  • Inicialización copiada y pegada por cada mapa
  • Tema oscuro/claro rompe basemap y popups
  • Mapas pesados inicializados de golpe al cargar
  • Capas y listeners sin lifecycle: fugas de memoria
  • Datos geográficos dispersos y duplicados
La Solución

Un Sistema de Componentes de Mapa

Map Factory

createMap() centraliza la inicialización con defaults mergeados: bounds de Chile, atribución y renderer.

Registry de Mapas

Separar definición de instanciación: cada mapa vive en MAP_REGISTRY reutilizable.

Lazy Rendering

IntersectionObserver inicializa cada mapa al entrar en viewport, con skeleton e invalidateSize().

Theme Adapter

Basemap Carto light/dark y tokens CSS sincronizan con data-bs-theme sin flicker.

Buenas Prácticas

Decisiones con Evidencia en el Código

Contenedores Responsivos

Altura explícita + invalidateSize() al revelar. El mapa se adapta al contenedor, nunca al revés.

Performance Canvas

preferCanvas, chunkedLoading y keepBuffer mantienen 346 puntos fluidos sin jank.

Accesibilidad Geográfica

Cada mapa con role="region" + aria-label. Tabla HTML alternativa en <details> y navegación teclado nativa.

Galería y Métricas
8

Patrones de mapa

16

Regiones GeoJSON

346

Comunas en clúster

0

Dependencias de build

Showcase Interactivo

Ocho Mapas, Un Sistema

La rueda del mouse se habilita al hacer clic o enfocar un mapa con teclado, para no secuestrar el desplazamiento de la página. Cada patrón incluye su tabla de datos como alternativa accesible.

Mapa Base + Capas

L.control.layers
Ver datos en tabla
CapaProveedorUso
Carto LightCARTO (OSM)Base clara por defecto
Carto DarkCARTO (OSM)Base oscura por defecto
OpenStreetMapOpenStreetMapCapa alternativa manual

Marcadores + Popups

L.marker
Ver datos en tabla
CapitalRegiónPoblación
AricaArica y Parinacota221.364
IquiqueTarapacá191.468
AntofagastaAntofagasta361.873
CopiapóAtacama158.438
La SerenaCoquimbo205.531
ValparaísoValparaíso296.655
SantiagoMetropolitana404.495
RancaguaO'Higgins214.344
TalcaMaule201.815
ChillánÑuble161.963
ConcepciónBiobío223.574
TemucoLa Araucanía223.724
ValdiviaLos Ríos150.125
Puerto MonttLos Lagos218.858
CoyhaiqueAysén53.410
Punta ArenasMagallanes120.760

Símbolos Proporcionales

circleMarker
Ver datos en tabla
RegiónPoblaciónRadio px
Metropolitana7.112.80830,0
Valparaíso1.815.90218,1
Biobío1.556.80517,2
Maule1.044.95015,2
La Araucanía957.22414,8
O'Higgins914.55514,6
Los Lagos828.70814,2
Coquimbo757.58613,8
Antofagasta607.53413,0
Ñuble480.60912,2
Los Ríos384.83711,6
Tarapacá330.55811,2
Atacama286.16810,8
Arica y Parinacota226.06810,3
Magallanes166.5339,7
Aysén103.1588,9

Regiones GeoJSON

L.geoJSON
Ver datos en tabla
RegiónSuperficie km²Población
Tarapacá42.226,0330.558
Antofagasta126.049,1607.534
Atacama75.176,0286.168
Coquimbo40.580,0757.586
Valparaíso16.396,11.815.902
O'Higgins16.363,9914.555
Maule30.296,11.044.950
Biobío23.890,21.556.805
La Araucanía31.842,3957.224
Los Lagos48.583,6828.708
Aysén108.494,4103.158
Magallanes138.229,1166.533
Metropolitana15.403,27.112.808
Los Ríos18.429,5384.837
Arica y Parinacota16.873,3226.068
Ñuble13.178,5480.609

Choropleth + Leyenda

choropleth
Ver datos en tabla
RegiónDensidad hab/km²Clase
Tarapacá7,835 – 20
Antofagasta4,82< 5
Atacama3,81< 5
Coquimbo18,675 – 20
Valparaíso110,7640 – 150
O'Higgins55,9040 – 150
Maule34,4920 – 40
Biobío65,1640 – 150
La Araucanía30,0620 – 40
Los Lagos17,065 – 20
Aysén0,95< 5
Magallanes1,20< 5
Metropolitana461,77> 150
Los Ríos20,8820 – 40
Arica y Parinacota13,405 – 20
Ñuble36,4720 – 40

Fuente: INE, Censo 2017 (población) · SUBDERE (superficie).

Clustering de Comunas

markerCluster
Ver datos en tabla
MacrozonaComunasEjemplos
Norte Grande29Putre, Camiña, María Elena
Norte Chico15Ovalle, Andacollo, Los Vilos
Zona Centro153Codegua, Coltauco, Marchigüe
Zona Sur98Cunco, Freire, Galvarino
Zona Austral50Fresia, Llanquihue, Puqueldón

Total: 346 comunas, incluida la comuna de la Antártica.

Ruta 5 Norte–Sur

L.polyline
Ver datos en tabla
HitoLatLng
Arica-18.4783-70.3126
Iquique-20.2133-70.1503
Quillagua-21.6533-69.5350
Tocopilla-22.0899-70.2018
Antofagasta-23.6509-70.3975
Carmen Alto-23.6689-69.8447
Chañaral-26.3486-70.6206
Copiapó-27.3664-70.3325
Vallenar-28.5754-70.7595
La Serena-29.9045-71.2489
Los Vilos-31.9105-71.5102
Santiago-33.4489-70.6693
Rancagua-34.1708-70.7444
Talca-35.4264-71.6554
Chillán-36.6064-72.1033
Los Ángeles-37.4697-72.3541
Temuco-38.7359-72.5904
Osorno-40.5740-73.1422
Puerto Montt-41.4693-72.9414
Castro-42.4806-73.7613
Quellón-43.1197-73.6312

Trazado simplificado de la Ruta 5: ~3.360 km entre Arica y Quellón.

Control Custom + DivIcon

L.Control
Ver datos en tabla
ElementoAPIFunción
Botón Volver a ChileL.Control.extendReinicia el zoom a la vista nacional
Pin SantiagoL.divIconMarcador HTML custom en la capital
Pulso del pinCSS @keyframesAnillo animado, desactivado con reduced-motion
Stack Tecnológico

Herramientas del Laboratorio

Núcleo

Leaflet 1.9.4 Canvas/SVG renderer JavaScript ES6+ HTML5 CSS3

Plugins

Leaflet.markercluster 1.5.3

Patrones

Factory Registry Observer Adapter 0 dependencias de build

Accesibilidad

role="region" aria-label Tabla fallback Navegación teclado

¿Necesitas mapas claros y mantenibles?

Construyo visualizaciones geográficas interactivas sobre Leaflet: performance, accesibilidad y tema claro/oscuro.