7 Geometría 3D con R y PostGIS

A partir del MDT de nuestro municipio, vamos a obtener una muestra de puntos en 3D, a almacenarlos en PostGIS y a representarlos en R.

Mediante el fragmento de código siguiente, obtenemos una muestra de puntos en 3D.

file <- 'datos/Lanjaron/p03out/mdt-lanjaron-bbox-jsamos.tif'
mdt <- terra::rast(file)

# Extraer puntos y elevaciones del MDT
puntos <- as.data.frame(mdt, xy = TRUE, na.rm = TRUE)
colnames(puntos) <- c("x", "y", "z")

# Seleccionar una muestra aleatoria
muestra <- sample(1:nrow(puntos), size = 1000, replace = FALSE)
puntos <- puntos[muestra, ]

A continuación, podemos generar una capa a partir de las coordenadas de los puntos, mediante el código siguiente.

puntos$geom <- paste0("POINT Z (", puntos$x, " ", puntos$y, " ", puntos$z, ")")
puntos$id <- 1:nrow(puntos)
puntos <- puntos[, c('id', 'geom')]
sf_puntos <- sf::st_as_sf(puntos, wkt = "geom", crs = sf::st_crs(mdt))

Los podemos almacenar directamente en PostGIS, mediante el código siguiente.

con <- RPostgres::dbConnect(
  RPostgres::Postgres(),
  dbname = 'lanjaron_jsamos',
  host = 'localhost',
  port = '5432',
  user = 'postgres',
  password = 'postgres'
)

sf::st_write(obj = sf_puntos,
             dsn = con,
             layer = "p3d_lanjaron_bbox_jsamos")

RPostgres::dbDisconnect(con)

También podemos representar los puntos desde R, mediante el código siguiente.

xyz <- sf::st_coordinates(sf_puntos)
rgl::plot3d(xyz[, 'X'], xyz[, 'Y'], xyz[, 'Z'],
       col = "blue", size = 1.5, type = "s",
       xlab = "X", ylab = "Y", zlab = "Z")
Resultado de 3D de muestra de puntos desde R.

Figura 7.1: Resultado de 3D de muestra de puntos desde R.

En la figura 7.1 se muestra el resultado.