Este cuaderno presenta y explica dos métodos de interpolación espacial: Distancia Inversa Ponderada (IDW) y Kriging Ordinario (OK). La técnica IDW es un enfoque determinista que asigna valores a puntos desconocidos en función de la proximidad a puntos de muestreo conocidos, asumiendo que los más cercanos tienen mayor influencia. Por otro lado, OK es un método geoestadístico basado en modelos probabilísticos, que no solo considera la distancia entre puntos, sino también la estructura espacial de los datos a través de una función de variograma. Ambas técnicas se aplican en este análisis para generar una superficie continua del carbono orgánico del suelo (SOC) en la profundidad de 15-30 cm, utilizando datos de SoilGrids con una resolución espacial de 250 metros.
Este cuaderno se construye como forma de presentación del segundo informe del curso de Geomática Básica del período 2024-II, por lo cual, además de la interpretación de los datos de interpolación espacial, también se busca dar una explicación detallada sobre el código utilizado con el fin de demostrar los conocimientos adquiridos en el curso sobre R en el curso de geomática.
En primer lugar, limpiaremos la memoria, para optimizar el rendimiento del código
#rm(list=ls())
Para manejar datos geoespaciales, utilizaremos las bibliotecas terra para el procesamiento de datos ráster y sf para el manejo de datos vectoriales. Para realizar la interpolación espacial, emplearemos las bibliotecas gstat y automap, que facilitan la estimación y ajuste de modelos geoestadísticos. En cuanto a la visualización, recurriremos a ggplot2 para gráficos estáticos, leaflet para mapas interactivos y tmap para la representación cartográfica avanzada. Antes de comenzar, es fundamental asegurarse de que todas estas bibliotecas estén instaladas. Se recomienda hacerlo directamente desde la consola de R, en lugar de ejecutarlo dentro del cuaderno (notebook), para evitar posibles conflictos en la instalación y asegurar un mejor rendimiento del código.
En caso de que no se tenga ningún paquete instalado se recomienda usar el siguiente código: paquetes = c(‘terra’, ‘sf’, ‘sp’, ‘stars’, ‘gstat’, ‘automap’, ‘leaflet’, ‘leafem’) install.packages(paquetes)
En esta caso como ya tenemos la mayoría de los paquetes instalados, solo procederemos a instalar los paquetes que nos hagan falta de la siguiente manera: paquetes = c(‘gstat’, ‘automap’) install.packages(paquetes)
Ahora sí podemos importar todas las bibliotecas para asegurarnos que estén en funcionamiento
library(terra)
## terra 1.8.10
library(ggplot2)
library(sf)
## Linking to GEOS 3.12.2, GDAL 3.9.3, PROJ 9.4.1; sf_use_s2() is TRUE
library(sp)
library(stars)
## Cargando paquete requerido: abind
library(gstat)
library(automap)
library(RColorBrewer)
library(leaflet)
library(leafem)
Como se indicó en la introducción, nuestras muestras tienen valores de SOC a 15-30 cm de profundidad. Se obtuvieron de SoilGrids 250 m utilizando un cuaderno anterior donde se guardaron los datos en un archivo geopack.
En primer lugar, comprobemos que los datos están disponibles para su uso, para esto usaremos la función “list.files” que nos permitirá leer los archivos de una carpeta específica (En nuestro caso la carpeta se llama “DATOS”) que tengan la extensión “gpkg” puesto que los datos que obtuvimos en el otro cuaderno se guardaron en un geopack. Cabe aclarar que el Notebook y los datos deben estar en la misma carpeta de archivos, ya que de lo contrario la función no podrá encontrarlos.
list.files(path="DATOS", pattern = "*.gpkg")
## [1] "aguas_caquetá.gpkg" "caquetá_box.gpkg" "ciudades_Caquetá.gpkg"
## [4] "dpto.shp.gpkg" "dpto_caquetá.gpkg" "mun_caquetá.gpkg"
## [7] "rios_Caquetá.gpkg" "roads_caquetá.gpkg" "soc_caq.gpkg"
El archivo donde se guardaron los datos es el de “soc_caq.gpkg”. Ahora se buscará la ruta específica de este archivo y se leerá con la función sf para posteriormente guardarse en el vector “samples”
samples <- sf::st_read("C:/Users/Karol Ruiz/Documents/GEOMATICA 2024-2/PROYECTO4/DATOS/soc_caq.gpkg")
## Reading layer `SOC_reducido' from data source
## `C:\Users\Karol Ruiz\Documents\GEOMATICA 2024-2\PROYECTO4\DATOS\soc_caq.gpkg'
## using driver `GPKG'
## Simple feature collection with 2000 features and 1 field
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: -76.30642 ymin: -0.7034065 xmax: -71.22078 ymax: 2.9375
## Geodetic CRS: +proj=longlat +datum=WGS84 +no_defs
En este archivo podemos ver las coordenadas de latitud y altitud del marco del departamento en formato CRS WGS84 y la cantidad de muestras tomadas en el departamento.
Adicionalmente traeremos los datos del departamento del Caquetá que es nuestro departamento de estudio.
munic <- sf::st_read("C:/Users/Karol Ruiz/Documents/GEOMATICA 2024-2/PROYECTO4/DATOS/mun_caquetá.gpkg")
## Multiple layers are present in data source C:\Users\Karol Ruiz\Documents\GEOMATICA 2024-2\PROYECTO4\DATOS\mun_caquetá.gpkg, reading layer `municipios_colombia'.
## Use `st_layers' to list all layer names and their type in a data source.
## Set the `layer' argument in `st_read' to read a particular layer.
## Warning in CPL_read_ogr(dsn, layer, query, as.character(options), quiet, :
## automatically selected the first layer in a data source containing more than
## one.
## Reading layer `municipios_colombia' from data source
## `C:\Users\Karol Ruiz\Documents\GEOMATICA 2024-2\PROYECTO4\DATOS\mun_caquetá.gpkg'
## using driver `GPKG'
## Simple feature collection with 16 features and 5 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -76.30622 ymin: -0.70584 xmax: -71.25385 ymax: 2.938334
## Geodetic CRS: MAGNA-SIRGAS
Como podemos ver, el archivo de los municipios esta en formato MAGNA SIRGAS así que vamos a transformar su formato para que este en coordenadas de latitud y longitud al igual que las muestras de SOC.
(munic_wgs84 <- st_transform(munic, crs = 4326))
## Simple feature collection with 16 features and 5 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -76.30622 ymin: -0.70584 xmax: -71.25385 ymax: 2.938334
## Geodetic CRS: WGS 84
## First 10 features:
## dpto_ccdgo mpio_ccdgo mpio_cdpmp dpto_cnmbr mpio_cnmbr
## 1 18 001 18001 CAQUETÁ FLORENCIA
## 2 18 029 18029 CAQUETÁ ALBANIA
## 3 18 094 18094 CAQUETÁ BELÉN DE LOS ANDAQUÍES
## 4 18 150 18150 CAQUETÁ CARTAGENA DEL CHAIRÁ
## 5 18 205 18205 CAQUETÁ CURILLO
## 6 18 247 18247 CAQUETÁ EL DONCELLO
## 7 18 256 18256 CAQUETÁ EL PAUJÍL
## 8 18 410 18410 CAQUETÁ LA MONTAÑITA
## 9 18 460 18460 CAQUETÁ MILÁN
## 10 18 479 18479 CAQUETÁ MORELIA
## geom
## 1 MULTIPOLYGON (((-75.47547 1...
## 2 MULTIPOLYGON (((-75.89531 1...
## 3 MULTIPOLYGON (((-75.78705 1...
## 4 MULTIPOLYGON (((-74.78722 1...
## 5 MULTIPOLYGON (((-76.09066 1...
## 6 MULTIPOLYGON (((-75.36167 2...
## 7 MULTIPOLYGON (((-75.36638 2...
## 8 MULTIPOLYGON (((-75.47712 1...
## 9 MULTIPOLYGON (((-75.32574 1...
## 10 MULTIPOLYGON (((-75.77185 1...
Ahora leeremos un resumen de los datos descargados con la función summary
summary(samples)
## soc_igh_15_30 geom
## Min. : 91.32 POINT :2000
## 1st Qu.: 129.22 epsg:NA : 0
## Median : 176.37 +proj=long...: 0
## Mean : 244.29
## 3rd Qu.: 308.34
## Max. :1193.53
## NA's :47
Como podemos observar, en la base de datos encontramos un total de 2000 muestras siendo el dato promedio de SOC en todas las muestras 244.29, el valor mínimo de 91.32 y el valor máximo de 1193.53. También podemos observar que hay 47 valores faltantes que probablemente no tiene muestras de datos.
Para tener más clara la información vamos a visualizar los datos en un histograma que nos permitirá interpretar los datos de forma gráfica
hist(samples$soc)
En el histograma se corroboran los datos presentados anteriormente,
sobre los valores máximos y mínimos de muestra, los cuartiles, la media
y la mediana.
Ahora redondearemos los datos a 2 cifras para su mejor manejo. Esto se hará con la siguiente función:
samples$soc = round(samples$soc,2)
Ahora visualizaremos los datos en un mapa interactivo con ayuda de la función leaflet. El primer paso es escoger una paleta de colores adecuada para la visualización de las muestras. En mi caso decidí escoger los colores ““#66CD00” (Verde oscuro), “#BCEE68” (Verde claro), “#F9D423” (Amarillo), “#FC913A” (Naranja) y “#FF4E50” (Rojo), en ese orden respectivamente.
pal <- colorNumeric(
c("#66CD00", "#BCEE68", "#F9D423", "#FC913A", "#FF4E50"),
domain = samples$soc,
)
Ahora si usaremos la función leaflet para generar el mapa, en primer lugar, vamos a agregar los polígonos de la capa “munic” que es la que contiene los municipios, con algunas especificaciones como por ejemplo tener un contorno gris, una opacidad total para los bordes y un grosor de los bordes de 1 píxel. Después se agregarán los puntos de las coordenadas de la capa “samples” que es la que contiene los datos de las muestras SOC. Estos puntos los vamos a específicar con un tamaño de radio de 1.5 y con los colores respectivos de la paleta que hemos construido anteriormente, les daremos también una opacidad total del 100% e indicaremos que no tengan borde alrededor. Finalmente agregaremos una leyenda que nos permita interpretar los colores de la muestra y la ubicaremos en la esquina inferior izquierda.
leaflet() %>%
addPolygons(
data = munic,
color = "gray",
opacity = 1,
weight = 1,
fillOpacity = 0.2) %>%
addCircleMarkers(
data = samples,
radius= 1.5,
label = ~soc,
color = ~pal(soc),
fillOpacity = 1,
stroke = F
) %>%
addLegend(
data = samples,
pal = pal,
values = ~soc,
position = "bottomleft",
title = "SOC:",
opacity = 0.9) %>%
addProviderTiles("OpenStreetMap")
## Warning: sf layer has inconsistent datum (+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs).
## Need '+proj=longlat +datum=WGS84'