Using Satellite Images

Usando Imágenes Satelitales

Autor/a

Martin Olmos

Fecha de publicación

19 de marzo de 2022

Breve intro conceptual1

La teledetección satelital o satellite remote sensing es la actividad de recolectar datos a través del uso de sensores, en este caso satélites, de un lugar al que no se tiene acceso físicamente, es decir en forma remota.

Estos datos consisten en la medición de energía electromagnética. La radiación electromagnética es una forma de energía emitida por toda materia con temperatura arriba del cero absoluto (0 Kelvin o -272° Celcius). Rayos X, ultravioletas, luz visible, infraroja, calor, microondas y ondas de radio y televisión son todas formas de energía electromagnética con distinta longitud de onda o frecuencia y son parte del espectro electromagnético.

Los objetos más calientes emiten más energía electromagnética y a ondas más cortas que los más fríos. La fuente de radiación electromagnética más común es el Sol. Los objetos que constituyen la superficie de la Tierra reflejan y emiten radiación electromagnética de distinta manera.

La porción del espectro electromagnético donde se ubica el pico de la radiación solar se denomina banda visible, ya que la visión humana es sensible a esas ondas. La teledetección permite extender la capacidad humana de percibir radiación electromagnética más allá de la banda visual, por eso las partes del espectro electromagnético que no podemos ver son muy importantes.

Los objetos que constituyen la superficie de la Tierra reflejan la radiación electromagnética de distinta manera. El atractivo de la teledetección multiespectral es que objetos indistinguibles a una longitud de onda determinada pueden ser fáciles de distinguir a otra. Las bandas comúnmente usadas para percibir la ocupación y uso del suelo son: visible, infraroja y microondas.

Entender las diferentes maneras en que longitudes de onda específicas interactúan con distintos objetos permite encontrar “sellos” o “signatures” que permitirán detectar esos objetos automáticamente.

Las aplicaciones son diversas: monitoreo de deforestación, degradación del suelo, detección y clasificación de objetos tan disímiles como humedales, asentamientos informales y barrios cerrados, monitoreo de la calidad y salinidad del agua, calidad del aire, detección de basurales clandestinos, monitoreo de rellenos sanitarios, monitoreo del impacto ambiental de industrias determinadas, entre otros.

En este post no voy a avanzar en detección o clasificación de objetos pero, siguiendo este tutorial voy a utilizar imágenes satelitales junto con datos de elevación SRTM para hacer un mapa en 3D de mi lugar preferido en el mundo: el Dique de Cuesta del Viento en Rodeo, San Juan.

Acá el código:

library(rayshader)
library(sp)
library(raster)
library(scales)

rodeo_elevation <- raster::raster("S31W070.hgt")

height_shade(raster_to_matrix(rodeo_elevation)) %>% 
  plot_map()

rodeo_r <- raster::raster("LC08_L1TP_232081_20210817_20210826_01_T1_B4.TIF")
rodeo_g <- raster::raster("LC08_L1TP_232081_20210817_20210826_01_T1_B3.TIF")
rodeo_b <- raster::raster("LC08_L1TP_232081_20210817_20210826_01_T1_B2.TIF")

rodeo_rgb <- raster::stack(rodeo_r, rodeo_g, rodeo_b)

raster::plotRGB(rodeo_rgb, scale=255^2)

rodeo_rgb_corrected <- sqrt(raster::stack(rodeo_r, rodeo_g, rodeo_b))
raster::plotRGB(rodeo_rgb_corrected)

raster::crs(rodeo_r)
raster::crs(rodeo_elevation)

rodeo_elevation_utm <- raster::projectRaster(rodeo_elevation, 
                                             crs = crs(rodeo_r), 
                                             method = "bilinear")

crs(rodeo_elevation_utm)

bottom_left <- c(y=-69.1478, x=-30.2374)
top_right <- c(y=-69.0077, x=-30.1295)

extent_latlong = sp::SpatialPoints(rbind(bottom_left, top_right), 
                                   proj4string=sp::CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))
extent_utm <- sp::spTransform(extent_latlong, raster::crs(rodeo_elevation_utm))

e <- raster::extent(extent_utm)

rodeo_rgb_cropped <- raster::crop(rodeo_rgb_corrected, e)
rodeo_elevation_cropped <- raster::crop(rodeo_elevation_utm, e)

names(rodeo_rgb_cropped) <- c("r", "g", "b")

rodeo_r_cropped = rayshader::raster_to_matrix(rodeo_rgb_cropped$r)
rodeo_g_cropped = rayshader::raster_to_matrix(rodeo_rgb_cropped$g)
rodeo_b_cropped = rayshader::raster_to_matrix(rodeo_rgb_cropped$b)

rodeo_elevation_matrix <- rayshader::raster_to_matrix(rodeo_elevation_cropped)

rodeo_rgb_array <- array(0, dim = c(nrow(rodeo_r_cropped), ncol(rodeo_r_cropped), 3))

rodeo_rgb_array[,,1] <- rodeo_r_cropped/255
rodeo_rgb_array[,,2] <- rodeo_g_cropped/255
rodeo_rgb_array[,,3] <- rodeo_b_cropped/255

rodeo_rgb_array <- aperm(rodeo_rgb_array, c(2,1,3))

plot_map(rodeo_rgb_array)

rodeo_rgb_contrast <- scales::rescale(rodeo_rgb_array, to=c(0,1))

plot_map(rodeo_rgb_contrast)

plot_3d(hillshade = rodeo_rgb_contrast, 
        heightmap = rodeo_elevation_matrix,
        windowsize = c(1100, 900),
        zscale = 15, 
        shadowdepth = -50, 
        zoom = 0.5,
        phi = 45, 
        theta = -45, 
        fov = 70, 
        background = "#F2E1D0", 
        shadowcolor = "#523E2B")

render_snapshot(title_text = "Dique Cuesta del Viento, San Juan | Imagery: Landsat 8 | DEM: 30m SRTM", 
                title_bar_color = "#523E2B", title_color = "white", title_bar_alpha = 1)

# Video

angles <- seq(0, 360, length.out = 1441)[-1]

for(i in 1:1440) {
  render_camera(theta = -45+angles[i])
  render_snapshot(filename = sprintf("cuesta_%i.png", i),
                  title_text = "Dique Cuesta del Viento, San Juan | Imagery: Landsat 8 | DEM: 30m SRTM",
                  title_bar_color = "#1f5214", title_color = "white", title_bar_alpha = 1)
}

rgl::rgl.close()

Y el resultado:

Notas

  1. En base al MOOC “Imagery, Automation, and Applications” de la Universidad de California, Davis y al libro de David DiBiase, The Nature of Geographic Information. Penn State University, College of Earth and Mineral Sciences. Retrieved from https://www.e-education.psu.edu/natureofgeoinfo/↩︎