• Saltar a la navegación principal
  • Saltar al contenido principal
Geoinnova

Consultoría y Formación en SIG, Territorio y Medio Ambiente

  • Geoinnova
    • Quiénes somos
    • Coworking
    • Alianzas Estratégicas
    • Visor de proyectos Geoinnova
  • SIG y Desarrollo
    • Plugins QGIS
    • GeoNode
    • QElectricGIS
    • Planero Web
  • Consultoría Territorial
    • Planes de Emergencia Municipales de Protección Civil
    • Planes Urbanos de Actuación Municipal – PUAM
    • Evaluación Ambiental Estratégica de planes y programas
    • Minimización de Impacto Territorial y Declaración de Situación Individualizada en suelo no urbanizable
    • Turismo sostenible
  • Consultoría Ambiental
    • Trámites de Economía Circular
    • Prevención y gestión ambiental
    • Responsabilidad social corporativa
    • Estrategia de sostenibilidad
  • Formación
    • Todos los cursos
    • Formación para empresas
    • Máster y Diplomas
    • Cursos de QGIS Online Certificados
    • Cursos de programación, desarrollo SIG y geoservicios
    • Cursos de Teledetección
    • Cursos de Giswater
    • Cursos de SIG con ArcGIS
    • Cursos de Medio Ambiente
    • Campus
  • Divulgación
    • Blog
    • Tertulia Territorio Geoinnova
    • TFMs y otro trabajos de alumnos
    • Noticias
    • Webinars
    • Geolibrería
  • Contacto
    • Soporte – Tickets
CURSOS DE GISWATER APÚNTATE
Programación y Desarrollo SIG SIG

Cómo Implementar Clustering en OpenLayers

30/09/2025 Deja un comentario

Antes de implementar la funcionalidad de clustering en OpenLayers mediante un ejemplo práctico, es clave entender en qué consiste esta técnica y qué beneficios aporta.

¿Qué es el clustering y para qué sirve?

El clustering es una técnica utilizada para agrupar múltiples entidades (features) cercanas en una sola representación visual. Es especialmente útil en mapas que contienen una gran cantidad de puntos geográficos, ya que evita la saturación visual y mejora la experiencia de usuario.

Cuando muchas entidades están próximas entre sí (por ejemplo, marcadores de ubicaciones), el mapa puede volverse ilegible si se muestran todos a la vez. El clustering resuelve esto agrupando automáticamente las entidades en un solo símbolo, que puede mostrar cuántas entidades contiene. Al hacer zoom, los grupos se desagregan progresivamente hasta mostrar las entidades individuales.

Este enfoque resulta especialmente útil para:

  • Aplicaciones web geográficas con muchos datos puntuales (observaciones, incidencias, POIs).
  • Visualización de datos dinámicos o en tiempo real.
  • Interfaces donde la claridad y el rendimiento son prioritarios.
Contenidos ocultar
¿Qué es el clustering y para qué sirve?
¿Cómo funciona el clustering en OpenLayers?
Ejemplo básico: agrupación de puntos en OpenLayers con dos clusters diferenciados usando WFS reales
1. Cabecera: enlaces necesarios y estilos
2. Contenedor del mapa y leyenda
3. Inicializar la capa base
4. Cargar y agrupar puntos desde cat_c.json (magenta)
5. Cargar y agrupar puntos desde cat_a.json (azul)
6. Inicializar el mapa

¿Cómo funciona el clustering en OpenLayers?

OpenLayers utiliza la clase ol/source/Cluster, que toma como entrada una fuente vectorial (ol/source/Vector) y agrupa las entidades cercanas según la configuración de parámetros como:

  • distance: distancia en píxeles dentro de la cual las entidades se agrupan.
  • minDistance: (opcional) separación mínima garantizada entre clusters.

Estos parámetros son suficientes para obtener un resultado visual limpio y funcional sin necesidad de personalizar el comportamiento avanzado del clustering con otros parámetros como:

  • geometryFunction (opcional): permite indicar qué geometría se utiliza como punto de cálculo para el clustering. Por defecto se usa el centro de la geometría (getGeometry()), pero puede ajustarse para casos como polígonos.
  • createCluster (opcional): función personalizada para crear las entidades-cluster a partir del punto central y las features incluidas. Por defecto, devuelve una Feature con geometry y features.
  • wrapX (opcional): indica si se repite el mundo en el eje X (útil para mapas globales).

* Puedes consultar la documentación oficial en este enlace: https://openlayers.org/en/latest/apidoc/module-ol_source_Cluster-Cluster.html

Para nuestro ejemplo vamos a utilizar dos capas en formato GeoJSON publicadas en GitHub:

  • cat_c.json: puntos que agruparemos en magenta.
  • cat_a.json: puntos agrupados en azul.

Cada grupo tendrá su propio estilo de cluster para facilitar la identificación visual.

Ejemplo básico: agrupación de puntos en OpenLayers con dos clusters diferenciados usando WFS reales

Vamos a dividir el ejemplo en partes para facilitar su comprensión:

1. Cabecera: enlaces necesarios y estilos

Incluye la hoja de estilo y el script principal de OpenLayers. También definimos los estilos para el mapa:

<!-- Enlace a la hoja de estilos de OpenLayers -->
<link rel="stylesheet" href="https://openlayers.org/en/v6.5.0/css/ol.css" />
<!-- Script de OpenLayers -->
<script src="https://openlayers.org/en/v6.5.0/build/ol.js"></script>
<!-- Estilo básico para que el mapa ocupe toda la pantalla -->
<style>
  body {
    margin: 0;
    padding: 0;
    font-family: Arial, sans-serif;
  }
  #map {
    width: 100%;
    height: 100vh;
  }
  .legend {
    position: absolute;
    bottom: 10px;
    left: 10px;
    background: rgba(255, 255, 255, 0.8);
    padding: 10px;
    font-size: 14px;
    border-radius: 4px;
    box-shadow: 0 1px 3px rgba(0,0,0,0.3);
  }
  .legend-item {
    display: flex;
    align-items: center;
    margin-bottom: 4px;
  }
  .legend-color {
    width: 12px;
    height: 12px;
    margin-right: 8px;
    border-radius: 50%;
  }
  .magenta { background: #cc3399; }
  .blue { background: #3399cc; }
</style>

2. Contenedor del mapa y leyenda

Creamos el div que contendrá el mapa y una leyenda para explicar el significado de los colores:

<!-- Contenedor principal del mapa -->
<div id="map"></div>
<!-- Leyenda de colores para identificar cada capa -->
<div class="legend">
  <div class="legend-item"><span class="legend-color magenta"></span> cat_c.json (magenta)</div>
  <div class="legend-item"><span class="legend-color blue"></span> cat_a.json (azul)</div>
</div>

3. Inicializar la capa base

Creamos la capa de fondo utilizando OpenStreetMap:

// Capa base de OpenStreetMap
const baseLayer = new ol.layer.Tile({
  source: new ol.source.OSM()
});

4. Cargar y agrupar puntos desde cat_c.json (magenta)

Esta capa se agrupa usando ol/source/Cluster y se representa con estilo magenta:

const clusterSourceC = new ol.source.Cluster({
  distance: 40, // distancia en píxeles para agrupar
  source: new ol.source.Vector({
    url: 'https://raw.githubusercontent.com/erabasco/pruebas/refs/heads/main/cat_c.json',
    format: new ol.format.GeoJSON({
      defaultDataProjection: 'EPSG:3857',
      featureProjection: 'EPSG:3857'
    })
  })
});
const layerC = new ol.layer.Vector({
  source: clusterSourceC,
  style: function (feature) {
    const size = feature.get('features').length;
    return new ol.style.Style({
      image: new ol.style.Circle({
        radius: 15,
        fill: new ol.style.Fill({ color: '#cc3399' }),
        stroke: new ol.style.Stroke({ color: '#fff' })
      }),
      text: new ol.style.Text({
        text: size.toString(),
        fill: new ol.style.Fill({ color: '#fff' })
      })
    });
  }
});

5. Cargar y agrupar puntos desde cat_a.json (azul)

Mismo proceso que la anterior, pero con color azul:

const clusterSourceA = new ol.source.Cluster({
  distance: 40,
  source: new ol.source.Vector({
    url: 'https://raw.githubusercontent.com/erabasco/pruebas/refs/heads/main/cat_a.json',
    format: new ol.format.GeoJSON({
      defaultDataProjection: 'EPSG:3857',
      featureProjection: 'EPSG:3857'
    })
  })
});
const layerA = new ol.layer.Vector({
  source: clusterSourceA,
  style: function (feature) {
    const size = feature.get('features').length;
    return new ol.style.Style({
      image: new ol.style.Circle({
        radius: 15,
        fill: new ol.style.Fill({ color: '#3399cc' }),
        stroke: new ol.style.Stroke({ color: '#fff' })
      }),
      text: new ol.style.Text({
        text: size.toString(),
        fill: new ol.style.Fill({ color: '#fff' })
      })
    });
  }
});

6. Inicializar el mapa

Creamos el mapa, añadimos todas las capas y centramos la vista:

const map = new ol.Map({
  target: 'map',
  layers: [
    baseLayer,
    layerC,
    layerA
  ],
  view: new ol.View({
    center: ol.proj.fromLonLat([-3.5, 40.0]), // Centro aproximado de España
    zoom: 6
  })
});
// (Opcional) Captura de errores
map.on('error', function (event) {
  console.error('Error en el mapa:', event);
});

A continuación te dejamos todo el código completo y, pulsando sobre «Edit in JSFiddle»,
podrás acceder a este entorno online para ejecutarlo, personalizar los estilos, cambiar los archivos GeoJSON o ajustar los parámetros de agrupación como distance y minDistance.

Como has podido comprobar, con estas pocas líneas de código, puedes convertir cualquier conjunto de puntos en un mapa interactivo con clustering, mejorando tanto la visualización como la experiencia de uso en tus aplicaciones cartográficas.

Etiquetas: clustering, GeoJson, Openlayers, web mapping

Apúntate a nuestra newsletter semanal

"*" señala los campos obligatorios

Este campo es un campo de validación y debe quedar sin cambios.
Consentimiento*

Artículos relacionados

proyecto-qgis-rediam-geoinnova
El proyecto base de QGIS de la REDIAM con toda la información ambiental de Andalucía que probablemente no conocías
16/03/2026
Proyecto FirePaths: visor cartográfico avanzado para el análisis del riesgo de incendios forestales
30/01/2026
Republicar un WMS externo en GeoServer
09/02/2026

Eva Rabasco

Full Stack Developer. Comprometida con el diseño y desarrollo de materiales innovadores basados en la Web. Amplia experiencia en tecnologías específicas del lado cliente y del servidor.

Actualmente forma parte del equipo de Programación y Desarrollo SIG de la Asociación Geoinnova.

Además desarrolla su labor como docente en algunos de los cursos de bases de datos y de programación SIG del catálogo de cursos de Geoinnova.

Interacciones con los lectores

¿Quieres comentarnos algo? Adelante! Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Geoinnova
c/ Luis Morondo Urra nº 8 Bajo A
31006 Pamplona (Navarra)
info@geoinnova.org
+34 948 117 137

Horario de atención

Lunes a Viernes - 09:00 a 14:00 y de 16:00 a 19:00.
Fines de semana y Festivos - Exclusivamente por mail.
Horario de Verano (01 de julio al 30 de agosto): De lunes a viernes de 8 a 15h.

Otras páginas de interes

  • Promociones y descuentos en formación
  • Formación bonificada FUNDAE
  • Verificador y descarga de Certificados de aprovechamiento
  • Cursos certificable por QGIS.org

Legal

  • Aviso Legal
  • Política de privacidad
  • Política de seguridad
  • Política de cookies
  • Términos y condiciones
Entidad adherida a Confianza Online Certificado de inscripción en el Registro de huella de carbono, compensación y proyectos de absorción Logo Plazox Certificado de conformidad con el ENS

Todo el contenido publicado desde 2009 hasta 2026 en el Blog de Geoinnova por Geoinnova y colaboradores está licenciado bajo CC BY-NC-ND 4.0
Para usos específicos, contactar con Geoinnova.

© 2026 · Desarrollada por Geoinnova

Gestionar el Consentimiento de las Cookies
Utilizamos tecnologías como las cookies para almacenar y/o acceder a la información del dispositivo. Lo hacemos para mejorar la experiencia de navegación y para mostrar anuncios personalizados. El consentimiento a estas tecnologías nos permitirá procesar datos como el comportamiento de navegación o las identificaciones únicas en este sitio. No consentir o retirar el consentimiento, puede afectar negativamente a ciertas características y funciones.
Funcional Siempre activo
El almacenamiento o acceso técnico es estrictamente necesario para el propósito legítimo de permitir el uso de un servicio específico explícitamente solicitado por el abonado o usuario, o con el único propósito de llevar a cabo la transmisión de una comunicación a través de una red de comunicaciones electrónicas.
Preferencias
El almacenamiento o acceso técnico es necesario para la finalidad legítima de almacenar preferencias no solicitadas por el abonado o usuario.
Estadísticas
El almacenamiento o acceso técnico que es utilizado exclusivamente con fines estadísticos. El almacenamiento o acceso técnico que es utilizado exclusivamente con fines estadísticos anónimos. Sin una requerimiento, el cumplimiento voluntario por parte de su proveedor de servicios de Internet, o los registros adicionales de un tercero, la información almacenada o recuperada sólo para este propósito no se puede utilizar para identificarlo.
Marketing
El almacenamiento o acceso técnico es necesario para crear perfiles de usuario para enviar publicidad, o para rastrear al usuario en un sitio web o en varios sitios web con fines de marketing similares.
  • Administrar opciones
  • Gestionar los servicios
  • Gestionar {vendor_count} proveedores
  • Leer más sobre estos propósitos
Personalizar
  • {title}
  • {title}
  • {title}