💡 OBJETIVOS DE LA ACTIVIDAD:

► Conocer el concepto de Sistema de Coordenadas de Referencia.

► Reconocer la importancia de un correcto manejo de los CRS en el análisis de ficheros en formato ráster, y en particular, en el análisis de imágenes de satélite.

💡 MATERIALES PARA LA ACTIVIDAD:

fichero_datos_reproyección.

script_laboratorio_3_reproyección.

INTRODUCCIÓN

En cualquier aspecto del análisis geoespacial, verificar y garantizar el ajuste espacial y la conformidad de las proyecciones es una tarea fundamental. Para ello, debe definirse el sistema de referencia de coordenadas (en inglés CRS).

LOS SISTEMAS DE COORDENADAS DE REFERENCIA

¿Qué es un Sistema de coordenadas de referencia?

Un sistema de coordenadas de referencia (CRS) puede ser tan simple y arbitrario como la cuadrícula creada para muestrear una parcela o tan complejo como para abarcar todo el planeta. Se puede definir como un marco de referencia local, regional o global, basado en coordenadas, que se utiliza para representar gráficamente (en un mapa) las ubicaciones reales de entidades geográficas.

Los criterios para diferenciarlos son diversos, pero esencialmente se puede recurrir al :

► El marco de medición, que puede ser geográfico (coordenadas esféricas) o planimétrico (coordenadas proyectadas sobre una superficie plana).

► La unidad de medición, generalmente metros para sistemas de coordenadas proyectadas o grados (latitud/longitud) para coordenadas geográficas.

Además, los CRS presentan otras características adicionales, como el esferoide de referencia, el datum y otros parámetros de proyección (uno o más paralelos estándar, meridiano central o posibles cambios en las direcciones de x e y) etc…

Clasificación de los sistemas de coordenadas de referencia

A partir de esos criterios, los sistemas de coordenadas de referencia se clasifican en dos grandes grupos:

Sistema de coordenadas geográficas: las ubicaciones se definen en términos de valores de latitud y longitud (coordenadas medidas desde el centro de la Tierra) sobre una superficie esférica, de tres dimensiones, siendo la unidad de medida los grados. Esto supone que distancias y otros parámetros topográficos no pueden evaluarse con precisión.

Sistemas de coordenadas proyectadas, también denominadas proyecciones cartográficas. Se basan en la proyección de una superficie curva sobre una superficie plana bidimensional, empleando fórmulas matemáticas para relacionar las coordenadas esféricas con las coordenadas cartesianas (x, y) que definen las ubicaciones de las entidades geográficas. A diferencia del sistema de coordenadas geográficas, el sistema de coordenadas proyectadas permite cálculos como distancias, áreas constantes etc, pero todas incorporan algunas distorsiones en esas magnitudes. Algunas de las proyecciones más famosas son la ‘Mercator’, ‘UTM’, ‘Robinson’, ‘Lambert’, ‘Sinusoidal’ ‘Robinson’ y ‘Albers’. No existe una proyección mejor que otras; algunas pueden usarse para todo el planeta, mientras que otras son apropiadas para áreas pequeñas. Una de las características más importantes de la proyección es si es corresponde a las conocidas como de “áreas iguales” (la escala del mapa es constante) o las “conformes” (las formas como se ven en un globo). Ninguna proyección puede ser a la vez conforme y de áreas iguales (pero pueden ser aproximadamente ambas para áreas más pequeñas, por ejemplo, UTM o Lambert Equal Area para un área grande).

La notación de los Sistemas de coordenadas de rerencia en R

Tradicionalmente, las proyecciones en R usaron la notación PROJ.4, nombre de una biblioteca de software en código abierto. En esta notación, cada proyección era identificada mediante una cadena de caracteres que almacenaba los parámetros que describen tanto la proyección como el sistema de coordenadas. Este formato es conocido como proj4string. Por ejemplo, un sistema de coordenadas geográfico (no proyectado) que utiliza la proyección UTM para el centro de la Península Ibérica (WGS 84/UTM 30N) se define por la siguiente cadena de caracteres “+proj=longlat + datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0”.

proj=longlat: los datos utilizan un sistema de coordenadas geográficas (latitud y longitud).

datum=WGS84: el datum WGS84 (el datum hace referencia a un punto de origen de los ejes de coordenadas).

ellps=WGS84: el elipsoide (como se calcula la esfericidad de la Tierra).

Hoy en día, a los sistemas de proyección más utilizados se les asigna un código EPSG, un código corto compilado originalmente por el European Petroleum Survey Group. Los códigos EPSG con los Sistemas de Referencia de Coordenadas (CRS) utilizados en la representación cartográfica de los servicios Web de Mapas (WMS) del Nodo IDE del MAPAMA son los siguientes (pulsar el enlance para ampliar información sobre cada código):

En coordenadas geográficas: EPSG:4230 (ED50) EPSG:4326 (WGS84) EPSG:4258 (ETRS89)

En coordenadas UTM: EPSG:32628 (WGS84 / UTM zone 28N) EPSG:32629 (WGS84 / UTM zone 29N) EPSG:32630 (WGS84 / UTM zone 30N) EPSG:32631 (WGS84 / UTM zone 31N) EPSG:25828 (ETRS89 / UTM zone 28N) EPSG:25829 (ETRS89 / UTM zone 29N) EPSG:25830 (ETRS89 / UTM zone 30N) EPSG:25831 (ETRS89 / UTM zone 31N) EPSG:23028 (ED50 / UTM zone 28N) EPSG:23029 (ED50 / UTM zone 29N) EPSG:23030 (ED50 / UTM zone 30N) EPSG:23031 (ED50 / UTM zone 31N)

Podemos conocer algo más sobre los sistemas de referencia en las siguientes páginas web: Sistemas de referencia. Coordinate Systems Worldwide En qué zona UTM me encuentro

Página web Spatial Reference
Página web Spatial Reference

CRS DE OBJETOS RÁSTER

Es muy habitual que, a la hora de trabajar que diferentes fuentes de información, los objetos espaciales no estén proyectados, o puedan estarlo en diferentes CRS. Por ello, deben transformarse en un CRS común para realizar la mayoría de las operaciones típicas de un entorno SIG. Los casos más habituales de transformación de CRS son los siguientes:

► La asignación de un CRS a un objeto que no disponía de CRS previo.

► El cambio del CRS de un objeto a un sistema de proyección diferente.

En esta sesión se trabajará con los paquetes sf (para objetos vectoriales) y terra (para objetos ráster).

library(terra)
## Warning: package 'terra' was built under R version 4.3.3
## terra 1.8.21

El ejercicio comienza creado un objeto ráster a partir de una matriz de datos.

matriz <- matrix(1:36, 6, 6)
matriz
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    7   13   19   25   31
## [2,]    2    8   14   20   26   32
## [3,]    3    9   15   21   27   33
## [4,]    4   10   16   22   28   34
## [5,]    5   11   17   23   29   35
## [6,]    6   12   18   24   30   36
base <- rast(matriz)

Una vez creada, el objeto matriz puede ser eliminado ya que no será utilizado

rm(matriz)

El paquete terra contiene varias funciones relacionadas con los sistemas de coordenadas de referencia.

► Para identificar el CRS de un objeto ráster se usa:

• crs(nombre_raster)

► Para asignar un CRS a un objeto que carece de él:

• crs(nombre_raster) <- “EPSG:4326”

► Para cambiar el CRS de un objeto raster en otro CRS:

• nuevoRaster <- project(antiguoRaster, nuevo_crs))

Asignación del CRS a un objeto ráster sin proyección.

Se puede consultar el CRS de un objeto ráster con las siguientes funciones.

crs(base) 
## [1] ""

R devuelve una cadena vacía (““), mensaje por el cual se nos informa que el ráster no tiene un CRS definido.

Para asignarle un CRS escribiendo directamente el código EPSG.

crs(base) <- "EPSG:4326"
base
## class       : SpatRaster 
## dimensions  : 6, 6, 1  (nrow, ncol, nlyr)
## resolution  : 1, 1  (x, y)
## extent      : 0, 6, 0, 6  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326) 
## source(s)   : memory
## name        : lyr.1 
## min value   :     1 
## max value   :    36

Transformación del CRS de un ráster a otro CRS (reproyección)

La proyección y/o reproyección de un objeto ráster supone un problema que no tienen los objetos vectoriales: las nuevas ubicaciones de los píxeles no tienen por qué coincidir con las localizaciones antiguas una vez reproyectados, ya que han sido “obligadas” a encajarse en otras cuadrículas con una disposición diferente. Los píxeles de un objeto ráster poseen el mismo tamaño (en términos de las unidades del CRS aunque su tamaño real puede variar), por lo que no es posible transformar celda a celda.

El cálculo de los valores de los píxeles reproyectados se puede realizar a partir de los valores de los píxeles del ráster original. Por lo tanto, será necesario interpolar esos valores. Esto significa calcular un valor promedio ponderado de los píxeles circundantes más cercanos (cuatro píxeles en la práctica). Alternativamente, se podría usar el método de remuestreo del vecino más cercano, que recoge el valor del píxel más cercano, evitando así el promedio, pero esto tiende a dar resultados bastante pixelados y es formalmente menos correcto. Se recomienda:

► Si los valores del ráster son categóricos (por ejemplo, usos del suelo), se recomienda el uso del método del vecino más cercano (Nearest neighbor, argumento “ngb”)

► Si la variable del ráster es continúa (por ejemplo, la altitud) la interpolación se realiza con el método bilineal (argumento “bilinear”).

Método Descripción
“near” Vecino más cercano (categorías, uso de suelo, clases)
“bilinear” Bilineal (suavizado, datos continuos como temperatura
“cubic” Cúbica (suavizado con más precisión, datos continuos
“cubicspline” Spline cúbico; más suavizado que “cubic”
“lanczos” Lanczos; para imágenes y datos con detalles finos
“min” Mínimo de valores vecinos
“max” Máximo de valores vecinos
“mode” Valor más frecuente (moda); también útil para datos categóricos)

Además del suavizado de los valores originales, la reproyección de rásteres con cualquier método que no sea el del vecino más cercano es irreversible: no hay forma de volver a los valores originales. Por lo tanto, si tiene que elegir entre volver a proyectar datos vectoriales para que coincidan con su proyección ráster o volver a proyectar el ráster para que coincida con la proyección vectorial, se recomienda optar por proyectar los objetos vectoriales, que es, además, mucho más rápida.

Interpolación con el método bilinear
Interpolación con el método bilinear

Reproyección de un raster con variables continuas.

A continuación se diseñará un objeto ráster formado por 81 celdas, a las que se incorporarán las coordenadas geográficas.

base <- rast(ncols= 12,                          # Número de columnas del ráster
             nrows= 12,                          # Número de filas
             xmax= -3, xmin= -4,                # Coordenadas del eje X (considerémoslas la longitud)
             ymax= 43, ymin= 42)                # Coordenadas del eje y (idem latitud)
base
## class       : SpatRaster 
## dimensions  : 12, 12, 1  (nrow, ncol, nlyr)
## resolution  : 0.08333333, 0.08333333  (x, y)
## extent      : -4, -3, 42, 43  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84)

Este objeto ráster se rellenará con los siguientes valores

values(base) <- runif(ncell(base),
                      min = 1,
                      max= 6)

Llamando al objeto ráster se puede conocer las características de dicho objeto.

base
## class       : SpatRaster 
## dimensions  : 12, 12, 1  (nrow, ncol, nlyr)
## resolution  : 0.08333333, 0.08333333  (x, y)
## extent      : -4, -3, 42, 43  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) 
## source(s)   : memory
## name        :    lyr.1 
## min value   : 1.027391 
## max value   : 5.985348

La función terra::project()[https://rspatial.github.io/terra/reference/project.html] reproyecta un objeto SpatRaster a un nuevo CRS, en este caso ETRS89 / UTM zone 30N. Como es un ráster con valores continuos, se aplicarán los métodos bilinear y cubic.

base_bil <- project(base, 
                method = "bilinear", 
                "EPSG:25830")
crs(base_bil, describe = TRUE)
##                    name authority  code
## 1 ETRS89 / UTM zone 30N      EPSG 25830
##                                                                                                                                                               area
## 1 Europe between 6°W and 0°W: Faroe Islands offshore; Ireland - offshore; Jan Mayen - offshore; Norway including Svalbard - offshore; Spain - onshore and offshore
##                      extent
## 1 -6.00, 0.01, 35.26, 80.49

Método de interpolación “cúbico”.

base_cub <- project(base, 
                method = "cubic", 
                "EPSG:25830")

En la siguiente imagen se representa el objeto ráster original y los resultantes de la reproyección con diferentes métodos.

# Dos filas, dos columnas
par(mfcol = c(2, 2))

# Gráficos
plot(base, main = "Datos originales")
text(base, digits=1, cex = 0.5)
plot(base_bil, main = "Reproyección bilinear")
text(base_bil, digits=1, cex = 0.5)
plot(base_cub, main = "Reproyección cúbica")
text(base_cub, digits=1, cex = 0.5)

# Volvemos al estado original
par(mfcol = c(1, 1))

Obsérvese que, mientras en los datos originales el CRS sigue coordenadas geográficas (valores de latitud y longitud), en los objetos reproyectados con el nuevo CRS las unidades son metros.

Reproyección de un raster con variables categóricas.

En el caso de un ráster con valores categóricos, el procedimiento es similar, aunque se recomienda el uso de otros métodos de interpolación.

Primero se creará el fichero ráster:

tipo_roca <- c("caliza", "arenisca", "granito")
lista <- sample(tipo_roca, 144, replace = TRUE)
roca_factor <- factor(lista, 
                      levels = tipo_roca)
roca <- rast(nrows = 12,
            ncols = 12,
            xmax= -3, xmin= -4,                # Coordenadas del eje X (considerémoslas la longitud)
            ymax= 43, ymin= 42,                # Coordenadas del eje y (idem latitud)
            vals = roca_factor)
plot(roca)

roca
## class       : SpatRaster 
## dimensions  : 12, 12, 1  (nrow, ncol, nlyr)
## resolution  : 0.08333333, 0.08333333  (x, y)
## extent      : -4, -3, 42, 43  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) 
## source(s)   : memory
## categories  : label 
## name        :   lyr.1 
## min value   :  caliza 
## max value   : granito

A continuación se reproyectará usando como método el del vecino más próximo

roca_nr <- project(roca, 
                method = "near", 
                "EPSG:25830")
reclass_matrix <- matrix(c(0, 1.999, 1,   # Valores entre 0 y 200 → Categoría 1
                           2, 2.999, 2,   # Valores entre 200 y 400 → Categoría 2
                           3, 3.999, 3),  # Valores entre 400 y 600 → Categoría 3
                           ncol=3, byrow=TRUE)

# Aplicar reclasificación
roca_nr <- classify(roca_nr, reclass_matrix)

En la siguiente imagen se representa el objeto ráster original y los resultantes de la reproyección con diferentes métodos.

# Dos filas, dos columnas
par(mfcol = c(1, 2))

# Gráficos
plot(roca, main = "Datos originales")
plot(roca_nr, main = "Reproyección vecino")

# Volvemos al estado original
par(mfcol = c(1, 1))

terra dispone de la función terra::same.crs [https://rdrr.io/cran/terra/man/same.crs.html] para determinar si las proyecciones de dos objetos espaciales son idénticas.

same.crs(roca, 
         roca_nr)
## [1] FALSE

CRS DE OBJETOS VECTORIALES

Es muy habitual también combinar objetos en formato ráster con objetos en formato vectorial. Es necesario, por lo tanto, que ambos formatos compartan el mismo CRS. El procedimiento para asignar o para reproyectar objetos SpatVector es similar al observado en el caso de los objetos SpatRaster.

Este objeto será creado a partir de una matriz de coordenadas (x, y)

coords <- matrix(c(-4.5, 39.7,
                   -3, 39.7,
                   -3, 40.5,
                   -3.5, 41.4,
                   -4.5, 40,
                   -4.5, 39.7),    # El último punto debe coincidir con el primero para cerrar el polígono
                 ncol=2, byrow=TRUE)

Convertir la matriz en un objeto SpatVector de tipo polígono

poligono <- vect(list(coords), type="polygons")

A continuación se Visualiza la información sobre el polígono

print(poligono)
##  class       : SpatVector 
##  geometry    : polygons 
##  dimensions  : 1, 0  (geometries, attributes)
##  extent      : -4.5, -3, 39.7, 41.4  (xmin, xmax, ymin, ymax)
##  coord. ref. :

Se puede reproducir gráficamente el polígono

plot(poligono, col="lightblue", border="blue", lwd=2)

Verificar el CRS actual

crs(poligono, describe = TRUE)
##      name authority code area         extent
## 1 unknown      <NA> <NA> <NA> NA, NA, NA, NA

R devuelve una cadena vacía (““), mensaje por el cual se nos informa que tampoco este objeto vectorial tiene un CRS definido.

Objetivo Función terra
Verificar CRS crs(vector)
Asignar CRS crs(vector) <- “EPSG:XXXX”
Cambiar proyección project(vector, “EPSG:XXXX”)

Asignación de CRS a un objeto vectorial.

El procedimiento es idéntico al señalado para los objetos ráster. Consiste en asignarle un CRS escribiendo directamente el código EPSG.

crs(poligono) <- "EPSG:4326"
poligono
##  class       : SpatVector 
##  geometry    : polygons 
##  dimensions  : 1, 0  (geometries, attributes)
##  extent      : -4.5, -3, 39.7, 41.4  (xmin, xmax, ymin, ymax)
##  coord. ref. : lon/lat WGS 84 (EPSG:4326)

Reproyección del CRS de un objeto vectorial.

En este caso se utiliza la función terra::project() añadiendo como principal argumento el nuevo CRS, que en este caso siguen también la notación EPSG.

poligono <- project(poligono, 
                    "EPSG:25830")
crs(poligono, describe = TRUE)
##                    name authority  code
## 1 ETRS89 / UTM zone 30N      EPSG 25830
##                                                                                                                                                               area
## 1 Europe between 6°W and 0°W: Faroe Islands offshore; Ireland - offshore; Jan Mayen - offshore; Norway including Svalbard - offshore; Spain - onshore and offshore
##                      extent
## 1 -6.00, 0.01, 35.26, 80.49

EJEMPLO DESARROLLADO CON DATOS REALES

A continuación se revisan algunos procedimientos comunes para realizar estas transformaciones en R con datos reales.

Primero, debe establecerse la carpeta dónde se encuentran los ficheros que serán utilizados en esta sesión.

Una vez creado dicha carpeta, se descargan los ficheros necesarios para esta actividad directamente desde el servidor web.

Y descomprimirse

Un procedimiento alternativo es realizar todo el proceso manualmente. Para ello, los ficheros necesarios para esta práctica se descargan aquí

En primer lugar se importará un objeto ráster, con proyección geográfica.

mdt <- rast("D:/G174_2025/LABORATORIO_3_Preprocesamiento_imagenes_satelite/datos/reproyeccion_imagenes/mdt.tif")
crs(mdt, describe = TRUE)
##     name authority code  area             extent
## 1 WGS 84      EPSG 4326 World -180, 180, -90, 90

A continuación se importarán los límites administrativos de la Comunidad Autónoma de Madrid.

cam <- vect("D:/G174_2025/LABORATORIO_3_Preprocesamiento_imagenes_satelite/datos/reproyeccion_imagenes/comunidad.shp")

Si se intenta representar la combinación del objeto ráster mdt, y superpuesto el objeto vectorial comunidad aparece lo siguiente.

plot(mdt) 
plot(cam, 
     col = "red",
     add = TRUE)

El objeto vectorial cam aparece en coordenadas proyectadas.

crs(cam, describe = TRUE)
##                    name authority  code area         extent
## 1 WGS 84 / UTM zone 30N      EPSG 32630 <NA> NA, NA, NA, NA

Por ello es necesario su transformación en el mismo sistema de coordendas de referencia del objeto mdt.

cam <- project(cam, "EPSG:4326")
crs(cam, describe = TRUE)
##     name authority code  area             extent
## 1 WGS 84      EPSG 4326 World -180, 180, -90, 90

Por último se verifica que se ha conseguido que ambos objetos tengan la misma proyección.

plot(mdt) 
plot(cam, 
     col = "red",
     add = TRUE)

También se importará el límite administrativo del municipio de Madrid. En este caso, está proyectado en coordenadas geográficas.

library(rgeoboundaries)                            # Paquete con las unidades administrativas (todo el planeta)
## Warning: package 'rgeoboundaries' was built under R version 4.3.3
municipio <- geoboundaries("Spain", "adm3")        # Solicitamos la extracción de los municipios ("adm") de España
municipio <- subset(municipio,                     # Filtramos el límite del municipio de Madrid
                  shapeName == "Madrid")
municipio <- municipio[ , -c(1:2, 4, 5, 6)]                 # Eliminamos columnas innecesarias
plot(municipio)

Es habitual que en la mayoría de los paquetes que ofrecen datos espaciales el CRS básico corresponda a un sistema de coordenadas geográficas. La conversión a proyectadas es muy más fácil y genera menos errores.

El objeto vectorial municipio es un objeto de la clase sf, proyectado en coordenadas geográficas (latitud y longitud).

class(municipio)
## [1] "sf"         "data.frame"
crs(municipio, describe = TRUE)
##     name authority code  area             extent
## 1 WGS 84      EPSG 4326 World -180, 180, -90, 90

En consecuencia, primero de todo habrá que convertir ese objeto sf en un objeto SpatVector que pueda ser utilizado en el entorno terra.

municipio <- vect(municipio)

Si se intenta realizar lo mismo con el objeto ráster y el objeto vectorial municipio el resultado es el siguiente.

plot(mdt) 
plot(municipio, 
     col = "red", 
     add = TRUE)

Por último, si se representan ambos límites administrativos, el resultado es el siguiente

plot(mdt)
plot(cam, 
     col = "lightgreen", 
     border = "black", 
     add = TRUE) 
plot(municipio, 
     col = "red", 
     add = TRUE)

Los diferentes CRS de cada objeto pueden ser conocidos requiriéndolos a R, con el argumento proj = TRUE:

crs(cam, proj = TRUE)
## [1] "+proj=longlat +datum=WGS84 +no_defs"
crs(municipio, proj = TRUE)
## [1] "+proj=longlat +datum=WGS84 +no_defs"
crs(mdt, proj = TRUE)
## [1] "+proj=longlat +datum=WGS84 +no_defs"

Igualmente, los límites espaciales de cada objeto son diferentes:

as.vector(ext(cam))
##      xmin      xmax      ymin      ymax 
## -4.579076 -3.052983 39.884719 41.165845
as.vector(ext(municipio))
##      xmin      xmax      ymin      ymax 
## -3.888957 -3.518235 40.312064 40.643333
as.vector(ext(mdt))
##      xmin      xmax      ymin      ymax 
## -4.921875 -2.812469 39.368651 41.508577

Transformación en un nuevo CRS (Reproyección)

Elegiremos como CRS común el sistema proyectado EPSG:23030 (ED50 / UTM zone 30N), que también es un sistema de coordenadas proyectadas. Hay varias posibilidades para realizar esta reproyección.

Reproyección de un objeto vectorial mediante la creación de un objeto CRS.

► Primero se puede crear un objeto con el nuevo sistema de proyección, común a los tres objetos espaciales.

reproj <- "EPSG:23030"

► A continuación, se transforma el sistema de referencia original de los objetos vectoriales municipio y comunidad al nuevo CRS con la función terra::project().

cam_ED50 <- project(cam, 
                    reproj)
crs(cam_ED50, describe = TRUE)
##                  name authority  code
## 1 ED50 / UTM zone 30N      EPSG 23030
##                                                                                                                                                                                                     area
## 1 Europe - between 6°W and 0°W - Channel Islands (Jersey, Guernsey); France offshore; Gibraltar; Ireland offshore; Norway including Svalbard - offshore; Spain - onshore; United Kingdom - UKCS offshore
##                      extent
## 1 -6.00, 0.01, 35.26, 80.49
municipio_ED50 <- project(municipio, 
                          reproj)
crs(municipio_ED50, describe = TRUE)
##                  name authority  code
## 1 ED50 / UTM zone 30N      EPSG 23030
##                                                                                                                                                                                                     area
## 1 Europe - between 6°W and 0°W - Channel Islands (Jersey, Guernsey); France offshore; Gibraltar; Ireland offshore; Norway including Svalbard - offshore; Spain - onshore; United Kingdom - UKCS offshore
##                      extent
## 1 -6.00, 0.01, 35.26, 80.49

► Podríamos realizar lo mismo para reproyectar el objeto ráster.

mdt_ED50 <- project(mdt, 
                   reproj)
crs(mdt_ED50, describe = TRUE)
##                  name authority  code
## 1 ED50 / UTM zone 30N      EPSG 23030
##                                                                                                                                                                                                     area
## 1 Europe - between 6°W and 0°W - Channel Islands (Jersey, Guernsey); France offshore; Gibraltar; Ireland offshore; Norway including Svalbard - offshore; Spain - onshore; United Kingdom - UKCS offshore
##                      extent
## 1 -6.00, 0.01, 35.26, 80.49

Ahora sí los límites administrativos coinciden.

plot(mdt_ED50) 
plot(cam_ED50, 
     add = TRUE)

Reproyección de un objeto vectorial con el CRS de un objeto ráster

Otra posibilidad es la reproyección de un objeto vectorial, en este caso, el objeto municipio con el CRS de un objeto raster, por ejemplo el objeto mdt_ED50.

El CRS del objeto vectorial es el siguiente.

crs(municipio, describe = TRUE)
##     name authority code  area             extent
## 1 WGS 84      EPSG 4326 World -180, 180, -90, 90

El CRS del objeto ráster aparece a continuación.

crs(mdt_ED50, describe = TRUE)
##                  name authority  code
## 1 ED50 / UTM zone 30N      EPSG 23030
##                                                                                                                                                                                                     area
## 1 Europe - between 6°W and 0°W - Channel Islands (Jersey, Guernsey); France offshore; Gibraltar; Ireland offshore; Norway including Svalbard - offshore; Spain - onshore; United Kingdom - UKCS offshore
##                      extent
## 1 -6.00, 0.01, 35.26, 80.49

A continuación, mediante la función sf::st_transform reproyectamos el objeto municipio al nuevo sistema de coordenadas, creando un nuevo objeto. En este caso, el argumento crs = crs(mdt_ED50) informa a R que tiene que utilizar como CRS el que corresponde al objeto mdt_ED50.

municipio_ED50 <- project(municipio, 
                         mdt_ED50)

Ahora sí los límites administrativos coinciden.

plot(mdt_ED50) 
plot(cam_ED50, 
     col = "red", add = TRUE)
plot(municipio_ED50, 
     col = "yellow", add = TRUE)

Un último caso es la incorporación de otro objeto espacial que originalmente no dispone de proyección, porque ha sido importado como dataframe, por ejemplo, una serie de localidades (puntos). El procedimiento para asignar un CRS es algo más complicado.

Primero, se importa el fichero original (en formato .csv).

puntos <- read.csv("D:/G174_2025/LABORATORIO_3_Preprocesamiento_imagenes_satelite/datos/reproyeccion_imagenes/meteo_mad.csv")
str(puntos)
## 'data.frame':    9 obs. of  4 variables:
##  $ cdg     : int  82150 82190 82200 82210 82220 82230 82240 82260 82270
##  $ estacion: chr  " NAVACERRADA" " COLMENAR" " C. UNIVERSITARIA" " BARAJAS" ...
##  $ lon     : num  -4.02 -3.73 -3.72 -3.57 -3.68 ...
##  $ lat     : num  40.8 40.6 40.5 40.5 40.4 ...
class(puntos)
## [1] "data.frame"

Puede observarse que estos datos contienen información espacial al incluir dos columnas, una con la longitud de la localidad y otra con la latitud. Aprovechando estos datos, el dataframe se convertirá en un objeto espacial de la clase sf(un objeto vectorial). Dado que la localización de cada entidad está medida en grados, es necesario asignar como CRS el Sistema de Coordenadas Geográficas EPSG:4326 (WGS84).

puntos <- vect(puntos, 
              geom=c("lon", "lat"),                 # Define las columnas con las coordenadas.
              crs="EPSG:4326")                      # Establece el sistema de referencia geográfico WGS 84 (coordenadas en grados decimales).
class(puntos)
## [1] "SpatVector"
## attr(,"package")
## [1] "terra"

A continuación se reproyectará el objeto punto, cuya proyección es geográfica, en el mismo del objeto mdt.

meteo_ED50 <- project(puntos, 
                      mdt_ED50)

Finalmente, se pueden cartografiar ambos conjuntos de datos.

plot(mdt_ED50) 
plot(cam_ED50, 
     col = "red", add = TRUE)
plot(municipio_ED50, 
     col = "yellow",
     border = "darkgreen", 
     add = TRUE) 
plot(meteo_ED50,
     col = "blue",
     add = TRUE)

📝 **LABORATORIO 3. ACTIVIDAD DE EVALUACIÓN 3:

Cada alumno elaborará un script conteniendo los procedimientos necesarios para responder a las cuestiones planteadas en la siguiente actividad de evaluación. Una vez concluido, el script será enviado posteriormente al profesor a través de correo electrónico.