5 Transformación de datos para análisis
En este apartado vamos a transformar los datos con el objetivo de adaptarlos a las necesidades para realizar operaciones de análisis con el resultado.
Unas operaciones se muestran en QGIS, otras en R.
5.1 Transformaciones en QGIS
A partir del MDT vamos a generar capas vectoriales de curvas (curvas de nivel) y puntos aleatorios a los que asociaremos su correspondiente altitud.
5.1.1 Curvas de nivel
Para obtener las curvas de nivel, pulsamos sobre Ráster > Extracción > Curvas de nivel…
En la ventana de definición de parámetros de la operación, es muy importante el campo Intervalo entre curvas de nivel, que determina la separación y, por tanto, el número de estas. Podemos dejar el valor por defecto o cambiarlo según nuestro propio criterio (según lo accidentado que sea el terreno).
Si miramos la tabla de atributos de las curvas generadas, para cada una tenemos un atributo ELEV
con la altitud.
5.1.2 Puntos aleatorios
Para obtener un conjunto de puntos aleatorios a partir del MDT, pulsamos sobre Vectorial > Herramientas de investigación > Puntos aleatorios en la extensión…

Figura 5.1: Obtención de puntos aleatorios.
En la ventana de definición de parámetros de la operación (figura 5.1), en el campo Extensión de entrada seleccionamos la opción Calcular a partir de la capa… y seleccionamos el MDT; podemos indicar el número de puntos (en este caso se ha indicado el valor 1000
); también se puede definir una restricción en cuanto a la distancia mínima entre puntos en metros, que en este caso no se ha indicado el valor 50
.
Como resultado, se han generado los puntos aleatorios en una nueva capa vectorial, dentro de los límites definidos por el MDT, sin embargo, los puntos no tienen asociada la altitud definida en su posición respecto al MDT. Para ello, necesitamos utilizar el complemento Point sampling tool.

Figura 5.2: Obtención del valor asociado a los puntos aleatorios.
Una vez instalado, accedemos a él mediante su icono en la barra de herramientas. En la ventana de definición de parámetros de la operación (figura 5.2), definimos la capa que contiene los puntos aleatorios y la lista de capas de las que tomar valores. También indicamos el archivo donde almacenar la nueva capa. En la nueva capa generada, los puntos tienen asociado el valor tomado del MDT.
5.2 Transformaciones en R
A partir del MDT vamos a generar capas vectoriales de curvas de nivel y puntos aleatorios con la altitud. A continuación, se realizan otras transformaciones mediante R.
5.2.1 Curvas de nivel
Obtenemos curvas de nivel a partir del MDT mediante la función para este fin del paquete terra
: tenemos que indicar los niveles que queremos obtener. A continuación, generamos una capa vectorial para el paquete sf
.
file <- 'datos/Lanjaron/p03out/mdt-lanjaron-bbox-jsamos.tif'
mdt <- terra::rast(file)
niveles <- seq(0, max(terra::values(mdt), na.rm = TRUE), by = 100)
contours <- terra::as.contour(mdt, levels = niveles)
contours_sf <- sf::st_as_sf(contours)
Podemos presentar las curvas obtenidas mediante el siguiente código:
5.2.2 Puntos aleatorios
Como vimos en el capítulo anterior, mediante el fragmento de código siguiente, obtenemos una muestra aleatoria de puntos en 3D.
file <- 'datos/Lanjaron/p03out/mdt-lanjaron-bbox-jsamos.tif'
mdt <- terra::rast(file)
# Extraer puntos y elevaciones del MDT
puntos <- as.data.frame(mdt, xy = TRUE, na.rm = TRUE)
colnames(puntos) <- c("x", "y", "z")
# Seleccionar una muestra aleatoria
muestra <- sample(1:nrow(puntos), size = 1000, replace = FALSE)
puntos <- puntos[muestra, ]
A continuación, podemos generar una capa a partir de las coordenadas de los puntos, mediante el código siguiente.
puntos$geom <- paste0("POINT Z (", puntos$x, " ", puntos$y, " ", puntos$z, ")")
puntos$id <- 1:nrow(puntos)
puntos <- puntos[, c('id', 'geom')]
sf_puntos <- sf::st_as_sf(puntos, wkt = "geom", crs = sf::st_crs(mdt))
Podemos presentar la muestra en 2D mediante el siguiente código:
5.3 Otras transformaciones en R
A continuación, se muestran otras transformaciones sobre las capas que podemos necesitar para utilizarlas en operaciones de análisis.
5.3.1 Transformar capa vectorial en ráster
Vamos a obtener una capa ráster a partir de la capa CORINE Land Cover.
file <- "datos/Lanjaron/p03out/clc-lanjaron-jsamos.gpkg"
clc <- sf::st_read(file, layer = "clc-lanjaron-bbox-jsamos")
Necesitamos generar un ráster base con las características que necesitemos.
- Podemos definir las características explícitamente, como se muestra a continuación.
- O bien, obtenerlas a partir de un ráster que tengamos disponible, en este caso, el MDT.
file <- 'datos/Lanjaron/p03out/mdt-lanjaron-bbox-jsamos.tif'
mdt <- terra::rast(file)
r_base <- terra::rast(mdt)
Para obtener el ráster, debemos indicar, además de la capa vectorial, el ráster base y el campo de la capa vectorial cuyos valores almacenar en el resultado.
clc$CODE_18 <- as.integer(clc$CODE_18)
r_clc <- terra::rasterize(terra::vect(clc), r_base, field = "CODE_18")
terra::plot(r_clc)
Para obtener los literales y colores asociados a los códigos almacenados en el ráster, podemos leer el componente de definición de estilos e interpretar la definición XML usando el paquete de la asignatura sigugr
2.
from <- "datos/Lanjaron/p03out/clc-lanjaron-jsamos.gpkg"
categorias <- sigugr::get_layer_categories(from, r_clc)
A partir del data frame categorias
obtenido, podemos definir los literales del ráster y usar los colores para representarlo, como se muestra a continuación.
5.3.2 Obtener capas de distancias
A partir de una capa vectorial, vamos a obtener capas de distancia en formato ráster y vectorial.
Partimos de la capa de la red hidrográfica del municipio.
file <- "datos/Lanjaron/p03out/tem-redh-lanjaron-jsamos.gpkg"
layer <- "tem-redh-lanjaron-jsamos"
redh_lanjaron_jsamos <- sf::st_read(file, layer = layer)
plot(sf::st_geometry(redh_lanjaron_jsamos))
Obtenemos la capa en formato vectorial con el mismo CRS del MDT, ya que vamos a usar el MDT como ráster base.
mdt <- terra::rast('datos/Lanjaron/p03out/mdt-lanjaron-bbox-jsamos.tif')
r_base <- terra::rast(mdt)
redh_lanjaron_jsamos <- sf::st_transform(redh_lanjaron_jsamos, crs = sf::st_crs(mdt))
redh_lanjaron_jsamos_terra <- terra::vect(redh_lanjaron_jsamos)
terra::plot(redh_lanjaron_jsamos_terra)
Obtenemos el ráster de distancias a partir de la capa vectorial, tomando como ráster base el indicado (el obtenido a partir del MDT).
A partir del ráster, generamos la capa de curvas de nivel (como hemos hecho en el apartado 5.2.1).
niveles <- seq(0, max(terra::values(r_dist), na.rm = TRUE), by = 1000)
contours <- terra::as.contour(r_dist, levels = niveles)
v_dist <- sf::st_as_sf(contours)
ggplot2::ggplot() +
ggplot2::geom_sf(data = v_dist, ggplot2::aes(color = level), size = 0.5) +
ggplot2::geom_sf(data = redh_lanjaron_jsamos, color = "red", size = 1) +
ggplot2::scale_color_viridis_c(name = "Distancia") +
ggplot2::theme_minimal()
5.3.3 Ajustar un ráster a otro
Si queremos realizar una operación de análisis en la que intervengan dos capas ráster, ambas deberán tener las mismas características: CRS y resolución espacial. Podemos ajustar un ráster a otro mediante la función resample
, como se muestra a continuación.
Obtenemos las dos capas ráster.
mdt <- terra::rast('datos/Lanjaron/p03out/mdt-lanjaron-bbox-jsamos.tif')
terra::plot(mdt)
mdt
sat <- terra::rast('datos/Lanjaron/p03out/sat-r15m-lanjaron-bbox-jsamos.tif')
terra::plot(sat)
sat
Adaptamos la banda de satélite a las características del MDT.
O viceversa.