• 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
Especialista Universitario 2 MATRICÚLATE AHORA
Programación y Desarrollo SIG SIG Tecnología

Cómo cargar y superponer múltiples capas GeoJSON con diferentes proyecciones en OpenLayers

13/02/2024 Deja un comentario

En el mundo del desarrollo web cartográfico, la superposición de múltiples capas GeoJSON con proyecciones diferentes es una tarea común pero crucial. OpenLayers, una potente biblioteca JavaScript de código abierto para mapas interactivos, ofrece herramientas para manejar esta complejidad de manera efectiva.

Sistemas de Referencia en OpenLayers

OpenLayers trabaja con varios sistemas de referencia comunes, entre los que se incluyen:

  • EPSG:4326 (WGS 84): Sistema de coordenadas geográficas utilizado ampliamente, expresado en grados decimales de latitud y longitud.
  • EPSG:3857 (Sistema de Coordenadas Mercator Web): Un sistema de coordenadas proyectadas que se utiliza comúnmente para visualizaciones web, expresado en metros.
  • Otros sistemas de referencia, como EPSG:25830 (UTM Zone 30N), que también pueden ser compatibles con OpenLayers.

Al cargar capas GeoJSON con diferentes proyecciones, es fundamental transformar las coordenadas para que se ajusten a la proyección del mapa base. Esto garantiza una superposición precisa de los datos y una visualización correcta.

En este artículo, exploraremos cómo cargar y superponer capas GeoJSON con distintas proyecciones utilizando OpenLayers. Además, proporcionaremos un ejemplo práctico para comprender mejor el proceso.

Contenidos ocultar
Añadiendo la librería Openlayers y Proj4js
Establecer el tamaño del mapa
Registrar las proyecciones
Función para transformar coordenadas
Función para cargar y transformar GeoJSON
Crear una capa de teselas
Crear el mapa base y la vista
Cargar, transformar GeoJSON a EPSG:3857 y añadir al mapa
Quizás te interese

En nuestro ejemplo, cargaremos dos capas GeoJSON con proyecciones diferentes y las superpondremos en un mapa base. La primera capa estará en la proyección EPSG:4326* (WGS 84), mientras que la segunda estará en EPSG:25830 (UTM 30N).

*Aunque no sería necesaria la transformación de la capa en la proyección EPSG:4326 ya que OpenLayers la acepta de forma predeterminada, nos servirá como ejemplo.

Añadiendo la librería Openlayers y Proj4js

El primer paso consiste en incluir tanto la biblioteca OpenLayers como Proj4 para asegurarnos de tener acceso a todas las funcionalidades necesarias. Esto nos permitirá cargar, manipular y visualizar capas GeoJSON con diversas proyecciones de manera efectiva en OpenLayers.

<!DOCTYPE html>
<html>
  <head>
    <title>Cargar y superponer múltiples capas GeoJSON con diferentes proyecciones</title>
    
    <!-- Incluimos el CSS de OpenLayers para estilizar el mapa -->
    <link rel="stylesheet" href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" type="text/css">
    
    <!-- Incluimos nuestro archivo de estilos personalizado -->
    <link rel="stylesheet" href="styles.css">
  </head>
  <body>
    <!-- Contenedor donde se renderizará el mapa -->
    <div id="map"></div>
    
    <!-- Incluimos la librería de OpenLayers para poder utilizar sus funciones -->
    <script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
    
    <!-- Incluimos la librería Proj4js para manejar las proyecciones espaciales -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.7.2/proj4.js"></script>
    
    <!-- Incluimos nuestro archivo JavaScript principal donde se encuentra la lógica del mapa -->
    <script src="main.js"></script>
  </body>
</html>

Además, integraremos tanto nuestros estilos personalizados como el CSS de OpenLayers, junto con nuestro archivo principal JS que contiene la lógica del mapa.

Establecer el tamaño del mapa

Definiremos el tamaño del mapa desde el archivo CSS. El fragmento de código CSS proporcionado asegura que el elemento con el ID ‘map’ ocupe todo el ancho disponible y el 98% de la altura visible del viewport

#map {
    width: 100%;
    height: 98vh;
}

Registrar las proyecciones

OpenLayers no trabaja por defecto con la proyección EPSG:25830 (UTM Zona 30). Por lo que, utilizaremos la biblioteca proj4js para registrar esta proyección y asegurar que pueda entender y trabajar con coordenadas en este sistema de referencia.

// Esta proyección es una proyección UTM Zona  30 basada en el sistema de referencia GRS80.
proj4.defs("EPSG:25830", "+proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs");
ol.proj.proj4.register(proj4);

Función para transformar coordenadas

Ahora, implementaremos la función transformCoordinates para transformar las coordenadas, en este caso, de la proyección EPSG:25830 a EPSG:3857, que es la proyección utilizada por OpenLayers por defecto para los mapas web.

function transformCoordinates(coordinateSystem, coordinates) {
  return proj4(coordinateSystem, 'EPSG:3857', coordinates);
}

Función para cargar y transformar GeoJSON

Esta función loadAndTransformGeoJson cargará un archivo GeoJSON desde una URL dada y transforma sus coordenadas a la proyección EPSG:3857. También permite especificar un color para los puntos que serán dibujados en el mapa.

function loadAndTransformGeoJson(url, coordinateSystem, color) {
  fetch(url)
    .then(response => response.json())
    .then(data => {
      // Creamos una nueva fuente vectorial vacía donde almacenaremos las características transformadas.
      const transformedVectorSource = new ol.source.Vector();
      // Recorremos cada característica del GeoJSON.
      data.features.forEach(feature => {
        // Transformamos las coordenadas de la característica a la proyección que se recibe como parámetro
        const transformedCoordinates = transformCoordinates(coordinateSystem, feature.geometry.coordinates);
        // Creamos una nueva característica con las coordenadas transformadas.
        const transformedFeature = new ol.Feature({
          geometry: new ol.geom.Point(transformedCoordinates)
        });
        // Agregamos la característica transformada a la fuente vectorial.
        transformedVectorSource.addFeature(transformedFeature);
      });
      // Creamos una capa vectorial con la fuente vectorial transformada y un estilo personalizado.
      const transformedVectorLayer = new ol.layer.Vector({
        source: transformedVectorSource,
        style: new ol.style.Style({
          image: new ol.style.Circle({
            radius:   15,
            fill: new ol.style.Fill({
              color: color
            }),
            stroke: new ol.style.Stroke({
              color: 'white',
              width:   2
            })
          })
        })
      });
      // Agregamos la capa vectorial transformada al mapa.
      map.addLayer(transformedVectorLayer);
    })
    .catch(error => {
      console.error('Error al cargar y transformar el GeoJSON:', error);
    });
}

Crear una capa de teselas

Esta parte del código crea una capa de teselas para servir como fondo del mapa, utilizando el servicio de teselas OSM (OpenStreetMap).

// Servicio de teselas OSM.
const OSM = new ol.layer.Tile({
  source: new ol.source.OSM()
});

Crear el mapa base y la vista

Aquí inicializamos el mapa con la capa de teselas. Además, se crea una vista centrada en las coordenadas de Madrid.

// Creamos una vista centrada en las coordenadas de Madrid para el mapa.
const view = new ol.View({
  center: ol.proj.fromLonLat([-3.705983,   40.41903]),
  zoom:   15
});
// Inicializamos el mapa con la capa de teselas y la capa vectorial en EPSG:4326.
const map = new ol.Map({
  target: 'map',
  layers: [OSM],
  view: view
});

Cargar, transformar GeoJSON a EPSG:3857 y añadir al mapa

Finalmente, se cargan los dos archivos GeoJSON, se transforman a la proyección EPSG:3857 (comúnmente utilizada por OpenLayers), y se añaden al mapa con estilos de color proporcionados como argumentos (rojo y azul).

loadAndTransformGeoJson('./data/map25830.geojson', 'EPSG:25830', 'red');
loadAndTransformGeoJson('./data/map4326.geojson', 'EPSG:4326', 'blue');

En la imagen se puede apreciar la disposición final de las capas, mostrando cómo se superponen y complementan los datos geoespaciales representados en el mapa.

Puedes examinar el código completo del script y realizar pruebas interactivas para explorar las funciones del mapa de manera dinámica desde el siguiente enlace:

Quizás te interese

Trabajando con proyecciones en QGIS

Trabajando con proyecciones en QGIS

Curso de Desarrollo de visores de mapas web

Curso de Desarrollo de visores de mapas web

Etiquetas: EPSG:25830, EPSG:3857, EPSG:4326, GeoJson, Openlayers, reproyección, sistemas de referencia

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

Visualizar series temporales con OpenLayers y servicios WMS
Cómo visualizar series temporales con OpenLayers y servicios WMS
24/10/2025
Cómo Implementar Clustering en OpenLayers
Cómo Implementar Clustering en OpenLayers
15/07/2025
Animar rutas o trayectorias con OpenLayers
Animar rutas o trayectorias con OpenLayers
04/03/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}