class: center, middle, inverse, title-slide # Datos espaciales con R ## Principios básicos ### Stephanie Orellana ### RLadies Madrid ### 2021-03-15 --- background-image: url("img/cohete.png") background-size: 400px 400px background-position: center right # Hoy hablaremos de: - Introducción a R - Conceptos básicos de datos espaciales - Paquete sf - Paquete raster - Ejemplos prácticos --- background-image: url("https://raw.githubusercontent.com/sporella/30daymap/master/plots/29_gfs.gif") background-size: 400px 400px background-position: center right background-color: white # Sobre mí .col-right[ ] - Stephanie Orellana (sporella@uc.cl) -- - Ingeniera Agrónoma y Magíster en Recursos Naturales -- - No aprendí a programar en ningún curso de la Universidad, sino que por necesidad. -- - Partí trabajando con modelos mixtos de variables climáticas, usando: + Arcgis + Excel + R -- - Luego fui migrando completamente a R. Pero para "mirar" los rásters y vectores uso QGIS --- class: middle background-image: url("img/r.png") background-position: center right # Básicos de R --- class: inverse background-image: url("img/r-rstudio.png") background-position: center right # Básicos de R .col-right[ ] -- - R es un lenguaje de **programación** y es un software libre -- - RStudio es la **interfaz de usuario** más conocida (hace que R sea amigable e incluye herramientas para facilitar el trabajo) -- - R es un lenguaje orientado a **objetos** en donde pueden aplicarse **funciones** a estos objetos. --- class: middle background-image: url("https://jules32.github.io/useR-2019-keynote/img/horst-welcome_to_rstats_twitter.png") background-size: 600px 600px background-position: bottom right background-color: white width: 50% # Por qué usar R .col-right[ ] - Es un software libre y gratuito -- - Permite hacer investigación reproducible: -- - El flujo de trabajo queda escrito en código - Los análisis se hacen dentro del mismo programa -- - Es una herramienta potente y está en constante desarrollo. -- - Existe una gran comunidad alrededor del mundo que siempre está dispuesta a enseñar, responder preguntas y desarrollar nuevos paquetes. -- - Aprender a **buscar en Google** es primordial - **Twitter** --- class: inverse # R Base v/s Tidyverse .pull-left[ <img src="https://i.ytimg.com/vi/MCB4gNVfysU/maxresdefault.jpg" width="50%" style="display: block; margin: auto;" /> - Programar con la sintaxis nativa de R - Indices de objetos se realizan con: ` $ , [ ], [,] o [[]]` - Funciones incluidas en el paquete base (base::) ] -- .pull-right[ <img src="https://miro.medium.com/max/4032/1*B-cwhqnFgGIbd9lWnzi_mQ.png" width="50%" style="display: block; margin: auto;" /> - Grupo de paquetes diseñados para hacer ciencia de datos - Busca una programación más intuitiva. Funciones como verbos. - Todos los paquetes comparten una filosofía de diseño, gramática y estructuras de datos subyacentes. - Operador "pipe" %>% ] --- class: inverse # R Base v/s Tidyverse ```r # Seleccionar columnas ## R base iris$Sepal.Length iris[, c("Petal.Length", "Sepal.Length", "Species")] # Seleccionar columnas ## tidyverse library(dplyr) iris %>% select(Petal.Length, Sepal.Length, Species) ``` -- .pull-top[ <img src="https://image.slidesharecdn.com/emilytidyversepresentation-180205195912/95/the-lesser-known-stars-of-the-tidyverse-5-638.jpg?cb=1517860826" width="100%" style="display: block; margin: auto;" /> ] -- .pull-center[ ¡Para procesar datos espaciales necesitaremos las dos formas! <img src="https://cdn160.picsart.com/upscale-235481347027212.png?type=webp&to=min&r=1024" width="25%" style="display: block; margin: auto;" /> ] --- class: middle left background-image: url("img/spatial.png") background-position: bottom right background-size: 300px 300px # ¡Vamos a la parte espacial! --- # R vs SIG tradicionales R | SIG Tradicionales --------|---------|--------- Código ilimitado, se pueden mezclar diferentes paquetes para diferentes operaciones y análisis (incluso puedes hacer tus reportes y presentaciones en R). | Algunos como ArcGis y QGis tienen una consola de código en Python. -- Visualización de datos espaciales no es tan detallada como en un SIG tradicional, aunque existen paquetes para explorar de forma dinámica. | Visualización rápida de grandes vectores y creación de estos con herramientas manuales especializadas. -- --- # R vs SIG tradicionales R | SIG Tradicionales --------|---------|--------- Se puede hacer todo tipo de análisis y gráficos de la información espacial (ej: **`{ggplot2}`**). | Sólo vistas de mapas e histogramas. -- Se pueden programar procesos iterativos para hacer la misma acción muchas veces (se puede programar todo). | Procesos en "batch" siguen siendo manuales. -- Fácil análisis de las tablas de atributos (uso de tidyverse y contenidos del libro R for Data Science). | Análisis limitado de tablas de atributos. -- Permite reproducibilidad, queda todo por escrito. | Poco reproducible, nada (o muy poco) queda por escrito. --- # #Rspatial <iframe src="https://cran.r-project.org/web/views/Spatial.html" width="90%" height="400px" style="border: none;"></iframe> --- class: inverse <img src="img/sppackages_stats.png" width="90%" style="display: block; margin: auto;" /> [*] 50 paquetes más descargados con la etiqueta RSpatial desde 2015 --- class: middle right background-image: url("img/check-list.png") background-position: bottom left background-size: 300px 300px title-size: 50% # Conceptos básicos a tomar en cuenta --- class: inverse # 1. Tipo de dato/archivo .pull-left[ .h2[VECTORES] .p-caption[ <div class="figure" style="text-align: center"> <img src="img/vector.png" alt="Fuente: <a href='http://katiejolly.io/rnorth-19'> @Katie Jolly </a>" width="55%" /> <p class="caption">Fuente: <a href='http://katiejolly.io/rnorth-19'> @Katie Jolly </a></p> </div> ] ] .pull-right[ <img src="img/vectorcat.png" width="40%" style="display: block; margin: auto;" /> - Mediciones de campo - Estaciones meteorológicas - Caminos - Rutas GPS - Comunas - Regiones - Áreas de estudio ] --- class: inverse # 1. Tipo de dato/archivo .pull-left[ .h2[RÁSTER] .p-caption[ <div class="figure" style="text-align: center"> <img src="img/raster.png" alt="Fuente: <a href='http://katiejolly.io/rnorth-19'> @Katie Jolly </a>" width="62%" /> <p class="caption">Fuente: <a href='http://katiejolly.io/rnorth-19'> @Katie Jolly </a></p> </div> ] ] .pull-right[ <img src="img/pixelcat.png" width="40%" style="display: block; margin: auto;" /> - Imágenes satelitales - Modelos climáticos - Interpolaciones espaciales - Imágenes aéreas - Modelos de elevación digital - Usos de suelo - Datos (numéricos o categóricos) en grillas regulares ] --- class: inverse background-image: url("https://user-images.githubusercontent.com/520851/50280460-e35c1880-044c-11e9-9ed7-cc46754e49db.jpg") background-position: bottom right background-size: 550px 550px # Vectores: paquete "sf" .right-column2[ ] -- - Es el paquete "más moderno" para trabajar con vectores. -- - Actúa bajo la lógica de **simple features** en donde un objeto espacial se divide en dos componentes: -- - data.frame (tabla de atributos) - geometría **geometry** (información espacial adherida) -- - Es compatible con **tidyverse** --- # Cargar datos con sf ```r library(sf) # Cargar datos ## Poligonos *espana <- read_sf("data/limites_espana.shp") head(espana) ``` ``` ## Simple feature collection with 6 features and 7 fields ## geometry type: MULTIPOLYGON ## dimension: XY ## bbox: xmin: -5.424095 ymin: 35.1721 xmax: 0.6900477 ymax: 40.78831 ## geographic CRS: ETRS89 ## # A tibble: 6 x 8 ## ID ID_CODIGO ID_TTOPO FECHA_ALTA TIPO_0101 CCAA ETIQUETA ## <dbl> <chr> <chr> <chr> <chr> <chr> <chr> ## 1 11 0101S <NA> 201009240000~ 03 Comunidad Valen~ Castellón ## 2 14 0101S <NA> 201009240000~ 03 Andalucía Almería ## 3 10 0101S <NA> 201506010858~ 03 Ciudad Autónoma~ Islas Chafa~ ## 4 1 0101S <NA> 201506011034~ 03 CEUTA Isla de Per~ ## 5 2 0101S <NA> 201506011034~ 03 CEUTA Ceuta ## 6 15 0101S <NA> 201009240000~ 03 Comunidad Valen~ Alicante ## # ... with 1 more variable: geometry <MULTIPOLYGON [°]> ``` --- # Cargar datos con sf ```r ## Puntos *aeropuertos <- read_sf("data/BCN500_0606P_AEROP_AEROD.shp") aeropuertos ``` ``` ## Simple feature collection with 102 features and 5 fields ## geometry type: POINT ## dimension: XYZ ## bbox: xmin: -17.89353 ymin: 27.80845 xmax: 4.211772 ymax: 43.91356 ## z_range: zmin: 0 zmax: 0 ## geographic CRS: Europe ETRS 89 (EUREF 89 System), Latitude-Longitude; Degrees ## # A tibble: 102 x 6 ## ID ID_CODIGO FECHA_ALTA TIPO_0606 ETIQUETA geometry ## <dbl> <chr> <chr> <chr> <chr> <POINT [°]> ## 1 1 0606P 20091223000000 01 AEROP Z (-5.345102 36.15061 0) ## 2 2 0606P 20091223000000 01 AEROP Z (-4.496404 36.67687 0) ## 3 3 0606P 20091223000000 01 AEROP Z (-3.778217 37.17579 0) ## 4 4 0606P 20091223000000 01 AEROP Z (-2.359821 36.84331 0) ## 5 5 0606P 20091223000000 01 AEROP Z (-4.84883 37.83674 0) ## 6 6 0606P 20091223000000 01 AEROP Z (-1.040987 41.66157 0) ## 7 7 0606P 20091223000000 01 AEROP Z (-6.030386 43.56352 0) ## 8 8 0606P 20091223000000 01 AEROP Z (-3.819026 43.42818 0) ## 9 9 0606P 20091223000000 01 AEROP Z (-5.501317 40.95517 0) ## 10 10 0606P 20091223000000 01 AEROP Z (-4.867205 41.70134 0) ## # ... with 92 more rows ``` --- class: inverse # Rásters: paquete "raster" .right-column2[ <img src="https://i.stack.imgur.com/xeqec.png" width="70%" style="display: block; margin: auto;" /> ] -- - Es el paquete más utilizado para el procesamiento de rásters, aunque se está desarrollando el paquete `stars` (del mismo creador de `sf`) el cual permite el procesamiento de ráster en tidyverse -- - El paquete ráster actúa bajo la lógica de una matriz de datos en donde el inicio se encuentra en el extremo superior izquierdo. -- - Si sabes cómo procesar matrices con R Base, es fácil acceder a los valores de un ráster. -- - El paquete tiene funciones para leer, transformar, analizar y guardar rásters. --- # Cargar datos con raster ```r library(raster) # Cargar datos ## Ráster individual *lst_01 <- raster("data/raster/lst_01.tif") lst_01 ``` ``` ## class : RasterLayer ## dimensions : 193, 307, 59251 (nrow, ncol, ncell) ## resolution : 0.04491576, 0.04491576 (x, y) ## extent : -10.10605, 3.683093, 35.66312, 44.33186 (xmin, xmax, ymin, ymax) ## crs : +proj=longlat +datum=WGS84 +no_defs ## source : C:/Users/PEZ/Desktop/git/datos_espaciales_madrid/data/raster/lst_01.tif ## names : lst_01 ``` --- # Cargar datos con raster ```r library(raster) # Cargar datos ## Grupos de rásters l <- list.files("data/raster/", full.names = T) *lst <- stack(l) lst ``` ``` ## class : RasterStack ## dimensions : 193, 307, 59251, 12 (nrow, ncol, ncell, nlayers) ## resolution : 0.04491576, 0.04491576 (x, y) ## extent : -10.10605, 3.683093, 35.66312, 44.33186 (xmin, xmax, ymin, ymax) ## crs : +proj=longlat +datum=WGS84 +no_defs ## names : lst_01, lst_02, lst_03, lst_04, lst_05, lst_06, lst_07, lst_08, lst_09, lst_10, lst_11, lst_12 ``` --- class: inverse # 2. Proyección Espacial (CRS) - Es fundamental conocer en qué proyección espacial se encuentran nuestros datos. Las proyecciones están determinadas por un CRS (coordinate reference system). -- - Cada CRS puede estar definido por un EPSG (sigla de European Petroleum Survey Group) el cual es un código que se encuentra registrado en un listado de parámetros geodésicos (https://spatialreference.org/ref/) -- - Si quiero hacer operaciones espaciales, todas las capas deben tener el mismo sistema de proyección. -- - En Chile, los sistemas de proyección más usados son: - EPSG:4326: WGS 84 - EPSG:32719: WGS 84 / UTM zone 19S - EPSG:3857: WGS84 Web (Pseudo)Mercator (Auxiliary Sphere) - EPSG:24879: PSAD56 / UTM zone 19S --- class: inverse # 2. Proyección espacial <iframe src="img/proj_face1.mp4?showcase=0" width="100%" height="400px"></iframe> [Andy Woodruff: Projection Face!](http://bl.ocks.org/awoodruff/9216081?utm_campaign) --- # Cambiar proyección de un vector ```r # Cambiar proyección ## Proyección actual st_crs(espana)$epsg st_crs(espana)$proj4string ``` ``` ## [1] 4258 ## [1] "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs" ``` -- ```r ## Cambiar a Pseudo Mercator *espana_psm <- st_transform(espana, crs = 3857) st_crs(espana_psm)$epsg st_crs(espana_psm)$proj4string ``` ``` ## [1] 3857 ## [1] "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs" ``` --- # Cambiar proyección de un ráster ```r # Conocer CRS actual crs(lst_01) ``` ``` ## CRS arguments: +proj=longlat +datum=WGS84 +no_defs ``` ```r # Proyectar a UTM *lst_01_psm <- projectRaster(lst_01, crs = crs("+init=epsg:3857")) crs(lst_01_psm) ``` ``` ## CRS arguments: ## +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 ## +units=m +nadgrids=@null +wktext +no_defs ``` --- # 3. Extensión y resolución -- - Muy importante cuando trabajo con rásters. -- - Si mis rásters no tienen la misma extensión (bbox) espacial, no pueden tratarse como stacks. Tampoco si es que tienen diferente resolución -- .pull-left[ ```r extent(lst_01) ``` ``` ## class : Extent ## xmin : -10.10605 ## xmax : 3.683093 ## ymin : 35.66312 ## ymax : 44.33186 ``` ```r res(lst_01) ``` ``` ## [1] 0.04491576 0.04491576 ``` ] -- .pull-right[ ```r extent(lst_01_psm) ``` ``` ## class : Extent ## xmin : -1160000 ## xmax : 445000 ## ymin : 4224003 ## ymax : 5549593 ``` ```r res(lst_01_psm) ``` ``` ## [1] 5000 6530 ``` ] --- class:: middle background-image: url("https://raw.githubusercontent.com/sporella/30daymap/master/plots/0_collage.png") background-position: right .purple_h1[ Visualización ] --- # Cortar Vectores por atributos y visualizar .pull-left[ ```r library(sf) library(tidyverse) # Seleccionar sólo Comunidad de Madrid andalucia <- espana %>% * filter(CCAA == "Andalucía") ``` ```r ## Gráfico rápido plot(andalucia) ``` ] -- .pull-right[ <img src="index_files/figure-html/unnamed-chunk-25-1.png" style="display: block; margin: auto;" /> ] --- # Vectores y ggplot2 .col-left[ ```r ## Gráfico con ggplot library(ggplot2) ggplot(andalucia) + * geom_sf(aes(fill = ETIQUETA)) ``` ] -- .col-right[ <img src="index_files/figure-html/unnamed-chunk-27-1.png" height="60%" style="display: block; margin: auto;" /> ] --- # Cortar rásters por máscaras .col-left[ ```r # Creo máscara madrid_psm <- espana %>% filter(CCAA == "Comunidad de Madrid") %>% st_transform(crs = 3857) *madrid_lst_01 <- mask(lst_01_psm, madrid_psm) plot(madrid_lst_01) ``` <img src="index_files/figure-html/unnamed-chunk-28-1.png" width="50%" style="display: block; margin: auto;" /> ] -- .col-right[ ```r *madrid_lst_01 <- crop(madrid_lst_01, madrid_psm) plot(madrid_lst_01) ``` <img src="index_files/figure-html/unnamed-chunk-29-1.png" width="70%" style="display: block; margin: auto;" /> ] --- # Rásters y ggplot2 .col-left[ ```r # Convertir a tabla rt <- data.frame(rasterToPoints(madrid_lst_01)) colores <- rev(terrain.colors(15)) ggplot() + * geom_raster(data = rt, aes(x = x, y = y, fill = lst_01)) + scale_fill_gradientn(colours = colores) + coord_equal() ``` ] .col-right[ <img src="index_files/figure-html/unnamed-chunk-31-1.png" width="70%" style="display: block; margin: auto;" /> ] --- # {mapview} .pull-left[ ```r mapview::mapview(madrid_lst_01) ```
] .pull-right[ ```r mapview::mapview(madrid_psm) ```
] --- class: middle left background-image: url("img/share.png") background-position: right center background-size: 450px 450px # Recomendaciones --- # Libros .pull-left[ <div class="figure" style="text-align: center"> <img src="https://geocompr.robinlovelace.net/images/cover.png" alt=" <a href='https://geocompr.robinlovelace.net/'>Geocomputation with R</a>" width="50%" /> <p class="caption"> <a href='https://geocompr.robinlovelace.net/'>Geocomputation with R</a></p> </div> ] .pull-right[ <div class="figure" style="text-align: center"> <img src="https://d33wubrfki0l68.cloudfront.net/b88ef926a004b0fce72b2526b0b5c4413666a4cb/24a30/cover.png" alt=" <a href='https://r4ds.had.co.nz/'>R for data science</a>" width="50%" /> <p class="caption"> <a href='https://r4ds.had.co.nz/'>R for data science</a></p> </div> ] --- class: middle background-color: white background-image: url("img/twitter.png") background-position: top right background-size: 400px 400px # A quién seguir - https://twitter.com/CivicAngela `#rspatialchat` - https://twitter.com/Paula_Moraga_ - https://twitter.com/hadleywickham - https://twitter.com/edzerpebesma - https://twitter.com/RogerBivand - https://twitter.com/jakub_nowosad - https://twitter.com/robinlovelace - `#rspatial` - `#rstats` --- class: inverse background-color: white background-image: url("https://image.freepik.com/vector-gratis/lego-isometrico_71884-8.jpg") background-size: 300px 300px background-position: bottom right # Recomendaciones generales -- - Si se demoró mucho en cargar, mejor no visualizar. -- - Cuando se trabaja con datos muy grandes, mejor hacer todas las pruebas con una selección pequeña. -- - R tampoco es mágico, si le damos las instrucciones incorrectas, no obtendremos el resultado esperado. -- - R es rápido, pero hay procesos que se demoran. Esperar. --- class: middle center background-image: url("img/computer.png") background-position: right center background-size: 450px 450px # Ejemplos