En este blog, exploraremos cómo construir un geovisor web utilizando Leaflet y GeoServer para visualizar capas geoespaciales. Implementaremos capas base como Google Earth y OpenStreetMap, y agregaremos capas WMS desde un servidor GeoServer local, incluyendo la funcionalidad de obtener información emergente (popup) al hacer clic en polígonos.
1. Requisitos previos
Antes de empezar, asegúrate de tener instalado y configurado:
- GeoServer corriendo en
http://localhost:8080/geoserver - Capas publicadas en GeoServer con los nombres
trigal:parcelasytrigal:vertices - Un servidor web o simplemente abrir el HTML en un navegador
2. Estructura del proyecto
El proyecto estará compuesto por tres archivos:
index.html→ Estructura del visorstyles.css→ Estilos del mapascript.js→ Código Leaflet para manejar las capas y eventos
3. Código del Geovisor
Archivo index.html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Geovisor Parcelas</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<link rel="stylesheet" href="styles.css">
</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>
Archivo styles.css
#map {
height: 600px;
width: 100%;
}
Archivo script.js
var map = L.map('map').setView([-17.8, -63.2], 14);
// Capas base
var googleSat = L.tileLayer('https://{s}.google.com/vt/lyrs=s&x={x}&y={y}&z={z}', {
maxZoom: 20,
subdomains: ['mt0', 'mt1', 'mt2', 'mt3']
});
var osm = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
});
// Capas WMS desde GeoServer
var parcelas = L.tileLayer.wms("http://localhost:8080/geoserver/trigal/wms", {
layers: "trigal:parcelas",
format: "image/png",
transparent: true
});
var vertices = L.tileLayer.wms("http://localhost:8080/geoserver/trigal/wms", {
layers: "trigal:vertices",
format: "image/png",
transparent: true
});
// Control de capas
var baseMaps = {
"Google Earth": googleSat,
"OpenStreetMap": osm
};
var overlayMaps = {
"Parcelas": parcelas,
"Vértices": vertices
};
L.control.layers(baseMaps, overlayMaps).addTo(map);
googleSat.addTo(map);
// Obtener información de parcelas al hacer clic
map.on('click', function (e) {
var url = "http://localhost:8080/geoserver/trigal/wms?service=WMS&version=1.1.1&request=GetFeatureInfo" +
"&layers=trigal:parcelas&query_layers=trigal:parcelas&bbox=" + map.getBounds().toBBoxString() +
"&width=" + map.getSize().x + "&height=" + map.getSize().y + "&x=" +
Math.floor(map.latLngToContainerPoint(e.latlng).x) + "&y=" +
Math.floor(map.latLngToContainerPoint(e.latlng).y) +
"&info_format=application/json";
fetch(url)
.then(response => response.json())
.then(data => {
if (data.features.length > 0) {
var feature = data.features[0];
var idpredio = feature.properties.idpredio;
L.popup()
.setLatLng(e.latlng)
.setContent("<b>ID Predio:</b> " + idpredio)
.openOn(map);
}
});
});
4. Explicación del código
- Se crea el mapa con Leaflet y se define su centro y nivel de zoom inicial.
- Se añaden capas base como Google Earth y OpenStreetMap.
- Se agregan capas WMS desde GeoServer para mostrar parcelas y vértices.
- Se implementa un control de capas para alternar entre bases y overlays.
- Se usa un evento
clicken el mapa para obtener información de los polígonos mediante una petición WMS GetFeatureInfo. - Se muestra un popup con el
idprediodel polígono clicado.
5. Prueba y despliegue
Para probar el visor, solo necesitas abrir index.html en un navegador. Si deseas desplegarlo en un entorno web real, puedes usar un servidor local como XAMPP, WAMP o Python HTTP Server.
Conclusión
Este geovisor permite visualizar información geográfica interactiva a partir de capas publicadas en GeoServer. Leaflet proporciona una solución ligera y flexible para la visualización de datos espaciales en la web. Con más personalización, puedes mejorar este visor añadiendo controles adicionales, estilos personalizados y más capas geoespaciales.
¿Tienes dudas o sugerencias? ¡Déjalas en los comentarios! 🚀