Pencil

library(cartography)
## This project is in maintenance mode. 
## Core functionalities of `cartography` can be found in `mapsf`.
## https://riatelab.github.io/mapsf/
## 
## Adjuntando el paquete: 'cartography'
## The following object is masked from 'package:terra':
## 
##     north
mtq_pencil <- getPencilLayer(x = provincias)
plot(st_geometry(mtq_pencil), col = 1:18)
plot(st_geometry(provincias), add = TRUE)

Este plot fue realizado con lenguaje R, paquete cartography y la función getPencilLayer

Pencil en ArgenMap

# Crear una paleta de colores basada en el campo único de cada provincia (ej., "nombre_provincia")
pal <- colorFactor(palette = "Set3", domain = mtq_pencil$fna)

# head(mtq_pencil)
# Crear el mapa con leaflet
leaflet() %>%
  addTiles('https://wms.ign.gob.ar/geoserver/gwc/service/tms/1.0.0/mapabase_gris@EPSG%3A3857@png/{z}/{x}/{-y}.png') %>%
  setView(lng =-65.39,lat =-26.01, zoom = 7)%>% 
  addPolygons(
    data = st_transform(mtq_pencil, 4326),  # Transformar al sistema de coordenadas EPSG 4326
    color = ~pal(fna),
    fillOpacity = 0.8,
    weight = 7,         # Grosor del borde
    popup = ~fna  # Opcional: muestra el nombre en un popup
  ) %>%
  addPolygons(
    data = st_transform(provincias, 4326),
    fillOpacity = 0.001 # Transformar al sistema de coordenadas EPSG 4326
    #color = "black"                    # Transparencia del relleno para que no cubra completamente el contorno de "boceto"
  )

La Región Noroeste Argentino (NOA)

library(leaflet)

# Crear una paleta de colores basada en el campo único de cada provincia (ej., "nombre_provincia")
pal <- colorFactor(palette = "Set3", domain = prov$fna)



leaflet() %>%
     addTiles('https://wms.ign.gob.ar/geoserver/gwc/service/tms/1.0.0/mapabase_gris@EPSG%3A3857@png/{z}/{x}/{-y}.png') %>%
     setView(lng =-65.39,lat =-26.01, zoom = 7)%>%  
     addPolygons(data = prov,
                 fillColor = ~pal(fna),  # Asigna un color distinto a cada provincia
                 fillOpacity = 0.6,
    color = "black",    # Color del borde de cada polígono
    weight = 1,         # Grosor del borde
    popup = ~fna  # Opcional: muestra el nombre en un popup
  )  

Población

Total de Población

Mapa temático de símbolos proporcionales

Fuente: INDEC

Mapa temático de símbolos proporcionales también conocido como gráfico de símbolos proporcionales o mapa de símbolos proporcionales. Es un tipo de mapa en el que se utilizan símbolos (como círculos, cuadrados u otros iconos) para representar datos cuantitativos de una región o área geográfica. La característica principal de este mapa es que el tamaño de cada símbolo es proporcional al valor de la variable representada en esa ubicación.

#install.packages("cartography")

# mtq <- st_read("martinique.shp")

plot(st_geometry(provincias2))
propSymbolsLayer(x = provincias2, var = "totalPoblación",
legend.title.txt = "Población",
col = "#a7dfb4")

Gráfico de Barras

Un gráfico de barras es una representación visual de datos en la que se utilizan barras rectangulares, cuya longitud o altura es proporcional al valor que representan. Cada barra corresponde a una categoría o grupo, y su tamaño facilita la comparación entre diferentes categorías. Es útil para mostrar la distribución de un conjunto de datos y comparar cantidades de manera clara y directa.

# Mostrar los gráficos
grafico_poblacion
### Cartograma de Vías Estratégicas
# Organizar los gráficos en una cuadrícula de 3x3 con gridExtra
#grid.arrange(grobs = plots, ncol = 3, nrow = 3, 
#  widths = c(1, 1, 1),   # Puedes modificar estas proporciones
#  heights = c(1, 1, 1)   # También puedes modificar las proporciones aquí
#  )

Total Población

Total de Población

Gráfico de Tortas

Fuente de datos: Censo INDEC

Un gráfico de torta (o gráfico circular) es una representación visual de datos en forma de un círculo dividido en segmentos, donde cada segmento muestra la proporción de un valor respecto al total. Cada porción del gráfico representa una categoría y su tamaño es proporcional a su valor relativo. Es útil para mostrar distribuciones o porcentajes de un todo

df2bis <- df2

# Eliminar "Provincia de" del nombre de las provincias en df2bis
df2bis$fna <- gsub("^Provincia de ", "", df2bis$fna)

# Gráfico de torta para el total de población
grafico_torta <- plot_ly(
  df2bis, 
  labels = ~fna,  # Las provincias como etiquetas
  values = ~totalPoblación,  # Los valores de la población total
  type = "pie",  # Tipo de gráfico torta
  textinfo = "label+percent",  # Mostrar etiqueta y porcentaje en cada segmento
  textfont = list(size = 14),  # Tamaño de la fuente del texto
  marker = list(colors = "steelblue")  # Color del gráfico (puedes usar una paleta de colores también)
) %>%
  layout(
    title = "Distribución del Total de Población por Provincia",
    height = 400  # Ajusta la altura del gráfico
  )
## Warning: Specifying width/height in layout() is now deprecated.
## Please specify in ggplotly() or plot_ly()
# Mostrar el gráfico
grafico_torta

Cartograma

Un cartograma es un tipo de mapa en el que se distorsionan las geometrías de las áreas en función de un atributo específico, como población, ingresos o cualquier otro dato cuantitativo.

En lugar de mostrar las áreas geográficas de forma precisa, se ajustan proporcionalmente a los valores del atributo que se está representando. Esto permite visualizar la distribución de datos de manera más clara y comparativa, destacando las áreas con mayor o menor cantidad del atributo en cuestión.

#provincias2$totalPoblación
 # Crear el cartograma para la vía actual
provincias_cartograma <- cartogram_cont(provincias2, weight = "totalPoblación")
  
 # Crear el gráfico con ggplot2
ggplot(provincias_cartograma) +
    geom_sf(aes(fill = totalPoblación)) +
       labs(
      fill = "totalPoblación", 
      title = paste("Cartograma de Población Total")  # Título con nombre personalizado
    ) +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5))

Cantidad de personas en Situación de Calle

Cartograma Personas en Situación de Calle

# Crear el gráfico con ggplot2
ggplot(provincias_cartograma) +
    geom_sf(aes(fill = totalSituacionCalle)) +
       labs(
      fill = "totalSituacionCalle", 
      title = paste("Cartograma: Cantidad de Personas en Situación de Calle")  # Título con nombre personalizado
    ) +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5))

Gráfico de Barras

grafico_situacion_calle

Catálogos Metadatos para NOA

cat$URL <- paste0('<a href="', cat$URL, '" target="_blank">', cat$URL, '</a>')

# Crear el datatable y evitar escape en la columna de URL
datatable(cat, escape = FALSE, options = list(pageLength = 10))

Modelo de elevación

Mapa de elevación (DEM) para la región NOA, utilizando un bounding box de la región. Para obtener el mapa de elevación (DEM) es la función get_elev_raster del paquete elevatr en R. get_elev_raster accede a servicios en línea, como el servidor de datos de elevación de Amazon Web Services (AWS) o similares, que proporcionan modelos de elevación digital globales (por ejemplo, SRTM o ASTER).

# Definir el sistema de proyección en WGS84
ll_proj <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"

# Cargar y filtrar provincias
provincias <- st_read("./provincia.shp")
## Reading layer `provincia' from data source 
##   `D:\Users\lr826\Desktop\eval\ultimos\casoNOA\provincia.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 24 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -74 ymin: -90 xmax: -25 ymax: -21.78086
## Geodetic CRS:  WGS 84
provincias <- provincias %>%
  filter(fna %in% c("Provincia de Jujuy", "Provincia de Salta", "Provincia de Santiago del Estero", "Provincia de Tucumán", "Provincia de Catamarca"))

# Unir provincias y transformar a EPSG:4326
region <- st_union(provincias)
region <- st_transform(region, 4326)

# Obtener el bounding box de la región
bbox <- st_bbox(region)

# Descargar el DEM utilizando las coordenadas del bounding box
dem <- get_elev_raster(locations = data.frame(x = c(bbox["xmin"], bbox["xmax"]), 
                                              y = c(bbox["ymin"], bbox["ymax"])),
                       prj = ll_proj, z = 8, clip = "bbox")
## Mosaicing & Projecting
## Clipping DEM to bbox
## Note: Elevation units are in meters.
# Convertir el raster a EPSG:4326 si es necesario
if (as.character(crs(dem)) != ll_proj) {
  dem <- projectRaster(dem, crs = ll_proj)
}

# Reducir la resolución del raster (resample a menor resolución)
dem_resampled <- aggregate(dem, fact = 4)  # Reduce la resolución dividiendo las celdas en 4

# Guardar el raster con resolución reducida como archivo PNG
png_filename <- tempfile(fileext = ".png")
writeRaster(dem_resampled, png_filename, format = "PNG", overwrite = TRUE)
# Cargar el raster y el contorno en un mapa leaflet
leaflet() %>%
  addTiles() %>%
  addRasterImage(dem_resampled, colors = terrain.colors(10), opacity = 0.7) %>%
  addPolygons(data = region, color = "black", weight = 2, fill = FALSE) %>%
  addLegend(pal = colorNumeric(terrain.colors(10), values(dem_resampled), na.color = "transparent"),
            values = values(dem_resampled),
            title = "Elevación (m)")

MDE-ar del IGN

https://www.ign.gob.ar/content/nuevos-modelos-digitales-de-elevaciones-para-la-rep%C3%BAblica-argentina

Los nuevos MDE tienen una resolución espacial de 5m y una precisión vertical submétrica,

# Reemplaza 'ruta/al/archivo.img' con la ubicación de tu archivo .img
raster_data <- rast("2366-04-2-d.img")

# Reducir la resolución del raster (ajusta 'fact' según sea necesario)
raster_data_lowres <- aggregate(raster_data, fact = 10, fun = mean)

# Convertir a WGS84 si es necesario
raster_data_wgs84 <- project(raster_data_lowres, "EPSG:4326")

library(dplyr)
library(leaflet)
# Crear el mapa Leaflet y agregar el raster de menor resolución
leaflet() %>%
  addTiles() %>%  # Agregar una capa base
  addRasterImage(raster_data_wgs84, 
                 colors = terrain.colors(20), # Paleta de colores
                 opacity = 0.7) %>%  # Ajustar la opacidad
  addLegend(pal = colorNumeric(terrain.colors(20), values(raster_data_wgs84), na.color = "transparent"),
            values = values(raster_data_wgs84),
            title = "Elevación (m)",
            position = "bottomright") %>%
  setView(lng = mean(ext(raster_data_wgs84)[c(1, 2)]), 
          lat = mean(ext(raster_data_wgs84)[c(3, 4)]), 
          zoom = 13) 
# Generar pendientes a partir del raster reducido
slope <- terrain(raster_data_wgs84, v = "slope", unit = "degrees")



# 4. Definir la línea de muestreo para el perfil (por ejemplo, entre dos puntos)
# Asegúrate de que estas coordenadas estén en el sistema WGS84
puntos <- data.frame(lon = c(-65.61, -65.58), lat = c(-22.10, -22.10))  # Ajusta las coordenadas
linea <- st_sfc(st_linestring(as.matrix(puntos)), crs = 4326)  # Crear la línea

# 5. Asegurarse de que la línea esté en el mismo sistema de coordenadas que el raster
linea_wgs84 <- st_transform(linea, crs = st_crs(raster_data_wgs84))  # Transformar la línea al CRS del raster

# 3. Convertir el raster a WGS84 si es necesario
raster_data_wgs84 <- project(raster_data_lowres, "EPSG:4326")

# 4. Definir la línea de muestreo para el perfil (por ejemplo, entre dos puntos)
# Asegúrate de que estas coordenadas estén en el sistema WGS84
puntos <- data.frame(lon = c(-65.58, -65.56), lat = c(-21.10, -21.09))  # Ajusta las coordenadas


# 4. Definir la línea de muestreo para el perfil (por ejemplo, entre dos puntos)
# Asegúrate de que estas coordenadas estén en el sistema WGS84
puntos <- data.frame(lon = c(-65.58, -65.56), lat = c(-21.10, -21.09))  # Ajusta las coordenadas
linea <- st_sfc(st_linestring(as.matrix(puntos)), crs = 4326)  # Crear la línea

# 5. Asegurarse de que la línea esté en el mismo sistema de coordenadas que el raster
linea_wgs84 <- st_transform(linea, crs = st_crs(raster_data_wgs84))  # Transformar la línea al CRS del raster

# 6. Usar st_segmentize para dividir la línea en segmentos más pequeños (para mejorar la extracción de puntos)
linea_segmentada <- st_segmentize(linea_wgs84, dfMax = 0.001)  # Ajusta la distancia mínima de los segmentos

# 7. Extraer los puntos a lo largo de la línea segmentada
# Esta vez se usa st_coordinates en la línea segmentada para obtener los puntos
puntos_muestreo <- st_coordinates(linea_segmentada)  # Coordenadas de los puntos segmentados
puntos_vect <- vect(puntos_muestreo)  # Convertir a un objeto de tipo 'vect' para 'terra'

# 8. Extraer el perfil de elevación en estos puntos
elevaciones <- extract(raster_data_wgs84, puntos_vect)

# 9. Graficar el perfil de elevación
perfil <- elevaciones[, 2]  # Extraemos las elevaciones (el valor de la segunda columna)
distancia <- seq(0, by = 10, length.out = length(perfil))  # Distancia entre puntos

# Filtrar valores NA
perfil <- perfil[!is.na(perfil)]
distancia <- distancia[1:length(perfil)]

# Graficar el perfil de elevación
if(length(perfil) > 0) {
  plot(distancia, perfil, type = "l", col = "blue", lwd = 2, 
       xlab = "Distancia (m)", ylab = "Elevación (m)", 
       main = "Perfil de Elevación")
} else {
  message("No se encontraron datos de elevación en el perfil.")
}
## No se encontraron datos de elevación en el perfil.
  1. Capa de Elevación

    • Función utilizada: Se carga el archivo raster .img (que contiene el Modelo Digital de Elevación) usando la función rast() del paquete terra. Esta función carga el archivo en un objeto de tipo SpatRaster, que contiene la información de elevación.
    • Paquete: terra
  2. Capa de Pendiente

    • Función utilizada: Cálculo de la pendiente. La pendiente se obtiene a partir del raster de elevación utilizando la función terrain() del paquete terra. Esta función calcula varios parámetros derivados del terreno, como la pendiente, la orientación, entre otros.
    • Paquete: terra
  3. Capa de Curvas de Nivel

# Crear contornos (curvas de nivel) a partir del raster reducido
contours <- as.contour(raster_data_wgs84, levels = seq(0, max(values(raster_data_wgs84), na.rm = TRUE), by = 50))

# Crear el mapa Leaflet y agregar el raster de elevación, pendientes, y contornos
leaflet() %>%
  addTiles() %>%  # Capa base
  addRasterImage(raster_data_wgs84, 
                 colors = terrain.colors(20), 
                 opacity = 0.7, 
                 group = "Elevación") %>%
  addRasterImage(slope, 
                 colors = colorNumeric(c("lightblue", "darkblue"), values(slope), na.color = "transparent"), 
                 opacity = 0.5, 
                 group = "Pendiente") %>%
  addPolylines(data = contours, 
               color = "brown", 
               weight = 1, 
               opacity = 0.7, 
               group = "Curvas de Nivel") %>%
  addLayersControl(
    overlayGroups = c("Elevación", "Pendiente", "Curvas de Nivel"),
    options = layersControlOptions(collapsed = FALSE)
  ) %>%
  addLegend(pal = colorNumeric(terrain.colors(20), values(raster_data_wgs84), na.color = "transparent"),
            values = values(raster_data_wgs84),
            title = "Elevación (m)",
            position = "bottomright") %>%
  addLegend(pal = colorNumeric(c("lightblue", "darkblue"), values(slope), na.color = "transparent"),
            values = values(slope),
            title = "Pendiente (°)",
            position = "bottomleft") %>%
  setView(lng = mean(ext(raster_data_wgs84)[c(1, 2)]), 
          lat = mean(ext(raster_data_wgs84)[c(3, 4)]), 
          zoom = 13)

Regiones Agroecológicas (Fuente INTA)

Enlace al metadato de regiones agroecológicas de INTA

# head(mtq_pencil)
# Crear el mapa con leaflet
leaflet() %>%
  addTiles('https://wms.ign.gob.ar/geoserver/gwc/service/tms/1.0.0/mapabase_gris@EPSG%3A3857@png/{z}/{x}/{-y}.png') %>%
  setView(lng =-65.39,lat =-26.01, zoom = 6)%>%
  addPolygons(data = agroEco,
                 fillColor = ~pal1(reg_agro),  # Asigna un color distinto a cada provincia
                 fillOpacity = 0.6,
                 color = "black",    # Color del borde de cada polígono
                 weight = 1,         # Grosor del borde
                 popup = ~reg_agro  # Opcional: muestra el nombre en un popup
  )%>%
  addLegend("bottomright", 
            pal = pal1, 
            values = agroEco$reg_agro,
            title = "NOA: Regiones Agroecológicas",
            opacity = 0.6)  

Cuencas Hídricas (Fuente INTA)

Enlace al metadato de cuencas hídricas de INTA

# head(mtq_pencil)
# Crear el mapa con leaflet
leaflet() %>%
  addTiles('https://wms.ign.gob.ar/geoserver/gwc/service/tms/1.0.0/mapabase_gris@EPSG%3A3857@png/{z}/{x}/{-y}.png') %>%
  setView(lng =-65.39,lat =-26.01, zoom = 6)%>%
  addPolygons(data = cuencas,
                 fillColor = ~pal2(nom_macro_),  # Asigna un color distinto a cada provincia
                 fillOpacity = 0.6,
                 color = "black",    # Color del borde de cada polígono
                 weight = 1,         # Grosor del borde
                 popup = paste("<b>Cuenca:</b> ", cuencas$nom_macro_, "<br/>",
                               "<b>Nombre:</b> ", cuencas$nombre_1, "<br/>")
  )%>%
  addLegend("bottomright", 
            pal = pal2, 
            values = cuencas$nom_macro_,
            title = "NOA: Cuencas Hídricas",
            opacity = 0.6)  
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Set3 is 12
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Set3 is 12
## Returning the palette you asked for with that many colors

NOA: Unidades Geologicas 1M (Fuente SEGEMAR)

Enlace al metadato de Unidades Geológicas 1M

wfs1 <- "WFS:https://sigam.segemar.gov.ar/geoserver217/wfs"
layer <- "sigam:e1M.NOA.Geol"


#sigam:e1M.NOA.Fallas

geol <- st_read(wfs1, layer)
## Reading layer `sigam:e1M.NOA.Geol' from data source 
##   `WFS:https://sigam.segemar.gov.ar/geoserver217/wfs' using driver `WFS'
## Simple feature collection with 1532 features and 4 fields
## Geometry type: MULTISURFACE
## Dimension:     XY
## Bounding box:  xmin: -69.25234 ymin: -27.99997 xmax: -65.63704 ymax: -21.77727
## Geodetic CRS:  WGS 84
geol <- geol %>% 
  st_cast(to = "GEOMETRYCOLLECTION") %>% 
  st_collection_extract(type = "POLYGON")


pal3 <- colorFactor(palette = "Set3", domain = geol$unidad)


# Crear el dataframe con los datos proporcionados
library(dplyr)

# Definir las coordenadas de los salares y proyectos
data <- data.frame(
  Nombre = c("Salar del Rincón", 
             "Proyecto del Salar Cauchari Olaroz", 
             "Salar de Olaroz", 
             "Salar de Arizaro", 
             "Salar del Hombre Muerto", 
             "Salar de Antofalla"),
  Latitud = c(-24.171111, -23.716667, -23.475556, -24.725, -25.35, -25.6836),
  Longitud = c(-67.096111, -66.75, -66.665833, -67.673611, -67.07, -67.6856)
)


p.sf <- st_as_sf(data, coords = c("Longitud", "Latitud"), crs = 4326) 
# head(mtq_pencil)
# Crear el mapa con leaflet
leaflet() %>%
  addTiles('https://wms.ign.gob.ar/geoserver/gwc/service/tms/1.0.0/mapabase_gris@EPSG%3A3857@png/{z}/{x}/{-y}.png') %>%
  setView(lng =-65.39,lat =-26.01, zoom = 7)%>%
  addPolygons(data = geol,
                 fillColor = ~pal3(unidad),  # Asigna un color distinto a cada provincia
                 fillOpacity = 0.6,
                 color = "black",    # Color del borde de cada polígono
                 weight = 1,         # Grosor del borde
                 popup = paste("<b>Unidad:</b> ", geol$unidad, "<br/>",
                               "<b>Edad:</b> ", geol$edad, "<br/>",
                               "<b>Tipo de Roca:</b> ", geol$tipoderoca, "<br/>"))%>%
   addMarkers(data = p.sf, popup = ~p.sf$Nombre)%>% 
   addControl(
    html = paste0(
      "<div style='background-color: white; padding: 8px; border-radius: 5px; max-width: 300px;'>",
      "<h4 style='margin: 0; text-align: center;'>NOA: Geología</h4>",
      "<div style='display: flex; flex-wrap: wrap; gap: 4px; font-size: 0.8em;'>",
      paste0("<div style='flex: 1 1 45%; display: flex; align-items: center;'>",
             "<span style='background-color:", pal3(unique(geol$unidad)), 
             "; width: 10px; height: 10px; display: inline-block; margin-right: 4px;'></span>",
             unique(geol$unidad), "</div>", collapse = ""),
      "</div>",
      "</div>"
    ),
    position = "bottomright"
  )
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Set3 is 12
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Set3 is 12
## Returning the palette you asked for with that many colors

Salares (timelapse)

https://geography.utk.edu/creating-satellite-timelapse-with-streamlit-and-earth-engine/ Aplicación en python

Un timelapse es una técnica de video que permite mostrar el paso del tiempo de forma acelerada, comprimiendo eventos que ocurren lentamente (como el movimiento de las nubes, el crecimiento de una planta o el cambio de las estaciones) en un corto periodo de tiempo.

Salar Hombre Muerto

Salar del Rincón

NOA: Asentamientos Humanos (Fuente BAHRA)

Enlace al metadato de BAHRA

#nlevels(asen$tipo_asentamiento)
# Crear el mapa y agregar los marcadores de color según el atributo
leaflet() %>%
  addTiles('https://wms.ign.gob.ar/geoserver/gwc/service/tms/1.0.0/mapabase_gris@EPSG%3A3857@png/{z}/{x}/{-y}.png') %>%
  setView(lng = -65.39, lat = -26.01, zoom = 7) %>%
  addCircleMarkers(data = asen,
                   color = ~pal(tipo_asentamiento),
                   fillOpacity = 1, 
                   radius = 3)%>%
  addLegend("bottomright", 
            pal = pal, 
            values = asen$tipo_asentamiento,
            title = "NOA: Asentamientos Humanos",
            opacity = 0.6)