¿Y si hoy sales con un visor web funcionando y listo para mostrar en tu portafolio? mantén esta idea en mente mientras avanzas.
En menos de lo que dura un capítulo de tu serie favorita, tendrás una aplicación GIS web con las piezas clave para un mapa útil en campo, catastro, clima, movilidad o forestal.
Este tutorial está centrado en Leaflet y te guía en el paso a paso para montar el ambiente y aplicar el top 10 funcionalidades de Leaflet que más usan los equipos de cartografía y geomática en proyectos reales.
NOTA: el objetivo es hacerlo simple. Si ya programas en javascript, te sentirás como en casa. Si vienes del mundo SIG, vas a entender cada línea.
Qué necesitas antes de empezar (preparación del ambiente)
Requisitos mínimos
- Un editor de texto (visual studio code, sublime o tu favorito).
- Un navegador moderno.
- Conexión a internet para usar CDN de Leaflet y un mapa base.
Estructura sugerida de carpetas
mi-visor-leaflet/
script.js
index.html
styles.css
data/capas.geojson
img/marcador.png
Plantilla inicial
Crea index.html con este contenido base:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
<link rel="stylesheet" href="style.css">
<title>10 Funcionalidades</title>
</head>
<body>
<div id="map"></div>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="script.js"></script>
</body>
</html>
Crea un archivo script.js vacío. Ahí irá el código de las funcionalidades.
Y en otro archivo llamado styles.css deja lo siguiente para darle mejor aspecto:
#map {
position: absolute;
width: 100%;
height: 100%;
}
.leaflet-control-scale {
background-color: azure;
padding: 2px 6px;
border-radius: 4px;
font-size: 18px;
box-shadow: 0 0 5px rgba(0,0,0,0.3);
color: black;
}
1) Crear el mapa y definir vista inicial
Empezamos por lo básico: el contenedor #map ya está en el html. Ahora, en script.js inicializamos el mapa con una coordenada y nivel de zoom de arranque.
//Bogotá (puedes usar tu ciudad)
const map = L.map('map').setView([4.65, -74.1],12);
- Tip: el número de zoom va de 0 (todo el mundo) a ~19 (nivel calle). Para pruebas urbanas, 12–14 suele ir bien.

2) Agregar mapa base
Sin un mapa base es como tener un lienzo en blanco. Añadimos openstreetmap:
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
- Puedes añadir otros estilos (satélite, gris claro, topográfico) desde proveedores públicos. cambia la url del
tileLayery listo.

3) Agregar marcadores
Los marcadores muestran puntos de interés: pozos en campo, paraderos de movilidad, estaciones clima.
fetch('data/Cines.geojson')
.then(res => res.json())
.then(data => {
data.features.forEach(feature => {
const [lon,lat] = feature.geometry.coordinates;
const nombre = feature.properties.NOMBRE;
L.marker ([lat,lon])
.addTo(map)
.bindPopup(`<strong>${nombre}<strong/>`);
});
});
- Si quieres iconos propios, coloca un png en una carpeta dentro de tu proyecto llamada
img/y usaL.icon.
const icono = L.icon({
iconUrl: 'img/marcador.png',
iconSize: [24, 24],
iconAnchor: [12, 24],
popupAnchor: [0, -24]
});
L.marker([4.68, -74.08], { icon: icono }).addTo(map)
.bindPopup('sensor lluvia');

4) Control de capas
Cuando el visor crece, necesitas encender y apagar capas. El control de capas viene listo en la libreria Leaflet.
function agregarControlCapas(){
if(barriosLayer && viasLayer){
L.control.layers(null, {
"Barrios": barriosLayer,
"Vías": viasLayer
}).addTo(map);
}
}
- Deja
collapsed: truepara ahorrar espacio si tienes muchas capas.

5) Cargar datos geojson
El formato geojson es el puente entre tu análisis en Qgis/ArcGis y la web. Sirve para polígonos catastrales, rutas de buses, coberturas forestal.
fetch('data/Vias_principales_bogota.geojson')
.then(res=> res.json())
.then(data => {
viasLayer = L.geoJSON(data, {
onEachFeature: function (feature,layer){
const nombreVia = feature.properties.LABEL;
layer.bindPopup(`<strong>${nombreVia}<strong/>`)
}
});
viasLayer.addTo(map);
agregarControlCapas();
});
- Exporta desde Qgis: botón derecho sobre la capa → exportar → guardar como → formato
geojson.

6) Detectar clicks en el mapa
ideal para consultas espaciales rápidas o para capturar coordenadas en catastro.
map.on('click', function(e) {
L.popup()
.setLatLng(e.latlng)
.setContent("Coordenadas: " + e.latlng.toString())
.openOn(map);
});
- Puedes guardar esos puntos en tu backend más adelante; por ahora basta con mostrar la ventana emergente.

7) Dibujar formas geométricas
Para delimitar un predio, un área de clima o una zona de exclusión en movilidad.
L.circle([4.564105, -74.052143],{
radius: 1000,
color: 'red'
}).addTo(map).bindPopup("Radio de 1000 metros");
L.polygon([
[4.655,-74.11],
[4.66,-74.1],
[4.65,-74.09],
[4.645,-74.1]
], {
color: 'green'
}
).addTo(map).bindPopup("Zona de interés");
L.polyline([
[4.64, -74.12],
[4.645, -74.115],
[4.65, -74.11],
[4.655, -74.105]
],{
color: 'yellow',
weight: 5
}
).addTo(map).bindPopup("Ruta trazada");
- Más adelante puedes integrar el plugin leaflet.draw para edición interactiva, pero con esto ya comunicas ideas.

8) Hover para destacar
Mejorar la interacción sin click hace que los mapas interactivos se sientan fluidos. Usa eventos de mouseover y mouseout al cargar el geojson.
fetch('data/Barrios_bogota.geojson')
.then(res=> res.json())
.then(data => {
barriosLayer = L.geoJSON(data, {
style: {
color: "#3388ff",
weight: 1,
fillOpacity: 0.3
},
onEachFeature: function (feature, layer){
const nombreBarrio = feature.properties.BARRIO;
layer.on({
mouseover: function (e){
e.target.setStyle({
weight: 3,
color: "#FFD700",
fillOpacity: 0.5
});
},
mouseout: function(e){
barriosLayer.resetStyle(e.target);
}
});
layer.bindTooltip(nombreBarrio,{
permanent: false,
direction: 'center',
className: 'tooltip-barrio'
});
}
});
barriosLayer.addTo(map);
agregarControlCapas();
});
- Este patrón ayuda a leer polígonos densos, muy útil en cartografía urbana.

9) Control personalizado y zoom animado
Un botón propio mejora la experiencia sin recargar la interfaz. Además, el zoom animado ayuda a mejorar la interactividad.
const BtnCines = L.Control.extend({
onAdd: function(){
const btn = L.DomUtil.create('button');
btn.innerHTML = 'Cines';
btn.onclick = () => map.flyTo([4.65,-74.1],14);
return btn;
}
});
map.addControl(new BtnCines({position: 'topright'}));
flyTohace una animación agradable. para un salto inmediato usasetView.

10) Control de escala
Pequeño detalle que los usuarios esperan en un visor profesional.
L.control.scale({
position: 'bottomleft',
metric: true,
imperial: false,
maxWidth: 200,
updateWhenIdle: true
}).addTo(map);

Ejemplos rápidos por sector
Campo: marca pozos, dibuja un buffer de 300 m y destaca parcelas al pasar el cursor. Añade una capa geojson de fincas y un popup con hectáreas.
Catastro: carga manzanas y predios, agrega un control de capas para años diferentes. Con el click, muestra coordenadas y código catastral.
Clima: grupo de marcadores con estaciones y un polígono de zonas de alerta. Usa color fucsia para niveles altos y azul para niveles bajos.
Movilidad: rutas de bus en geojson, estaciones como markers y flyTo para ir a corredores clave. Escala visible para mediciones rápidas.
Forestal: polígonos de coberturas y hover para resaltar tipos. Combina un mapa base gris y capas en aguamarina para contraste.
Buenas prácticas para un visor limpio
- Rendimiento: simplifica geometrías al exportar desde Qgis. Menos vértices, más fluidez.
- Accesibilidad: colores con buen contraste (usa azul oscuro
#162b6fpara controles y aguamarina#2596bepara polígonos). - Móvil primero: usa
height: 100vhy evita controles gigantes. - Nombres claros:
predios_2024.geojsonmejor quecapa_nueva.geojson. - Atribución: si usas openstreetmap u otras fuentes, mantén el crédito.
Checklist final del top 10 funcionalidades de Leaflet
- Mapa y vista inicial ✅
- Mapa base ✅
- Marcadores ✅
- Control de capas ✅
- Datos geojson ✅
- Click en el mapa ✅
- Formas geométricas ✅
- Hover para destacar ✅
- Control personalizado y
flyTo✅ - Escala ✅
Si todo está marcado, ya tienes un visor javascript listo para mostrar.
Aquí te explico lo básico para echar a andar tu visor. En el video completo del canal verás el flujo y trucos paso a paso. https://youtu.be/BADB5Uu9mAw
Descarga la guía para crear un mapa desde cero con Leaflet: https://johagis.com/descargar-guia
Si quieres ahorrar tiempo, tengo una plantilla base de aplicación web gis lista para personalizar por 24 usd.
