Información espacial en formato vector en R

Existen varios paquetes en R que permiten manejar datos espaciales, ya sea en formato de vector o raster. Algunos de ellos incluyen: sp, rgdal, rgeos, sf, stars, raster, terra. Sin embargo, en este curso nos enfocaremos en utilizar sf para el manejo de información vectorial y stars para el manejo de rasters.

Introducción a sf

sf es un paquete creado para trabajar de manera sencilla con información vectorial.

Features

El objeto básico en sf es un feature, es decir un rasgo o una característica. Este objeto usualmente contiene una geometría que describe la localización en el espacio de dicho rasgo y que puede contener más atributos que describen otras propiedades del mismo.

Existen varios tipos de features de acuerdo a su geometría, los básicos y más comunes son:

  • Punto (Point).
  • Línea (Linestring).
  • Polígono (Polygons).
  • Multipunto (Multipoint).
  • Multilínea (Multilinestring).
  • Mulitpolígono (Multipolygon).
  • Colección de geometrías (Geometrycollection).

Ahora, la geometría de cada rasgo va a estar asociado a un sistema de coordenadas de referencia (CRS). Por lo cual, dicho CRS indicará la proyección de los datos y el datum.

Funciones en sf

Todas las funciones en sf estarán precedidas por st_ que significa spatial type.

Estructura de datos sf

Los features van a estar organizados en un formato de data.frame, es decir, de una tabla o cuadro de datos. Sin embargo, como las geometrías usualmente no contienen un solo valor, se guardarán en una lista.

Para ver un ejemplos carguemos un archivo shapefile.

library(sf)
## Linking to GEOS 3.9.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE
nc <- st_read(system.file("shape/nc.shp", package="sf"))
## Reading layer `nc' from data source 
##   `D:\JonathanVSV\Documents\R\win-library\4.2\sf\shape\nc.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 100 features and 14 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
## Geodetic CRS:  NAD27
nc
## Simple feature collection with 100 features and 14 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
## Geodetic CRS:  NAD27
## First 10 features:
##     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
## 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
## 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
## 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
## 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
## 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
## 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
## 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
## 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
## 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
## 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
##    NWBIR74 BIR79 SID79 NWBIR79                       geometry
## 1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
## 2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...
## 3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
## 4      123   830     2     145 MULTIPOLYGON (((-76.00897 3...
## 5     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
## 6      954  1838     5    1237 MULTIPOLYGON (((-76.74506 3...
## 7      115   350     2     139 MULTIPOLYGON (((-76.00897 3...
## 8      254   594     2     371 MULTIPOLYGON (((-76.56251 3...
## 9      748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
## 10     160  2038     5     176 MULTIPOLYGON (((-80.02567 3...

Aquí podemos ver la tabla de atributos del archivo, así como el tipo de geometría (multipolígono) y las geometrías de cada entrada. A partir de esta información podemos ver que se trata de una tabla con 100 rasgos con 14 atributos + 1 columna con las geometrías de cada rasgo. Cada renglón de la tabla constituye un simple feature (sf), es decir un rasgo con ciertos atributos y su geometría. La geometría de cada rasgo constituye un simple feature geometry (sfg), mientras que la columna con todas las geometrías de los rasgos, una simple feature geometry list-column (sfc).

Conversión de datos tabulados a sf

Un tipo de conversión bastante común es que contemos con una tabla de datos con coordenadas geográficas y ciertos atributos extra que deseamos convertir a sf. Para realizar dicha operación se puede usar la función st_as_sf.

Primero se creará un conjunto de datos de coordenadas y atributos.

tabla <- data.frame(lon = c(-101.2737, -101.0627, -101.15), 
                    lat = c(19.99155, 19.96613, 19.98),
                    Atributo1 = c("A", "B", "C"))
tabla
##         lon      lat Atributo1
## 1 -101.2737 19.99155         A
## 2 -101.0627 19.96613         B
## 3 -101.1500 19.98000         C

Después se convierte a sf. Para ello, hay que indicar el CRS de la información, para lo cual se puede consultar los códigos EPSG en https://epsg.io/.

vec1 <- st_as_sf(tabla, 
                 # Nombre de las columnas con coordenadas x y
                 coords = c( "lon", "lat"),
                 # CRS en código EPSG
                 crs = 4326,
                 # ¿Quitar columnas con información espacial?
                 remove = T)
vec1
## Simple feature collection with 3 features and 1 field
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -101.2737 ymin: 19.96613 xmax: -101.0627 ymax: 19.99155
## Geodetic CRS:  WGS 84
##   Atributo1                   geometry
## 1         A POINT (-101.2737 19.99155)
## 2         B POINT (-101.0627 19.96613)
## 3         C      POINT (-101.15 19.98)

Ahora supongamos que queremos hacer un polígono a partir de ese vector.

poly1 <- vec1 %>% 
  # Si se hacen varios polígonos de acuerdo a un atributo
  # dplyr::group_by() %>% 
  dplyr::summarise() %>%
  st_cast("POLYGON")
poly1
## Simple feature collection with 1 feature and 0 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -101.2737 ymin: 19.96613 xmax: -101.0627 ymax: 19.99155
## Geodetic CRS:  WGS 84
##                         geometry
## 1 POLYGON ((-101.15 19.98, -1...

Lectura y escritura de datos

Para leer y escribir datos desde archivos externos se utilizan las funciones st_read y st_write. Por ejemplo, carguemos un archivo que viene en el paquete sf:

filename <- system.file("shape/nc.shp", package="sf")
nc <- st_read(filename)
## Reading layer `nc' from data source 
##   `D:\JonathanVSV\Documents\R\win-library\4.2\sf\shape\nc.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 100 features and 14 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
## Geodetic CRS:  NAD27
nc
## Simple feature collection with 100 features and 14 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
## Geodetic CRS:  NAD27
## First 10 features:
##     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
## 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
## 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
## 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
## 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
## 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
## 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
## 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
## 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
## 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
## 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
##    NWBIR74 BIR79 SID79 NWBIR79                       geometry
## 1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
## 2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...
## 3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
## 4      123   830     2     145 MULTIPOLYGON (((-76.00897 3...
## 5     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
## 6      954  1838     5    1237 MULTIPOLYGON (((-76.74506 3...
## 7      115   350     2     139 MULTIPOLYGON (((-76.00897 3...
## 8      254   594     2     371 MULTIPOLYGON (((-76.56251 3...
## 9      748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
## 10     160  2038     5     176 MULTIPOLYGON (((-80.02567 3...

Para escribir un vector al disco:

st_write(nc, 
         "nc_exp.shp",
         # sobreescribir si ya existe
         append = F)
## Deleting layer `nc_exp' using driver `ESRI Shapefile'
## Writing layer `nc_exp' to data source `nc_exp.shp' using driver `ESRI Shapefile'
## Writing 100 features with 14 fields and geometry type Multi Polygon.

Las funciones st_read y st_write contienen más argumentos para definir

Visualización de datos

Por último, el visualizar los datos nos puede dar una muy buena idea de los productos intermedios en un flujo de trabajo o verificar que la información que importamos o exportamos es la correcta. Para ver el objecto sf con todos sus atributos:

plot(nc)
## Warning: plotting the first 10 out of 14 attributes; use max.plot = 14 to plot
## all

O para ver algún atributo en particular.

plot(nc["AREA"])

Operaciones espaciales básicas

Descargar información de trabajo

Primero vamos a cargar información desde mi github.

## [1] "D:\\Descargas\\SIGmaterial\\16mun.zip"       
## [2] "D:\\Descargas\\SIGmaterial\\MX.zip"          
## [3] "D:\\Descargas\\SIGmaterial\\Mich.zip"        
## [4] "D:\\Descargas\\SIGmaterial\\SerieVI_Mich.zip"
##      [,1]                                                              
## [1,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/16mun.cpg"
## [2,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/16mun.dbf"
## [3,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/16mun.prj"
## [4,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/16mun.shp"
## [5,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/16mun.shx"
##      [,2]                                                               
## [1,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/Mexico.shx"
## [2,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/Mexico.cpg"
## [3,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/Mexico.dbf"
## [4,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/Mexico.prj"
## [5,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/Mexico.shp"
##      [,3]                                                             
## [1,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/Mich.cpg"
## [2,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/Mich.dbf"
## [3,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/Mich.prj"
## [4,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/Mich.shp"
## [5,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/Mich.shx"
##      [,4]                                                                     
## [1,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/SerieVI_Mich.cpg"
## [2,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/SerieVI_Mich.dbf"
## [3,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/SerieVI_Mich.prj"
## [4,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/SerieVI_Mich.shp"
## [5,] "D:/Drive/Jonathan_trabaggio/Doctorado/R/SIG/Curso/Data/SerieVI_Mich.shx"

Veamos qué descargamos.

# Ver qué archivos en la carpeta indicada cumplen con el patrón de ".shp"
files <- list.files(paste0(getwd(), "/Data"), ".shp")
files
## [1] "16mun.shp"        "Mexico.shp"       "Mich.shp"         "roi.shp"         
## [5] "SerieVI_Mich.shp"
# Leer los archivos
mun <- st_read(paste0(getwd(), "/Data/","16mun.shp"))
## Reading layer `16mun' from data source 
##   `D:\Drive\Jonathan_trabaggio\Doctorado\R\SIG\Curso\Data\16mun.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 113 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -50.89613 ymin: 1983660 xmax: 388695.4 ymax: 2258033
## Projected CRS: WGS 84 / UTM zone 14N
mx <- st_read(paste0(getwd(), "/Data/","Mexico.shp"))
## Reading layer `Mexico' from data source 
##   `D:\Drive\Jonathan_trabaggio\Doctorado\R\SIG\Curso\Data\Mexico.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 1 feature and 1 field
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -118.4042 ymin: 14.55055 xmax: -86.73862 ymax: 32.71846
## Geodetic CRS:  WGS 84
mich <- st_read(paste0(getwd(), "/Data/","Mich.shp"))
## Reading layer `Mich' from data source 
##   `D:\Drive\Jonathan_trabaggio\Doctorado\R\SIG\Curso\Data\Mich.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 1 feature and 2 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7455 ymin: 17.92189 xmax: -100.057 ymax: 20.40305
## Geodetic CRS:  WGS 84
veg <- st_read(paste0(getwd(), "/Data/","SerieVI_Mich.shp"))
## Reading layer `SerieVI_Mich' from data source 
##   `D:\Drive\Jonathan_trabaggio\Doctorado\R\SIG\Curso\Data\SerieVI_Mich.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 6529 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7381 ymin: 17.91491 xmax: -100.063 ymax: 20.39456
## Geodetic CRS:  WGS 84
mun
## Simple feature collection with 113 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -50.89613 ymin: 1983660 xmax: 388695.4 ymax: 2258033
## Projected CRS: WGS 84 / UTM zone 14N
## First 10 features:
##    CVEGEO CVE_ENT CVE_MUN         NOMGEO                       geometry
## 1   16001      16     001       Acuitzio MULTIPOLYGON (((256032.1 21...
## 2   16002      16     002      Aguililla MULTIPOLYGON (((113031.8 21...
## 3   16003      16     003 Álvaro Obregón MULTIPOLYGON (((290455.6 22...
## 4   16004      16     004   Angamacutiro MULTIPOLYGON (((222887 2240...
## 5   16005      16     005      Angangueo MULTIPOLYGON (((365943.8 21...
## 6   16006      16     006     Apatzingán MULTIPOLYGON (((160165.4 21...
## 7   16007      16     007          Aporo MULTIPOLYGON (((355615.2 21...
## 8   16008      16     008         Aquila MULTIPOLYGON (((20860.2 207...
## 9   16009      16     009           Ario MULTIPOLYGON (((221485.2 21...
## 10  16010      16     010        Arteaga MULTIPOLYGON (((173820.4 20...
mx
## Simple feature collection with 1 feature and 1 field
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -118.4042 ymin: 14.55055 xmax: -86.73862 ymax: 32.71846
## Geodetic CRS:  WGS 84
##   COUNTRY                       geometry
## 1  Mexico MULTIPOLYGON (((-97.77687 2...
mich
## Simple feature collection with 1 feature and 2 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7455 ymin: 17.92189 xmax: -100.057 ymax: 20.40305
## Geodetic CRS:  WGS 84
##   CODIGO    ESTADO                       geometry
## 1   MX16 Michoacán POLYGON ((-103.4796 18.9672...
veg
## Simple feature collection with 6529 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7381 ymin: 17.91491 xmax: -100.063 ymax: 20.39456
## Geodetic CRS:  WGS 84
## First 10 features:
##                           TIP_INFO CLAVE            TIP_ECOV
## 1                       OTRO RASGO    AH        NO APLICABLE
## 2                       OTRO RASGO    AH        NO APLICABLE
## 3                       OTRO RASGO    AH        NO APLICABLE
## 4                       OTRO RASGO    AH        NO APLICABLE
## 5                       OTRO RASGO    AH        NO APLICABLE
## 6  ECOLÓGICA-FLORÍSTICA-FISONÓMICA    BA BOSQUE DE CONÍFERAS
## 7  ECOLÓGICA-FLORÍSTICA-FISONÓMICA    BP BOSQUE DE CONÍFERAS
## 8  ECOLÓGICA-FLORÍSTICA-FISONÓMICA    BP BOSQUE DE CONÍFERAS
## 9  ECOLÓGICA-FLORÍSTICA-FISONÓMICA   BPQ BOSQUE DE CONÍFERAS
## 10 ECOLÓGICA-FLORÍSTICA-FISONÓMICA   BPQ BOSQUE DE CONÍFERAS
##                  TIP_VEG       DESVEG      FASE_VS             OTROS    CAL_POS
## 1           NO APLICABLE NO APLICABLE NO APLICABLE URBANO CONSTRUIDO Aproximada
## 2           NO APLICABLE NO APLICABLE NO APLICABLE URBANO CONSTRUIDO Aproximada
## 3           NO APLICABLE NO APLICABLE NO APLICABLE URBANO CONSTRUIDO Aproximada
## 4           NO APLICABLE NO APLICABLE NO APLICABLE URBANO CONSTRUIDO Aproximada
## 5           NO APLICABLE NO APLICABLE NO APLICABLE URBANO CONSTRUIDO Aproximada
## 6       BOSQUE DE OYAMEL     PRIMARIA      NINGUNO      NO APLICABLE Aproximada
## 7         BOSQUE DE PINO     PRIMARIA      NINGUNO      NO APLICABLE Aproximada
## 8         BOSQUE DE PINO     PRIMARIA      NINGUNO      NO APLICABLE Aproximada
## 9  BOSQUE DE PINO-ENCINO     PRIMARIA      NINGUNO      NO APLICABLE Aproximada
## 10 BOSQUE DE PINO-ENCINO     PRIMARIA      NINGUNO      NO APLICABLE Aproximada
##                          geometry
## 1  MULTIPOLYGON (((-101.3781 1...
## 2  MULTIPOLYGON (((-101.3348 1...
## 3  MULTIPOLYGON (((-101.3585 1...
## 4  MULTIPOLYGON (((-101.3107 1...
## 5  MULTIPOLYGON (((-101.4364 1...
## 6  MULTIPOLYGON (((-101.42 19....
## 7  MULTIPOLYGON (((-101.2158 1...
## 8  MULTIPOLYGON (((-100.7489 1...
## 9  MULTIPOLYGON (((-101.3228 1...
## 10 MULTIPOLYGON (((-101.3273 1...

Ver los gráficos de la información.

plot(mun)

plot(mx)

plot(mich)

# Como está pesada esta capa mostrar sólo un atributo
plot(veg["TIP_ECOV"])

Operaciones basadas en geometrías

En sf existe un conjunto de funciones diseñadas para realizar operaciones con las geometrías de los objetos sf. Aquí revisaremos algunas de las más utilizadas.

Comprobación de geometrías válidas

Comprobar que contiene geometrías válidas

st_is_valid(mx)
## [1] TRUE

En caso de que haya geometrías no válidas se puede forzar la eliminación de geometrías no válidas mediante st_make_valid.

Reproyección

Para reproyectar una capa a otro CRS simplemente se puede indicar el CRS objetivo o utilizar otra capa para extraer el CRS objetivo mediante st_crs. En este ejemplo, primero veamos el CRS de las capas mun y las demás.

st_crs(mun)
## Coordinate Reference System:
##   User input: WGS 84 / UTM zone 14N 
##   wkt:
## PROJCRS["WGS 84 / UTM zone 14N",
##     BASEGEOGCRS["WGS 84",
##         DATUM["World Geodetic System 1984",
##             ELLIPSOID["WGS 84",6378137,298.257223563,
##                 LENGTHUNIT["metre",1]]],
##         PRIMEM["Greenwich",0,
##             ANGLEUNIT["degree",0.0174532925199433]],
##         ID["EPSG",4326]],
##     CONVERSION["UTM zone 14N",
##         METHOD["Transverse Mercator",
##             ID["EPSG",9807]],
##         PARAMETER["Latitude of natural origin",0,
##             ANGLEUNIT["Degree",0.0174532925199433],
##             ID["EPSG",8801]],
##         PARAMETER["Longitude of natural origin",-99,
##             ANGLEUNIT["Degree",0.0174532925199433],
##             ID["EPSG",8802]],
##         PARAMETER["Scale factor at natural origin",0.9996,
##             SCALEUNIT["unity",1],
##             ID["EPSG",8805]],
##         PARAMETER["False easting",500000,
##             LENGTHUNIT["metre",1],
##             ID["EPSG",8806]],
##         PARAMETER["False northing",0,
##             LENGTHUNIT["metre",1],
##             ID["EPSG",8807]]],
##     CS[Cartesian,2],
##         AXIS["(E)",east,
##             ORDER[1],
##             LENGTHUNIT["metre",1]],
##         AXIS["(N)",north,
##             ORDER[2],
##             LENGTHUNIT["metre",1]],
##     ID["EPSG",32614]]
st_crs(mx)
## Coordinate Reference System:
##   User input: WGS 84 
##   wkt:
## GEOGCRS["WGS 84",
##     DATUM["World Geodetic System 1984",
##         ELLIPSOID["WGS 84",6378137,298.257223563,
##             LENGTHUNIT["metre",1]]],
##     PRIMEM["Greenwich",0,
##         ANGLEUNIT["degree",0.0174532925199433]],
##     CS[ellipsoidal,2],
##         AXIS["latitude",north,
##             ORDER[1],
##             ANGLEUNIT["degree",0.0174532925199433]],
##         AXIS["longitude",east,
##             ORDER[2],
##             ANGLEUNIT["degree",0.0174532925199433]],
##     ID["EPSG",4326]]
st_crs(mich)
## Coordinate Reference System:
##   User input: WGS 84 
##   wkt:
## GEOGCRS["WGS 84",
##     DATUM["World Geodetic System 1984",
##         ELLIPSOID["WGS 84",6378137,298.257223563,
##             LENGTHUNIT["metre",1]]],
##     PRIMEM["Greenwich",0,
##         ANGLEUNIT["degree",0.0174532925199433]],
##     CS[ellipsoidal,2],
##         AXIS["latitude",north,
##             ORDER[1],
##             ANGLEUNIT["degree",0.0174532925199433]],
##         AXIS["longitude",east,
##             ORDER[2],
##             ANGLEUNIT["degree",0.0174532925199433]],
##     ID["EPSG",4326]]
st_crs(veg)
## Coordinate Reference System:
##   User input: WGS 84 
##   wkt:
## GEOGCRS["WGS 84",
##     DATUM["World Geodetic System 1984",
##         ELLIPSOID["WGS 84",6378137,298.257223563,
##             LENGTHUNIT["metre",1]]],
##     PRIMEM["Greenwich",0,
##         ANGLEUNIT["degree",0.0174532925199433]],
##     CS[ellipsoidal,2],
##         AXIS["latitude",north,
##             ORDER[1],
##             ANGLEUNIT["degree",0.0174532925199433]],
##         AXIS["longitude",east,
##             ORDER[2],
##             ANGLEUNIT["degree",0.0174532925199433]],
##     ID["EPSG",4326]]

Vemos que mun está en otro CRS. Para transformar la capa al mismo CRS que las demás capas.

mun <- st_transform(mun, st_crs(mx))
st_crs(mun)
## Coordinate Reference System:
##   User input: WGS 84 
##   wkt:
## GEOGCRS["WGS 84",
##     DATUM["World Geodetic System 1984",
##         ELLIPSOID["WGS 84",6378137,298.257223563,
##             LENGTHUNIT["metre",1]]],
##     PRIMEM["Greenwich",0,
##         ANGLEUNIT["degree",0.0174532925199433]],
##     CS[ellipsoidal,2],
##         AXIS["latitude",north,
##             ORDER[1],
##             ANGLEUNIT["degree",0.0174532925199433]],
##         AXIS["longitude",east,
##             ORDER[2],
##             ANGLEUNIT["degree",0.0174532925199433]],
##     ID["EPSG",4326]]

Vemos que ya se realizó la transformación deseada.

Cálculo de área

Para calcular el área:

# Normalmente el valor de área está en m^2
st_area(mx)
## 1.961269e+12 [m^2]
st_area(mich)
## 59654936304 [m^2]

Recuerden que estamos trabajando con datos en coordenadas geográficas (no proyectados), por lo que sería mejor idea primero proyectarlos y después calcular su área para obtener medidas cómo el área o distancia. Esto se podría hacer mediante:

# Normalmente el valor de área está en m^2
mx |>
  st_transform(32614) |>
  st_area()
## 1.98135e+12 [m^2]

Más adelante explicaremos a qué se refiere el operador |> pero por el momento lo podemos interpretar como una función que permite encadenar procesos.

Intersección

Revisar si existe intersección entre dos sf.

st_intersects(mx, mich)
## Sparse geometry binary predicate list of length 1, where the predicate
## was `intersects'
##  1: 1

Retorna un valor por cada feature que contiene cada objeto. Si la salida es (empty) implica que no se intersectan, mientras que cuando la salida contiene números, estos indican para cada feature del objeto 1 con qué features del objeto2 se intersectan.

Por el contrario, si se desea extraer la intersección entre dos objetos se usa st_intersection

int_mx_mich <- st_intersection(mx, mich)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries

¿Qué creen que será el resultado?

plot(int_mx_mich)

int_mx_mich
## Simple feature collection with 1 feature and 3 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7455 ymin: 17.92189 xmax: -100.057 ymax: 20.40305
## Geodetic CRS:  WGS 84
##   COUNTRY CODIGO    ESTADO                       geometry
## 1  Mexico   MX16 Michoacán POLYGON ((-103.5775 18.8816...

Noten que la tabla de atributos contiene los atributos del objeto 1 (mx) y del objeto 2 (mich).

Diferencia

Para calcular la diferencia:

mx_sin_mich <- st_difference(mx, mich)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
plot(mx_sin_mich["COUNTRY"])

Unión

Para unir varias geometrías en una sola.

mx_con_mich <- st_union(mx_sin_mich, mich)
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
plot(mx_con_mich["COUNTRY"])

Unión de polígonos o varios sf en una misma colección

Para unir varios polígonos o rasgos espaciales dentro de una misma colección se utiliza la notación de tidyverse para unir tablas, es decir, bind_rows.

mx_con_mich_sinunion <- dplyr::bind_rows(mx_sin_mich, mich)
mx_con_mich_sinunion
## Simple feature collection with 2 features and 3 fields
## Geometry type: GEOMETRY
## Dimension:     XY
## Bounding box:  xmin: -118.4042 ymin: 14.55055 xmax: -86.73862 ymax: 32.71846
## Geodetic CRS:  WGS 84
##   COUNTRY CODIGO    ESTADO                       geometry
## 1  Mexico   MX16 Michoacán MULTIPOLYGON (((-103.5508 1...
## 2    <NA>   MX16 Michoacán POLYGON ((-103.4796 18.9672...
plot(mx_con_mich_sinunion["COUNTRY"])

Regresa Michoacán al polígono completo de México, aunque noten que quedan algunos polígonos basura.

Centroides

Se puede calcular el centroide de un polígono.

mich_centroid <- st_centroid(mich)
## Warning in st_centroid.sf(mich): st_centroid assumes attributes are constant
## over geometries of x
plot(mich_centroid)

Buffers

Además, se puede calcular buffers.

# Normalmente el valor de buffer está en m
mich_centr_buff <- st_buffer(mich_centroid, 
                             10000)
plot(mich_centr_buff)

Join espacial

Muestreo aleatorio

Esta función es bastante utilizada para muestrear una superficie, lo cual es muy utilizado para verificar mapas clasificados u productos similares. Para realizar este muestreo se utiliza la función st_sample.

Operaciones basadas en atributos

En sf existe un conjunto de funciones diseñadas para realizar operaciones con basados en los atributos de los objetos sf. Aquí revisaremos algunas de las más utilizadas.

Tidyverse-esque sintaxis

En R existe un paquete llamado tidyverse que contiene un conjunto de paquetes muy útiles para gráficas (ggplot2), limpiar y arreglar bases de datos (tidyr y dplyr), los cuales hacen uso del operador %>% o pipe para concatenar varias funciones de manera más resumida. Esta sintaxis será de mucha ayuda para concatenar un flujo de trabajo o para simplificar el código, lo cual muchas veces facilita su lectura. Por ello, para la mayoría de las operaciones basadas en atributos usaremos el operador %>% para realizar las operaciones. Actualmente, en R > 4.0.0, dicho operador fue incluido en R base como |>.

Selección por rasgos

Primero revisemos parte de los datos, así como los niveles de un atributo. Para consultar los niveles de un atributo lo podemos hacer con la sintaxis tradicional de R o a la manera tidyverse.

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.6     v dplyr   1.0.7
## v tidyr   1.1.4     v stringr 1.4.0
## v readr   2.1.1     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter()     masks stats::filter()
## x dplyr::lag()        masks stats::lag()
## x readr::parse_date() masks curl::parse_date()
head(veg)
## Simple feature collection with 6 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -101.4439 ymin: 19.40706 xmax: -101.3107 ymax: 19.54956
## Geodetic CRS:  WGS 84
##                          TIP_INFO CLAVE            TIP_ECOV          TIP_VEG
## 1                      OTRO RASGO    AH        NO APLICABLE     NO APLICABLE
## 2                      OTRO RASGO    AH        NO APLICABLE     NO APLICABLE
## 3                      OTRO RASGO    AH        NO APLICABLE     NO APLICABLE
## 4                      OTRO RASGO    AH        NO APLICABLE     NO APLICABLE
## 5                      OTRO RASGO    AH        NO APLICABLE     NO APLICABLE
## 6 ECOLÓGICA-FLORÍSTICA-FISONÓMICA    BA BOSQUE DE CONÍFERAS BOSQUE DE OYAMEL
##         DESVEG      FASE_VS             OTROS    CAL_POS
## 1 NO APLICABLE NO APLICABLE URBANO CONSTRUIDO Aproximada
## 2 NO APLICABLE NO APLICABLE URBANO CONSTRUIDO Aproximada
## 3 NO APLICABLE NO APLICABLE URBANO CONSTRUIDO Aproximada
## 4 NO APLICABLE NO APLICABLE URBANO CONSTRUIDO Aproximada
## 5 NO APLICABLE NO APLICABLE URBANO CONSTRUIDO Aproximada
## 6     PRIMARIA      NINGUNO      NO APLICABLE Aproximada
##                         geometry
## 1 MULTIPOLYGON (((-101.3781 1...
## 2 MULTIPOLYGON (((-101.3348 1...
## 3 MULTIPOLYGON (((-101.3585 1...
## 4 MULTIPOLYGON (((-101.3107 1...
## 5 MULTIPOLYGON (((-101.4364 1...
## 6 MULTIPOLYGON (((-101.42 19....
# Ver niveles únicos del atributo TIP_ECOV
unique(veg$TIP_ECOV)
##  [1] "NO APLICABLE"               "BOSQUE DE CONÍFERAS"       
##  [3] "BOSQUE DE ENCINO"           "VEGETACIÓN INDUCIDA"       
##  [5] "SELVA CADUCIFOLIA"          "PASTIZAL"                  
##  [7] "VEGETACIÓN HIDRÓFILA"       "MATORRAL XERÓFILO"         
##  [9] "SELVA SUBCADUCIFOLIA"       "BOSQUE MESÓFILO DE MONTAÑA"
## [11] "SELVA ESPINOSA"
# Lo mismo pero en forma tidyverse
veg |>
  select(TIP_ECOV) |>
  distinct(TIP_ECOV)
##                      TIP_ECOV
## 1                NO APLICABLE
## 2         BOSQUE DE CONÍFERAS
## 3            BOSQUE DE ENCINO
## 4         VEGETACIÓN INDUCIDA
## 5           SELVA CADUCIFOLIA
## 6                    PASTIZAL
## 7        VEGETACIÓN HIDRÓFILA
## 8           MATORRAL XERÓFILO
## 9        SELVA SUBCADUCIFOLIA
## 10 BOSQUE MESÓFILO DE MONTAÑA
## 11             SELVA ESPINOSA

Seleccionemos entonces todos los polígonos de selva caducifolia.

# Lo mismo pero en forma tidyverse
sbc <- veg |>
  filter(TIP_ECOV == "SELVA CADUCIFOLIA")
sbc
## Simple feature collection with 1286 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7093 ymin: 17.99039 xmax: -100.2101 ymax: 20.37962
## Geodetic CRS:  WGS 84
## First 10 features:
##                           TIP_INFO   CLAVE          TIP_ECOV
## 1  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 2  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSA/SBC SELVA CADUCIFOLIA
## 3  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 4  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 5  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 6  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 7  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 8  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 9  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 10 ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
##                   TIP_VEG     DESVEG   FASE_VS        OTROS    CAL_POS
## 1  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 2  SELVA BAJA CADUCIFOLIA SECUNDARIA   ARBÓREA NO APLICABLE Aproximada
## 3  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 4  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 5  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 6  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 7  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 8  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 9  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 10 SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
##                          geometry
## 1  MULTIPOLYGON (((-101.3513 1...
## 2  MULTIPOLYGON (((-101.4022 1...
## 3  MULTIPOLYGON (((-102.8018 1...
## 4  MULTIPOLYGON (((-102.8374 1...
## 5  MULTIPOLYGON (((-102.7461 1...
## 6  MULTIPOLYGON (((-102.7968 1...
## 7  MULTIPOLYGON (((-102.685 18...
## 8  MULTIPOLYGON (((-102.7767 1...
## 9  MULTIPOLYGON (((-102.7778 1...
## 10 MULTIPOLYGON (((-102.7534 1...
# Para hacer lo mismo en sintaxis tradicional
veg[veg$TIP_ECOV == "SELVA CADUCIFOLIA",]
## Simple feature collection with 1286 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7093 ymin: 17.99039 xmax: -100.2101 ymax: 20.37962
## Geodetic CRS:  WGS 84
## First 10 features:
##                            TIP_INFO   CLAVE          TIP_ECOV
## 66  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 67  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSA/SBC SELVA CADUCIFOLIA
## 192 ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 193 ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 194 ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 262 ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 263 ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 264 ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 265 ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 266 ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
##                    TIP_VEG     DESVEG   FASE_VS        OTROS    CAL_POS
## 66  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 67  SELVA BAJA CADUCIFOLIA SECUNDARIA   ARBÓREA NO APLICABLE Aproximada
## 192 SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 193 SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 194 SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 262 SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 263 SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 264 SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 265 SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 266 SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
##                           geometry
## 66  MULTIPOLYGON (((-101.3513 1...
## 67  MULTIPOLYGON (((-101.4022 1...
## 192 MULTIPOLYGON (((-102.8018 1...
## 193 MULTIPOLYGON (((-102.8374 1...
## 194 MULTIPOLYGON (((-102.7461 1...
## 262 MULTIPOLYGON (((-102.7968 1...
## 263 MULTIPOLYGON (((-102.685 18...
## 264 MULTIPOLYGON (((-102.7767 1...
## 265 MULTIPOLYGON (((-102.7778 1...
## 266 MULTIPOLYGON (((-102.7534 1...

A partir de ahora utilizaremos únicamente la notación “tidy”. También podemos seleccionar entradas a partir de uno o más niveles de algún atributo. El operador %in% indica que se busquen las entradas donde su atributo TIP_ECOV sea alguna de las entradas indicadas en el vector siguiente, es decir: SELVA CADUCIFOLIA o BOSQUE DE CONÍFERAS.

# Lo mismo pero en forma tidyverse
sbc_bc <- veg |>
  filter(TIP_ECOV %in% c("SELVA CADUCIFOLIA", "BOSQUE DE CONÍFERAS"))
sbc_bc
## Simple feature collection with 2346 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7093 ymin: 17.99039 xmax: -100.1266 ymax: 20.37962
## Geodetic CRS:  WGS 84
## First 10 features:
##                           TIP_INFO  CLAVE            TIP_ECOV
## 1  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     BA BOSQUE DE CONÍFERAS
## 2  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     BP BOSQUE DE CONÍFERAS
## 3  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     BP BOSQUE DE CONÍFERAS
## 4  ECOLÓGICA-FLORÍSTICA-FISONÓMICA    BPQ BOSQUE DE CONÍFERAS
## 5  ECOLÓGICA-FLORÍSTICA-FISONÓMICA    BPQ BOSQUE DE CONÍFERAS
## 6  ECOLÓGICA-FLORÍSTICA-FISONÓMICA    BPQ BOSQUE DE CONÍFERAS
## 7  ECOLÓGICA-FLORÍSTICA-FISONÓMICA    BPQ BOSQUE DE CONÍFERAS
## 8  ECOLÓGICA-FLORÍSTICA-FISONÓMICA    BPQ BOSQUE DE CONÍFERAS
## 9  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/BA BOSQUE DE CONÍFERAS
## 10 ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSA/BP BOSQUE DE CONÍFERAS
##                  TIP_VEG     DESVEG   FASE_VS        OTROS    CAL_POS
## 1       BOSQUE DE OYAMEL   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 2         BOSQUE DE PINO   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 3         BOSQUE DE PINO   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 4  BOSQUE DE PINO-ENCINO   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 5  BOSQUE DE PINO-ENCINO   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 6  BOSQUE DE PINO-ENCINO   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 7  BOSQUE DE PINO-ENCINO   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 8  BOSQUE DE PINO-ENCINO   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 9       BOSQUE DE OYAMEL SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 10        BOSQUE DE PINO SECUNDARIA   ARBÓREA NO APLICABLE Aproximada
##                          geometry
## 1  MULTIPOLYGON (((-101.42 19....
## 2  MULTIPOLYGON (((-101.2158 1...
## 3  MULTIPOLYGON (((-100.7489 1...
## 4  MULTIPOLYGON (((-101.3228 1...
## 5  MULTIPOLYGON (((-101.3273 1...
## 6  MULTIPOLYGON (((-101.2634 1...
## 7  MULTIPOLYGON (((-101.4312 1...
## 8  MULTIPOLYGON (((-101.2528 1...
## 9  MULTIPOLYGON (((-101.4514 1...
## 10 MULTIPOLYGON (((-101.3691 1...

Calcular nuevos atributos

Para agregar una nueva columna o un nuevo atributo se utiliza la función mutate seguido del nombre del nuevo atributo y de la definición del nuevo atributo de acuerdo a una función o un único valor.

sbc <- sbc |>
  # as.numeric se utiliza para convertir los valores a numéricos y quitarle la propiedad de units (ver sección cálculo de área). Además, al dividir entre 10000 se pasa de m2 a ha.
  mutate(area_ha = as.numeric(st_area(sbc)/10000))
sbc
## Simple feature collection with 1286 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7093 ymin: 17.99039 xmax: -100.2101 ymax: 20.37962
## Geodetic CRS:  WGS 84
## First 10 features:
##                           TIP_INFO   CLAVE          TIP_ECOV
## 1  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 2  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSA/SBC SELVA CADUCIFOLIA
## 3  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 4  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 5  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 6  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 7  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 8  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 9  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 10 ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
##                   TIP_VEG     DESVEG   FASE_VS        OTROS    CAL_POS
## 1  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 2  SELVA BAJA CADUCIFOLIA SECUNDARIA   ARBÓREA NO APLICABLE Aproximada
## 3  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 4  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 5  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 6  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 7  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 8  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 9  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 10 SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
##                          geometry    area_ha
## 1  MULTIPOLYGON (((-101.3513 1...   57.60691
## 2  MULTIPOLYGON (((-101.4022 1...  156.68668
## 3  MULTIPOLYGON (((-102.8018 1...  125.93153
## 4  MULTIPOLYGON (((-102.8374 1...  557.72104
## 5  MULTIPOLYGON (((-102.7461 1... 2433.63242
## 6  MULTIPOLYGON (((-102.7968 1...  122.14498
## 7  MULTIPOLYGON (((-102.685 18... 2680.84067
## 8  MULTIPOLYGON (((-102.7767 1...   31.28422
## 9  MULTIPOLYGON (((-102.7778 1...  331.41608
## 10 MULTIPOLYGON (((-102.7534 1...  102.77817

Selección por rasgos2

Ahora vamos a filtrar usando variables numéricas. En este caso, para quedarnos con entradas con un área entre 100 y 5000 ha.

sbc_filt <- sbc |>
  filter(area_ha <= 5000 & area_ha >= 100)
sbc_filt
## Simple feature collection with 855 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7093 ymin: 17.9907 xmax: -100.2101 ymax: 20.37962
## Geodetic CRS:  WGS 84
## First 10 features:
##                           TIP_INFO   CLAVE          TIP_ECOV
## 1  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSA/SBC SELVA CADUCIFOLIA
## 2  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 3  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 4  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 5  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 6  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 7  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 8  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 9  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 10 ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
##                   TIP_VEG     DESVEG   FASE_VS        OTROS    CAL_POS
## 1  SELVA BAJA CADUCIFOLIA SECUNDARIA   ARBÓREA NO APLICABLE Aproximada
## 2  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 3  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 4  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 5  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 6  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 7  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 8  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 9  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 10 SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
##                          geometry   area_ha
## 1  MULTIPOLYGON (((-101.4022 1...  156.6867
## 2  MULTIPOLYGON (((-102.8018 1...  125.9315
## 3  MULTIPOLYGON (((-102.8374 1...  557.7210
## 4  MULTIPOLYGON (((-102.7461 1... 2433.6324
## 5  MULTIPOLYGON (((-102.7968 1...  122.1450
## 6  MULTIPOLYGON (((-102.685 18... 2680.8407
## 7  MULTIPOLYGON (((-102.7778 1...  331.4161
## 8  MULTIPOLYGON (((-102.7534 1...  102.7782
## 9  MULTIPOLYGON (((-102.7617 1...  144.2841
## 10 MULTIPOLYGON (((-102.7179 1...  269.7079

Finalmente, veamos una de las ventajas de usar la sintaxis “tidy”, al concatenar varios procesos para obtener el mismo resultado.

sbc_filt2 <- veg |>
  filter(TIP_ECOV == "SELVA CADUCIFOLIA") |>
  mutate(area_ha = as.numeric(st_area(sbc)/10000)) |>
  filter(area_ha <= 5000 & area_ha >= 100)
sbc_filt2
## Simple feature collection with 855 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7093 ymin: 17.9907 xmax: -100.2101 ymax: 20.37962
## Geodetic CRS:  WGS 84
## First 10 features:
##                           TIP_INFO   CLAVE          TIP_ECOV
## 1  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSA/SBC SELVA CADUCIFOLIA
## 2  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 3  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 4  ECOLÓGICA-FLORÍSTICA-FISONÓMICA     SBC SELVA CADUCIFOLIA
## 5  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 6  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 7  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 8  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 9  ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
## 10 ECOLÓGICA-FLORÍSTICA-FISONÓMICA VSa/SBC SELVA CADUCIFOLIA
##                   TIP_VEG     DESVEG   FASE_VS        OTROS    CAL_POS
## 1  SELVA BAJA CADUCIFOLIA SECUNDARIA   ARBÓREA NO APLICABLE Aproximada
## 2  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 3  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 4  SELVA BAJA CADUCIFOLIA   PRIMARIA   NINGUNO NO APLICABLE Aproximada
## 5  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 6  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 7  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 8  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 9  SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
## 10 SELVA BAJA CADUCIFOLIA SECUNDARIA ARBUSTIVA NO APLICABLE Aproximada
##                          geometry   area_ha
## 1  MULTIPOLYGON (((-101.4022 1...  156.6867
## 2  MULTIPOLYGON (((-102.8018 1...  125.9315
## 3  MULTIPOLYGON (((-102.8374 1...  557.7210
## 4  MULTIPOLYGON (((-102.7461 1... 2433.6324
## 5  MULTIPOLYGON (((-102.7968 1...  122.1450
## 6  MULTIPOLYGON (((-102.685 18... 2680.8407
## 7  MULTIPOLYGON (((-102.7778 1...  331.4161
## 8  MULTIPOLYGON (((-102.7534 1...  102.7782
## 9  MULTIPOLYGON (((-102.7617 1...  144.2841
## 10 MULTIPOLYGON (((-102.7179 1...  269.7079

Fusionar por atributos (disolver)

mun_diss <- mun |>
  # Agrupar por CVE_ENT, lo cual puede ser útil cuando se tienen datos más complejos
  mutate(area_ha = as.numeric(st_area(mun)/10000)) |>
  group_by(CVE_ENT) |>
  # Resumir, se puede aprovechar para resumir un atributo
  summarise(area_ha = sum(area_ha)) |>
  st_cast("POLYGON")
mun_diss
## Simple feature collection with 1 feature and 2 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7381 ymin: 17.91491 xmax: -100.063 ymax: 20.39456
## Geodetic CRS:  WGS 84
## # A tibble: 1 x 3
##   CVE_ENT  area_ha                                                      geometry
##   <chr>      <dbl>                                                 <POLYGON [°]>
## 1 16      5877654. ((-101.4021 20.03894, -101.4021 20.03992, -101.4021 20.04014~
plot(mun_diss)

Noten que los únicos atributos son la variable por la que fueron agrupados los datos y el atributo que se resumió.

Unir tablas por atributos

Otra función bastante utilizada es unir tablas no espaciales a objetos espaciales mediante sus atributos. Así que cargaremos unos datos del censo agropecuario del 2007 desde mi github.

cen_agrop <- read.csv("https://github.com/JonathanVSV/CursoSIG/raw/main/material/cag_2007_04.csv")

Vemos que hizo parcialmente la unión. ¿Quién adivina por qué?

mun |>
  left_join(cen_agrop, 
            by = c("NOMGEO" = "entidad_y_municipio"))
## Simple feature collection with 113 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -103.7381 ymin: 17.91491 xmax: -100.063 ymax: 20.39456
## Geodetic CRS:  WGS 84
## First 10 features:
##    CVEGEO CVE_ENT CVE_MUN         NOMGEO superficie_total_a
## 1   16001      16     001       Acuitzio          13430.637
## 2   16002      16     002      Aguililla         119237.074
## 3   16003      16     003 Álvaro Obregón                 NA
## 4   16004      16     004   Angamacutiro          15308.272
## 5   16005      16     005      Angangueo           2476.861
## 6   16006      16     006     Apatzingán                 NA
## 7   16007      16     007          Aporo           3617.149
## 8   16008      16     008         Aquila          70122.757
## 9   16009      16     009           Ario          48324.613
## 10  16010      16     010        Arteaga         236101.807
##    regimen_de_tenencia_de_la_tierra_ejidal
## 1                                1349.7480
## 2                               41364.4160
## 3                                       NA
## 4                               11273.3090
## 5                                2075.7966
## 6                                       NA
## 7                                 886.5822
## 8                                5915.8852
## 9                               22239.7259
## 10                              53052.6941
##    regimen_de_tenencia_de_la_tierra_comunal
## 1                                   19.2265
## 2                                    0.0000
## 3                                        NA
## 4                                    4.5000
## 5                                    0.0000
## 6                                        NA
## 7                                    0.0000
## 8                                27862.1605
## 9                                    0.0000
## 10                                5028.4367
##    regimen_de_tenencia_de_la_tierra_privada
## 1                                12060.5622
## 2                                77858.5831
## 3                                        NA
## 4                                 4026.4626
## 5                                  400.0645
## 6                                        NA
## 7                                 2721.5673
## 8                                36344.7113
## 9                                26078.8871
## 10                              176369.9331
##    regimen_de_tenencia_de_la_tierra_de_colonia
## 1                                            0
## 2                                            0
## 3                                           NA
## 4                                            0
## 5                                            0
## 6                                           NA
## 7                                            0
## 8                                            0
## 9                                            0
## 10                                           0
##    regimen_de_tenencia_de_la_tierra_publica unidad_de_medida
## 1                                     1.100        hectareas
## 2                                    14.075        hectareas
## 3                                        NA             <NA>
## 4                                     4.000        hectareas
## 5                                     1.000        hectareas
## 6                                        NA             <NA>
## 7                                     9.000        hectareas
## 8                                     0.000        hectareas
## 9                                     6.000        hectareas
## 10                                 1650.744        hectareas
##                          geometry
## 1  MULTIPOLYGON (((-101.3251 1...
## 2  MULTIPOLYGON (((-102.6761 1...
## 3  MULTIPOLYGON (((-101.0023 1...
## 4  MULTIPOLYGON (((-101.6524 2...
## 5  MULTIPOLYGON (((-100.2788 1...
## 6  MULTIPOLYGON (((-102.2316 1...
## 7  MULTIPOLYGON (((-100.3776 1...
## 8  MULTIPOLYGON (((-103.54 18....
## 9  MULTIPOLYGON (((-101.6504 1...
## 10 MULTIPOLYGON (((-102.0921 1...

Al parecer el problema está en los caracteres con acentos. Vamos a tener que hacer dos cosas para arreglar los datos. 1) Substituir los acentos por letras sin acentos en mun y substituir la primera letra del nombre del municipio a su equivalente en mayúsculas en cen_agrop.

mun <- mun |>
  # Aquí pasamos la fórmula al estilo purrr, otro paquete de R
  # La lógica es indicar una función ~ aplicada a lo que viene antes, indicado por el .x
  # Sustituimos todas las letras por su equivalente sin acento
  mutate(across(NOMGEO, ~ str_replace_all(.x, c("Á" = "A", "á" = "a", "É" = "E", "é" = "e", "Í" = "I", "i" = "i", "Ó" = "O", "ó" = "o", "Ú" = "U", "u" = "u")))) 

cen_agrop <- cen_agrop |>
  # Vamos a tener que usar Regular Expressions para arreglar otro problema con los datos: algunos no empiezan con mayúsculas. Vamos a hacer esto para cambiar la primera letra de la primera palabra "^\\w{1}" a mayúscula
  mutate(across(entidad_y_municipio, ~ str_replace_all(.x, "^\\w{1}", toupper)))

Ahora ya podemos unir los datos de manera correcta.

mun <- mun |>
  left_join(cen_agrop, 
            by = c("NOMGEO" = "entidad_y_municipio")) 

Una vez realizado estos pasos, ya obtenemos nuestra capa sf con los atributos de la tabla sin información espacial. Este ejemplo, sirve para demostrar algunas de las capacidades de R para automatizar procesos y limpiar datos. Además, es un ejemplo de la vida real, en el que las bases de datos muchas veces contienen errores o no hay una compatibilidad al 100 % entre distintas bases de datos.

Visualizacion avanzada

Para generar visualizaciones más avanzadas podemos utilizar otros paquetes como ggplot2 o tmap. Aquí veremos un ejemplo de cada uno.

ggplot2

En ggplot se puede determinar directamente el color y relleno de cada capa vectorial.

ggplot() +
  # Graficar cada capa por separado con sus características de visualización
  geom_sf(data = mich, fill = "gray70", colour = "red") +
  geom_sf(data = mun, fill = "transparent", colour = "gray40") +
  geom_sf(data = sbc, fill = "orange2")

Sin embargo, también se puede utilizar un atributo de cada capa para determinar el color o relleno de los polígonos

ggplot() +
  # Graficar cada capa por separado con sus características de visualización
  geom_sf(data = mich, fill = "gray70", colour = "red") +
  geom_sf(data = mun, fill = "transparent", colour = "gray40") +
  geom_sf(data = sbc_bc, aes(fill = TIP_ECOV)) +
  # Para sobreescribir valores de relleno por default
  scale_fill_manual(values = c("forestgreen", "orange2"))

tmap

La opción de tmap require de utilizar algún atributo de la información para determinar el color de relleno de cada polígono de acuerdo a los valores de ese atributo. Es similar a ggplot utilizando la opción de aes. Podemos ver algunas de las paletas que ya vienen pre hechas tanto para ggplot como para tmap con tmaptools::palette_explorer()

library(tmap)

# Cargar shapr
tm_shape(mich) +
  # Elegir forma de visualización
  tm_polygons() +
  tm_shape(mun) +
  tm_polygons() +
  tm_shape(sbc_bc) +
  tm_fill(col = "TIP_ECOV", palette = "-RdYlGn") 

</div>

</div> </div>