• En este vídeo tutorial explico como hacer uso de la librería geoBounds dentro de R para acceder a información de shapefiles político administrativo a distintos niveles. Y podemos lograr mapas como este:

    Blog original: https://dieghernan.github.io/202602_geobounds/

    Contacto: Fabio Castro – Llanos Whatsapp: wa.me/+573217850490

  • Contacto

    Fabio Alexander Castro Llanos: fabioalexandercastro@gmail.com wa.me/+573217850490

    En este pequeño proyecto desarrollé una aplicación interactiva en R Shiny para visualizar el Palmer Drought Severity Index (PDSI) a nivel municipal en Colombia. La idea es bastante simple: poder explorar cómo cambian las condiciones de sequía o humedad mes a mes usando un mapa interactivo.

    El resultado final es una app donde el usuario puede seleccionar año y mes, y automáticamente el mapa se actualiza mostrando el valor del índice en cada municipio.

    La aplicación está construida usando sf, leaflet, tidyverse y Shiny, junto con algunos ajustes visuales usando bslib para darle una apariencia moderna

    📦 Carga de librerías y datos

    El primer paso consiste en cargar las librerías necesarias y leer los datos que vamos a usar.

    En este caso se utilizan dos datasets principales:

    • Un shapefile simplificado de los municipios de Colombia
    • Una tabla con los valores mensuales del PDSI
    require(sf)
    require(tidyverse)
    require(shiny)
    require(leaflet)
    require(bslib)
    require(RColorBrewer)
    mpio <- st_read("./www/mpios_simplify.gpkg", quiet = TRUE)
    znal <- read_csv(
    "./www/zonal_pdsi_year-monthly_gather.csv"
    ) |>
    select(MpCodigo, MpNombre, Depto, year, month, value)

    Algo importante aquí es asegurarse de que el código del municipio tenga el mismo tipo de dato en ambas tablas para poder hacer correctamente el join.

    mpio$MPIO_CCNCT <- as.character(mpio$MPIO_CCNCT)
    znal$MpCodigo <- as.character(znal$MpCodigo)
    🎛️ Interfaz de usuario (UI)

    La interfaz se construyó con Bootstrap 5 usando el paquete bslib. Esto permite aplicar temas modernos y tipografías personalizadas.

    theme = bs_theme(
    version = 5,
    bootswatch = "darkly",
    primary = "#38bdf8"
    )

    En el panel izquierdo se agregaron dos controles simples:

    • selección de año
    • selección de mes
    selectInput("yr", "Año", choices = yrs_avl)
    selectInput("mt", "Mes", choices = mth_avl)

    Estos inputs serán los que controlan la actualización del mapa.

    En el panel principal se incluye el mapa interactivo:

    leafletOutput("map_pdsi")

    Además agregué algunos detalles visuales como tarjetas (cards), tipografía moderna y enlaces a redes sociales.

    ⚡ Lógica reactiva en el servidor

    La magia de Shiny ocurre en el server, donde se construye el flujo reactivo de la aplicación.

    Primero se filtran los datos del índice según el año y el mes seleccionados:

    tbl_pdsi <- reactive({
    znal |>
    filter(
    year == input$yr,
    month == input$mt
    )
    })

    Luego se realiza la unión con el shapefile municipal:

    mpio_pdsi <- reactive({
    mpio |>
    left_join(
    tbl_pdsi(),
    by = c("MPIO_CCNCT" = "MpCodigo")
    )
    })

    De esta forma cada municipio queda asociado con su valor del índice PDSI.

    🗺️ Construcción del mapa interactivo

    Primero se inicializa el mapa base usando Leaflet:

    output$map_pdsi <- renderLeaflet({
    leaflet() %>%
    addProviderTiles(providers$CartoDB.Positron) %>%
    setView(lng = -74, lat = 4.5, zoom = 6)
    })

    Después se actualizan los polígonos dinámicamente cada vez que cambia el año o el mes.

    pal <- colorNumeric(
    palette = brewer.pal(11, "BrBG"),
    domain = dat$value
    )

    Esta paleta permite representar:

    • valores negativos → sequía
    • valores positivos → humedad

    Finalmente se dibujan los municipios en el mapa.

    addPolygons(
    fillColor = ~pal(value),
    fillOpacity = 0.8,
    label = ~paste0(MpNombre, "<br>PDSI: ", round(value,2))
    )

    Además se agrega una leyenda dinámica que ayuda a interpretar los colores.

    🌎 Resultado

    El resultado es una pequeña aplicación interactiva que permite explorar rápidamente las condiciones de sequía o humedad en Colombia a escala municipal.

    Este tipo de herramientas resulta especialmente útil para:

    • monitoreo climático
    • análisis agroclimático
    • exploración de datos espaciales en tiempo real

    Y demuestra lo poderoso que puede ser R para construir aplicaciones geoespaciales interactivas con relativamente pocas líneas de código.

  • Si requieres asesoría en temas de SIG contactame a mi correo fabioalexandercastro@gmail.com o whatsapp https://wa.me/+573217850490

    En este nuevo tutorial muestro cómo calcular la estadística zonal del PDSI para todos los municipios de Colombia y generar un archivo espacial final listo para análisis multitemporal.

    Trabajamos con datos previamente descargados de TerraClimate, específicamente el Palmer Drought Severity Index (PDSI), y realizamos el procesamiento usando un flujo reproducible en R.

    🔎 ¿Qué hace el script?

    El código realiza tres procesos fundamentales:

    1️⃣ Lectura y organización de rasters

    Se listan todos los .tif del PDSI recortados a Colombia y se ordenan correctamente por año.

    fles <- dir_ls('./tif/pdsi', regexp = '.tif$')
    fles <- grep('COL', fles, value = T)
    fles <- mixedsort(fles)
    2️⃣ Cálculo de estadística zonal

    Utilizamos exactextractr::exact_extract() para calcular el promedio mensual del PDSI por municipio:

    znal <- exactextractr::exact_extract(
    x = rstr,
    y = st_as_sf(mpio),
    fun = 'mean'
    )

    El resultado genera:

    • 12 columnas (mean.PDSI_1 a mean.PDSI_12)
    • Una fila por municipio
    • Un identificador temporal por año

    Todo queda organizado en una tabla estructurada.

    3️⃣ Creación del archivo espacial final

    Luego hacemos el join con el shapefile municipal y exportamos:

    st_write(znal, './gpkg/zonal_pdsi.gpkg')

    El resultado es un GeoPackage listo para:

    • Mapas temáticos
    • Dashboards en Shiny
    • Modelos econométricos espaciales
    • Análisis multitemporal por municipio

    🎥 Mira el paso a paso completo

    En el video del canal Un Geógrafo en YouTube explico:

    • Por qué usar exactextractr en lugar de terra::extract
    • Cómo estructurar datos multitemporales
    • Buenas prácticas para zonal statistics
    • Errores comunes y cómo evitarlos

    👉 Te invito a ver el tutorial completo en el canal.

  • Si requieres asesoría en temas de SIG contactame a mi correo fabioalexandercastro@gmail.com o whatsapp https://wa.me/+573217850490

    En este tutorial te explico cómo descargar y procesar datos climáticos del dataset TerraClimate directamente desde R, automatizando la descarga de múltiples años, recortando por país y exportando los resultados en formato GeoTIFF listo para análisis espacial.

    El flujo que implementamos es completamente reproducible y escalable, ideal para proyectos de modelación climática, análisis de sequías o estudios de cambio climático.

    🌎 ¿Qué es TerraClimate?

    TerraClimate es un conjunto de datos climáticos mensuales de alta resolución (~4 km) que combina información de estaciones, reanálisis y climatologías históricas. Es ampliamente utilizado para estudios de:

    • Balance hídrico
    • Índices de sequía (como PDSI)
    • Temperatura y precipitación
    • Modelación ecológica
    • Agricultura y seguridad alimentaria

    En este ejemplo trabajamos con el Palmer Drought Severity Index (PDSI).

    🧠 Objetivo del flujo en R

    El script realiza cuatro procesos clave:

    1. Genera automáticamente las URLs para múltiples años.
    2. Descarga archivos NetCDF (.nc) desde el servidor THREDDS.
    3. Recorta y enmascara los datos usando el límite oficial de Colombia.
    4. Exporta cada resultado como archivo GeoTIFF.

    Todo esto se ejecuta con una función aplicada iterativamente.

    📦 Librerías utilizadas

    Trabajamos con un stack moderno y eficiente

    require(pacman)
    p_load(terra, fs, sf, tidyverse, gtools, glue)
    🔗 Construcción automática de URLs

    Generamos las rutas directamente hacia el servidor:

    urls <- glue('http://thredds.northwestknowledge.net:8080/thredds/fileServer/TERRACLIMATE_ALL/data/TerraClimateV1.1_PDSI_{1995:2020}.nc')

    Esto evita descargar manualmente año por año y permite escalar fácilmente el rango temporal.

    🗺 Descarga del límite oficial de Colombia

    Utilizamos geodata::gadm() para obtener el shapefile del país:

    col0 <- geodata::gadm(country = 'COL', level = 0, path = './tmpr')

    Este objeto se usa posteriormente como máscara espacial.

    ⚙️ Función principal de descarga y procesamiento

    La función ejecuta tres operaciones:

    • Descarga del archivo .nc
    • Recorte espacial (crop)
    • Enmascaramiento (mask)
    • Exportación a .tif
    make.down <- function(urle){
    wrtn <- glue('{dout}/{basename(urle)}')
    download.file(
    url = urle,
    destfile = wrtn,
    mode = 'wb'
    )
    rstr <- rast(wrtn)
    rstr <- terra::crop(rstr, col0)
    rstr <- terra::mask(rstr, col0)
    wrtn <- glue('{dirname(wrtn)}/COL_{basename(wrtn)}')
    wrtn <- gsub('.nc', '.tif', wrtn)
    terra::writeRaster(x = rstr, filename = wrtn, overwrite = TRUE)
    }

    Luego simplemente:

    map(urls, make.down)
    📁 Resultado final

    Obtendrás una carpeta con archivos como:

    🚀 Ventajas del enfoque

    ✔ Automatización completa
    ✔ Flujo reproducible
    ✔ Uso de terra (más eficiente que raster)
    ✔ Escalable a cualquier variable de TerraClimate
    ✔ Compatible con flujos avanzados (SPEI, modelación de especies, análisis agrícola)


    🎥 Mira el video completo

    En el video del canal Un Geógrafo en YouTube explico cada paso con detalle

  • En este video presento un flujo completo y reproducible en R para identificar zonas climáticamente idóneas para el cultivo de café bajo sombra, inspirado en el artículo científico:

    “A coffee corridor for biodiversity and livelihoods: climatic feasibility of shade coffee cultivation in western Rwanda”
    Trees, Forests and People 🌱📄

    Aunque el estudio original se desarrolla en África oriental, aquí adapto su enfoque metodológico al contexto colombiano, utilizando datos climáticos globales y herramientas SIG en R.

    🧭 Área de estudio y datos utilizados

    El análisis se centra en los departamentos de Quindío, Risaralda y Caldas, una de las principales regiones cafeteras de Colombia ☕🇨🇴.

    Se emplean datos oficiales y abiertos:

    • 🌡️🌧️ Variables bioclimáticas (BIO) de WorldClim v2.1
    • 🗺️ Límites administrativos de GADM
    • 📦 Paquetes especializados de R para análisis espacial (terra, sf, tmap, geodata)

    📊 Variables climáticas consideradas

    Siguiendo el artículo de referencia, se seleccionan cinco variables bioclimáticas clave para el cultivo de Coffea arabica:

    • BIO1: Temperatura media anual 🌡️
    • BIO2: Rango diurno de temperatura
    • BIO5: Temperatura máxima del mes más cálido 🔥
    • BIO6: Temperatura mínima del mes más frío ❄️
    • BIO12: Precipitación anual 🌧️

    Cada variable se recorta y enmascara a la zona de estudio para asegurar coherencia espacial.

    🧮 Reclasificación climática (idoneidad)

    Las variables climáticas se reclasifican en cinco niveles de idoneidad, desde:

    • No apto
    • ⚠️ Marginal
    • Apto
    • 🌿 Muy apto

    Esto se realiza mediante matrices de reclasificación, construidas a partir de rangos climáticos reportados en la literatura agroecológica. El resultado es un conjunto de capas raster comparables entre sí.

    ⚖️ Análisis multicriterio (Weighted Linear Combination)

    Para integrar las variables se aplica un Análisis Multicriterio por Combinación Lineal Ponderada (WLC):

    • Todas las variables reciben el mismo peso (0.25)
    • Se asume igual importancia relativa de cada factor climático
    • El resultado es un mapa continuo de idoneidad climática

    Finalmente, el índice se normaliza a un rango de 0 a 1, donde:

    • 0 = climáticamente no apto
    • 1 = condiciones óptimas para café bajo sombra

    📈 Este enfoque permite sintetizar información climática compleja en un solo indicador espacial interpretable.

    🗺️ Visualización cartográfica

    El resultado se representa mediante un mapa temático en tmap, incorporando:

    • 🎨 Paleta de colores gradual por clases de idoneidad
    • 🧭 Rosa de los vientos
    • 📏 Barra de escala
    • 🏷️ Etiquetas departamentales
    • 🖼️ Exportación en alta resolución (300 dpi)

    El mapa final resume visualmente las zonas con mayor potencial climático para el café, bajo un enfoque reproducible y transparente.

    🔁 Reproducibilidad y aplicación

    Todo el proceso se desarrolla 100% en R, lo que permite:

    • 🔁 Repetir el análisis en otras regiones
    • 🌱 Adaptarlo a otros cultivos
    • 🌍 Incorporar escenarios climáticos futuros
    • 📊 Integrarlo en estudios de planificación territorial

    Este tipo de análisis es ampliamente utilizado en agroecología, SIG ambiental y estudios de cambio climático, y aquí se presenta de forma accesible para la comunidad técnica.

    ¿Me deseas contactar?

    Escribeme a mi whatsapp https://wa.me/+573217850490

    El vídeo tutorial de YouTube aquí lo puedes encontrar:

  • Análisis espacial urbano con R y OpenStreetMap

    La disponibilidad de áreas verdes urbanas es un indicador clave para la calidad de vida, la salud pública y la resiliencia climática de las ciudades.
    En este artículo presento un flujo de trabajo reproducible en R para identificar, cuantificar y mapear las áreas verdes dentro de la ciudad de Cali, combinando límites oficiales con información abierta proveniente de OpenStreetMap (OSM).

    El objetivo no es solo hacer un mapa “bonito”, sino calcular un indicador espacial sólido: la proporción del área urbana cubierta por zonas verdes.

    🧰 1. Preparación del entorno de trabajo

    El análisis se desarrolla completamente en R, utilizando un conjunto de librerías especializadas en datos espaciales, visualización y manejo reproducible de rutas:

    Este stack permite:

    • trabajar con geometrías vectoriales modernas (sf),
    • consultar directamente OpenStreetMap (osmdata),
    • realizar operaciones espaciales robustas (terra),
    • y producir cartografía publicable (ggplot2, ggspatial).

    El uso de here asegura que el proyecto sea portable y reproducible, una práctica fundamental en análisis espaciales profesionales.

    🗺️ 2. Carga y preparación de los límites oficiales

    El análisis parte de shapefiles oficiales de:

    • barrios urbanos,
    • corregimientos.

    Estos límites definen el universo espacial válido del estudio.

    🌳 3. ¿Dónde están las áreas verdes en OpenStreetMap?

    A diferencia de los catastros oficiales, OpenStreetMap no tiene una única capa de “zonas verdes”.
    Estas áreas están distribuidas en múltiples etiquetas (tags), entre ellas:

    • leisure: parques, jardines, zonas recreativas,
    • landuse: bosques, praderas,
    • natural: vegetación natural.

    Para manejar esta complejidad, se define una función personalizada que:

    1. consulta OSM por tipo de cobertura,
    2. descarga los polígonos,
    3. los proyecta correctamente,
    4. y los recorta al límite oficial de Cali.
    ✂️ 4. Recorte espacial: solo lo que está dentro de Cali

    Una vez descargados los polígonos desde OSM, se realiza una intersección espacial:

    Este paso es fundamental porque:

    • evita sobreestimar áreas,
    • elimina elementos periféricos,
    • asegura métricas coherentes con la ciudad real.

    Sin recorte espacial, las métricas urbanas no son defendibles.

    🧩 5. Integración de todas las áreas verdes

    Las distintas capas provenientes de OSM se limpian y se unen en una sola geometría temática:

    Cada polígono conserva:

    • su identificador,
    • la clave OSM (key),
    • el tipo de cobertura (value).

    Esto permite auditoría, análisis posterior y extensiones del estudio.

    📐 6. Cálculo de la cobertura verde urbana

    Con todas las áreas integradas, se calcula el indicador central del anál

    Este valor representa el porcentaje del área total de la ciudad cubierto por zonas verdes, un indicador ampliamente utilizado en:

    • planeación urbana,
    • estudios de sostenibilidad,
    • análisis de adaptación al cambio climático.

    Aquí pasamos de la cartografía descriptiva a un resultado cuantitativo interpretable.

    🗺️ 7. Cartografía final de las áreas verdes

    El resultado se presenta mediante un mapa claro y sobrio, pensado para comunicación académica y técnica:

    Vídeo tutorial donde explicamos todo esto:

    Deseas contactarme para guiarte en tu proyecto de SIG (pregrado, maestría o doctorado), escríbeme al Whatsapp: +57 3217850490

  • Las luces nocturnas observadas desde satélites se han convertido en uno de los insumos más poderosos para el análisis espacial del desarrollo humano, la urbanización, la actividad económica y los cambios territoriales a escala global. Gracias a su cobertura continua y homogénea, estos datos permiten analizar dinámicas sociales y económicas incluso en regiones donde la información estadística oficial es limitada o inexistente.

    En este artículo te explico qué son los datos armonizados de luces nocturnas DMSP–OLS y VIIRS, cómo fueron construidos y por qué son tan relevantes para la investigación en geografía, economía y ciencias ambientales.

    🛰️ ¿Qué son los datos de luces nocturnas?

    Las luces nocturnas satelitales capturan la iluminación artificial visible durante la noche, proveniente principalmente de:

    • Ciudades y áreas urbanas
    • Infraestructura vial
    • Zonas industriales
    • Actividades extractivas
    • Centros poblados rurales

    Durante décadas, estas observaciones han sido utilizadas como proxy de actividad humana, crecimiento urbano y desarrollo económico.

    📡 Dos generaciones de sensores: DMSP y VIIRS

    🔹 DMSP-OLS (1992–2013)

    El programa Defense Meteorological Satellite Program – Operational Linescan System (DMSP-OLS) fue el primer sistema que permitió observar luces nocturnas a escala global.

    Limitaciones principales:

    • Saturación en grandes ciudades
    • Falta de calibración radiométrica entre años
    • Resolución espacial limitada
    🔹 VIIRS-DNB (2014–2020)

    El sensor Visible Infrared Imaging Radiometer Suite – Day/Night Band (VIIRS-DNB) representa un gran avance tecnológico:

    • Mayor resolución espacial
    • Mejor sensibilidad radiométrica
    • Menor saturación en áreas urbanas

    Sin embargo, el cambio de sensor generó una ruptura temporal que dificultaba los análisis de largo plazo… hasta que llegó la armonización.

    🔄 Armonización DMSP–VIIRS: un paso clave

    El dataset “Harmonization of DMSP and VIIRS nighttime light data”, desarrollado por Li et al. (2020), resuelve este problema mediante un riguroso proceso de calibración temporal y espacial.

    ✔ ¿Qué logra esta armonización?

    • Unifica ambas fuentes en una serie temporal continua
    • Permite análisis consistentes desde 1992 hasta 2018
    • Reduce sesgos instrumentales
    • Facilita estudios comparables en el tiempo
    🧩 Contenido del dataset

    El conjunto de datos incluye:

    • 🌐 Cobertura global
    • 📅 Series anuales desde 1992 a 2018
    • 🗺️ Resolución espacial de 30 arc-seconds (~1 km)
    • 🔢 Valores de luz nocturna calibrados y comparables
    • 📊 Datos listos para análisis espacial y estadístico

    Los archivos están disponibles en formato raster y son compatibles con herramientas como R, QGIS, ArcGIS y Google Earth Engine.

    🔬 ¿Para qué se usan estos datos?

    Las aplicaciones son muy amplias, entre ellas:

    • 📈 Análisis del crecimiento urbano
    • 🌍 Estudios de desigualdad regional
    • 💡 Proxy de actividad económica (PIB, consumo energético)
    • 🔥 Evaluación de impactos de conflictos o desastres
    • 🌱 Estudios de sostenibilidad y presión humana
    • 📊 Modelos econométricos espaciales

    En muchos estudios, las luces nocturnas funcionan como un indicador alternativo de desarrollo, especialmente útil en países con baja disponibilidad de datos oficiales.

    📚 Fuentes de los datos
    ✍️ Reflexión final

    Las luces nocturnas son mucho más que una imagen bonita del planeta: son una huella luminosa de la actividad humana. Gracias a la armonización DMSP–VIIRS, hoy contamos con una de las series espaciales más valiosas para entender cómo hemos transformado el territorio en las últimas tres décadas.

    En Un Geógrafo en YouTube seguiremos explorando cómo estos datos pueden ayudarnos a leer el mundo desde el espacio 🌌📊.

    Aquí el video tutorial:

    ¿Me deseas contactar?

    Escribeme a mi whatsapp https://wa.me/+573217850490

  • En este tutorial explicamos como descargar datos de cobertura de la tierra, procesarlos y mapearlos con la ayuda de R

    El vídeo en mi canal de YouTube

    El script para su réplica:

    Me deseas contactar?

    Escríbeme al Whatsapp: +57 3217850490

  • Este es el vídeo tutorial

    De aquí puedes descargar el informe realizado, recuerda que es un documento abierto a mejora.