R - преобразовать SpatialLines в растровый

В R мы можем взять raster и превратить его в SpatialLinesDataFrame с помощью функции 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)

enter image description here

В R есть способ сделать обратное? Что-то вроде contourToRaster?

Мы можем просто получить значения полей, связанные с каждой точкой вдоль линии, но я ищу что-то более общее, которое интерполирует между линиями и создает полный растр в определенной области.

Ответы

Ответ 1

library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)

Вы можете растеризовать значения. В этом случае после извлечения их из факторных меток сначала.

x$value <- as.numeric(as.character(x$level))
rr <- rasterize(x, r, "value")

А затем извлечь значения ячеек и интерполировать эти

xyz <- rasterToPoints(rr)

(если вы хотите пропустить растеризацию и растровые точки (как предполагает mikoontz), вы можете вместо этого сделать

#g <- geom(x) 
#xyz = cbind(g[, c("x", "y")], x$value[g[,1]])

за счет более сложной модели)

Теперь интерполируем, например, с Tps

library(fields) 
tps <- Tps(xyz[,1:2], xyz[,3])
p <- raster(r)
p <- interpolate(p, tps)

m <- mask(p, r)
plot(m)

Ответ 2

У вас есть только доступ к объекту, созданному rasterToContour()?

Если у вас все еще есть доступ к исходному растру, вы можете сначала создать контуры как полные полигоны (вместо того, чтобы создавать их как линии). Тогда функция "contourToRaster" -like просто rasterize() (или fasterize()).

Здесь заимствован некоторый код: Как превратить контурные линии в заполненные контуры?

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)))

Производит:

enter image description here

РЕДАКТИРОВАТЬ:

Мне нравится подход Роберта к этому, если вы хотите интерполировать. Я бы пропустил шаг rasterize(), который может быть довольно медленным, в пользу непосредственного приведения множественных строк к точкам:

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)

enter image description here

Обратите внимание, что оба эти метода полагаются на исходный raster объект.

Ответ 3

Похоже, что vect2rast может это сделать.