Taller: Patrones de cobertura territorial con isocronas, mapas de calor y densidades de núcleo

Dra. Maria Carolina Quintana Noriega

Twitter: @Urbainilla

28 y 29 de junio de 2021

Patrones de cobertura territorial con isocronas, mapas de calor y densidades de núcleo

## Warning: package 'rgdal' is not available for this version of R
## 
## A version of this package for your version of R might be available elsewhere,
## see the ideas at
## https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages
## Warning: 'BiocManager' not available.  Could not check Bioconductor.
## 
## Please use `install.packages('BiocManager')` and then retry.
## Warning in p_install(package, character.only = TRUE, ...):
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : there is no package called 'rgdal'
## Warning in p_load("readr", "tidyverse", "DT", "prettydoc", "mapview", "rgdal", : Failed to install/load:
## rgdal

Taller presentado durante el 4º Coloquio de Estudiantes de Maestría en Ciencias en Arquitectura y Urbanismo de la ESIA Tecamachalco, del Instituto Politécnico Nacional.

Aprendizaje Al finalizar el taller, el participante podrá evaluar la cobertura de algún tipo de servicio, infraestructura o equipamiento, así como observar la distribución territorial de algún fenómeno particular que decida analizar.

Actividades Durante el taller se elaborarán mapas de calor basados en el Directorio Estadístico Nacional de Unidades Económicas (DENUE) con QGIS y se revisará la porosidad urbana por medio de isocronas generadas con una herramienta en línea. Finalmente se elaborarán densidades de núcleo con R Studio para determinar los patrones de distribución de un conjunto específico de datos espaciales.

Requerimientos Se hará uso de los softwares libres y de código abierto para análisis geo-espacial QGIS y R Studio. Es deseable contar con conocimientos sobre sistemas de información geográfica.

Sesión 1 (2hrs)

Minería de datos:

Sesión 2 (2hrs)

Mapas de calor:

  • Revisión de configuración y contenido del DENUE
  • Representación de capas como mapas de calor
  • Categorizar (Ponderar) mapas de calor por variable: “nombre_act” ilike ‘hospital%’)

Isocronas:

Densidades de núcleo:

Tener un encabezado:

####################################################################################
# Titulo  : Densidades de núcleo (kernel)                                          #
#                                                                                  #
# Autor   : Maria Carolina Quintana Noriega                                        #
# Fecha   : 29 de junio de 2021                                                    #
####################################################################################
##### Instalar los paquetes de herramientas que se van a utilizar (PACMAN, RGDAL, RGEOS y GGSpatial):

install.packages("pacman")
install.packages("rgdal")
install.packages("rgeos")
install.packages("ggspatial")
##### Cargar las bibliotecas

pacman::p_load(tidyverse, sf, sp, spData, viridis, tmap)
##### Cargar SHP con polígono de municipio o alcaldía y proyección en grados (4326)

NAUCALPAN <- st_read("MPIO_NAUCALPAN.shp")

NAUCALPAN %>%
  ggplot() +
  geom_sf()

  • Revisión del código para densidades de núcleo
##### Cargar CSV con centroides (puntos) de equipamientos

NAUCALPAN_TORTILLERIAS <- read_csv("TORTILL_NAUCALPAN.csv")
## Rows: 542 Columns: 42
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (31): clee, nom_estab, raz_social, nombre_act, per_ocu, tipo_vial, nom_v...
## dbl (10): id, codigo_act, numero_ext, edificio_e, numero_int, cod_postal, cv...
## lgl  (1): www
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
##### Representar los puntos sobre el polígono

NAUCALPAN %>%
  ggplot() +
  geom_sf() +
  geom_point(data = NAUCALPAN_TORTILLERIAS,
             aes(x = longitud,
                 y = latitud))

##### Generar polígonos de densidad de núcleo (kernel)

NAUCALPAN %>%
  ggplot() +
  geom_sf(fill = "grey95",
          size = 0.4) +
  geom_density2d(data = NAUCALPAN_TORTILLERIAS,
                 aes(x = longitud, y = latitud),
                 
                 adjust = 1/3,                                     # Para modificar la densidad (ancho de banda)
                 
                 size = 0.6, color = "#673059") +
  
  scale_x_continuous(minor_breaks=0, limits=c(-99.42,-99.2)) +     # Para no cortar las curvas
  scale_y_continuous(minor_breaks=0, limits=c(19.4,19.54)) +       # Fuente: https://stackoverflow.com/questions/35974805/ggplot2-automatic-scaling-to-include-complete-contour-lines-in-geom-density-2d
  
  theme_void() +
  labs(title = "Densidades de núcleo (kernel)",
       subtitle = "CDMX, 29 de junio de 2021.",
       caption = "Elaboración propia con base en carpetas DENUE.") 

##### Para crear densidades de núcleo (kernel) con relleno

NAUCALPAN %>%                                         #####
  ggplot() +                                          # Esto representa el SHP de la CDMX en el mapa
  geom_sf(fill = "grey95",                            #
          size = 0.4)+                                #####
  geom_density2d(data = NAUCALPAN_TORTILLERIAS,       # Esto representa los polígonos de densidad de
                 aes(x = longitud, y = latitud),      # núcleo (kernel) sobre el mapa
                 size = 0.6, color = "#673059") +     ##### 
  stat_density2d(data = NAUCALPAN_TORTILLERIAS,       #
               aes(x = longitud, y = latitud,         #
                   fill = ..level.. ,                 #
                   alpha = ..level..),                # Y todo esto representa los rellenos de la
               geom = "polygon",                      # densidad de núcleo (kernel) sobre el mapa
               size = 0.01, bins = 10) +              #
  scale_fill_viridis(option = "inferno") +            #
  guides(fill=FALSE, alpha = F) +                     #####
  theme_void() +
  labs(title = "Densidades de núcleo (kernel)",
       subtitle = "CDMX, 29 de junio de 2021.",
       caption = "Elaboración propia con base en DENUE") 

  • Exportación de capa
##### Para guardar el resultado en un archivo SHP
# Esta es una opción de StackOverflow del Sep 16 '17 at 9:48 por usuario=Z.Lin
# Se puede consultar en el siguiente enlace:
# https://stackoverflow.com/questions/46248061/save-a-ggplot2-coord-map-chart-in-shapefile
 
library(ggplot2)
 
 # Paso 0: crear el objeto de densidades de núcleo como en el código
 
 dens_nuc <- ggplot() +
 stat_density2d(data = NAUCALPAN_TORTILLERIAS,
                aes(x = longitud, y = latitud,
                fill = ..level.. ,
                alpha = ..level..),
                geom = "polygon",
                
                adjust = 1/3,                                       # Para modificar la densidad (ancho de banda)
                
                size = 0.01, bins = 10) +
 
   scale_x_continuous(minor_breaks=0, limits=c(-99.42,-99.2)) +     # Para no cortar las curvas
   scale_y_continuous(minor_breaks=0, limits=c(19.4,19.54))         # Fuente: https://stackoverflow.com/questions/35974805/ggplot2-automatic-scaling-to-include-complete-contour-lines-in-geom-density-2d
 # Paso 1: Extraer los datos relevantes del objeto ggplot:
   
 library(dplyr)
 
 
 # Devolver una lista de marcos de datos (cada marco de datos contiene coordenadas para un contorno);
 # Tener en cuenta que puede haber varios contornos en el mismo alfa / color / relleno,
 # de ahí la necesidad de dividir por grupos en lugar de por parámetros estéticos.
 
 dg <- layer_data(dens_nuc) %>% 
   select(group, x, y) %>% 
   split(.$group) %>%
   lapply(function(d){d[,-1]})
 # Paso 2: Convertir los marcos de datos en un objeto SpatialPolygonsDataFrame,
 # que se pasará a writeOGR:

 library(sp)

 # Convertir cada marco de datos en un objeto de clase Polygon.
 
 polygons <- lapply(dg, Polygon) 

 # Convertir cada objeto de la clase Polygon en un objeto de la clase Polygons.
 
 polygons <- lapply(seq_along(polygons), 
                   function(i){
                     Polygons(list(polygons[[i]]),
                              ID = names(dg)[i])
                   })

 # Convertir la lista de objetos de la clase Polygons en un objeto SpatialPolygons
 
 polygons <- SpatialPolygons(polygons)

 # Convertir el objeto SpatialPolygons en un objeto SpatialPolygonsDataFrame
 
 polygons <- SpatialPolygonsDataFrame(polygons,
                                     data = layer_data(dens_nuc) %>% 
                                     select(group, alpha, colour, fill) %>% 
                                     unique(),
                                     match.ID = "group")
 # Paso 3: Guardar el objeto SpatialPolygonsDataFrame como un shapefile.
   
 rgeos::createSPComment(polygons)             # Este comando lo requirió writeOGR. Implicó instalar un nuevo paquete
 
 rgdal::writeOGR(obj = polygons,
                   dsn = 'Library/CloudStorage/OneDrive-InstitutoTecnologicoydeEstudiosSuperioresdeMonterrey/UTILERIA/IPN_TALLER_PCT_2021/',
                   layer = "DENS_NUC_NAUCALPAN_TORTILLERIAS",
                   driver = "ESRI Shapefile")
  • Representación en QGis.
  • Interpretación cartográfica

¡Gracias por participar en el Taller!