R-convierte SpatialLines en raster
r-raster (2)
En R, podemos tomar un raster
y convertirlo en un SpatialLinesDataFrame
con la función rasterToCountour
:
library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
class(x)
[1] "SpatialLinesDataFrame"
attr(,"package")
[1] "sp"
spplot(x)
Dentro de R, ¿hay una manera de hacer lo contrario? Algo así como contourToRaster
?
Simplemente podemos capturar los valores de campo asociados con cada punto a lo largo de la línea, pero estoy buscando algo más general que interpola entre las líneas y produce un ráster completo sobre un dominio definido.
¿Solo tiene acceso al objeto creado por rasterToContour()
?
Si aún tiene acceso al ráster original, puede crear los contornos como polígonos completos primero (en lugar de crearlos como líneas). Luego, la función similar a "contourToRaster" es rasterize()
(o hacer más fasterize()
).
Algún código tomado de aquí: ¿Cómo se convierten las curvas de nivel en contornos rellenos?
library(fasterize)
rc <- cut(r, breaks= 10)
cut_vals <- cut(r[], breaks = 10, dig.lab = 5)
pols <- rasterToPolygons(rc, dissolve=T) %>%
st_as_sf()
r_template <- raster(pols, res = res(r))
back_to_raster <- fasterize(pols, r_template, field = "layer")
par(oma = c(0, 0, 0, 5))
plot(back_to_raster, legend = FALSE)
plot(back_to_raster, legend.only=TRUE, legend.width = 1,
axis.args=list(at=1:nlevels(cut_vals),
labels=levels(cut_vals)))
Produce:
EDITAR:
Me gusta el enfoque de Robert a esto si quieres interpolar. Me saltearía el paso rasterize()
, que puede ser bastante lento, a favor de convertir los puntos múltiples en puntos directamente:
library(tidyverse)
library(sf)
library(raster)
library(fields)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
class(x)
x_sf <- x %>% st_as_sf() %>% st_cast("LINESTRING") %>% st_cast("MULTIPOINT") %>% st_cast("POINT")
tps <- Tps(x = st_coordinates(x_sf), Y = as.numeric(as.character(x_sf$level)))
p <- interpolate(r, tps) %>% mask(r)
plot(p)
Tenga en cuenta que ambos métodos dependen del acceso al objeto raster
original.
library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
Puedes rasterizar los valores. En este caso, después de extraerlos de las etiquetas de factores primero.
x$value <- as.numeric(as.character(x$level))
rr <- rasterize(x, r, "value")
Y luego extraer los valores de la celda e interpolar estos
xyz <- rasterToPoints(rr)
(Si desea omitir rasterize y rasterToPoints (como sugiere mikoontz), podría hacer
#g <- geom(x)
#xyz = cbind(g[, c("x", "y")], x$value[g[,1]])
a costa de un modelo más complejo)
Ahora interpolar, por ejemplo con Tps.
library(fields)
tps <- Tps(xyz[,1:2], xyz[,3])
p <- raster(r)
p <- interpolate(p, tps)
m <- mask(p, r)
plot(m)