r raster r-raster sp

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)