##Angelica Martinez## Datos de elevacion en R

En este notebook se ilustraran diferentes funciones para obtener, procesar y visualizar modelos de elevacion digital.

1. Instalamoslos paquetes necesarios

Para lograrlos se deben instalar los siguientes paquetes.

#install.packages("rgdal")
# install.packages("raster")
#install.packages("elevatr")
#install.packages("rasterVis")
#install.packages("rgl")
#install.packages("lattice")
#install.packages("latticeExtra")

2. Se adjuntan los paquetes Una vez instalados se deben cargar.

library(raster)
## Warning: package 'raster' was built under R version 3.6.3
## Loading required package: sp
## Warning: package 'sp' was built under R version 3.6.3
library(rgl)
## Warning: package 'rgl' was built under R version 3.6.3
library(rgdal)
## Warning: package 'rgdal' was built under R version 3.6.3
## rgdal: version: 1.4-8, (SVN revision 845)
##  Geospatial Data Abstraction Library extensions to R successfully loaded
##  Loaded GDAL runtime: GDAL 2.2.3, released 2017/11/20
##  Path to GDAL shared files: C:/Users/Usuario/Documents/R/win-library/3.6/rgdal/gdal
##  GDAL binary built with GEOS: TRUE 
##  Loaded PROJ.4 runtime: Rel. 4.9.3, 15 August 2016, [PJ_VERSION: 493]
##  Path to PROJ.4 shared files: C:/Users/Usuario/Documents/R/win-library/3.6/rgdal/proj
##  Linking to sp version: 1.4-1
library(lattice)
library(latticeExtra)
## Warning: package 'latticeExtra' was built under R version 3.6.3
library(sp)
library(raster)
library(rasterVis)
## Warning: package 'rasterVis' was built under R version 3.6.3
library(elevatr)
## Warning: package 'elevatr' was built under R version 3.6.3

3. Obtener datos de elevación raster

Se trabajara con el archivo del Censo del Dane, que fue descargado con antelación. Se listara el contenido del archivo llamado “ADMINISTRATIVO”

list.files("20_CESAR/ADMINISTRATIVO")
##  [1] "MGN_DPTO_POLITICO.cpg"     "MGN_DPTO_POLITICO.dbf"    
##  [3] "MGN_DPTO_POLITICO.prj"     "MGN_DPTO_POLITICO.sbn"    
##  [5] "MGN_DPTO_POLITICO.sbx"     "MGN_DPTO_POLITICO.shp"    
##  [7] "MGN_DPTO_POLITICO.shp.xml" "MGN_DPTO_POLITICO.shx"    
##  [9] "MGN_MPIO_POLITICO.cpg"     "MGN_MPIO_POLITICO.dbf"    
## [11] "MGN_MPIO_POLITICO.prj"     "MGN_MPIO_POLITICO.sbn"    
## [13] "MGN_MPIO_POLITICO.sbx"     "MGN_MPIO_POLITICO.shp"    
## [15] "MGN_MPIO_POLITICO.shp.xml" "MGN_MPIO_POLITICO.shx"

Ahora leeremos el archivo con una utilidad del paquete raster.

(munic <-  shapefile("20_CESAR/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp"))
## class       : SpatialPolygonsDataFrame 
## features    : 25 
## extent      : -74.13916, -72.88575, 7.67435, 10.86767  (xmin, xmax, ymin, ymax)
## crs         : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
## variables   : 9
## names       : DPTO_CCDGO, MPIO_CCDGO, MPIO_CNMBR,                         MPIO_CRSLC,    MPIO_NAREA, MPIO_NANO, DPTO_CNMBR,    Shape_Leng,       Shape_Area 
## min values  :         20,      20001,  AGUACHICA,                               1915,   73.00612196,      2017,      CESAR, 0.43487341949, 0.00599288307584 
## max values  :         20,      20787, VALLEDUPAR, Ordenanza 8 de Noviembre 3 de 1971, 4185.79157206,      2017,      CESAR, 4.87780921906,   0.345529320156

Visualicemos los atributos de munic

head(munic)
##   DPTO_CCDGO MPIO_CCDGO  MPIO_CNMBR                               MPIO_CRSLC
## 0         20      20011   AGUACHICA                     Ordenanza 40 de 1914
## 1         20      20032      ASTREA     Ordenanza 13 de Noviembre 26 de 1984
## 2         20      20060    BOSCONIA       Ordenanza 1 de Noviembre 6 de 1979
## 3         20      20175 CHIMICHAGUA                   Ordenanza 0054 de 1892
## 4         20      20178 CHIRIGUANÃ\201                     Ordenanza 04 de 1888
## 5         20      20228   CURUMANÃ\215 Ordenanza 36 del 16 de Noviembre de 1965
##   MPIO_NAREA MPIO_NANO DPTO_CNMBR Shape_Leng Shape_Area
## 0   877.6508      2017      CESAR   1.967938 0.07202222
## 1   637.9028      2017      CESAR   1.335874 0.05252647
## 2   586.2015      2017      CESAR   1.274771 0.04833089
## 3  1376.4446      2017      CESAR   2.473946 0.11324235
## 4  1114.4804      2017      CESAR   2.487206 0.09173969
## 5   915.1712      2017      CESAR   1.606253 0.07529250

Se seleccionara la capital del departamento de Cesar “Valledupar” y realizaremos un ploteo

valle <- munic[munic$MPIO_CNMBR=="VALLEDUPAR",]
plot(valle, main="Valledupar", axes=TRUE)
plot(munic, add=TRUE)
invisible(text(coordinates(munic), labels=as.character(munic$MPIO_CNMBR), cex=0.6))

Ahora se trabajara con el paquete elevation

elevation <- get_elev_raster(valle, z = 8)
## Merging DEMs
## Reprojecting DEM to original projection
## Note: Elevation units are in meters.
## Note: The coordinate reference system is:
##  +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0

Se visualizara el contenido de elevation

elevation
## class      : RasterLayer 
## dimensions : 1033, 1544, 1594952  (nrow, ncol, ncell)
## resolution : 0.00275, 0.00271  (x, y)
## extent     : -74.545, -70.299, 8.392522, 11.19195  (xmin, xmax, ymin, ymax)
## crs        : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
## source     : memory
## names      : layer 
## values     : -801.2662, 5532.962  (min, max)

Es de resaltar que el sistema de coordenadas de refencia es el WGS84

plot(elevation, main="This the downloaded DEM [meters]")
plot(valle, add=TRUE)

4.Recorte los datos de elevación para que coincidan con la extensión del área de estudio.

#writeRaster(elevation, cesar1="./dem/elev_z8.tif", datatype='INT4S', overwrite=TRUE)

Cortaremos los datos correspondientes a Valledupar, y su abreviatura sera " valle"

elev_crop = crop(elevation, valle)
plot(elev_crop, main="Cropped Digital elevation model")
plot(valle, add=TRUE)

Se chequea el nuevo elemento.

elev_crop
## class      : RasterLayer 
## dimensions : 387, 277, 107199  (nrow, ncol, ncell)
## resolution : 0.00275, 0.00271  (x, y)
## extent     : -73.83825, -73.0765, 9.817982, 10.86675  (xmin, xmax, ymin, ymax)
## crs        : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
## source     : memory
## names      : layer 
## values     : 46.89514, 5532.962  (min, max)

5. Reproyectar los datos de elevación

En la pagina epsg se pueden obtener los datos de MAGNA Colombia Bogota zone projection. se necesita la definicion de PROJEC 4.

spatialref <- "+proj=tmerc +lat_0=4.596200416666666 +lon_0=-74.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs" 

Podemos reproyectarlos datos de elevacion de WGS84 geographic coordinates a MAGNA Colombia Bogota zone.

pr3 <- projectExtent(elev_crop, spatialref)
 
res(pr3) <- 100

rep_elev <- projectRaster(elev_crop, pr3)

Lo que obtendriamos sera:

rep_elev
## class      : RasterLayer 
## dimensions : 1162, 837, 972594  (nrow, ncol, ncell)
## resolution : 100, 100  (x, y)
## extent     : 1026160, 1109860, 1577475, 1693675  (xmin, xmax, ymin, ymax)
## crs        : +proj=tmerc +lat_0=4.596200416666666 +lon_0=-74.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
## source     : memory
## names      : layer 
## values     : 46.24819, 5521.017  (min, max)

Ahora se reproyectara el SpatialPolygonsDataFrame de la capital del Cesar:

(rep_valle = spTransform(valle,spatialref))
## class       : SpatialPolygonsDataFrame 
## features    : 1 
## extent      : 1026104, 1109555, 1577583, 1693669  (xmin, xmax, ymin, ymax)
## crs         : +proj=tmerc +lat_0=4.596200416666666 +lon_0=-74.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
## variables   : 9
## names       : DPTO_CCDGO, MPIO_CCDGO, MPIO_CNMBR, MPIO_CRSLC,    MPIO_NAREA, MPIO_NANO, DPTO_CNMBR,    Shape_Leng,     Shape_Area 
## value       :         20,      20001, VALLEDUPAR,       1915, 4185.79157206,      2017,      CESAR, 4.87780921906, 0.345529320156

Esta es la imagen que obtenemos al plotear

plot(rep_elev, main="Reprojected Digital elevation model")
plot(rep_valle, add=TRUE)

Con elsiguiente codigo guardemos el cambio.

#writeRaster(rep_elev, cesar1="./dem/rep_valle_elev.tif", datatype='INT4S', overwrite=TRUE)

6. Estadísticas básicas de datos de elevación

Haremos un histograma de las elevaciones , para revisar algo de estadistica.

hist(rep_elev)

# para archivos grandes sepueden trabajar los siguientes codigos 
promedio <- cellStats(rep_elev, 'mean')
minimo <- cellStats(rep_elev, 'min')
maximo <- cellStats(rep_elev, 'max')
desviacion  <- cellStats(rep_elev, 'sd')
metricas <- c('mean', 'min', 'max', 'std')
valores <- c(promedio, minimo, maximo, desviacion)

Obtendremos estos datos

# creacion de data frame con estadisticas de elevacion [metros]
# el paréntesis externo sirve para "imprimir" el contenido de un objeto
(df_estadisticas <- data.frame(metricas, valores))
##   metricas    valores
## 1     mean  945.31222
## 2      min   46.24819
## 3      max 5521.01701
## 4      std 1182.98377

7. Estadísticas básicas de datos de dimensiones

Antes de introducirse en este tema se deben tener conocimientos previos del tema de pendientes

slope = terrain(rep_elev,opt='slope', unit='degrees')
aspect = terrain(rep_elev,opt='aspect',unit='degrees')
hill = hillShade(slope,aspect,40,315)
plot(rep_elev,main="DEM for Valledupar [meters]", col=terrain.colors(25,alpha=0.7))

En nuestros ploters , la pendiente se observa por los cambios de tonos y de colores

plot(slope,main="Slope for Valledupar [degrees]", col=topo.colors(25,alpha=0.7))

plot(aspect,main="Aspect for Valledupar [degrees]", col=rainbow(25,alpha=0.7))

plot(hill,
        col=grey(1:100/100),  
        legend=FALSE,         
        main="DEM for Valledupar",
        axes=FALSE)           
plot(rep_elev, 
        axes=FALSE,
        col=terrain.colors(12, alpha=0.35), add=TRUE) # color method

8. Mapeo de datos de elevación con rayshader

La biblioteca rayshader es un paquete de código abierto para producir visualizaciones de datos 2D y 3D en R. rayshader utiliza datos de elevación en una matriz base R y una combinación de trazado de rayos, mapeo de texturas esféricas, superposiciones y oclusión ambiental para generar hermosos mapas topográficos 2D y 3D . Además de los mapas, rayshader también permite al usuario traducir objetos ggplot2 en hermosas visualizaciones de datos 3D.

#install.packages("rayshader")
library(rayshader)
## Warning: package 'rayshader' was built under R version 3.6.3
elmat = raster_to_matrix(rep_elev)
elmat %>%
  sphere_shade(texture = "imhof2") %>%
  plot_map()

Detectar agua

elmat %>%
  sphere_shade(texture = "desert") %>%
  add_water(detect_water(elmat), color = "desert") %>%
  plot_map()

Podemos agregar una capa de trazado de rayos desde esa dirección del sol:

elmat %>%
  sphere_shade(texture = "desert") %>%
  add_water(detect_water(elmat), color = "desert") %>%
  add_shadow(ray_shade(elmat), 0.5) %>%
  plot_map()

9. Otra forma de visualizacion

#install.packages(jpeg)
library(jpeg)

Función de sombreado de mapeo de entorno esférico

getv=function(i,a,s){
  ct = dim(i)[1:2]/2
  sx = values(s)/90 * ct[1]
  sy = values(s)/90 * ct[2]
  a = values(a) * 0.01745
  px = floor(ct[1] + sx * -sin(a))
  py = floor(ct[2] + sy * cos(a))
  
  
  template = brick(s,s,s)
  values(template)=NA
  
  cellr = px + py * ct[1]*2
  cellg = px + py * ct[1]*2 + (ct[1]*2*ct[2]*2)
  cellb = px + py * ct[1]*2 + 2*(ct[1]*2*ct[2]*2)
  
  template[[1]] = i[cellr]
  template[[2]] = i[cellg]
  template[[3]] = i[cellb]
  
  template = template * 256
  
  template
}

Ahora con una imagen jpeg

map=readJPEG("./9pvbHjN.jpg")


out = getv(map,aspect, slope)


plotRGB(out, main = "El Valle")